ساختار برنامه، انواع داده و متغیرها
هر برنامهٔ C++ از چند تابع تشکیل شده که یکی از آنها حتماً main نام دارد و اجرای برنامه از آن آغاز میشود. اگر تابعی مقداری را برنگرداند، در محل نوع مقدار برگشتی از void استفاده میشود.
#include <iostream> // افزودن فایل سرآمد کتابخانهای int main() { // تابع اصلی، نقطهٔ آغاز اجرا // دستورات برنامه return 0; // اعلام پایان موفق }
انواع داده
| خانواده | نوعها | مثال | یادداشت امروزی |
|---|---|---|---|
| اعداد صحیح | int، long، long long | int a = 25; | int امروز معمولاً ۳۲ بیت است. برای عرض دقیق از int32_t / int64_t در <cstdint> استفاده کنید. |
| اعداد اعشاری | float، double | double pi = 3.14159; | double استاندارد پیشفرض امروز است؛ float تنها وقتی که حافظه مهم باشد. |
| نویسه | char | char c = 'A'; | نویسهٔ تکبایتی؛ برای فارسی و یونیکد از std::string و انواع char16_t/char32_t استفاده کنید. |
| منطقی | bool | bool ok = true; | دو مقدار true و false. |
| رشته | std::string (در منبع قدیمی: آرایهٔ char) | std::string name = "Ali"; | کلاس آمادهٔ کتابخانهٔ استاندارد؛ مدیریت حافظه را خودش انجام میدهد. |
کلمات کلیدی و قواعد نامگذاری
کلمات کلیدی کلماتیاند که برای کامپایلر معنای خاصی دارند و نمیتوان از آنها برای نامگذاری استفاده کرد: if، int، while، return و…
مجاز: sum، x_1، totalGrade · غیرمجاز: 2sum، int، my-var
int a, b = 1, c; // تعریف چند متغیر؛ b مقدار اولیه دارد const float PI = 3.14159f; // مقدار ثابت — روش امروزی constexpr int MAX = 100; // ثابت محاسبهشده در زمان ترجمه — روش مدرنتر // #define PI 3.14 // روش قدیمی: پیشپردازشی و بدون نوع — امروز توصیه نمیشود
عملگرها و اولویت آنها
سه خانوادهٔ عملگر: محاسباتی، مقایسهای و منطقی.
➗محاسباتی arithmetic
+ − * / و باقیماندهٔ صحیح % · عملگرهای مرکب +=، -=، *=، /= · افزایش و کاهش ++ و --.
⚖️مقایسهای relational
>، >=، <، <=، تساوی == و نامساوی !=. حاصل این عملگرها مقدار درست/نادرست است.
🔗منطقی logical
&& (و) · || (یا) · ! (نقیض).
اولویت عملگرها
| اولویت | عملگرها | ملاحظه |
|---|---|---|
| بالاترین | پرانتز ( ) | هر چیزی داخل پرانتز اول محاسبه میشود |
| — | پیشوندی ++x و --x | در حالت پیشوندی بیشترین تقدم را دارند؛ اول یک واحد اضافه/کم میشود، بعد مقدار در انتساب بهکار میآید |
| — | * / % | هماولویت و از چپ به راست |
| — | + - | هماولویت و از چپ به راست |
| پایینترین | پسوندی x++ و x-- | کمترین تقدم؛ اول مقدار فعلی در انتساب بهکار میآید، بعد یک واحد اضافه/کم میشود |
int a = 3, b, d, e, f; d = ++a; // اول a یک واحد افزایش مییابد (4)، سپس به d داده میشود → d = 4 e = a++; // اول مقدار فعلی a به e داده میشود (4)، سپس a میشود 5 → e = 4 f = --a; // a کاهش مییابد (4)، سپس به f داده میشود → f = 4 b = a--; // مقدار فعلی a به b داده میشود (4)، سپس a میشود 3 → b = 4
int a=2, b=3, c=4, d=5, e; e = (a + 2) * 3 + --c * d; // 4 * 3 = 12 // --c → c میشود 3 ، 3 * d(5) = 15 // e = 12 + 15 = 27 // نتیجه: a=2, c=3, e=27
ساختار شرط (if / else)
شکل کلی دستور شرط: اگر شرط درست بود بلوک اول، در غیر این صورت بلوک دوم اجرا میشود. در این کتاب بدنهٔ شرط را همیشه — حتی برای یک دستور — داخل آکولاد مینویسیم؛ خوانایی بیشتر و پیشگیری از خطا از همینجا شروع میشود.
if (شرط) { // دستورات حالت درست } else { // دستورات حالت نادرست }
#include <iostream> int main() { int x, y; std::cin >> x; if (x >= 10) { y = 2 * x - 3; } else { y = 3 * x - 10; } std::cout << y; return 0; } // برای x = 12 → y = 2*12 - 3 = 21 // برای x = 4 → y = 3*4 - 10 = 2
#include <iostream> int main() { int n, x, y = 5; std::cin >> n; x = n % 10; // یکان عدد if (x > 5) { y++; // y = y + 1 } else if (x < 3) { y--; // y = y - 1 } else { y -= 2; } std::cout << y; return 0; } // n = 325 → x = 5 → مسیر else → y = 3
ساختارهای تکرار
سه ساختار تکرار در زبان: for، while و do-while. هر سه یک هدف دارند: تکرار دستورات تا وقتی شرط برقرار است.
| ساختار | شکل کلی | ویژگی | کاربرد |
|---|---|---|---|
| for | for (مقدار اولیه; شرط پایان; گام تغییر) | شمارنده در همان سطر تعریف میشود؛ بررسی شرط پیش از هر تکرار | وقتی تعداد تکرارها از پیش معلوم است |
| while | while (شرط) | بررسی شرط پیش از اجرای بدنه؛ ممکن است بدنه یک بار هم اجرا نشود | وقتی تعداد تکرارها به داده بستگی دارد |
| do-while | do { … } while (شرط); | بررسی شرط در پایان حلقه؛ بدنه حتماً یک بار اجرا میشود | منوها و اعتبارسنجی ورودی (مثال: خواندن تا رسیدن عدد مجاز) |
// الف) با for — صعودی for (int i = 11; i <= 99; i += 2) std::cout << i << " "; // ب) با while — نزولی int i = 99; while (i >= 11) { std::cout << i << " "; i -= 2; } // ج) با do-while i = 11; do { std::cout << i << " "; i += 2; } while (i <= 99);
// روش ۱ — با while #include <iostream> int main() { int i = 1, n, x, sum = 0; std::cin >> n; while (i <= n) { std::cin >> x; sum += x; i++; } double avg = static_cast<double>(sum) / n; // ⚠ تقسیم اعشاری std::cout << avg; return 0; } // روش ۲ — با for #include <iostream> int main() { int n, x, sum = 0; std::cin >> n; for (int i = 1; i <= n; i++) { std::cin >> x; sum += x; } double avg = static_cast<double>(sum) / n; std::cout << avg; return 0; }
آرایهها
برای نگهداری چندین مقدار همنوع، بهجای تعریف صد متغیر جداگانه، یک آرایه تعریف میکنیم. اندیس خانهها از صفر شروع میشود.
int a[100]; // آرایهای با ۱۰۰ خانه، اندیسهای 0 تا 99 a[0] = 2; // قرار دادن مقدار ۲ در خانهٔ صفر a[0]++; // افزایش یکواحدی مقدار خانهٔ صفر → 3 a[2] = a[0] + 3; // خانهٔ ۲ برابر 6 میشود
#include <iostream> int main() { float a[5], sum = 0; for (int i = 0; i < 5; i++) { std::cin >> a[i]; sum += a[i]; } double avg = sum / 5.0; std::cout << avg; return 0; }
#include <iostream> int main() { float a[5], max; for (int i = 0; i < 5; i++) std::cin >> a[i]; max = a[0]; // فرض اولیه: اولین خانه بزرگترین است for (int i = 1; i < 5; i++) // از خانهٔ دوم مقایسه شروع میشود if (a[i] > max) { max = a[i]; } std::cout << max; return 0; }
زیربرنامهها (توابع)
تابع، قطعهای نامدار از برنامه است که با گرفتن پارامترهای ورودی کاری را انجام میدهد و در صورت نیاز مقدار برگشتی میدهد. ساختار کلی: نوع مقدار برگشتی، نام تابع، فهرست پارامترها و بدنه.
<نوع مقدار برگشتی> نامتابع (فهرست پارامترهای ورودی) {
دستورات تابع
return مقدار برگشتی; // اگر نوع void باشد، return لازم نیست
}
int f(int x, int y) { // تابعی که جمع دو عدد صحیح را برمیگرداند
return x + y;
}
void print(int i) { // تابعی که چیزی برنمیگرداند
for (int j = 1; j <= i; j++)
std::cout << "*";
}#include <iostream> int fact(int i) { // i! را محاسبه و برمیگرداند int p = 1; for (int j = 2; j <= i; j++) p *= j; return p; } int main() { int n, s = 0; std::cin >> n; for (int i = 1; i <= n; i++) // s = 1! + 2! + 3! + ... + n! s += fact(i); std::cout << s; return 0; }
#include <iostream> void print(int i) { // i ستاره چاپ میکند for (int j = 1; j <= i; j++) std::cout << "*"; } int main() { int n; std::cin >> n; for (int i = 1; i <= n; i++) { print(i); // فراخوانی تابع std::cout << '\n'; } return 0; }
بهروزرسانی با دانش امروز
اسلایدهای منبع، C++ پیش از استاندارد ۱۹۹۸ و کامپایلر Turbo C++ را فرض میکنند. جدول زیر تفاوتهای عملی را یکجا میآورد.
| موضوع | در منبع درسی | وضعیت امروز (۲۰۲۶) | چرا مهم است |
|---|---|---|---|
| نسخهٔ زبان | C++ پیش از استاندارد، بدون فضای نام | C++17 و C++20 / C++23 منتشر شدهاند (C++26 در دست تدوین) | کتابخانهٔ استاندارد و ویژگیهای زبانی تازه |
| هدر ورودی/خروجی | #include <iostream.h> | #include <iostream> و std::cout | نسخههای قدیمی روی کامپایلر امروزی خطا میدهند |
| تابع اصلی | void main() | int main() | بازگشت مقدار، بخشی از استاندارد زبان است |
| خطای رایج تقسیم | avg = sum / n با متغیرهای صحیح | double avg = static_cast<double>(sum) / n; | پیشگیری از بریدهشدن اعشار و پاسخ غلط |
| پاکسازی صفحه | clrscr() و getch() | حذفشده و غیرقابلحمل؛ استفاده از کتابخانههای استاندارد | کد قابل اجرا روی لینوکس، مک و ویندوز |
| رشته | char s[20] | std::string | سرریز بافر و خطاهای امنیتی حذف میشود |
| آرایهٔ پویا | آرایه با اندازهٔ متغیر | std::vector | گسترش کامپایلری، استاندارد نیست |
| هشدار پیش از اجرا | بدون هشدار و بدون ابزار کیفیت | -Wall -Wextra، clang-tidy، sanitizers، Core Guidelines | پیدا کردن خطا پیش از آنکه در آزمون ظاهر شود |
| آزمون | اجرای چند نمونهٔ دستی | آزمون یکا با Catch2/GoogleTest | اطمینان از درستی پس از هر تغییر |
| گردش کار | ذخیرهٔ فایل روی دیسک شخصی | Git + سامانهٔ ساخت (CMake) + اجرای خودکار آزمونها | بازگشتپذیری، همکاری و بازتولیدپذیری |
نقشهٔ پوشش منبع — کدام بخش این صفحه از کدام اسلاید استخراج شده است.
| بخش این صفحه | اسلایدهای منبع |
|---|---|
| ۶.۱ ساختار برنامه و انواع داده | اسلایدهای ۳، ۹، ۱۰ |
| ۶.۲ عملگرها و اولویت | اسلایدهای ۴–۷ |
| ۶.۳ ساختار شرط | اسلایدهای ۱۱–۱۳ |
| ۶.۴ حلقهها | اسلایدهای ۱۴–۱۷ |
| ۶.۵ آرایهها | اسلایدهای ۱۸–۲۰ |
| ۶.۶ توابع | اسلایدهای ۲۱–۲۴ |
| ۶.۷ بهروزرسانیها | افزودهٔ سرویراستار (C++ امروزی) |
پازل مفاهیم فصل
همهٔ مفاهیم این فصل، یکجا و بهشکل یک بازی: هر مفهوم را انتخاب کنید و به تعریف درستش وصل کنید — جفت درست همان لحظه سبز میشود و به آسمانِ جدول میپرد، جفت اشتباه با یک جرقه باز میشود. وقتی همهٔ جفتها کامل شد، «بررسی پاسخها» را بزنید تا بالنها بترکند و در آسمانِ جدول به هم گره بخورند. هر وقت خواستید پاسخنامه را ببینید، دکمهٔ «نمایش پاسخها» آن را کامل نشان میدهد.