15

25 - سلسلة تبسيط البرمجة – برنامج قالب الاحتمالات المتعددة

25 - سلسلة تبسيط البرمجة – برنامج قالب الاحتمالات المتعددة

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

بسم الله الرحمن الرحيم

عودة على المثال في نهاية الدرس السابع لدينا :


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

فبدلا من الصيغة المطولة أصبحت تقول له

خمسة سبعة جمع فيجيب اثنا عشر أي

5 7 + => 12

8 2 - => 6

3 5 * => 15

9 3 / => 3


ونريد أن نحول هذه العملية إلى برنامج بحيث يستقبل مدخلين أرقام و رمز للعملية فيعطينا ناتج تطبيق العملية على الأرقام لذا سنكتب البرنامج التالي :

Module Module1

    Sub Main()
        Dim FirstNumber, SecondNumber As Integer
        Dim Operation As Char
        Dim Result As Double
        Dim Comment As String

        Console.Clear()
        Console.WriteLine("Type the first number ?")
        FirstNumber = Console.ReadLine()

        Console.Clear()
        Console.WriteLine("Type the second number ?")
        SecondNumber = Console.ReadLine()

        Console.Clear()
        Console.WriteLine("Type the operation ?")
        Console.WriteLine("+ for addition")
        Console.WriteLine("- for subtraction")
        Console.WriteLine("* for multiplication")
        Console.WriteLine("/ for division")
        Console.WriteLine()

        Operation = Console.ReadLine(0) ' استقبال أول رمز في حال إدخال أكثر من رمز

        Select Case Operation
            Case "+" ' العملية جمع
                Result = FirstNumber + SecondNumber
                Comment = FirstNumber & " + " & SecondNumber & " = " & Result
            Case "-" ' العملية طرح
                Result = FirstNumber - SecondNumber
                Comment = FirstNumber & " - " & SecondNumber & " = " & Result
            Case "*" ' العملية ضرب
                Result = FirstNumber * SecondNumber
                Comment = FirstNumber & " * " & SecondNumber & " = " & Result
            Case "/" 'العملية قسمة
                Result = FirstNumber / SecondNumber
                Comment = FirstNumber & " / " & SecondNumber & " = " & Result
            Case Else ' العملية غير معروفة
                Comment = "Operation is unknown."
        End Select

        Console.Clear()
        Console.WriteLine(Comment)

        Console.Read()
    End Sub

End Module

ابتدأنا البرنامج بتعريف المتحولات التي ستلزمنا خلال البرنامج

أولها تعريف متغيرين من النوع رقم صحيح ونلاحظ هنا أننا أسميناها أسماء تعبر عن وظيفتها بدلا من أن نكتبها كرموز مبهمة

وذلك لكي نعود أنفسنا أن نتعامل مع أسماء معبرة بحيث تسهل فهم البرنامج بالنسبة لنا عند مراجعته أو بالنسبة للآخرين سيما عندما تكبر البرامج

يليه تعريف متغير من النوع رمز Char والرمز هو رمز مفرد يعبر عن أحد رموز الأسكي وحجمه بايت واحد

ويختلف عن السلسلة الرمزية String أن الأخير هو سلسلة من الأول أي مصفوفة منه

لذا يمكن أن يحتوي أي عدد من الرموز المتسلسلة والتي تعبر عن النصوص

المتغير الثالث هو من النوع العدد الكسري Double و وظيفته حفظ النتيجة وقد احتجنا لهذا النوع لأن ناتج القسمة قد لا يكون صحيحا أي عددا عشريا

المتحول الآخير هو من النوع نص أو سلسلة رموز لأننا نريد أن يحتوي النص الذي سنخرجه على الشاشة بالنسبة لكل عملية

نلاحظ أننا استخدمنا إجراء جديد تابع لصنف Console و هو الإجراء Clear() و من اسمه يتبين أنه يقوم بعملية مسح أو تنظيف وفعلا وظيفته أن يمسح كل شيء ظاهر على الشاشة ليعيدها كما لو أنها فتحت أول مرة

والغاية هي أن يتم التركيز على الإدخال الجديد بعد أن ننتهي من الإدخال السابق

ثم يلي ذلك طلب إدخال العدد الأول وحفظه في المتحول المخصص له

ثم نمسح الشاشة وندخل العدد الثاني

ثم نمسح ونطلب إدخال رمز العملية ونظهر الخيارات كتوضيح للمستخدم

بعد إدخال العملية نأخذ الرمز الأول فقط ولهذا وضعنا صفر بين قوسي الإجراء لكي يتجاهل بقية النص في حال أدخل بعد الرمز فراغ أو شيء آخر

كما نلاحظ أننا أضفنا كتابة بالعربي ويظهر لونها أخضر ضمن محرر الكود

وهذا يسمى بالبرمجة التعليقات Comments ووظيفته إضافة تعليقات وشروحات ولا يعني للكود شيئا أي أنه عند الترجمة يتجاهل المترجم كل التعليقات

لأن التعليقات عملها فقط أثناء الكود

والتعليق يتم بكتابة رمز الفاصلة العلوية ' ثم ما يليه كله يعتبر تعليق ولهذا يجب أن لا يأتي أي تعليمة بعده لأن المحرر سيحوله لتعليق

والتعليق مهم جدا لعمليات التوثيق وذلك من أجل تسهيل مراجعة وتصحيح وتطوير الكود فيما بعد وخاصة عندما يكون هناك فريق عمل أو يتسلم الأمر مبرمج آخر

بعد أن أنهينا الإدخالات يأتي قسم الاحتمالات المتعددة وهي قالب تعليمة Select Case

و وظيفته أن يفحص قيمة المتغير الذي نريد أن يحدد سير التنفيذ

وفي مثالنا هو العملية Operation حيث لدينا عدة احتمالات إما أن يكون أحد العمليات الأربع وإما أن يكون احتمال غيرها

تأتي ضمنا الخيارات Case يليها الاحتمالات

وأثناء تنفيذ البرنامج ينتقل التنفيذ إلى البلوك الذي يطابق الرمز أو القيمة التي يحتويها المتغير Operation

وبعد أن نضع كل الاحتمالات يكون آخر شيء الاحتمال الاحتياطي أو الاضطراري Case Else وهو يعني أنه في حال كانت قيمة المتغير لا تطابق أي من الاحتمالات السابقة ينتقل التنفيذ إلى هنا

نلاحظ أننا داخل بلوك كل احتمال قمنا بحساب الناتج عن تطبيق العملية المختارة على الرقمين ووضعها في المتغير Result

وكذلك وضعنا النص المناسب والذي نريد إظهاره للتعبير عن النتيجة وحفظناه في المتغير Comment وهو من النوع String

لكي نظهره بعد الانتقال من بلوك Select Case كاملا

أنوه أن مجرد دخول التنفيذ إلى أحد البلوكات ضمن Select فإنه ينفذ ما بداخله ثم يخرج مباشرة إلى التعليمة التي تلي End Select و ذلك لأنه لن يكون للمتغير أكثر من احتمال واحد في نفس اللحظة أي مثلا يستحيل أن يكون الرمز المدخل جمع و ضرب بنفس اللحظة لأنه رمز وحيد

وحتى في حال عدم مطابقة الرمز المدخل للاحتمالات كلها فإنه سينتقل إجباريا إلى الاحتمال الآخير وهو Case Else لنضع داخل عبارة أن العملية غير معروفة ونحفظها بالمتحول كومينت نفسه

بعد الخروج من بلوك الاحتمالات نقوم بمسح الشاشة وإظهار التعليق الذي حفظناه

جربوا البرنامج مع إدخال عدة عمليات و كذلك بإدخال رموز غير العمليات الأربع

الواجب :

إضافة احتمال خامس لإيجاد النسبة المئوية للعدد الأصغر من الأكبر

بمعنى أن يكون أحد الرموز المعرفة هو % بحيث عندما يدخل إلى البلوك الخاص به يفحص أيهما أصغر فيقسمه على الأكبر ويظهر النتيجة كنسبة مئوية

وأدعكم بحفظ الله

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

السلام عليكم

مشاركتى بلغة ++c

#include <iostream>

using namespace std;

int main()
{
int x1,x2;
float result;
char op;
cout<<"enter first integer number"<<endl;
cin>>x1;
cout<<"enter second integer number"<<endl;
cin>>x2;
cout<<"enter an operator"<<endl;
cin>>op;
switch(op)
{
case '+':
cout<<"result="<<x1+x2<<endl;
break;
case '-':
if (x1>x2)
 cout<<"result="<<x1-x2<<endl;
break;
case '*':
 cout<<"result="<<x1*x2<<endl;
break;
case '/':
if(x2!=0)
cout<<"result="<<x1/x2<<endl;
if(x2==0)
 cout<<"result="<<"infinite"<<endl;
break;
case '%':
cout <<"result="<<x1%x2<<endl;
break;
default :
cout<<"you enter sth wrong , please check it "<<endl;
break;
}
return 0;

}

