العمليات الحسابية — القسمة، البواقي، وفخ الأعداد العشرية
المعاملات الحسابية السبعة، أولوية التنفيذ، استخدامات القسمة الصحيحة وباقي القسمة، ولماذا تظهر الكسور أحياناً بدقة غير متوقعة.
- 1المشكلة
- 2الفهم
- 3أمثلة محلولة
- 4التوقع
- 5التطبيق
- 6التحدي
المشكلة التي نقوم بحلها
لديك 17 كتاباً وصندوق يتسع لـ 5 كتب فقط. كم صندوقاً كاملاً ستحتاج، وكم كتاباً سيتبقى في الخارج؟
الإجابة ليست 17 / 5، لأن ذلك يعطي 3.4، ولا يوجد ما يسمى 3.4 صندوق. أنت بحاجة إلى إجابتين منفصلتين: كم عدد الصناديق الكاملة و كم تبقى من الكتب. في بايثون يوجد معامل خاص لكل منهما: معامل القسمة الصحيحة // ومعامل باقي القسمة % (Modulo).
وهناك أمر آخر يفاجئ المبتدئين دائماً: في لغات البرمجة بما فيها بايثون، ناتج 0.1 + 0.2 لا يساوي تماماً 0.3. سنفهم سبب ذلك وكيفية التعامل معه في هذه المهمة.
بنهاية هذه المهمة ستكون قادراً على
- استخدام المعاملات الحسابية السبعة في بايثون
- معرفة أولوية تنفيذ العمليات الحسابية ومتى تلزم الأقواس
- فهم الحالات التي يكون فيها
//و%هما الأداة المناسبة - إدراك سبب إنتاج معامل
/دائماً لعدد عشري (float) - إجراء العمليات الحسابية مع مراعاة دقة الأعداد العشرية
المتطلبات المسبقة: المتغيرات والأنواع.
المعاملات الحسابية السبعة
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
print(10 // 3)
print(10 % 3)
print(10 ** 3)13
7
30
3.3333333333333335
3
1
1000أهم المعاملات الخاصة:
//— القسمة الصحيحة (Floor Division): تقسم الأعداد وتتجاهل الجزء العشري محتفظة بالعدد الصحيح فقط%— باقي القسمة (Modulo): القيمة المتبقية بعد اكتمال القسمة الصحيحة**— الأس (Exponentiation):10 ** 3تعني 10 أس 3 (1000)
معامل/يُنتج دائماً عدداً عشرياً. حتى10 / 5تُرجع2.0وليس2. إذا أردت عدداً صحيحاً، استخدم معامل القسمة الصحيحة//.
حل مسألة الصناديق والكتب
books = 17
per_box = 5
full_boxes = books // per_box
left_over = books % per_box
print("Full boxes:", full_boxes)
print("Left over :", left_over)Full boxes: 3
Left over : 23 صناديق كاملة ويتبقى كتابان. المعاملان // و % يعملان دائماً معاً لإعطاء الصورة الكاملة لأي عملية تقسيم.
مثال تطبيقي متكامل
packing.py:
# Work out packing and shipping for one order
total_items = 47
items_per_box = 6
box_cost = 35.5
full_boxes = total_items // items_per_box
loose_items = total_items % items_per_box
# A partly filled box still costs a full box
boxes_needed = full_boxes
if loose_items > 0:
boxes_needed = full_boxes + 1
shipping = boxes_needed * box_cost
print("Items :", total_items)
print("Full boxes :", full_boxes)
print("Loose items :", loose_items)
print("Boxes needed :", boxes_needed)
print("Shipping :", round(shipping, 2))Items : 47
Full boxes : 7
Loose items : 5
Boxes needed : 8
Shipping : 284.0الأخطاء الشائعة وحلولها
خطأ ZeroDivisionError: division by zero محاولة القسمة على الصفر. وهي غير معرفة رياضياً، لذا يوقف بايثون تنفيذ البرنامج فوراً.
ظهور 2.0 بدلاً من 2 في ناتج القسمة استخدم معامل القسمة الصحيحة // بدلاً من /.
وجود أرقام عشرية طويلة وغير دقيقة هذا ليس خطأ برمجياً بل طبيعة تمثيل الكسور العشرية في ذاكرة الحاسوب الثنائية. استخدم دالة round() لتقريب الناتج عند الطباعة.
Step 4 of 6 — Predict
Check your understanding
All three lines work on the same two numbers, with a different operator each time. What is the output?
print(7 / 2)
print(7 // 2)
print(7 % 2)- A3.5 3 1
- B3.5 3.5 1
- C3 3 1
- D3.5 4 1
The program runs without any error but reports the average as 40.0. Why?
a = 10
b = 20
c = 30
average = a + b + c / 3
print("Average:", average)- A`/` runs first, so only `c` was divided — it needs to be `(a + b + c) / 3`
- BAverages must use `//`, not `/`
- CThe three numbers are `int`, which makes the result wrong
- D`average` is a reserved word, so the value was not stored properly
What is the output of these two lines?
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)- A0.30000000000000004 False
- B0.3 True
- C0.30000000000000004 True
- D0.3 False
Answering needs an account
Sign in to check your answers
The questions are above, and working them out in your head is the part that matters. Sign in to see the answers, the explanations and the three-level hints.
دورك الآن
اكتب ملفاً باسم time_split.py يقوم بتقسيم عدد من الثواني إلى ساعات ودقائق وثوانٍ.
ابدأ بالقيمة total_seconds = 7385، ويجب أن يكون الناتج مطابقاً لـ:
2 h 3 m 5 sوفق الشروط التالية:
- استخدم فقط المعاملين
//و%دون كتابة أي نتيجة يدوياً - احفظ القيم الثلاث في ثلاثة متغيرات ذات أسماء معبرة
- غيّر قيمة
total_secondsإلى59و60و3600و86399وجرب كل منها للتأكد من دقة البرنامج في كل الحالات
There is more in this mission
What you read above is the complete mission — nothing was cut out of it. Pro adds:
- ما يحدث فعلياً في الكواليس — كيف ينفذ بايثون هذا الكود
- الحل الكامل للتمرين مشروحاً خطوة بخطوة
- تمارين إضافية أكثر صعوبة وتحدياً
- أسئلة المقابلات الوظيفية حول هذا الموضوع مع نموذج الإجابة
Step 6 of 6
التحدي — the chapter quiz
عشرة أسئلة متدرجة من السهل إلى الصعب. الأسئلة الأخيرة صعبة عن قصد.
Sign in to take the quiz