الدرس 2 من 10
الأنواع والتحويل بينها
- 12 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الأنواع int وdouble وdecimal وقسمة الأعداد الصحيحة
الشرح
في C# تحدّد نوع كل متغيّر عند تعريفه، ولا يتغيّر نوعه بعد ذلك، فتستعمل int lives = 3; للأعداد الصحيحة، وdouble speed = 4.5; للأعداد العشرية، وdecimal price = 19.99m; للمبالغ المالية، وbool isAlive = true; للقيمة صواب أو خطأ، وstring name = "ليان"; للنصوص وتكتبها بين علامتَي تنصيص مزدوجتين، وchar grade = 'A'; لحرف واحد تكتبه بين علامتين مفردتين. والنصّ سلسلة من الأحرف، فأول حرف فيه هو name[0] ونوعه char. أما var فتجعل المترجم يستنتج النوع من القيمة، ثم يبقى النوع ثابتًا بعد ذلك.
وأشهر خطأ هنا أن قسمة عدد صحيح على عدد صحيح تعطي عددًا صحيحًا وتحذف الكسر دون أي تنبيه، فناتج 7 / 2 هو 3، ولذلك حوّل أحد الطرفين إلى عدد عشري قبل القسمة، فيصير ناتج (double)7 / 2 هو 3.5. أما (double)(7 / 2) فتعطي 3، لأن القسمة الصحيحة حدثت أوّلًا وضاع الكسر قبل التحويل. والتحويل من عشري إلى صحيح يحذف الكسر ولا يقرّب، فناتج (int)7.9 هو 7، بخلاف Convert.ToInt32(7.9) التي تقرّب إلى 8.
وتقرّب Math.Round(x, 2) العدد إلى منزلتين عشريتين. ونستعمل decimal للمال لأن double يخزّن الكسور بالنظام الثنائي فلا يحفظ 0.1 بدقّة، حتى إن المقارنة 0.1 + 0.2 == 0.3 تكون خاطئة، أما decimal فيحفظ المنازل العشرية كما تكتبها، والحرف m بعد الرقم يجعله من نوع decimal. ولا تخلط C# بين النوعين من تلقاء نفسها، فإذا كان price من نوع decimal كانت price * 1.15 خطأ ترجمة، والصواب price * 1.15m.
المطلوب
أصلح الدالة Average(points, games) لتُرجع المتوسّط عددًا عشريًّا مقرّبًا إلى منزلتين، فمن سجّل 47 نقطة في 6 مباريات متوسّطه 7.83 وليس 7. ثم أكمل WholeCoins(gold) لتُرجع عدد القطع الكاملة بالتحويل إلى int، وPriceWithTax(price) لتُرجع السعر بعد إضافة ضريبة 15% مقرّبًا إلى منزلتين، وInitial(name) لتُرجع أول حرف في الاسم.
الفحوص
5 فحوص- ناتج Average(47, 6) يساوي 7.83 وليس 7
- ناتج Average(10, 4) يساوي 2.5 لأن التحويل يسبق القسمة
- الدالة WholeCoins تحذف الكسر ولا تقرّب، فـ 7.9 تصير 7
- الدالة PriceWithTax تضيف ضريبة 15% بدقّة decimal وتقرّب إلى منزلتين
- الدالة Initial تُرجع الحرف الأول من نوع char