View Full Version : سوال: نحوه محاسبه عبارات محاسباتی
sara_mp
جمعه 13 اسفند 1389, 20:44 عصر
با سلام
در مورد نحوه محاسبه یه عبارت محاسباتی میشه یه کم توضیح بدید مثلا یه برنامه که یه عبارت رشته ای بر فرض 2*3+5/6 رو بگیره و جواب رو محاسبه کنه البته منظور من این رشته که مثال زدم نیست بلکه هر رشته ای میتونه باشه . اگه یه راهنمایی بفرمایید ممنون میشم.:لبخندساده:
حامد مصافی
جمعه 13 اسفند 1389, 21:31 عصر
یعنی اینکه یک رشته رو به عنوان ورودی دریافت کنه؟ گمان میکنم همینطور باشه و با همین فرض جواب میدم:
این سه راه داره:
۱) نوشتن یک parser
این راه نیاز به توضیح بیشتری ندارد. با زحمت و مشقت زیاد یک برنامه برای درک این عبارات بنویسید که بعید میدانم توجیه داشته باشد.
۲) استفاده از چهار چوب هایی که دارای امکان script نویسی هستند.
یکی از بهترین این فریم ورک ها qt است که در آن با QtScript میتوانید امکان اجرای اسکریپت ها را به دست آورید این اسکریپت ها (مانند رشته مثال شما) میتوانند حتی توسط برنامه تولید شوند و مجری اسکریپت آن را اجرا میکند.
۳)استفاده از زبان های واسط
راه دیگر آن استفاده از زبان های مفسری یا توکار مانند پایتون و lua است نرم افزار بلندر از پایتون استفاده میکند و نرم افزار های زیادی از lua استفاده میکنند. lua یک زبان مفسری است که بوسیله کتابخانه مربوطه از c++ اجرا میشوند.
sara_mp
جمعه 13 اسفند 1389, 21:38 عصر
ممنون از راهنماییتون ولی راه حل ساده تری وجود نداره ؟
سروش ربیعی
جمعه 13 اسفند 1389, 21:55 عصر
سلام
لازم نیست اینقدر پیچیده بنویسید! با استفاده از الگوریتم Shunting-Yard عبارت رو به حالت postfix یا prefix دربیارید. پرانتز نداره. ارزیابی این عبارتها خیلی ساده هست. مخصوصاً حالت postfix.
مثلاً بعد از اعمال الگوریتم Shunting-Yard یا همون Dijikstra روی عبارت
(a+b)^c-d^e
خروجی به شکل
ab+c^de^-
در خواهد اومد. ارزیابی این عبارت خیلی ساده هست. شما در هر مرحله باید دنبال الگوی oop بگردید که هر o یک عملوند و هر p یک عملگر هست. بعد از محاسبهٔ این سهتاییها نتیجه رو تو رشته جایگزین کنید. این کار رو میتونید با استفاده از یه پشته انجام بدید.
sara_mp
سه شنبه 17 اسفند 1389, 11:21 صبح
ببینید دوستان این یه برنامه ساده است و من نمیخام از مباحثی مانند پشته یا تبدیل infix به postfix استفاده کنم من فقط میخام ورودیم یه عبارت محاسباتی باشه اونم با اعداد تک رقمی مثلا 2+4*5/8 وبدون پرانتز و برنامه اون رو برام حساب کنه و خروجی بده اولویت عملگر ها هم مهم نیست .
sara_mp
سه شنبه 17 اسفند 1389, 15:39 عصر
هیچ کس نیست کمک کنه :ناراحت:
sara_mp
چهارشنبه 18 اسفند 1389, 14:39 عصر
ببخشیدا ولی این سوال اینقدر سخته یا اصلا جواب نداره تو رو خدا کمک یکی یه کمکی بکنه:گریه::ناراحت:
amin1softco
چهارشنبه 18 اسفند 1389, 16:11 عصر
نه سوالش خیلی آسونه ولی یک راه دیگه ام داره که با طرح ماشین تورینگ حلش کرد مثلاً رشته رو سرچ کنی کارکتر به کارکتر و تا رسیدی به یک عملگر اونو روی قبلی و بعدیش بنویسی اما این کارم مشکلات خودش رو داره همون روش درختی بهتره
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
//Structures
struct node
{
int value;
char op;
char type;
node* next;
node* prev;
};
//Prototypes
void printlist(node*);
int main()
{
char s[50], x;
node *eqhead, *eqtemp;
eqhead = new node;
eqtemp = eqhead;
while(s[0] != '=')
{
cin >> s;
if (isdigit(s[0]))
{
x = atoi(s);
eqtemp->value = x;
eqtemp->type = 'n';
}
else
{
eqtemp->op = s[0];
eqtemp->type = 'o';
}
eqtemp->next = new node;
eqtemp = eqtemp->next;
}
system("PAUSE");
return 0;
}
//Functions
void printlist(node* pltest)
{
for (node* p = pltest; p; p=p->next)
{
cout << "Node address: " << p
<< " Value: " << p->value << " Operator: " << p->op << " Next node: "
<< p->next << endl;
}
cout << endl;
}
Arcsinos
جمعه 20 اسفند 1389, 13:14 عصر
فکر کنم برنامه ای که اینجا (http://arcsinos.blogfa.com/post-124.aspx) نوشتم کارتو را بندازه .
quiet_programmer
جمعه 20 اسفند 1389, 19:00 عصر
با سلام.
خوب با این شرطی که گذاشتی(اعدا تک رقمی هستن و اولویت هم مهم نیست) یه راحتی میتونی کاراکتر به کاراکتر از رشته رو بخونی بعد عمل لازم رو روی اون انجام بدی. مثلا در ابتدا یه کاراکتر میخونه، خوب مطمئنا یه عدده بعد یه کاراکتر دیگه که باز به طور قطع یه عملگره و بعد یه کاراکتر دیگه که به طور قطع عدده بعد اون عملگر رو روی اون دوتا عدد اعمال کن نتیجه رو نگهداری کن و بعد باز یه کاراکتر دیگه و ....(البته اونجایی که گفتم به طور قطع عدد یا عملگره به این شرط که ما تو رشته مون عملگر یونری نداشته باشیم. در غیر این صورت برنامه یخورده(خیلی کم) پیچیده میشه.)
البته اگه متوجه نشدین بگین تا یه شبه کد براتون بزارم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.