hardjob

اول برنامج الة حاسبة + تصميم واجهة للبرنامج

9 ردود في هذا الموضوع

السلام عليكم ورحمة الله

انا مبتدأ في لغة c

وحاولت برمجة الة حاسبة رغم انها بسيطة اردت ان اطرحها

المرجو اعطائي رأيكم فيها


#include <stdio.h>
#include <stdlib.h>

int main()
{
long note;
printf("si tu veux la somme (+) ecrivez 1 \nsi tu veux la soustraction (-) ecrivez 2 \nsi tu veux le produit (*) ecrivez 3 \nsi tu veux la division (/) ecrivez 4 \n");
scanf("%ld",&note);
long nombrel;
printf("premier nombre \n");
scanf("%ld",&nombrel);
long nombrez;
printf("deusieme nombre \n");
scanf("%ld",&nombrez);
switch(note){
case 1 :
printf("%ld + %ld= %ld\n",nombrel,nombrez,nombrel+nombrez);
break;
case 2 :
printf("%ld - %ld= %ld\n",nombrel,nombrez,nombrel-nombrez);
break;
case 3 :
printf("%ld * %ld= %ld\n",nombrel,nombrez,nombrel*nombrez);
break;
case 4 :
printf("%ld / %ld= %ld\n",nombrel,nombrez,nombrel/nombrez);
break;


default :
printf("impossible de calculer cela !!\n");
break;




}













system("PAUSE");
return 0;
}




سؤال هل هدا البرنامج يمكنني ان اجعله نافدة يعني لا يبقى بالكنسول وانما كبقية البرامج الاخرى يعني فيه ازرار ... ؟؟

في انتظار ارائكم وشكراا

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
المرجو اعطائي رأيكم فيها

الكود ممتاز ... وكتابتك مرتبة بارك الله فيك ...

سؤال هل هدا البرنامج يمكنني ان اجعله نافدة يعني لا يبقى بالكنسول وانما كبقية البرامج الاخرى يعني فيه ازرار ... ؟؟

لا تستعجل أخي الكريم ... بالتأكيد يمكنك ذلك ولكن في العجلة الندامة ...

عليك انهاء الأساسيات في اللغة ...وبعد ذلك انتقل إلى الواجهات ... فهذا أفضل ..

أرجو لك التوفيق..

والسلام عليكم ورحمة الله ويركاته

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الكود ممتاز ... وكتابتك مرتبة بارك الله فيك ...

لا تستعجل أخي الكريم ... بالتأكيد يمكنك ذلك ولكن في العجلة الندامة ...

عليك انهاء الأساسيات في اللغة ...وبعد ذلك انتقل إلى الواجهات ... فهذا أفضل ..

أرجو لك التوفيق..

والسلام عليكم ورحمة الله ويركاته

شكرا لك اخي المهم انك طمئنتني انه يمكنني دلك

اشكرك مرة اخرى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

أهلا بك أخي الكريم في منتديات الفريق العربي للبرمجة :)

إليك ملاحظاتي على الكود بشكل سريع :

  • القيمة التي يحملها المتغير note عبارة عن رقم واحد و بالتالي النوع المناسب له ليس long و إنما short (استخدامك لــ long يعني استهلاك مساحة من الذاكرة لن تحتاج إليها)
  • استخدم الرموز الخاصة بالعمليات الحسابية و ليس الأرقام 1,2,3,4 (في هذه الحالة سيكون النوع الأفضل للمتغير note هو char)
  • إذا قام المستخدم بالقسمة على الصفر سينهار برنامجك (لذا عليك إضافة if-else للتأكد من قيمة المتغير الثاني)
  • عند الوصول إلى default سيتم الخروج من switch بشكل تلقائي لذا لا داعي لاستخدام break.
  • عند التعامل مع الــ Primitive Types يجب دائما التأكد من عدم حدوث OverFlow قبل إجراء العملية المطلوبة.
  • في النسخة القادمة من الكود حاول كتابة آلة حاسبة تدعم الأقواس.

عندما تنتهي من تصحيح الملاحظات السابقة, سأخبرك بما يجب عليك فعله للإنتقال إلى برمجة الواجهات.

أرجو لك التوقيق.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

أهلا بك أخي الكريم في منتديات الفريق العربي للبرمجة :)

