دورة Python للمبتدئين

5,5: البرمجة بلغة بايثون – مناقشة التطبيقات/التمارين

Python3.8

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

في هذا الموضوع سنراجع التطبيقات المطروحة في الدرس السابق و نحاول أن نفهمها و ننجزها.

على بركة الله نبدأ.

التطبيق الأول:

طُلب في التطبيق الأول كتابة برنامج يطلب من المستخدم إدخال أرقام محصورة بين 1 و 5.

في حالة ما إذا أدخل رقما أكبر قطعا من 5 أو أصغر قطعا من 1، يعيد البرنامج طلبَ إدخال رقمٍ حتى يُدخَل رقمٌ محصور بين 5 و 1، عندها يتوقف البرنامج.

إذا، تطبيقنا الأول يستلزم : دالة الإدخال input + حلقة تكرارية (لتكرار طلب الإدخال في حالة الخطأ، أي رقم لا ينتمي إلى [5-1] ) + دالة شرطية داخل الحلقة (أي يتم تكرار الحلقة فقط في حالة الخطأ).

يمكن كتابة الشفرة كالتالي:

number = input('Enter a number between 1 and 5: ')
number = int(number)

while True:
    if number < 1 or number > 5:
        number = int(input('Please try again: '))
    else:
        print('You entered: ',number)
        break

تحليل الشفرة:

قمنا أولا بطلب المستخدم أن يدخل رقما محصورا بين 1 و 5.

بعدها أنشأنا حلقة تكرارية While، و شرط تكرار الحلقة هو True. كيف هذا؟

True تعني صحيح، و كما قلنا سابقا، لا تشتغل الحلقة حتى يتحقق شرطها أولا، أي أن يكون صحيحاً. في هذه الحالة لدينا كلمة True لا تتغير، إذا فالحلقة ستشتغل دائما.

داخل الحلقة استعملنا صيغة الشرط if. الشرط هو أن يكون العدد أكبر قطعا من 5 أو أصغر قطعا من 1. إذا تحقق الشرط نظهر رسالة تطلب إدخال الرقم مجددا.

إذا أدخل المستخدم رقما خارج النطاق [5-1] ، فإن الدالة if ستعمل و تظهر الرسالة المكتوبة. و هكذا لن تشتغل الصيغة else (لأنها تشتغل إذا كان الشرط غير متحقق فقط). و سيتم تكرار الحلقة دائما.

و لكن عند إدخال رقم داخل النطاق المطلوب. فإن if لن تعمل، و ستعمل else عوضا عنها. و بالتالي ستظهر رسالة تبين للمستخدم الرقم الذي أدخله، و بعدها ستتوقف الحلقة بفضل الصيغة break.

إضافة:

إذا أردنا أن نعطي عدد فرص معين للخطأ. مثلا، إذا أخطا المستخدم في إدخال القيمة 3 مرات، لا يستطيع بعدها أن يدخل الرقم. يمكن أن نستعمل متغير إضافي كالتالي:

number = input('Enter a number between 1 and 5: ')
number = int(number)
e = 1
while e<3:
    e += 1
    if number < 1 or number > 5:
        number = int(input('Please try again: '))
    else:
        print('You entered: ',number)
        break

قد تجدون طرق أخرى لإنجاز التطبيقات، فكل واحد و له طريقة تفكير خاصة به. المهم هنا هو أن يتم تنفيذ ما هو مطلوب فقط، فما دامت الشفرة التي كتبتموها تنفذ المهمة بشكل جيد، فلا يهم كيف تم تصميمها.

التطبيق الثاني:

كتابة برنامج يطلب رقما عشوائيا من المستخدم، و يظهر له 10 أرقام تلي ذاك الرقم. مثلا إذا أدخل المستخدم 5، سيظهر له البرنامج الأرقام التي تليه من 6 إلى 15.

يمكن أن نكتبه بالطريقة التالية باستعمال for :

a = input('Please enter a random number: ')
a = int(a)
for i in range(0,10):
    a += 1
    print(a)

أو يمكن كتابته بالطريقة التالية باستعمال while :

a = input('Please enter a random number: ')
a = int(a)
s = 1
while s < 11:
    a += 1
    print(a)
    s += 1

إضافة بسيطة:

يمكن أن نظهر رسالة للمستخدم قبل إظهار الأرقام:

print('The 10 numbers following "',a,'" are: ')

هناك عيب بسيط في الطريقة أعلاه، و هو أن كتابة الفواصل بين الجمل و المتغير يُسبِّبُ في إنشاء مساحات إضافية بينهم. لحذف هذه المساحات، نستعمل الطريقة التالية:

print('The 10 numbers following "{}" are: '.format(a))

هذه الطريقة تسمح بإضافة المتغير في مكان اللامتين {} دون إضافة مساحة، و المتغير يُكتب داخل format().

أو يمكن كتابة الجملة هكذا:

print('The 10 numbers following "' + str(a) + '" are: ')

