يحدث الفيض الحسابي عندما يؤدي حساب، مثل عملية حسابية أو تحويل نوع، إلى قيمة أكبر من سعة النوع المستقبِل.
ستلتف تعبيرات من النوع int وlong ونظيراتها غير الموقعة بصمت في هذه الظروف.
يمكن تعديل سلوك حسابات الأعداد الصحيحة باستخدام الكلمة المفتاحية checked. عندما يحدث فيض داخل كتلة checked، يُطرح مثيل من OverflowException.
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
ستأخذ تعبيرات من النوع float وdouble قيمة خاصة هي اللانهاية.
ستطرح تعبيرات من النوع decimal مثيلًا من OverflowException.
تواجه دولة Hyperia مشكلاتها. فالتضخم فيها خارج عن السيطرة على وجه الخصوص. وقد جرى نقلُك إليها لتتولى عقدًا في البنك المركزي.
لتبسيط العمل الإداري داخليًا، قسّم البنك المركزي كل فئة إلى جزأين: أساس يبقى ثابتًا نسبيًا، و_مضاعف_ (وهو نفسه لكل الفئات) يمكن تغييره سنويًا أو أسبوعيًا أو حتى يوميًا.
وعند الطباعة تكون الفئات على الأوراق النقدية حاصل ضرب الأساس في المضاعف.
وبحلول الوقت الذي أُدخل فيه هذا النظام، كانت فئة أصغر ورقة نقدية تبلغ بالفعل 10,000,000. ويوضّح الجدول أدناه الوضع (للفئات الثلاث الأولى) عند إدخال النظام أول مرة. وقد ساءت الأمور كثيرًا منذ ذلك الحين، ولم يعد المضاعف وحده هو الذي يتغير، بل الأساس أيضًا.
| الأساس | المضاعف | الفئة |
|---|---|---|
| 10,000 | 1,000 | 10,000,000 |
| 50,000 | 1,000 | 50,000,000 |
| 100,000 | 1,000 | 100,000,000 |
| ... | 1,000 | ... |
وخلاصة ذلك أن الفئة = الأساس * المضاعف.
من فضلك نفّذ الطريقة CentralBank.DisplayDenomination() التي تأخذ الأساس والمضاعف وتُرجع سلسلة نصية تمثل حاصل ضربهما (الأساس * المضاعف). ويجب ألا تُنسَّق السلسلة النصية الرقمية المُرجَعة.
وإذا أدّت عملية الضرب إلى تجاوز الحد، فيجب إرجاع السلسلة النصية "*** Too Big ***".
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
يستخدم البنك المركزي الأسلوب نفسه القائم على المضاعف لتسجيل الناتج المحلي الإجمالي داخليًا. فتُسجَّل الإحصاءات بفئة أساسية ثم تُضاعَف باستخدام المضاعف.
من فضلك نفّذ الطريقة CentralBank.DisplayGDP() التي تأخذ الناتج المحلي الإجمالي الأساسي والمضاعف الحالي وتُرجع الناتج المحلي الإجمالي على هيئة سلسلة نصية.
وإذا تعذّر حساب الناتج المحلي الإجمالي، فستُرجَع السلسلة "*** Too Big ***".
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
يريد رئيسك في البنك أن يتأكد من عدم وجود مشكلات عند موعد صرف الرواتب.
نفّذ الطريقة CentralBank.DisplayChiefEconomistSalary() التي تأخذ راتبًا معبَّرًا عنه بوحدات الأساس (كما ورد أعلاه) ومضاعفًا، وتُرجع سلسلة نصية تحتوي على حاصل الضرب.
وإذا تعذّر حساب الراتب، فستُرجَع السلسلة "*** Much Too Big ***".
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"
سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.