إليك ملاحظاتي على الكود بشكل سريع :

  • القيمة التي يحملها المتغير note عبارة عن رقم واحد و بالتالي النوع المناسب له ليس long و إنما short (استخدامك لــ long يعني استهلاك مساحة من الذاكرة لن تحتاج إليها)
  • استخدم الرموز الخاصة بالعمليات الحسابية و ليس الأرقام 1,2,3,4 (في هذه الحالة سيكون النوع الأفضل للمتغير note هو char)
  • إذا قام المستخدم بالقسمة على الصفر سينهار برنامجك (لذا عليك إضافة if-else للتأكد من قيمة المتغير الثاني)
  • عند الوصول إلى default سيتم الخروج من switch بشكل تلقائي لذا لا داعي لاستخدام break.
  • عند التعامل مع الــ Primitive Types يجب دائما التأكد من عدم حدوث OverFlow قبل إجراء العملية المطلوبة.
  • في النسخة القادمة من الكود حاول كتابة آلة حاسبة تدعم الأقواس.

عندما تنتهي من تصحيح الملاحظات السابقة, سأخبرك بما يجب عليك فعله للإنتقال إلى برمجة الواجهات.

أرجو لك التوقيق.

شكرا لك اخي سعدت بدعمك

جاري التعديل

+ مالم افهمه هو

[*]عند التعامل مع الــ Primitive Types يجب دائما التأكد من عدم حدوث OverFlow قبل إجراء العملية المطلوبة.

+ كيف يمكنني ان اجعل الاقواس ف البرنامج ؟

[*]في النسخة القادمة من الكود حاول كتابة آلة حاسبة تدعم الأقواس.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كل متغير له قيمة صغرى و قيمة عظمى من البيانات التي يتعامل معها ليقوم بتخزينها و لا يمكنه تخزين أكبر من القيمة العظمى و لا أقل من القيمة الصغرى. يحدث الــ OverFlow عندما يتم إسناد قيمة أكبر من القيمة العظمى و يحدث الــ UnderFlow عندما يتم إسناد قيمة أقل من القيمة الصغرى. في كلتا الحالتين لن يتم تخزينة المُسندة و ستخزن بدلا منها قيمة أُخرى ..

بالنسبة للــ Primitive Types فتعني الأنواع البدائية الموجودة في اللغة مثل :

short, int, long, char, bool, float, double ..

كيف يمكنني ان اجعل الاقواس ف البرنامج ؟

السؤال مُوجه إليك أنت الآن :)

فكر في الطريقة المناسبة التي تجعل حاسبتك قادرة على حساب نتيجة عبارة مثل :

(4+5*2)-13/4

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كل متغير له قيمة صغرى و قيمة عظمى من البيانات التي يتعامل معها ليقوم بتخزينها و لا يمكنه تخزين أكبر من القيمة العظمى و لا أقل من القيمة الصغرى. يحدث الــ OverFlow عندما يتم إسناد قيمة أكبر من القيمة العظمى و يحدث الــ UnderFlow عندما يتم إسناد قيمة أقل من القيمة الصغرى. في كلتا الحالتين لن يتم تخزينة المُسندة و ستخزن بدلا منها قيمة أُخرى ..

بالنسبة للــ Primitive Types فتعني الأنواع البدائية الموجودة في اللغة مثل :

short, int, long, char, bool, float, double ..

السؤال مُوجه إليك أنت الآن :)

فكر في الطريقة المناسبة التي تجعل حاسبتك قادرة على حساب نتيجة عبارة مثل :

(4+5*2)-13/4

لقد عدلت على كل شيء

ما تبقى لي هو كيفية برمجة الة حاسبة تدعم الاقواس

4 ايام وانا احاول

--------------------------------------------------------------

ممكن تقل لي فقط المبدأ او مادا ينقصني ويجب ان اعرفه

لاني مازلت لم ادرس لغة c كاملة

------------------------------------------------------------

في انتظارك وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لقد عدلت على كل شيء

ما تبقى لي هو كيفية برمجة الة حاسبة تدعم الاقواس