كما رأينا سابقا، يمكن الجمع بين النصوص باستعمال + . في هذه الحالة لا بد من تحويل المتغير a الذي يحتوي على قيمة عددية إلى نص حتى يُمكن جمعه مع باقي الجمل.

التطبيق الثالث:

يجب كتابة برنامج ينشئ قائمة جديدة تحمل الأرقام المزدوجة فقط من القائمة التالية :
[1, 4, 7, 12, 17, 33, 45, 50, 63, 68, 82, 91, 100]

يمكن كتابة الشفرة كالتالي:

list = [1, 4, 7, 12, 17, 33, 45, 50, 63, 68, 82, 91, 100]
newlist=[]

for i in list:
    if i%2 == 0:
        newlist.append(i)

print('The new list is: ', newlist)

التطبيق الرابع:

كتابة برنامج يطلب من المستخدم رقما و يظهر له جدول الضرب الخاص بهذا الرقم.

يمكن كتابة الشفرة كالتالي:

number = float(input('Enter a random number: '))
for i in range(1,11):
        print(number,'x',i,'=', number*i)

تم اختيار النوع float على أساس افتراض إمكانية إدخال عدد عشري من طرف المستخدم. يمكن أيضا استعمال فقط النوع int إذا كان برنامج جدول الضرب مخصص فقط للأعداد الصحيحة.

إضافة:

في هذه الحالة، عندما ندخل رقما صحيحا فإنه دائما سيظهر على الشكل التالي : مثل 3، ستظهر 3.0 ، و هذا بسبب النوع float.

إذا أردنا استعمال النوع float و لكن عدم إظهار الصفر بعد الفاصلة عندما يكون الرقم صحيحا، يمكن أن نستعمل الطريقة التالية:

number = float(input('Enter a random number: '))
for i in range(1,11):
    if int(number) == number:
        print(int(number),'x',i,'=', int(number)*i)
    else:
        print(number,'x',i,'=', number*i)

تحليل:

أضفنا الصيغة الشرطية if ذات الشرط int(number) == number . أي هل العدد المُدخل number يساوي الصيغة الصحيحة له؟

مثلا إذا أدخلنا 1.5، فلا يمكن تحقق المساواة بين الجزء الصحيح 1 و العدد العشري كاملا 1.5.

أما إذا أدخلنا رقما صحيحا فهنا تتحقق المساواة. عندها نحول العدد من النوع الحقيقي float إلى النوع الصحيح int حتى نتخلص من الصفر الزائد.

التطبيق الخامس:

كتابة برنامج يطلب من المستخدم رقما معينا، و عند إدخال الرقم يظهر البرنامج مجموع الأعداد الصحيحة من 1 بلوغا الرقم المُدخَل. إذا أدخل المستخدم 4 ، سيُظهر البرنامج النتيجة 10 (1+2+3+4 = 10).

يمكن كتابته كالتالي:

n = int(input('Please enter a random number: '))
a = 0
for i in range(1,n+1):
    a = i + a
print(a)

تحليل:

طلبنا إدخال رقم عشوائي من المستخدم. و أضفنا متغيرا آخر a ذو القيمة الأولية 0.

عرفنا نطاق تكرار الحلقة for باستعمال الدالة range و التي تحتوي على n+1 ، أي أنه سيتم إضافة 1 إلى الرقم الذي سيدخله المستخدم، و ذلك من أجل جعل الرقم n ضمن نطاق الحلقة for.

مثلا، إذا أدخلنا 5، النطاق يصبح range (1,6).

المتغير a سيمر من خلال المراحل التالية:

a = i + a
a = 1 + 0 = 1
a = 2 + 1 = 3
a = 3 + 3 = 6
a = 4 + 6 = 10
a = 5 + 10 = 15

التطبيق السادس:

كتابة برنامج لعبة حجر ورقة مقص. سيتم طلب قيمتين، افتراضا منا أن هناك مستخدمان. بعد مقارنة القيم المُدخَلة، سيظهر البرامج الفائز و يهنؤه.

البرنامج يمكن أن يُكتب بالطريقة التالية:

#Program Description:
print('This is a RSP game: ')
print('Enter 1 for rock, 2 for scissors, 3 for paper')

#Variables needed:
i = 0
aa = 0
bb = 0

#Start:
while i <3:
    i += 1
    a = input("Player ONE: ")
    b = input("Player TWO: ")
    if a == "1":
        if b == "1":
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b =="2":
            aa += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b == "3":
            bb += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

    elif a == "2":
        if b == "1":
            bb += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b =="2":
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b == "3":
            aa += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

    elif a == "3":
        if b == "1":
            aa += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b =="2":
            bb += 1
            print('P1 : {} - {} : P2'.format(aa,bb))

        elif b == "3":
            print('P1 : {} - {} : P2'.format(aa,bb))

#Showing results:

if aa > bb:
    print('The winner is Player one with a score of: ', aa)
elif aa < bb:
    print('The winner is Player two with a score of: ', bb)
elif aa == bb:
    print('DRAW: {} vs. {}'.format(aa,bb))

إضافة:

لتجنب تكرار سطر النتائج print(‘P1 : {} – {} : P2’.format(aa,bb)) ، يمكن استعمال دالة معينة نُعرفها بالطريقة التالية:

#Functions needed
def result():
    print('P1 : {} - {} : P2'.format(aa,bb))

#Program Description:
print('This is a RSP game: ')
print('Enter 1 for rock, 2 for scissors, 3 for paper')

#Variables needed:
i = 0
aa = 0
bb = 0

#Start:
while i <3:
    i += 1
    a = input("Player ONE: ")
    b = input("Player TWO: ")

    if a == "1" and b == "1":
        result()

    elif a == "1" and b =="2":
        aa += 1
        result()

    elif a == "1" and b == "3":
        bb += 1
        result()

    elif a == "2" and b == "1":
        bb += 1
        result()

    elif a == "2" and b =="2":
        result()

    elif a == "2" and b == "3":
        aa += 1
        result()

    elif a == "3" and  b == "1":
        aa += 1
        result()

#Showing results:

if aa > bb:
    print('The winner is Player one with a score of: ', aa)
elif aa < bb:
    print('The winner is Player two with a score of: ', bb)
elif aa == bb:
    print('DRAW: {} vs. {}'.format(aa,bb))

ملاحظة: يمكن الإطلاع على الدوال المُعرفة في الدرس التالي.

تحليل الشفرة:

في البداية أظهرنا للمستخدم اسم اللعبة، و ربطنا كل خيار برقم معين لتسهيل الأمر:
الحجر = 1 ، المقص = 2 ، الورق = 3

بعدها حددنا المتغيرات التي سنحتاج إليها:

  • المتغير i يسمح لنا بتحديد عدد الجولات، و في هذا المثال أخذنا عدد 3 جولات. أي بعد 3 جولات تنتهي اللعبة و تظهر النتيجة النهائية.
  • المتغير a يحمل قيمة الخيار الذي يختاره الاعب الأول.
  • المتغير b يحمل قيمة الخيار الذي يختاره الاعب الثاني.
  • المتغيران aa و bb يحملان نتيجة اللاعبين الأول و الثاني على التوالي.

لكل لاعب 3 خيارات. إذا اختار اللاعب الأول حجرة، فاللاعب الثاني يمكن أن يختار أمرا واحدا من 3 احتمالات: إما حجرة، أو ورقة، أو مقص.

إذا نضع الدالة الشرطية if و نحدد نتيجة اللاعبين حسب كل شرط:
– إذا اختار اللاعبان الشرط نفسه = تعادل
– إذا اختلف اختيار اللاعبان، نحدد نتيجة الجولة حسب الاختيارات. و هكذا

طرق هيكلة الدالة الشرطية if تختلف من شخص لآخر، إذ يمكن كتابتها بطرق مختلفة:

    if a == b:
        result()

    elif a == "1" and b =="2":
        aa += 1
        result()

    elif a == "1" and b == "3":
        bb += 1
        result()

    elif a == "2" and b == "1":
        bb += 1
        result()

    elif a == "2" and b == "3":
        aa += 1
        result()

    elif a == "3" and  b == "1":
        aa += 1
        result()

    elif a == "3" and b =="2":
        bb += 1
        result()

أو:

if a == b:
        result()

    elif a == "1":
        if b =="2":
            aa += 1
            result()

        if b == "3":
            bb += 1
            result()

    elif a == "2":
        if b == "1":
            bb += 1
            result()

    elif a == "2":
        if b == "3":
            aa += 1
            result()

    elif a == "3":
        if b == "1":
            aa += 1
            result()

    elif a == "3":
        if b =="2":
            bb += 1
            result()

أو طريقة أكثر قصرا:

    if a == b:
        result()

    elif a == "2" and b == "1" or a == "1" and b == "3" or a == "3" and b == "2":
        bb += 1
        result()

    elif a == "2" and b == "3" or a == "1" and b =="2" or a == "3" and b == "1":
        aa += 1
        result()

استنتاج:

كل هذه الطرق تؤدي نفس المهمة، و كلها جيدة. لكن من المفضل كتابة أقصر كود ممكن حتى تكون الشفرة واضحة بشكل عام و غير معقدة.

نهاية الدرس التكميلي للدرس السابق:

نرحب بأية استفسارات و طلبات في قسم التعليقات في الأسفل.

في الموضوع التالي سنناقش الدوال المُعرفة بحول الله.

السابق
5: البرمجة بلغة بايثون – Input statement و تطبيقات
التالي
6: البرمجة بلغة بايثون – Functions الدوال

تعليق واحد

أضف تعليقا

  1. التنبيهات : البرمجة بلغة بايثون: دورة خاصة بالمبتدئين - الدرس الخامس - شِفْرَة

شاركنا برأيك