ما شاء الله نشيط !

حبذا لو تنسخ الكود منسق كما هو بالمحرر ليكون أوضح للفهم

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

ساكرر المحاولة

انا اعمل بالصيدلية بالفترة الليلية لذا اتواجد الان

تم إنجاز الواجب

Module Module1

Sub Main()
    Dim FirstNumber, SecondNumber As Integer
    Dim Operation As Char
    Dim Result As Double
    Dim Comment As String

    Console.Clear()
    Console.WriteLine("Type the First number")
    FirstNumber = Console.ReadLine()

    Console.Clear()
    Console.WriteLine("Type the second number")
    SecondNumber = Console.ReadLine()

    Console.Clear()
    Console.WriteLine("Type the operation")
    Console.WriteLine("+ for addition")
    Console.WriteLine("- for substraction")
    Console.WriteLine("* for multiplication")
    Console.WriteLine("/ for division")
    Console.WriteLine("% for percentage")
    Console.WriteLine()

    Operation = Console.ReadLine(0) 'أدخل أول رمز في حالة تعدد الإدخالات

    Select Case Operation
        Case "+" ' عملية الجمع
            Result = FirstNumber + SecondNumber
            Comment = FirstNumber & "+" & SecondNumber & "=" & Result
        Case "-" 'عملية الطرح
            Result = FirstNumber - SecondNumber
            Comment = FirstNumber & "-" & SecondNumber & "=" & Result
        Case "*" 'عملية الجداء
            Result = FirstNumber * SecondNumber
            Comment = FirstNumber & "*" & SecondNumber & "=" & Result

        Case "/" 'عملية القسمة
            Result = FirstNumber / SecondNumber
            Comment = FirstNumber & "-" & SecondNumber & "=" & Result

        Case "%" 'النسبة المئوية
            If FirstNumber < SecondNumber Then
                Result = FirstNumber / SecondNumber * 100
                Comment = FirstNumber & "%" & SecondNumber & "=" & Result
            ElseIf FirstNumber > SecondNumber Then
                Result = SecondNumber / FirstNumber * 100
                Comment = SecondNumber & "%" & FirstNumber & "=" & Result
            Else
                Comment = "This request has not been the case" ' لم تطلب في التمرين هذه الحالة

            End If


        Case Else 'عملية غير معروفة
            Comment = "operation is unknown"

    End Select

    Console.Clear()
    Console.WriteLine(Comment)

    Console.ReadLine()





End Sub

End Module

ولدي سؤال

ما هو الفرق بين if و case ؟

هل لهما نفس الخصائص ؟ أم أن هناك ما يميز case عن الشرطية if ؟

لو لاحظت العناوين فقد ميزنا بين الشرط و الشرط المتعدد وقالب الاحتمالات

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

أما case فهي تفحص قيمة المدخل وتقارنه مع الحالات المتوفرة لديه فأي منها طابق القيمة ينفذ البلوك التابع له ثم يخرج

وفي حال لم يجد أي حالة مطابقة يذهب إلى الحالة الافتراضية default في حال وُجدت

وإلا يخرج من بلوك case دون أن ينفذ شيء ويتابع سير البرنامج بشكل طبيعي

طبعا يمكن تمثيل case من خلال تعليمة الشرط المتعدد if else_if else

هناك بعض الفروقات

فمثلا في لغة #C يجب أن تكون قيم الحالات ثوابت const و لا يقبل متغيرات

بينما في تعليمة الشرط تستطيع أن تقارن ما تشاء

على البايثون

firstNumber=int(input("أدخل الرقم الأول: "))
secondNumber=int(input("أدخل الرقم الثاني: "))

print("اختر إحدى هذه العمليات: ")
print("+ للجمع")
print("- للطرح " )
print("* للجداء")
print("/ للقسمة" )
print("% النسبة المئوة")

operation=input()

if operation=="+": # عملية الجمع
    result=firstNumber + secondNumber
    print(firstNumber, "+" , secondNumber, "=" ,result)

elif operation=="-": # عملية الطرح
    result=firstNumber - secondNumber
    print(firstNumber, "-" , secondNumber, "=" ,result)

elif operation=="*": # عملية الجداء
    result=firstNumber * secondNumber
    print(firstNumber, "*" , secondNumber, "=" ,result)

elif operation=="/": # عملية القسمة
    result=firstNumber / secondNumber
    print(firstNumber, "/" , secondNumber, "=" ,result)