طيب, ضع هنا النسخة الجديدة التي تحتوي على التعديلات التالية :

  • القيمة التي يحملها المتغير note عبارة عن رقم واحد و بالتالي النوع المناسب له ليس long و إنما short (استخدامك لــ long يعني استهلاك مساحة من الذاكرة لن تحتاج إليها)
  • استخدم الرموز الخاصة بالعمليات الحسابية و ليس الأرقام 1,2,3,4 (في هذه الحالة سيكون النوع الأفضل للمتغير note هو char)
  • إذا قام المستخدم بالقسمة على الصفر سينهار برنامجك (لذا عليك إضافة if-else للتأكد من قيمة المتغير الثاني)
  • عند الوصول إلى default سيتم الخروج من switch بشكل تلقائي لذا لا داعي لاستخدام break.
  • عند التعامل مع الــ Primitive Types يجب دائما التأكد من عدم حدوث OverFlow قبل إجراء العملية المطلوبة.

ممكن تقل لي فقط المبدأ او مادا ينقصني ويجب ان اعرفه

برمجة آلة حاسبة تدعم الأقواس تحتاج إلى مستوى متوسط إلى متقدم و يجب أن تكون متمكن جدا من المؤشرات.

هذا مثال بسيط كتبته لك ع السريع, حاول أن تستفيد منه :

#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

/**
*
* @author [email protected]
*/

typedef enum fn_id {
bad_id, sin_id, cos_id
} fn_id;

double eval_factor(char const* exp, char const** end);
double eval_term(char const* exp, char const** end);
double eval_exp(char const* exp, char const** end);

int error_occured = 0;

void error(char const* msg, char const* remainder) {
if (!error_occured) {
printf("%s at: %s\n", msg, remainder);
error_occured = 1;
}
}

char const* skipws(char const* exp) {
while (isspace((int) (unsigned char) *exp)) {
exp++;
}
return exp;
}

fn_id getfn(char const** x) {
if ((*x)[0] == 's' && (*x)[1] == 'i' && (*x)[2] == 'n' && !isalpha((*x)[3])) {
(*x) += 3;
return sin_id;
} else if ((*x)[0] == 'c' && (*x)[1] == 'o' && (*x)[2] == 's' && !isalpha((*x)[3])) {
(*x) += 3;
return cos_id;
} else {
error("Bad function name", *x);
while (isalpha(**x)) {
++(*x);
}
return bad_id;
}
}

double eval_factor(char const* exp, char const** end) {
double result;
exp = skipws(exp);
if (*exp == '(') {
result = eval_exp(exp + 1, end);
if (**end != ')') {
error("missing closing parenthesis", *end);
} else {
++*end;
}
} else if (*exp == '+') {
result = eval_factor(exp + 1, end);
} else if (*exp == '-') {
result = -eval_factor(exp + 1, end);
} else if (isalpha(*exp)) {
switch (getfn(&exp)) {
case sin_id:
result = sin(eval_factor(exp, end));
break;
case cos_id:
result = cos(eval_factor(exp, end));
break;
case bad_id:
break;
}
} else {
char* endptr;
result = strtod(exp, &endptr);
*end = endptr;
if (*end == exp) {
error("invalid number", *end);
}
}
return result;
}

double eval_term(char const* exp, char const** end) {
double result = eval_factor(exp, end);
*end = skipws(*end);
while (**end == '*' || **end == '/') {
char const* op = *end;
double factor = eval_factor(*end + 1, end);
if (*op == '*') {
result *= factor;
} else if (factor != 0.0) {
result /= factor;
} else {
error("divide by 0.0", op);
}
*end = skipws(*end);
}
return result;
}

double eval_exp(char const* exp, char const** end) {
double result = eval_term(exp, end);
*end = skipws(*end);
while (**end == '+' || **end == '-') {
char const* op = *end;
double term = eval_term(*end + 1, end);
if (*op == '+') {
result += term;
} else {
result -= term;
}
*end = skipws(*end);
}
return result;
}

double eval(char const* exp) {
char const* end;
double result = eval_exp(exp, &end);
if (*end != '\0') {
error("trailing data after the expression", end);
}
return result;

}

int main() {
error_occured = 0;
char const* exp = "((2*6)+9*(7+3)-5)/6 + sin(4)";
double result = eval(exp);
if (!error_occured)
printf("%s = %.20g\n", exp, result);
return 0;
}

بالتوفيق.

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما شاء الله ...بارك الله فيك أخي [email protected]

تكتب parser عالسريع ...والأخ لم يطلب سوى فكرة بسيطة ... جزاك الله خيرا وبارك لك في وقتك ..

والكود مرتب ومفهوم ... سأقوم يتطويره قليلاً وتوثيقه وأضعه هنا خلال ثلاثة أيام بإذن الله ...

والله ولي التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .