مجموعة المسائل 1 — الفائدة المركبة
مجموعة المسائل 1: الفائدة المركبة (Compound Interest)
زميل مجموعة المسائل (Pset Buddy): لم يُعيَّن لك زميل لهذه المجموعة في النسخة المنشورة.
لا تحذف أيًا من تعليقات القالب المقدم، واستخدم أسماء المتغيرات المحددة أدناه لتحصل على الدرجة كاملة!
1) المقدمة (Introduction)
1.1) الأهداف (Objectives)
- التعرف إلى تدفق التحكم (Control Flow) في بايثون.
- صياغة حل حاسوبي لمشكلة.
- استكشاف البحث بالتنصيف (Bisection Search).
1.2) نظرة عامة (Overview)
- أكمل المسائل الثلاث في ملفات بايثون المقابلة:
ps1a.pyوps1b.pyوps1c.py. - أضف تعليقات تساعدنا على فهم كودك؛ اقرأ دليل الأسلوب (Style Guide) لتعليمات أدق.
ps1_tester.pyملف اختبار يمكنك تشغيله لاختبار كودك. تأكد من وجوده في المجلد نفسه معps1a.pyوps1b.pyوps1c.pyوput_in_function.py.
1.3) التعاون (Collaboration)
- يمكن للطلاب العمل معًا، لكن يجب أن يكتب كل طالب تكليفه ويسلّمه منفصلًا. لا يجوز للطلاب تسليم الكود نفسه تمامًا.
- يمكن للزملاء المعينين (Buddies) العمل معًا وتسليم الكود نفسه.
- لا يُسمح للطلاب بالنظر إلى كود بعضهم أو بنية كود بعضهم أو نسخها.
- أدرج أسماء من تعاونت معهم في تعليق في بداية كل ملف.
- راجع سياسة التعاون في معلومات المقرر لمزيد من التفاصيل.
1.4) ملاحظات مهمة
- اقرأ الأقسام 1 و2 و3 و4 من دليل الأسلوب.
- إذا ظهر خطأ مثل
ModuleNotFoundError: No module named 'ps1b_in_function'في أي وقت، فأعد تشغيل نواة Spyder. - احصل على إدخال المستخدم وعرّف المتغيرات تحت عناوين التعليقات الصحيحة في
ps1a.pyوps1b.pyوps1c.py. عدم الالتزام، مثل استخدام أسماء مختلفة حيث حُددت الأسماء أو تعريف المتغيرات تحت عناوين خاطئة، يؤدي إلى منح المصحح درجة صفر. - لا تحذف أو تغير أي تعليق مقدم في الملفات الأصلية الثلاثة.
- قد تشير التعليقات في أعلى الملفات المحملة إلى 6.100A، لأننا نستخدم الملفات نفسها تمامًا في 6.100A و6.100L.
2) الجزء A: الادخار لشراء منزل (Saving for a House)
تخرجت للتو من MIT وحصلت على وظيفة! تنتقل إلى منطقة خليج سان فرانسيسكو (Bay Area)، وتقرر بدء الادخار لشراء منزل. المنازل مرتفعة الثمن نسبيًا، فتبدأ الادخار لتوفير الدفعة المقدمة لمنزل أحلامك.
هدفك معرفة عدد الأشهر اللازمة لتوفير الدفعة المقدمة. تُحسب تكلفتها بضرب التكلفة الكلية لمنزل أحلامك في نسبة الدفعة المقدمة.
مدخلات المستخدم: اطلب المتغيرات التالية، وحوّلها إلى float. يجب تهيئتها بهذا الترتيب في بداية البرنامج، قبل تعريف متغيرات أخرى:
- الراتب السنوي الابتدائي:
yearly_salary. - نسبة الراتب المراد ادخارها:
portion_saved، بصيغة عشرية، مثل0.1مقابل 10%. - تكلفة منزل أحلامك:
cost_of_dream_home.
كتابة البرنامج: حدد عدد الأشهر اللازمة بناء على المعلومات التالية:
yearly_salary، كما سبق.portion_saved، كما سبق.cost_of_dream_home، كما سبق.portion_down_payment، نسبة التكلفة الكلية المطلوبة للدفعة المقدمة. افترضportion_down_payment = 0.25، أي 25%.- المبلغ المدخر حتى الآن هو
amount_saved، ويبدأ من صفر دولار. - تحصل على معدل عائد سنوي
r. أي أنك تتلقى في نهاية كل شهر مبلغًا إضافيًا قدرهamount_saved * (r/12)على مدخراتك؛ القسمة على 12 لأنrسنوي. افترضr = 0.05، أي 5%. - في نهاية كل شهر تزيد مدخراتك بمقدار: (1) نسبة من راتبك الشهري، و(2) العائد الشهري للاستثمار. مبلغ الاستثمار المستخدم لحساب العائد الشهري هو المبلغ المدخر عند بداية ذلك الشهر.
المخرج: خزّن عدد الأشهر المطلوبة لتوفير الدفعة المقدمة في متغير اسمه months.
ملاحظات:
- انتبه للقيم السنوية مقابل الشهرية.
- إذا كان عدد الأشهر خاطئًا بفارق شهر واحد، فأعد قراءة النص البارز أعلاه.
- افترض أن المستخدمين يدخلون قيمًا صحيحة؛ مثلًا لن يدخلوا نصًا عندما يُتوقع
float. - اطبع بالصيغة نفسها في حالات الاختبار التالية. قد ترى في Spyder أسطرًا إضافية بين المخرجات؛ لا تقلق بشأنها.
2.1) الاختبار (Testing)
2.1.1) حالات اختبار يدوية
الحالة 1:
Enter your yearly salary: 112000
Enter the percent of your salary to save, as a decimal: .17
Enter the cost of your dream home: 750000
Number of months: 97
الحالة 2:
Enter your yearly salary: 65000
Enter the percent of your salary to save, as a decimal: .20
Enter the cost of your dream home: 400000
Number of months: 79
الحالة 3:
Enter your yearly salary: 350000
Enter the percent of your salary to save, as a decimal: .3
Enter the cost of your dream home: 10000000
Number of months: 189
ملاحظة المترجم: نصوص الإدخال والإخراج النموذجية محفوظة بالإنجليزية لأنها جزء من مواصفات مطابقة الاختبارات: الراتب السنوي، نسبة الادخار العشرية، تكلفة المنزل، وعدد الأشهر.
2.1.2) أداة اختبار الطالب (Student Tester)
شغّل ps1_tester.py في المجلد نفسه مع ps1a.py وput_in_function.py. ينبغي أن تجتاز أول 3 حالات اختبار.
3) الجزء B: الادخار مع زيادة راتب (Saving with a Raise)
افترضنا في الجزء A أن راتبك لا يتغير مع الزمن. لكنك خريج MIT، ومن الواضح أن قيمتك للشركة ستزيد بمرور الوقت! سنبني هنا على حل الجزء A بإضافة زيادة راتب كل ستة أشهر. انسخ حلك من الجزء A إلى الأقسام المقابلة في ps1b.py.
مدخلات المستخدم: يوجد مدخل إضافي واحد. حوّل المدخلات إلى float، بهذا الترتيب، قبل تعريف متغيرات أخرى:
- الراتب السنوي الابتدائي
yearly_salary. - نسبة الراتب المدخرة
portion_saved. - تكلفة المنزل
cost_of_dream_home. - الزيادة نصف السنوية
semi_annual_raise، بنسبة عشرية، مثل0.1مقابل 10%.
كتابة البرنامج: احسب الأشهر اللازمة لتوفير الدفعة المقدمة. يمكنك إعادة استخدام قدر كبير من كود الجزء A. كالسابق، افترض عائدًا سنويًا r = 0.05، أي 5%، وportion_down_payment = 0.25، أي 25%. في هذه النسخة، يزيد yearly_salary بنسبة semi_annual_raise في نهاية كل ستة أشهر.
المخرج: كما في A، خزّن عدد الأشهر في months.
ملاحظات:
- كما في A، يُحسب العائد الشهري من المبلغ المدخر عند بداية كل شهر.
- انتبه للقيم السنوية مقابل الشهرية.
- تحدث الزيادات فقط في نهاية الشهر السادس، والثاني عشر، والثامن عشر، وهكذا.
- إذا اختلف عدد الأشهر بشهر واحد، فأعد قراءة النص البارز.
- افترض إدخالات صحيحة، دون نصوص مكان
float. - طابق صيغة المخرجات التالية، ولا تقلق من أسطر Spyder الإضافية.
3.1) الاختبار
3.1.1) حالات اختبار يدوية
الحالة 1:
Enter your starting yearly salary: 110000
Enter the percent of your salary to save, as a decimal: .15
Enter the cost of your dream home: 750000
Enter the semi-annual raise, as a decimal: .03
Number of months: 92
الحالة 2:
Enter your starting yearly salary: 350000
Enter the percent of your salary to save, as a decimal: .3
Enter the cost of your dream home: 10000000
Enter the semi-annual raise, as a decimal: .05
Number of months: 131
تعني الرسالة الإضافية طلب نسبة زيادة الراتب نصف السنوية بالصيغة العشرية.
3.1.2) أداة اختبار الطالب
شغّل ps1_tester.py في المجلد نفسه مع ps1b.py وput_in_function.py. ينبغي أن تجتاز الآن أول 5 حالات.
4) الجزء C: اختيار معدل فائدة (Choosing an Interest Rate)
استكشفت في A وB أثر (1) نسبة الراتب المدخرة كل شهر، و(2) الزيادة نصف السنوية، في مدة توفير الدفعة المقدمة، عند ثبات معدل العائد r.
في C، لدينا مبلغ ابتدائي ثابت وإمكانية اختيار معدل العائد r. هدفنا، انطلاقًا من إيداع ابتدائي، إيجاد أدنى معدل عائد يتيح توفير الدفعة المقدمة خلال 3 سنوات.
مدخل المستخدم: حوّله إلى float في بداية البرنامج: المبلغ الابتدائي في حساب الادخار initial_deposit.
كتابة البرنامج: احسب أدنى معدل r يحقق الدفعة المقدمة خلال 3 سنوات، بناء على initial_deposit. للتبسيط افترض:
- تكلفة المنزل 800,000 دولار.
- الدفعة المقدمة 25% من تكلفة المنزل.
استخدم صيغة الفائدة المركبة (Compound Interest) التالية لحساب المدخرات المتوقعة من r وinitial_deposit وmonths:
استخدم البحث بالتنصيف لتحديد أدنى معدل عائد يلزم لتحقيق دفعة مقدمة لمنزل ثمنه 800,000 دولار خلال 36 شهرًا. إصابة المبلغ تمامًا صعبة قليلًا، لذلك نطلب فقط أن يكون الفرق بين المدخرات والدفعة المطلوبة أقل من 100 دولار. مثلًا، إذا كانت الدفعة 1000 دولار، فينبغي أن يكون الإجمالي بين 900 و1100، دون الطرفين.
يجب أن يحدّث البحث قيمة r حتى تمثل أدنى معدل يتيح توفير الدفعة خلال 3 سنوات. ينبغي أن تكون r من نوع float، مثل 0.0704 مقابل 7.04%. افترض أنها بين 0% و100%، شاملًا الطرفين.
المخرجات:
- يعكس
stepsعدد خطوات البحث للحصول على أفضلr؛ أي عدد مرات تنصيف مجال الاختبار. - تكون
rأدنى معدل يتيح توفير الدفعة خلال 3 سنوات.
ملاحظات:
- قد توجد معدلات متعددة تعطي مبلغًا يختلف بأقل من 100 دولار عن الدفعة المطلوبة. يقبل المصحح أيًا منها.
- إذا كان الإيداع الابتدائي أكبر من الدفعة المطلوبة ناقص 100 دولار أو مساويًا لها، فأفضل معدل هو
0.0. - إذا تعذر توفير مبلغ ضمن هامش 100 دولار خلال 3 سنوات بمعدل بين 0% و100%، فأسند
Noneإلىr.Noneتختلف عن"None": الأولى قيمة بايثون الخالية (Null Value)، والثانية سلسلة نصية.
- قد يختلف عدد الخطوات قليلًا بحسب شرط التوقف وطريقة حساب المدخرات. تعطي أداة الاختبار مؤشرًا جيدًا إلى قرب العدد من الحل المتوقع.
- إذا استغرق اختبار وقتًا طويلًا، فقد تكون لديك حلقة لا نهائية! تحقق من شرط التوقف.
- طابق الصيغة التالية، ولا تقلق من الأسطر الإضافية في Spyder.
4.1) الاختبار
4.1.1) حالات اختبار يدوية
الحالة 1:
Enter the initial deposit: 65000
Best savings rate: 0.380615234375
Steps in bisection search: 12
المعدل وعدد الخطوات قد يكونان قريبين جدًا من هذين العددين بدلًا من مطابقتهما.
الحالة 2:
Enter the initial deposit: 150000
Best savings rate: 0.09619140625
Steps in bisection search: 11
قد يكون المعدل قريبًا جدًا من القيمة المعروضة، وقد يختلف عدد الخطوات بحسب تنفيذ البحث.
الحالة 3:
Enter the initial deposit: 1000
Best savings rate: None
Steps in bisection search: 0
قد يختلف عدد الخطوات بحسب التنفيذ. تعني الرسائل: الإيداع الابتدائي، أفضل معدل ادخار، وخطوات البحث بالتنصيف.
4.1.2) أداة اختبار الطالب
شغّل ps1_tester.py في المجلد نفسه مع ps1c.py وput_in_function.py. ينبغي اجتياز الحالات الثماني كلها.
5) إجراءات التسليم (Hand-in Procedure)
5.1) معلومات الوقت والتعاون
في بداية كل ملف اكتب أسماء من تعاونت معهم في تعليق، مثل:
# Problem Set 1A
# Name: Jane Lee
# Collaborators: John Doe
قدّر عدد الساعات التي قضيتها في المجموعة في صندوق السؤال المخصص.
5.2) التسليم المرحلي (Half-way Submission)
يجب على جميع الطلاب تسليم تقدمهم بحلول الموعد المرحلي، قبل النهائي بأسبوع. يساوي التسليم نقطة واحدة من درجة المجموعة، ولا يُقيَّم من حيث صحة الحل. الهدف أن تتقدم بثبات بدلًا من العمل في الأيام الأخيرة فقط.
يمكنك رفع إصدارات جديدة من ملفات المجموعة، اختر أي ملف واحد، حتى 21 سبتمبر، الساعة 09:00 مساءً. لا يمكنك استخدام تمديدات أو أيام تأخير لهذا التسليم.
واجهة المصدر: اختيار ملف؛ لم يُختَر ملف؛ إرسال. عدد التسليمات المتبقية غير محدود.
5.3) التسليم النهائي (Final Submit)
قبل تسليم الملفات، احذف جميع عبارات الطباعة الإضافية المستخدمة لتصحيح الأخطاء. وافتح نافذة أوامر جديدة في Spyder وأعد تشغيل البرامج.
شغّل أداة اختبار الطالب وتأكد من اجتياز جميع الاختبارات. لكن الأداة تحتوي على مجموعة فرعية فقط من اختبارات تحديد الدرجة؛ اجتيازها كلها لا يضمن الدرجة الكاملة.
يمكنك رفع إصدارات جديدة من كل ملف حتى 5 أكتوبر، الساعة 09:00 مساءً. يُحتسب أي رفع بعد الموعد من رصيد أيام التأخير، إن بقي رصيد. دون رصيد لا تُمنح درجة للتسليم المتأخر. لاحظ أننا نقيم آخر تسليم.
لتسليم مجموعة متعددة الملفات، يمكنك تسليم كل ملف على حدة في صفحة التسليم. اضغط «إرسال» عندما تكون جاهزًا لتسليم كودك.
وهذا كل شيء! تهانينا على إنهاء أول مجموعة مسائل لك في 6.100L :)
5.3.1) الجزء A
اختيار ملف؛ لم يُختَر ملف؛ إرسال. عدد التسليمات المتبقية غير محدود.
5.3.2) الجزء B
اختيار ملف؛ لم يُختَر ملف؛ إرسال. عدد التسليمات المتبقية غير محدود.
5.3.3) الجزء C
اختيار ملف؛ لم يُختَر ملف؛ إرسال. عدد التسليمات المتبقية غير محدود.
المصدر والنَّسب والترخيص
ترجمة عربية كاملة لتعليمات PS 1 الرسمية، من extracted/mit6_100l_f22_ps1.layout.txt. حزمة الكود الرسمية. بقيت أمثلة الإدخال والإخراج وأسماء الملفات والمتغيرات كما في المصدر، مع شرح عربي. المواعيد تاريخية، ولم تُنسخ الحزمة إلى الملفات العامة.
النَّسب: Ana Bell. 6.100L Introduction to CS and Programming using Python, Fall 2022. Massachusetts Institute of Technology: MIT OpenCourseWare. المقرر الأصلي. المواد المملوكة لـ MIT وهذه الترجمة بموجب CC BY-NC-SA 4.0: النَّسب، غير تجاري، المشاركة بالمثل. ترجمة غير رسمية لا تعني اعتماد MIT. مواد الأطراف الثالثة ليست مرخصة تلقائيًا؛ شروط الاستخدام.