لحساب مجموع الأعداد الزوجية حتى n في C++ نحدد عدد الحدود الزوجية k = n / 2، ثم نحسب k × (k + 1). نستخدم مجال unsigned long long للناتج ونفحص الضرب قبل تنفيذه. هذا يحمي من نتيجة خاطئة بسبب overflow عند استخدام int للمجموع.
الكود الكامل باستخدام C++17
#include <iostream>
#include <limits>
#include <optional>
std::optional<unsigned long long> evenSum(unsigned long long n) {
auto k = n / 2;
auto next = k + 1;
if (k > std::numeric_limits<unsigned long long>::max() / next)
return std::nullopt;
return k * next;
}
int main() {
long long n{};
std::cout << "Non-negative n: ";
if (!(std::cin >> n) || n < 0) {
std::cout << "Invalid input.\n";
return 1;
}
auto result = evenSum(static_cast<unsigned long long>(n));
if (!result) { std::cout << "Sum exceeds the supported range.\n"; return 1; }
std::cout << "Sum: " << *result << '\n';
}اشتقاق الصيغة
الأعداد المطلوبة هي 2 و4 و6 حتى 2k. مجموعها يساوي 2 × (1 + 2 + … + k)، أي k × (k + 1). عندما n=10 يكون k=5 والمجموع 30، وعندما n=9 يكون المجموع 20 لأن 10 خارج المجال. إدخال صفر يعطي مجموعًا صفرًا.
فحص تجاوز المجال
قبل الضرب نختبر هل k أكبر من أكبر قيمة قابلة للتمثيل مقسومة على k+1. إذا حدث ذلك نعيد nullopt وتعرض الواجهة رسالة بدل تنفيذ ضرب غير مناسب. استخدام نوع أوسع وحده لا يجعل المجال بلا حدود. نرفض المدخل السالب قبل تحويله إلى النوع غير الموقع.
مقارنة الصيغة بالحلقة
يمكن جمع القيم باستخدام حلقة بخطوة 2، لكن تكلفتها تزيد مع n. الصيغة تحتاج عددًا ثابتًا من العمليات بعد قراءة الإدخال. عند التعلم اختبر الطريقتين لقيم صغيرة مثل 0 و1 و2 و10 وتأكد من تطابق النتائج، ثم انتقل لفحص حدود النوع العددي.
ترجمة المثال وتشغيله
احفظ المثال في ملف main.cpp واختر معيار C++17 في محررك. مع GCC أو Clang يمكنك الترجمة بالأمر g++ -std=c++17 -Wall -Wextra -pedantic main.cpp -o main ثم تشغيل الملف الناتج. ترجم كل مثال كبرنامج مستقل؛ لا تجمع دوال main من دروس مختلفة في ملف واحد.
الصور والفيديو من الشرح السابق
الكود النصي أعلاه هو النسخة المصححة؛ قد تختلف المواد المرئية السابقة في أسماء المتغيرات أو طريقة التشغيل.







