السلام عليكم ورحمة الله
يوجد لدي استفسار بسيط
كيف اجعل المستخدم يدخل عمليه في المتغير
مثلا لدي المتغير length اريد المستخدم ان يدخل مثلا 4+5 (عمليه وليس عدد فقط)؟؟..
..وجزاكم الله خير..
السلام عليكم ورحمة الله
يوجد لدي استفسار بسيط
كيف اجعل المستخدم يدخل عمليه في المتغير
مثلا لدي المتغير length اريد المستخدم ان يدخل مثلا 4+5 (عمليه وليس عدد فقط)؟؟..
..وجزاكم الله خير..
الفكر بالكود التالى ....
/*
* File: main.cpp
* Author: Mohammed Abu Zayed
* Created on May 30, 2012, 08:11 PM
*/
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv)
{
string operation;
cout << "Enter like 1+400: ";
cin >> operation;
// .... verifaction and conversion code here ...
cout << operation;
return 0;
} // end of mainالمخرجات:
Enter like 1+400: 16+10 16+10 RUN SUCCESSFUL (total time: 4s)
لكن استخلاص الارقام والعلامات على حدا يمكنك استخدام فكرة المتراصة لعمل آلة حاسبة من تعمل من سطر الاوامر بأدخال عملية مباشرة مثل 20+10*10 وتعطيك النتيجة....
جزيت خيرا
لكن هنا عندما طبقت الكود المخرج كان 4+5 نفس المدخل انا اريد المخرج 9
تم تعديل هذه المشاركة بواسطة هدوء المطر في 31 مايو 2012 في 21:58
هدوء المطر كتب:السلام عليكم ورحمة الله
يوجد لدي استفسار بسيط
كيف اجعل المستخدم يدخل عمليه في المتغير
مثلا لدي المتغير length اريد المستخدم ان يدخل مثلا 4+5 (عمليه وليس عدد فقط)؟؟..
..وجزاكم الله خير..
لا أعتقد أنه بإمكاننا إدخال عملية حسابية لمتغير
فكل متغير يحجز عددا من البايتات في الذاكرة ولا يمكننا تجاوز هذا العدد
فمثلا عندما نقوم بكتابة
unsigned char a=3;
فإننا نحجز في هذه الحالة 2octets و توضع داخل هذا المتغير القيمة 3
printf("%d",(int)sizeof(short int));و إذا افترضنا أنك تردين كتابة 2+3 على هذا المتغير ولو أن ذلك غير ممكن حقيقة
فسنحجز مكانا للرقم 2 و بعد ذلك نحجز مكانا ل '+'و أخيرا نحجز ل 3 أي أننا قمنا في هذه الحالة قد حجزنا 6octets
وبذلك نكون قد تجاوزنا عدد البايتات المحجوزة سلفا للقيمة a و التي عددها 2 بايتات
وهذه صورة رسمتها بنفسي ستوضح لك الفكرة أكثر

تم تعديل هذه المشاركة بواسطة مومو (momo) في 31 مايو 2012 في 23:56
i love you mama
هذه العملية تسمى evaluation وﻻ تقوم بها C++ بل يلزم معرب لغوي parser. إذا كانت العملية التي سيدخلها المستخدم مجرد رقمين وعملية رياضية , 1 + 3 , فهذا معرب بسيط :
#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
using namespace std;
float eval(string opr) {
// أزل جميع المسافات من النص.
opr.erase(remove(opr.begin(), opr.end(), ' '), opr.end());
string first;
string second;
char oper;
bool done_first = false;
int i;
for( i = 0 ; i < opr.length() ; i++ ) {
// إعثر على الرقم الأول والرقم الثاني حيث أن 57 = '9', 49 = '0'.
if( opr <= 57 && opr >= 48 ) {
if(done_first == false) {
first += opr;
}
else {
second += opr;
}
}
// إعثر على العملية الرياضية.
else if(opr == '+' || opr == '-' || opr == '*' || opr == '/') {
oper = opr;
done_first = true;
}
else {
// في حال لم يكن المدخل عدد أو عملية رياضية, إدخال خاطئ, أرفع إستثناء "خطأ".
throw 0;
}
}
// أجر العملية الرياضية إعتماداً على العملية الرياضية المدخلة وأعدها.
switch(oper) {
case '+':
return atof(first.c_str()) + atof(second.c_str());
break;
case '-':
return atof(first.c_str()) - atof(second.c_str());
break;
case '*':
return atof(first.c_str()) * atof(second.c_str());
break;
case '/':
return atof(first.c_str()) / atof(second.c_str());
break;
}
}
int main(void) {
string user_input;
float number;
// إختبار.
cout << "Enter: ";
getline(cin, user_input);
try {
number = eval(user_input);
cout << number << endl;
} catch(int e) {
cout << "Error: Bad input format" << endl;
}
return(0);
}$ ./a.out Enter: 2 + 1 3 $ ./a.out Enter: 4-2 2 $ ./a.out Enter: 2 * 5 10 $ ./a.out Enter: 10 /2 5 $ ./a.out Enter: 2*dwef Error: Bad input format $
أما للعمليات الأكثر تعقيد , فتوجد مكتبات جاهزة لهذا الغرض. إطلعي على هذا السؤال. ذكر الكثير من أسماء المكتبات.
Mr.B كتب:هذه العملية تسمى evaluation وﻻ تقوم بها C++ بل يلزم معرب لغوي parser. إذا كانت العملية التي سيدخلها المستخدم مجرد رقمين وعملية رياضية , 1 + 3 , فهذا معرب بسيط :
أما للعمليات الأكثر تعقيد , فتوجد مكتبات جاهزة لهذا الغرض. إطلعي على هذا السؤال. ذكر الكثير من أسماء المكتبات.
+1 هذا ما كنت اقصدة ....
تم تعديل هذه المشاركة بواسطة AudaNix في 1 يونيو 2012 في 00:02
AudaNix
مومو (momo)
Mr.B
جزاكم الله كل خير وجعله في ميزان حسناتكم
ووفقكم لما يحب ويرضى
استفدت كثيرا منكم
الله يزيد بعلمكم