بدر عبدالكريم عبدالجبار نشر الخميس في 17:18 أرسل تقرير نشر الخميس في 17:18 السلام عليكم في الصورة رقم (١) ، النتيجة النهائية المطلوبة عند تنفيذ الكود ، يجب على كل النتائج أن تكون على استقامة واحدة في الصورة رقم (٢) لقد كتبت الكود و استخدمت (\t) ، جميع النتائج ظهرت على استقامة واحدة ما عدا (watermelons) ، لماذا ؟ في الصورة رقم (٣) لقد استخدمت طريقة مختلفة و تم ظهور النتائج كلها على استقامة واحدة ، مهما كان طول الكلمة ، هل حلي صحيح برمجيا ؟ 1 اقتباس
0 محمد عاطف25 نشر الخميس في 18:38 أرسل تقرير نشر الخميس في 18:38 وعليكم السلام ورحمة الله وبركاته . سبب المشكلة في الصورة الثانية أن رمز (\t) لا يضيف عدد ثابت من المسافات بل يعتمد على محطات توقف (Tab Stops) افتراضية. فعندما تكون الكلمات قصيرة مثل apples أو milk فإن ال \t\t تدفع السعر ليصل إلى نفس مكان التوقف بدقة. أما كلمة watermelons فهي طويلة وتجاوزت مساحة التوقف الأولى مما جعل النظام لنقل السعر إلى مكان التوقف التالي فظهر السعر بإزاحة أكبر نحو اليمين بشكل منفصل عن بقية القائمة. أما بالنسبة للحل الخاص بك في الصورة الأخيرة فهو حل ممتاز وصحيح فقد اعتمدت على فكرة ممتازة تعتمد على حساب طول الكلمة ديناميكيا (len(item)) وطرحه من إجمالي المسافات الثابتة لتحديد الفراغات المتبقية بدقة والنتيجة ظهرت مثالية ومستقيمة تماما مهما اختلف طول الكلمات. 1 اقتباس
0 Mustafa Suleiman نشر الخميس في 19:56 أرسل تقرير نشر الخميس في 19:56 تعتمد على قيمة ثابتة لعرض العمود وهي 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 خانة وتملأ الباقي بالمسافات تلقائياً. 1 اقتباس
0 بلال زيادة نشر أمس الساعة 07:26 أرسل تقرير نشر أمس الساعة 07:26 الرمز \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}") 1 اقتباس
السؤال
بدر عبدالكريم عبدالجبار
السلام عليكم
في الصورة رقم (١) ، النتيجة النهائية المطلوبة عند تنفيذ الكود ، يجب على كل النتائج أن تكون على استقامة واحدة
في الصورة رقم (٢) لقد كتبت الكود و استخدمت (\t) ، جميع النتائج ظهرت على استقامة واحدة ما عدا (watermelons) ، لماذا ؟
في الصورة رقم (٣) لقد استخدمت طريقة مختلفة و تم ظهور النتائج كلها على استقامة واحدة ، مهما كان طول الكلمة ، هل حلي صحيح برمجيا ؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.