PDA

View Full Version : طریقه ی تبدیل رشته ها به اعداد



moh.mon
یک شنبه 04 فروردین 1387, 16:55 عصر
من به یه مشکل در مورد برنامه نویسی به زبان c++ بر خوردم.
میخواستم یه برنامه بنویسم که یه رشته شامل اعداد اعشاری رو دریافت کنه و مجموع آنها رو چاپ کنه. مشکل اینجاست که نمیتونم رشته ی اعداد رو به اعداد اعشاری از نوع float تبدیل کنم میخواستم یکم کمکم کنید.

Nima_NF
دوشنبه 05 فروردین 1387, 01:54 صبح
ابتدا در رشته مورد نظر ، زیر رشته ای را پیدا کنید که یک عدد اعشاری تشکیل می دهد (xx.xx) و سپس آن را در بافری کپی کنید و سپس از طریق تابع atof آن رشته اعشاری را (چه استاندارد و چه از نوع علمی) می توانید به عدد اعشاری از نوع double یا float تبدیل کنید.



<math.h>
<stdlib.h>

moh.mon
سه شنبه 06 فروردین 1387, 00:45 صبح
میشه یکم در مورد آرگومان های وودی تابع atof توضیح بدین .
در ضمن یکم هم در مورد بافر توضیح بدین واگه میشه یکمی از برنامه رو بنویسنید
با تشکر.

karim1380
سه شنبه 06 فروردین 1387, 16:00 عصر
در ++c روشی برای تبدیل بنام تایپ کاستینگ هست لطفا به خط نهم از برنامه زیر توجه کنید


#include <iostream.h>
#include <conio.h>
int main()
{
int x, y, m;
float ave;
cout << "Enter three number : ";
cin >> x >> y >> m;
ave = (float) (x + y + m) / 3;
cout << "ave = " << ave;
getch();
return 0;
}

Nima_NF
چهارشنبه 07 فروردین 1387, 01:03 صبح
میشه یکم در مورد آرگومان های وودی تابع atof توضیح بدین .
در ضمن یکم هم در مورد بافر توضیح بدین واگه میشه یکمی از برنامه رو بنویسنید
با تشکر.

http://msdn2.microsoft.com/en-us/library/hc25t012(VS.80).aspx (http://msdn2.microsoft.com/en-us/library/hc25t012%28VS.80%29.aspx)

منظور از بافر ، اختصاص یک حافظه برای رشته مورد نظر شماست

moh.mon
چهارشنبه 07 فروردین 1387, 17:33 عصر
چجوری میشه زیر رشته ی مورد نظر رو انتخاب و در بافر کپی کرد اگه میشه تابع main رو بنویسید

Nima_NF
چهارشنبه 07 فروردین 1387, 19:31 عصر
خودتان به عنوان یک برنامه نویس در حال آموزش باید با مطالعه مثال ها و کتاب این کار را انجام دهید.



فقط برای یک نمونه غیر بهینه و جهت آشنا کردن شما:



// 23.03 28.6 ...

int begPtr = 0,
endPtr = 0;

while ( str[begPtr] == ' ' )
{
begPtr++;
}

endPtr = begPtr ;

while ( str[endPtr] != ' ' )
{
endPtr++;
}


جستجو می کنید تا به اولین کارکتر بعد از فضای خالی برسید و سپس از آن نقطه تا فضای خالی بعدی و یا اگر به انتهای رشته رسیده باشید ، یک رشته از نوع اعشاری خواهد بود و سپس عمل قبل را با کمی تغییرات تکرار می کنید. با کم کردن دو اشاره گر endPtr و begPtr به تعداد کارکتر مورد نظر برای کپی کردن زیر رشته نیز خواهید رسید.
اگر هم کارکتر n\ هم وجود دارد در کنار ' ' مورد تست قرار دهید.

ضمنا از توابع strstr نیز برای پیدا کردن زیر رشته در رشته دیگر و از strncpy برای کپی کردن تعداد کارکتر خاص از رشته ای به رشته دیگر می توانید استفاده کنید.
http://www.cplusplus.com/reference/clibrary/cstring/strncpy.html

moh.mon
پنج شنبه 08 فروردین 1387, 23:23 عصر
از راهنماییتون ممنون
ولی تابع atof آرایه ها رو به شکل کامل به اعداد تبدیل نمیکنه ممکنه یه تابع دیگه معرفی کنید.

moh.mon
جمعه 09 فروردین 1387, 00:29 صبح
من یه برنامه نوشتم که یه رشته از اعداد رو بخونه و اونه به زیر رشته های مشخص تقسیم کنه و در یک بافر کپی کنه ولی یه مشکلاتی داره میخواستم این مشکله برام حل کنید



