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

برنامج أله حاسبة أتمنى التقييم(بلغة c++) طلع عينى

رائج
بدأه ringawy في 3 يناير 2011 · 5 رد · 31,578 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

هذا أول برنامج لى بهذا الحجم (لأنى مبتدى) :wacko: (الكود مكتوب على برنامج dev c++)

وهو عبارة عن أله حاسبة بسيطة أتمنى تعجبكم وقابلنى بهذا البرنامج مشاكل كثيرة (لأنى مبتدى)

مثل عملية التحقق من المدخلات إذا كانت صحيحة ام لا

وأيضا عملية القسمة خاصة لأنها من الممكن أن تحتوى على كسور لذلك يجب معاملتها على أساس ذلك

والحمد لله أستطعت حلها

أنتظر التقييم وتصحيح الأخطاء وهل هو سهل للمستخدم العادى أم لا يصح أن يطلق علية برنامج أساسا :lol:

تفضلو الكود

#include<iostream>
using namespace std;
int main()
{
    int a,b=0;
    float c,d=0;
    char proc;
    cout<<"simple c++ calculator program\n==============================\n";
    cout<<"hi user please Enter Two number :)\nnow you can Enter frist number a= ";
    cin>>a;
    if(cin.fail()==true)
    {
    cout<<"Error please input number\n";
    system("pause");
    return 0;
    }
    else
    cout<<"now you can Enter scond number b= ";
    cin>>b;
    if(cin.fail()==true)
    {
    cout<<"Error please input number\n";
    system("pause");
    return 0;
    }
    else
    cout<<"you can use + for addition \n";
    cout<<"you can use - for subtraction\n";
    cout<<"you can use * for multiplication\n";
    cout<<"you can use / for division\n";
    cout<<"input your choice =";
    cin>>proc;

    switch (proc)
    {
           case '+':cout<<"("<<a<<"+"<<b<<")= "<<a+b<<endl;break;
           case '-':cout<<"("<<a<<"-"<<b<<")= "<<a-b<<endl;break;
           case '*':cout<<"("<<a<<"*"<<b<<")= "<<a*b<<endl;break;
           case '/':{
                if(b!=0)
                {
                c=(float)a;
                d=(float)b;
                cout<<"("<<c<<"/"<<d<<")= "<<c/d<<endl;
                }
                else
                cout<<"Error"<<a<<"/0 Wrong\n";};break;
                default:cout<<"Wrong choice you can choice between(-,+,*,/)\n";break;
    }
    system("pause");
    return 0;
}
3
#2

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

مرحبا بأخي الحبيب و صديقي الغالي, اشتقت إليك و الله :happy:

بداية .. أحب أن أهنئك على هذا العمل البرمجي الأكثر من رائع .. و الذي يدل على أن مستواك البرمجي قد تطور كثيرا ... مقارنة مع آخر لقاء بيننا قبل أشهر ...

اقتباس
مثل عملية التحقق من المدخلات إذا كانت صحيحة ام لا

توجد عدة طرق للتحقق من صحة الإدخال, بعضها مُعرّف مسبقا و البعض الآخر من اكتشافك أنت !, و أحيانا تحتاج إلى استخدام طريقة جديدة من أجل أن تتفادى بعض العيوب الواقعة في الطرق المُعرفة مُسبقا ! (سأوضح أكثر في فقرة الملاحظات)

اقتباس
وأيضا عملية القسمة خاصة لأنها من الممكن أن تحتوى على كسور لذلك يجب معاملتها على أساس ذلك

يمكنك استخدام طريقة أفضل (مثل الـ catsting) للتعامل مع الناتج الكسري و ذلك بافتراض أنك تجري العملية بين عددين صحيحين و إلا فلا حاجة لك باستخدام الـ casting ! (سأوضح أكثر في فقرة الملاحظات)

اقتباس
هل هو سهل للمستخدم العادى أم لا يصح أن يطلق علية برنامج أساسا

إذا كان الكود البرمجي يحتوي على أكثر من ألف سطر برمجي (على الأقل) فيمكنك تسميته بـ "برنامج" !, أما ما دون ذلك فأفضل أن نُطلق عليه إسم "الكود البرمجي الذي ينتج عنه ملف تنفيذي !"

بالمناسبة, سبق و أن مررت بمحاولة كهذه (أثناء بعض التدريبات البرمجية) مع بعض التحفظات ! :P :lol:

++++++++++++++++++

سأعرض لك ملاحظاتي على عجالة و لو وجدت وقتا أكثر لكانت الملاحظات أكثر تفصيلا ...

1. بما أن الكود يحاكي آلة حاسبة فمن الأفضل الإعلان عن المتغيرين a,b كـ float لكي يكون بإمكان المستخدم إجراء العمليات الحسابية بين الأعداد الكسرية, لاحظ أن الكود لا يمكنه حساب 7.4+9.1 !

