السلام عليكــم ورحمـة الله وبركاتــه ،،
اعضاء الفريق العربي للبرمجه :
يعطيكم الف عااافيه ممكن تساعدوني بشرح مفصل عن arithmetic statements
وكيفيه كتابه كود للمعادلات :مثل a=x+((a+b)*c+d)+y
باستخدام المكدسات بلغه c++
السلام عليكــم ورحمـة الله وبركاتــه ،،
اعضاء الفريق العربي للبرمجه :
يعطيكم الف عااافيه ممكن تساعدوني بشرح مفصل عن arithmetic statements
وكيفيه كتابه كود للمعادلات :مثل a=x+((a+b)*c+d)+y
باستخدام المكدسات بلغه c++
مشكور اخي مو مو على الاهتمام
بجد شرح رائع :lol:
أعتقد أنك تبحثين عن شيء آخر. طالما للموضوع علاقة بالتعابير والمكدس فأغلب الظن أنك تبحثين عن الـexpressions evaluation بمعنى لو أعطيتي البرنامج النص :
(1 + 2 ) * 4
فسيحسبه ويطبع 12.
إن كان كذلك, فيلزمك أولاً التخلص من الأقواس وتحويل التعبير الرياضي إلى التمثيل البولندي polish notation أو الـpostfix كي يُمكن إستخدام المُكدس معه.
في التمثيل الرياضي العادي, والمسمى prefix, لتمثيل عملية جمع رقمين مثل 1 و 2 وضرب الناتج بـ3 فسنكتب :
(1 + 2 ) * 5
لايوجد في التمثيل البولندي أقواس حيث يُمثل التعبير السابق بـ :
1 2 + 5 *
ويُمكن حينها حساب تلك العملية في البرنامج هكذا (سنتجاهل المسافات):
1- سينظر البرنامج للجزء الأول من اليسار, 1. طالما أنه رقم فسيدفعه للمكدس.
2- وسينظر للجزء الثاني, 2, طالما طالما أنه رقم فسيدفعه للمكدس.
المكدس الآن يحتوي :
+---+ | 2 | +---+ | 1 | +---+
3- سينظر للجزء الثالث, +. طالما انه عملية جمع رياضية , فسيسحب الرقمين الموجودة في المكدس ويجمعما ويضع الناتج في المكدس.
المكدس الآن يحتوي :
+---+ | 3 | +---+
4- سينظر للجزء الرابع, 5. طالما أنه رقم فسيدفعه للمكدس.
المكدس الآن يحتوي :
+---+ | 5 | +---+ | 3 | +---+
5- سينظر للجزء الخامس, *. طالما انه عملية ضرب رياضية , فسيسحب الرقمين الموجودة في المكدس ويجمعما ويضع الناتج في المكدس.
المكدس الآن يحتوي :
+----+ | 15 | +----+
النص إنتهى, ناتج تلك العملية 15.
ماتحتاجين لعمله:
قبل البدء يلزمك فهم كيف يُمكنك تحويل تمثيل رياضي عادي prefix إلى التمثيل البولندي أو الـpostfix.
مراجع :
http://www.cs.man.ac.uk/~pjj/cs212/fix.html
http://www.programmerinterview.com/index.php/general-miscellaneous/postfix-vs-prefix/
كتابة دالة تحول من prefix إلى postfix.
وكتابة دالة تأخذ الـpostfix الناتج وتحسبة بالطريقة التي ذكرت.
إنظري لهذه الصفحة فستفيدك : http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29#Expression_evaluation_and_syntax_parsing
هذا برنامج , بشع بس يعطي الفكرة, كتبته لحساب الـpostfix (ينقص الجزء الأول الخاص بالتحويل) :
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <stack>
using namespace std;
int eval_postfix(const char *);
int main(int argc, char **argv)
{
int result = 0;
// Test: case 1
if( (result = eval_postfix("1 2 +")) == 3 )
cout << "succeed: '1 + 2' = " << result << endl;
else
cout << "failed : '1 + 2' =" << result << endl;
// Test: case 2
if( (result = eval_postfix("100 2 * 4 /")) == 50)
cout << "succeed: '(100 * 2) / 4' = " << result << endl;
else
cout << "failed : '(100 * 2) / 4' =" << result << endl;
// Test: case 3
if( (result = eval_postfix("10 2 + 10 1 - *")) == 108)
cout << "succeed: '(10 + 2) * (10 - 1)' = " << result << endl;
else
cout << "failed : '(10 + 2) * (10 - 1)' = " << result << endl;
return 0;
}
int eval_postfix(const char *postfix)
{
char temp_string[256];
unsigned int index = 0;
int x = 0;
int y = 0;
stack<int> stk;
while(*postfix != '\0') {
if( isdigit(*postfix) ) {
index = 0;
do {
temp_string[index++] = *postfix++;
} while( isdigit(*postfix) );
temp_string[index] = '\0';
index = 0;
stk.push(atof(&temp_string[0]));
}
else if(*postfix == '+' ||
*postfix == '-' ||
*postfix == '*' ||
*postfix == '/' ||
*postfix == ' ') {
switch(*postfix) {
case '+':
y = stk.top();
stk.pop();
x = stk.top();
stk.pop();
stk.push(x + y);
break;
case '-':
y = stk.top();
stk.pop();
x = stk.top();
stk.pop();
stk.push(x - y);
break;
case '*':
y = stk.top();
stk.pop();
x = stk.top();
stk.pop();
stk.push(x * y);
break;
case '/':
y = stk.top();
stk.pop();
x = stk.top();
stk.pop();
stk.push(x / y);
break;
case ' ':
break;
}
}
else {
cout << "Unknown postfixeation '" << *postfix << "'." << endl;
}
*postfix++;
}
return stk.top();
}تم تعديل هذه المشاركة بواسطة Mr.B في 5 أكتوبر 2012 في 20:50
مشكور اخي على هذا الشرح المميز يعطيك الف عااافيه
بس اني اريد برنامج يكون اذا ادخلت له المعادله يرتبها
مثلا ادا ادخلت
a=x+((a+b)*c+d)+y
يكون out put كدا
z1=a+b
Z2=z1*c+d
a=x+z2+y
وسامحوني تعبتكم معايا :blush:
تم تعديل هذه المشاركة بواسطة المتألقه في 5 أكتوبر 2012 في 22:27
لم يسبق أن جربت عمل هذا. مثل هذه العملية لاأعتقد أن المكدس يُستخدم هنا, في العادة تستخدم شجرة البيانات tree data structure إنظري لهذه الصفحة.
جربي أن تبحثين في قوقل عن tree expression evaluation.