اذهب إلى المحتوى
  • 0

سؤال

بدر عبدالكريم عبدالجبار

السؤال

نشر

السلام عليكم

في الصورة رقم (١) ، النتيجة النهائية المطلوبة عند تنفيذ الكود ، يجب على كل النتائج أن تكون على استقامة واحدة

في الصورة رقم (٢) لقد كتبت الكود و استخدمت (\t)  ، جميع النتائج ظهرت على استقامة واحدة ما عدا (watermelons) ، لماذا ؟

في الصورة رقم (٣) لقد استخدمت طريقة مختلفة و تم ظهور النتائج كلها على استقامة واحدة ، مهما كان طول الكلمة ، هل حلي صحيح برمجيا ؟

1.png

2.png

3.png

Recommended Posts

  • 0
نشر

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

سبب المشكلة في الصورة الثانية  أن رمز (\t) لا يضيف عدد ثابت من المسافات بل يعتمد على محطات توقف (Tab Stops) افتراضية.

فعندما تكون الكلمات قصيرة مثل apples أو milk فإن ال \t\t تدفع السعر ليصل إلى نفس مكان التوقف بدقة.

أما كلمة watermelons فهي طويلة وتجاوزت مساحة التوقف الأولى مما جعل النظام لنقل السعر إلى مكان التوقف التالي فظهر السعر بإزاحة أكبر نحو اليمين بشكل منفصل عن بقية القائمة.

أما بالنسبة للحل الخاص بك في الصورة الأخيرة فهو حل ممتاز وصحيح فقد اعتمدت على فكرة ممتازة تعتمد على حساب طول الكلمة ديناميكيا (len(item)) وطرحه من إجمالي المسافات الثابتة لتحديد الفراغات المتبقية بدقة والنتيجة ظهرت مثالية ومستقيمة تماما مهما اختلف طول الكلمات.

  • 0
نشر

تعتمد على قيمة ثابتة لعرض العمود وهي spaces = 13، الحل سيعمل بنجاح فقط طالما أن طول الكلمة أقل من 13 حرفاً أما إذا أُضيفت كلمة من 13 حرفاً أو أكثر، فستصبح قيمة spaces_after صفراً أو رقم سالب.

في لغة بايثون، ضرب النص في رقم سالب مثل " " * -2 ينتج نصاً فارغاً ""، مما سيؤدي إلى التصاق السعر بالكلمة مباشرة واختلال الاستقامة من جديد، لذا مهما اختلف طول الكلمات عليك بتعديل بسيط يحسب عرض العمود ديناميكياً بناءً على أطول كلمة في القائمة:

spaces = max(len(item) for item in grocery_names) + 3

وتوفر بايثون أداة مدمجة داخل الـ f-string مباشرة وهي {item:<13} أو دالة item.ljust(13)، والتي تحجز 13 خانة وتملأ الباقي بالمسافات تلقائياً.

  • 0
نشر

الرمز

 \t

لا يضيف عددًا ثابتًا من المسافات، بل ينقل المؤشر إلى أقرب نقطة توقف (Tab Stop)، وهذه النقاط تكون كل 8 أحرف عادةً (0، 8، 16، 24...).

الكلمات القصيرة (أقل من 8 أحرف) تقفز إلى 8 ثم إلى 16، أما watermelons (11 حرفًا) فتجاوزت النقطة 8، فقفزت إلى 16 بعد أول

 \t

ثم إلى 24 بعد الثاني، فظهر السعر أبعد من البقية.

 \t

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

هل حلك في الصورة (٣) صحيح؟

الفكرة صحيحة وتعمل، فأنت تحسب عدد المسافات حسب طول كل كلمة (13 - len(item))، فتنتهي كل الأسطر عند نفس العمود. لكن هناك ملاحظتان

 لو ظهرت كلمة أطول من 13 حرفًا (مثل strawberries طولها 12 جيدة، لكن pomegranates طولها 12، وdragonfruits 12، أما blackcurrants فـ 13، وwatermelons-big أطول) فإن spaces_after ستصبح صفرًا أو سالبة، وسيلتصق السعر بالكلمة أو ينحرف. الأفضل حساب الرقم تلقائيًا

spaces = max(len(name) for name in grocery_names) + 2

هناك طريقة أبسط وأفضل في بايثون، وهي التنسيق بالعرض داخل f-string 

grocery_names = ["apples", "bananas", "watermelons", "milk", "bread"]
grocery_prices = [9.34, 8.12, 3.2, 0.1, 3.1]

width = max(len(name) for name in grocery_names) + 2

print("Grocery List:")
print(f"{'Item':<{width}}Price")
print("-" * 30)
for item, price in zip(grocery_names, grocery_prices):
    print(f"{item:<{width}}${price:.2f}")

شرح

{item:<{width}}

الرمز < يعني محاذاة لليسار، وwidth هو العرض الكلي للحقل، وبايثون تضيف المسافات تلقائيًا، فلا حاجة لحسابها يدويًا.

ولو أردت الأسعار محاذاة لليمين (كما هو شائع في القوائم) 

print(f"{item:<{width}}{price:>8.2f}")

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...