View Full Version : جواب ورودی های رشته ای
Rasul75
چهارشنبه 14 آبان 1393, 09:33 صبح
سلام به همه اساتید.
دوستان به مجموعه دستورات زیر چه کدهایی باید اضافه کنم تا بشود این نوع ورودی های رشته ای را جواب داد :
12+2/2+3/5
یا
20/4+10+3/6
main(){
string s;
cin>>s;
int x=s.find("+");
int y=s.find("/");
if(x!=-1)
{
string x1=s.substr(0,x);
string x2=s.substr(x+1,x);
int a=atoi(x1.c_str());
int b=atoi(x2.c_str());
cout<<a+b;
}
if(y!=-1)
{
string x1=s.substr(0,y);
string x2=s.substr(y+1,y);
float a=atoi(x1.c_str());
float b=atoi(x2.c_str());
cout<<a/b;
}
}
ali chegini
چهارشنبه 14 آبان 1393, 14:23 عصر
سلام . تو همین سایت جست و جو کن " ماشین حساب "
احتمالا مطالب مفیدی پیدا کنی.
Rasul75
چهارشنبه 14 آبان 1393, 17:45 عصر
من همین در این سایت و هم در کل اینترنت سرچ کردم ولی همه ورودی ها عددی بودند و رشته ای پیدا نکردم.
اگر شما سایتی را مدنظر دارید معرفی کنید.
iut.ali
چهارشنبه 14 آبان 1393, 19:51 عصر
واسه این کار باید از مفهوم درخت ها استفاده کنی در مورد درخت prefix بخون بعدش میفهمی چطوری میشه اینکارو انجام داد در ضمن این صفحه رو هم بخون چیزایی که گفته بی ارتباط به سوالت نیست
http://open-mind.ir/?p=771
rahnema1
چهارشنبه 14 آبان 1393, 21:21 عصر
این عبارت ساده را میشه بدون درخت حل حل کرد
می تونید از stringstream استفاده کنید
یک بار این عبارت را به صورت دستی حل کنید
مراحلی که ذهن شما در حل این عبارت انجام داد، مشابه اون را برای کامپیوتر پیاده سازی کنید
Rasul75
چهارشنبه 14 آبان 1393, 21:27 عصر
برای یه تازه کار میشه بیشتر توضیح بدید؟؟؟؟؟؟؟؟؟؟
rahnema1
چهارشنبه 14 آبان 1393, 21:30 عصر
خب شما بگید برای حل این عبارت با دست چه مراحلی انجام می دهید؟ ( جزء به جزء)
Rasul75
چهارشنبه 14 آبان 1393, 22:19 عصر
به طور مثال این عبارت :
12+2/7+8/3
اول 12 را با 2 جمع میکنم بعد جواب(14) رو تقسیم بر 7 میکنم که می شود 2 و جواب را با 8 جمع میکنم و تقسیم بر 3 می کنم که جواب آخر می شود 5.
می خوام وقتی این رشته رو به برنامه دادم جواب رو 5 بده فعلا هم از + و / استفاده کنه تا بعدا بهش - و * اضافه می کنم.
rahnema1
پنج شنبه 15 آبان 1393, 07:36 صبح
به طور مثال این عبارت :
12+2/7+8/3
اول 12 را با 2 جمع میکنم بعد جواب(14) رو تقسیم بر 7 میکنم که می شود 2 و جواب را با 8 جمع میکنم و تقسیم بر 3 می کنم که جواب آخر می شود 5. می خوام وقتی این رشته رو به برنامه دادم جواب رو 5 بده
نه دیگه نشد اینجور. با این منطقی که شما برای محاسبه عبارت استفاده کردید، جواب برابر 5 نمیشه ( با منطق درستش هم 5 نمیشه)
لطفا یه بار دیگه به صورت جزء به جزء شرح بدید. چون می خواهیم از روی اون مراحل بعدی را انجام بدیم ( لطفا کامل و دقیق بنویسید)
فعلا هم از + و / استفاده کنه تا بعدا بهش - و * اضافه می کنم.
بذارید اول اون مورد را درست کنیم بعد برسیم به + و *
satanix7
پنج شنبه 15 آبان 1393, 08:50 صبح
سلام
اون کدی که شما نوشتی با فرض اینکه عملگر + از / بیشتره انجام شده و با substring گرفتن یه جورایی دارید ساختار درختی رو پیاده می کنید ولی substring را باید به صورت recursive به همین تابع بدین تا زیر رشته رو براتون حساب کنه. اینطوری:
int CalculateString(string s)
{
int x=s.find("+");
int y=s.find("/");
if(x != -1 || y != -1 )
{
string x1=s.substr(0,x);
string x2=s.substr(x+1,x);
int a=CalculateString(x1);
int b=CalculateString(x2);
if ( x != 1)
return a+b;
else if (y != -1)
return a / b;
} else return atoi(s);
int main()
{
string input;
cin >> input;
int output = CalculateString(input);
cout << output;
return 0;
}
Rasul75
پنج شنبه 15 آبان 1393, 12:11 عصر
به طور مثال این عبارت :
12+2/7+8/3
اول 12 را با 2 جمع میکنم:
12+2=14
بعد جواب(14) رو تقسیم بر 7 میکنم:
14/7=2
که می شود 2 و جواب را با 8 جمع میکنم:
2+8=10
و تقسیم بر 3 می کنم:
10/3=3.333
که جواب آخر می شود 3.333.
اشتباها دستم برو روی 5 خورد و متوجه نشدم اینم مراحل حل عبارت.
rahnema1
پنج شنبه 15 آبان 1393, 18:12 عصر
ببینید در این روش که شما استفاده کردید تقدم عملگرها را یکسان در نظر گرفتید.ضمن اینکه این روش شما خیلی راحت میشه برنامه اش را نوشت. کافیه در یک حلقه به ترتیب یک «عدد» و یک «عملگر» را اسکن کنید و حاصل هر مرحله را در یک متغیر ذخیره کنید و نیازی به find و substring ندارید
اما مشکل اینه که در هیچ ماشین حسابی ( حداقل تا اونجایی که من دیدم) جواب این عبارت برابر 3.333 نمیشه میتونید در ماشین حساب امتحان کنید
Rasul75
پنج شنبه 15 آبان 1393, 21:01 عصر
اگر روشی مدنظر دارید برام بذارید.
اگر با کامپایلر ++dev c بلدید که چه بهتر چون من با این نوع کامپایلر شروع به کار کردم.
من این عدد 3.333 رو گذاشتم که اعداد اعشاری هم استفاده شود چه در سوال و چه در جواب.
با ماشین حساب ویندوز که حساب کردم جواب همین میشد اما با تعداد اعشار بیشتر.
rahnema1
پنج شنبه 15 آبان 1393, 21:18 عصر
کامپایلرش مهم نیست مراحل کار را که درست پیش بریم با هر کامپایلر و یا زبانی میشه انجام داد
نمیدونم چه طور توی ماشین حساب عبارت را نوشتین جهت اطلاع شما جواب میشه :
12+2/7+8/3 = 14.952380952380952380952380952381
شما باید بگید چرا این میشه؟
Rasul75
پنج شنبه 15 آبان 1393, 21:46 عصر
چرا برای من اینجوری جواب میده؟؟؟؟
125376
125377
rahnema1
پنج شنبه 15 آبان 1393, 21:54 عصر
ماشین حساب را ببرید به حالت scientific
Rasul75
پنج شنبه 15 آبان 1393, 22:03 عصر
بله در حالت scientific جواب شمارا می دهد.
درضمن اصلا مهم نیست که کدوم عملگرها اولویت اولی داشته باشند کاربر هرچه عملگر داد از اول تا انتها خوانده و حل نماید.
rahnema1
پنج شنبه 15 آبان 1393, 22:07 عصر
همون طور که گفتم اگه بخواهید جواب 3.333 بده لازمه یک حلقه بنویسید و داخل اون یک عدد و یک عملگر را اسکن کنید و با توجه به عملگر مورد نظر عملیات مربوطه را انجام بدید
اینجا برای شما حلقه و اسکن کردن عملگر و عملوند را میذارم که چه طور چاپ میشه بقیه کارهاش ساده هست
#include <sstream>
#include <iostream>
using namespace std;
int main ()
{
stringstream s("12+2/2+3/5");
double Operand;
char Operator;
while (s)
{
s >> Operand;
s >> Operator;
cout << Operand << " " << Operator << endl;
}
}
Rasul75
پنج شنبه 15 آبان 1393, 22:16 عصر
خیلی ممنون واقعا عالی.
ولی اگر بخواهم کد اولی که بالا قرار دادم رو تغییر بدم چه کدهایی باید بهش اضافه کنم؟؟؟
آیا به صرفه هست؟؟؟
rahnema1
پنج شنبه 15 آبان 1393, 22:21 عصر
کد بالا را بی خیالش بشید
الان هم عملگر را دارید و هم عملوند
afg-general
پنج شنبه 29 آبان 1393, 15:51 عصر
سلام به همه اساتید.
دوستان به مجموعه دستورات زیر چه کدهایی باید اضافه کنم تا بشود این نوع ورودی های رشته ای را جواب داد :
12+2/2+3/5
یا
20/4+10+3/6
main(){
string s;
cin>>s;
int x=s.find("+");
int y=s.find("/");
if(x!=-1)
{
string x1=s.substr(0,x);
string x2=s.substr(x+1,x);
int a=atoi(x1.c_str());
int b=atoi(x2.c_str());
cout<<a+b;
}
if(y!=-1)
{
string x1=s.substr(0,y);
string x2=s.substr(y+1,y);
float a=atoi(x1.c_str());
float b=atoi(x2.c_str());
cout<<a/b;
}
}
میشه کار تابع find رو برام توضیح بدی....!؟
میشه داخل پرانتز بیشتر از یه عبارت قرار داد...!؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.