2. أعجبني استخدامك للدالة cin.fail من أجل التحقق من صحة المُدخلات و لكن لا تنسى أن هذه الدلة قاصرة نسبيا !, عند إدخال عدد كسري في بداية تنفيذ البرنامج فسيتم إسناد القيمة المُدخلة إلى المتغير a ولكن لا تنسى أن القيمة المُسندة إلى a هي الجزء الصحيح فقط (هنا يكمن العيب !, عندما نُسند قيمة كسرية إلى متغير صحيح فسيتم أخذ الجزء الصحيح من القيمة المُسندة و الباقي سيظل مُخزنا في الــ buffer, تذكر دائما أن طريقة إسناد القيم الكسرية إلى المتغيرات الصحيحة تكون هكذا !). من اجل التخلص من هذه المشكلة يمكنك استخدام المؤشرات مع الدالة cin.getline إضافة إلى أحد أفراد عائلة الـ ATOX, أقصد الدالة atof

3. لماذا لم تتحقق من صحة إدخال الحرف المُسند للمتغير proc !؟

4. بالنسبة لهذه الجزئية :

d=(float)b;  c=(float)a;
 cout<<"("<<c<<"/"<<d<<")=  "<<c/d<<endl;

لا داعي للإعلان عن متغيرين من نوع float لأن هذا سيستهلك الذاكرة أكثر, بافتراض أن المتغيرين a,b من النوع int, كان من الأفضل أن تكتب هكذا :

cout<<"("<<a<<"/"<<b<<")= "<<(float)a/b<<endl;

5. لاحظتُ أنك تستخدم أحيانا الرمز \n بدلا من الدالة endl التي توفرها السي++ (من أجل الرجوع إلى بداية السطر) و هذا يُعتبر خلطا بين اللغتين ... لا طائل من ورائه !

6. أيضا يمكنك استخدام الرمز \a لتنبيه المستخدم عند حدوث خطأ.

7. لاحظت أنك وضعت الأمر break بعد الحالة default و هذا تحصيل حاصل !, فالحالة default هي الأخيرة من switch و عند الوصول إليها سيتم الخروج من القرار switch حتى لو لم تضع break !

8. حاول دائما أن تكون لك بصمة برمجية تضعها كختم على برامجك في المستقبل !, بما أنك الآن ما زلت مسجونا في زنزانة الكونصول (و اسمح لي على التعبير !) فأنصحك باستخدام switch تحتوي على ثلاثة خيارات :

الأول : من أجل رؤية مختلف خيارات البرنامج (الدخول إلى الحاسبة)

الثاني : عن المبرمج (تضع فيه معلومات خاصة بك, مثل الإيميل و الإسم و اللقب و العمر و رقم الهاتف و ....)

الثالث : من أجل الخروج من البرنامج (إذا ضغط المستخدم على حرف معين سيتم إغلاق النافذة)

بالنسبة للإخوة الذين لم يدرسوا السي++, إليكم الكود بلغة السي :

#include<stdio.h>
#include<conio.h>
int main()
{
    int a,b;
    char proc;

    printf("simple c++ calculator program\n==============================\n");
    printf("hi user please Enter Two number :)\nnow you can Enter frist number a= ");

    if(!scanf("%d",&a))
    {
       printf("Error please input number\a");
       getch();
       return 0;
    }

    printf("now you can Enter scond number b = ");
    if(!scanf("%d",&b))
    {
       printf("Error please input number !\a");
       getch();
       return 0;
    }

    printf("you can use + for addition.\n");
    printf("you can use - for subtraction.\n");
    printf("you can use * for multiplication.\n");
    printf("you can use / for division.\n");
    printf("input your choice : ");
    proc = getche();
    putchar('\n');

    switch(proc)
    {
           case '+' : printf("%d + %d = %d\n",a,b,a+b);break;
           case '-' : printf("%d - %d = %d\n",a,b,a-b);break;
           case '*' : printf("%d * %d = %d\n",a,b,a*b);break;
           case '/' :
               {
                    if(b!=0)
                       printf("%d / %d = %f\n",a,b,(float)a/b);
                    else
                       printf("Error\a %d/0 Wrong\n",a);
                }break;
           default : printf("Wrong choice you can choice between(-,+,*,/)\a\n");
    }
    getch();
    return 0;
}

و في الأخير, لا يسعني ألا أن أهنئك من جديد على هذا العمل البرمجي الأكثر من رائع :wink: و أرجو لك المزيد من التقدم و إلى الأمام دائما يا صديقي الغالي :wub:

بانتظار برنامجك القادم على أحر من الجمر ! :)

2
#3

كنت مستنى ردك دا من زمان هههههههههههه (أشتقت لرؤية مواضيعك يا صديقى)

كل ما أشوف ردك فى أى موضوع يا أحمد بكون متأكد إنى هطلع بمعلومة جديدة

فعلا التعديلات الى ذكرتها كويسة جدا وإن شاء الله سوف أضعها أمام عينى المرة القادمة

منتظرين عودتك فى المنتدى لأكمال الدورة إن شاء الله

وجزاك الله عنا خيرا

#4

ما شاء الله برنامجك او مثل ما حكى الاخ احمد الكود رائع و بداية جيدة للاحتراف بالبرمجة

و مشكور اخ احمد على ملاحظاتك الي كل واحد قراتها رح يستفيد منها و ليس فقط صاحب الكود ringawy

#5

شكرا لك صمت الفراشات وأتمنى تستفيد من البرنامج إن شاء الله

وأسعدنى مرورك

#6
اقتباس
الثالث : من أجل الخروج من البرنامج (إذا ضغط المستخدم على حرف معين سيتم إغلاق النافذة)

كيف اكتب هالطريقه ب لغة السي ++؟؟؟

ومشكورين استفدت كثير

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…