elif operation=="%": # عملية النسبة المئوية
    if secondNumber >firstNumber:
        result=firstNumber / secondNumber * 100
        print(firstNumber, "%" , secondNumber, "=" ,result)
    else:
        result=secondNumber / firstNumber * 100
        print(secondNumber, "%" , firstNumber, "=" ,result ) 

else: 
    print("المرجو إدخال إجدى العمليات المقترحة")

وأريد ان أسئل المجتمع

هل هناك مكافئ ل select case على البايثون

ونفس السؤال بالنسبة ل clear()

لا أدري ولكن if elif else أظن يمكنها أن تؤدي الغرض

كنت اريد منك بعض المساعدة لانى مبتدا فى البرمجة

انا بدات بمعرفة المتغيرات والمعاملات والدوال وبنى التحكم بنوعيها وطبقت عدة امثلة عليهم

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

بمعنى اخر ما يلزمنى لابدا فى التعامل بعد console application

كما اريد كتب او دروس للمبتدئين عن algorithms + data structures

لو امكن تدلنى على بعض الكتب و المواقع لابدا منها

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

هذه السلسلة لتضع من لا يعلم شيء عن البرمجة على بداية الطريق

أما ما تتحدث عنه أنت فهو يعتبر مرحلة تالية أو دورات ودروس للمبتدئين

هذه السلسلة كنت قد كتبتها منذ زمن وتتوقف عند الدرس 30

ولا أستطيع القطع بأني أستطيع الإكمال وذلك حسب الوقت المتاح

فيما يخص المصادر قد يتطلب منك البحث هنا وهناك أو أن تضع سؤالا في أكثر من موقع

وإن كانت لغتك الأجنبية جيدة فهناك الكثير من الكورسات

أما العربية فلا أعرف لأن ++C خارج مجالي الآن

المحاولة مرة اخرى

#include <iostream>

using namespace std;

int main()

{ int x1,x2; float result; char op; cout<<"enter first integer number"<>x1; cout<<"enter second integer number"<>x2; cout<<"enter an operator"<>op; switch(op) { case '+': cout<<"result="<x2) cout<<"result="<<x1-x2<<endl; break; case '': cout<<"result="<<x1x2<<endl; break; case '/': if(x2!=0) cout<<"result="<<x1/x2<<endl; if(x2==0) cout<<"result="<<"infinite"<<endl; break; case '%': cout <<"result="<<x1%x2<<endl; break; default : cout<<"you enter sth wrong , please check it "<<endl; break; } return 0;

}

ليتنى لم احاول

الا يمكن حذف هذة المشاركة؟

لا مشكلة

لا يحتاج إدراج أربع فراغات لكل سطر على حدا

عندما يكون بالمحرر للفيجوال

حدد الكود كامل ثم انقر Tab سيحشر تاب أي أربع فراغات لكل الأسطر

بعدها انسخه وضعه هنا

طبعا لا تنسى أن يكون سطر فارغ قبل أول سطر

مثال :

#include <iostream>

using namespace std;

int main()
{
    int x1, x2;
    float result;
    char op;
    cout << "enter first integer number" << endl;
    cin >> x1;
    cout << "enter second integer number" << endl;
    cin >> x2;
    cout << "enter an operator" << endl;
    cin >> op;
    switch (op)
    {
    case '+':
        cout << "result=" << x1 + x2 << endl;
        break;
    case '-':
        if (x1 > x2)
            cout << "result=" << x1 - x2 << endl;
        break;
    case '*':
        cout << "result=" << x1*x2 << endl;
        break;
    case '/':
        if (x2 != 0)
            cout << "result=" << x1 / x2 << endl;
        if (x2 == 0)
            cout << "result=" << "infinite" << endl;
        break;
    case '%':
        cout << "result=" << x1%x2 << endl;
        break;
    default:
        cout << "you enter sth wrong , please check it " << endl;
        break;
    }
    return 0;

}

مقدمة السلسلة

الدرس السابق 24

الدرس التالي 26

هذا البرنامج طريقة رائعة لتقديم مفاهيم البرمجة الأساسية بينما يعلم أيضًا بعض الرياضيات العملية! إضافة حساب النسبة المئوية لمسة ذكية تجعلها أكثر تنوعًا. أنا فضولي حول كيفية التعامل مع الحالات الحدية، مثل عندما تكون الأرقام صفر أو سالبة. هل فكرت أيضًا في توسيعها أكثر مع عمليات أكثر تعقيدًا أو ربما واجهة رسومية في المستقبل؟ عمل رائع بشكل عام!