#include <iostream>
#include <cstring>
#include <conio>
//using namespace std;
int main()
{
const int max= 100;
const int min= 20;
char s1[max], s2[min];
int b=0, e=0;

cout<<"yek reshte az adad ra vared konid: "<<endl;
cin.get(s1, max, '$');

do{ //reshteye s1 ra be zir reshte haye moshakhas taghsim
//karde va dar bafer s2 copy mikoinad.
while(s1[b]=' ')
{
b++;
}
e=b;
while(s1[e]!=' ')
{
e++;
}
strncpy(s2,s1,(e-b));
s2[e-b]='/0';
cout<<s2[e-b];
}while(s1[b]!='/0');

getch();
return 0;
}

Nima_NF
جمعه 09 فروردین 1387, 02:15 صبح
اشکالات برنامه را به شکل زیر برطرف کردم، قسمت های پر رنگ شده را یا اشتباه نوشته بودید یا برای درست عمل کردن اضافه کردم ، آن ها را مطالعه کنید تا خودتان متوجه شوید:



#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;

int main()
{
const int max= 100;
const int min= 20;
char s1[max], s2[min];
int b=0, e=0;

cout<<"yek reshte az adad ra vared konid: "<<endl;
cin.get(s1, max, '$');

do{ //reshteye s1 ra be zir reshte haye moshakhas taghsim
//karde va dar bafer s2 copy mikoinad.
while(s1[B]==' ') // use == and not =
{
b++;
}
e=b;

while(s1[e]!=' ' && s1[e]!='\0') // or just use: && s1[e]
{
e++;
}

strncpy(s2, s1 + b ,(e-b));
s2[e-b]='\0';
cout<< s2 << endl;

b=e; // move begin

}while(s1!=[B]'\0');

getch();
return 0;
}

انتهای رشته 0\ هست نه 0/
ضمنا لطفا کد ها را در تک کد قرار دهید. (code)

moh.mon
جمعه 09 فروردین 1387, 21:48 عصر
از وقتی که برای اصلاح برنامه گذاشتید ممنون ولی برنامه هزمان کامپایل شدن چندتا اشکال میگیره .
1- namespace name expected
2- experssion syntax
میخواستم بدونم چه جوری باید بر طرف شن
در ضمن من با borland cpp کار میکنم.

Nima_NF
شنبه 10 فروردین 1387, 16:28 عصر
کامپایلر همیشه خطا را به همراه شماره خط مورد نظر اعلام می کند، کار سختی نبود، [b] اشتباها در هنگام کپی کردن در فروم به پشت while رفته بود؛ که اصلاح شد. این گونه خطا ها باید توسط خودتان یافته و رفع شود.

ضمنا اگر از borland نسخه قدیمی استفاده می کنید، using namespace std را حذف کنید.

NjaNjooN
سه شنبه 13 فروردین 1387, 20:13 عصر
آقایون سلام ...

لطف می کنید و راهنمایی کنید که حالا چه طور می شه این اعداد رو با هم جمع زد ؟

پیشاپیش خیلی ممنون به خاطر راهنماییتون ...

NjaNjooN
سه شنبه 13 فروردین 1387, 21:08 عصر
رو هر قسمت و روشی که تمرین می کنم جواب نمیده ...

ممنونم اگه یکی راهنماییم کنه ...

Nima_NF
چهارشنبه 14 فروردین 1387, 19:43 عصر
لطف می کنید و راهنمایی کنید که حالا چه طور می شه این اعداد رو با هم جمع زد ؟

وقتی زیر رشته ها را یافتید می توانید آن ها را از طریق atof به اعداد تبدیل و در یک متغیر float (یا آرایه ای از متغیر های اعشاری) ذخیره کنید، سپس می توانید به راحتی آن ها را با هم جمع کنید

NjaNjooN
پنج شنبه 15 فروردین 1387, 11:45 صبح
خیلی خیلی به خاطر راهنماییتون ممنونم ...

moh.mon
پنج شنبه 15 فروردین 1387, 12:06 عصر
لطف می کنید و راهنمایی کنید که حالا چه طور می شه این اعداد رو با هم جمع زد ؟
ایمیل بدید تا براتون برنامه رو بفرستم.

NjaNjooN
جمعه 16 فروردین 1387, 11:39 صبح
خیلی ممنون , خودم تونستم حلش کنم , راستشو بخواین من قسمت اول رو که تو صفحه پیش Nima_NF گذاشتن رو بلد بودم ... مونده بودم چه طور میشه جمع زد که با راهنمایی ایشون متوجه شدم .

ممنون از همتون ...