الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه hardjob في 18 ديسمبر 2012 · 8 رد · 2,132 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

انا مبتدأ في لغة 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
اقتباس
المرجو اعطائي رأيكم فيها

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

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

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

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

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

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

2
#3
مصطفى 36a2 كتب:

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

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

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

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

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

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

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

#4

السلام عليكم

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

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

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

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

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

1
#5
Sn@CkeR كتب:

السلام عليكم

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

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

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

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

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

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

جاري التعديل

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

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

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

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

#6

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

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

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

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

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

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

(4+5*2)-13/4
1
#7
Sn@CkeR كتب:

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

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

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

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

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

(4+5*2)-13/4

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

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

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

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

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

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

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

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

#8
اقتباس
لقد عدلت على كل شيء

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

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

اقتباس
  • القيمة التي يحملها المتغير 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 Sn@CkeR
 */

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
#9

ما شاء الله ...بارك الله فيك أخي Sn@cker

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

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

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

مواضيع مشابهة