مبانی کامپیوتر · فصل ۰۶
بخش خوانده‌شده۰/ ۷
مقدمات برنامه‌نویسی با C++ · منبع: 06.a.pdf (۲۴ اسلاید)

مقدمات برنامه‌نویسی با C++

از «ساختار کلی برنامه» تا توابع: هر بخش با کد قابل اجرا، ردگیری گام‌به‌گام و هشدارهای خطاهای رایج.

همهٔ کدهای این صفحه با int main و هدرهای استاندارد بازنویسی شده‌اند · قابل کامپایل با g++ -std=c++23

۷بخش۷جدول۱۵قطعه‌کد≈۱۹ دقیقهمطالعهمنبع06.a.pdf
CPP-06A · مقدمات C++
main.cpp#include <iostream>int main() {std::cout << "salam";salam
نوشتن، کامپایل، اجرا — حلقهٔ ساخت. edit → compile → run
۶.۱
بخش ۶.۱

ساختار برنامه، انواع داده و متغیرها

Program structure & data types

هر برنامهٔ C++ از چند تابع تشکیل شده که یکی از آن‌ها حتماً main نام دارد و اجرای برنامه از آن آغاز می‌شود. اگر تابعی مقداری را برنگرداند، در محل نوع مقدار برگشتی از void استفاده می‌شود.

شکل کلی برنامه
#include <iostream>      // افزودن فایل سرآمد کتابخانه‌ای

int main() {             // تابع اصلی، نقطهٔ آغاز اجرا
    // دستورات برنامه
    return 0;            // اعلام پایان موفق
}
امضای درست تابع main در C++ امروزی

انواع داده

خانوادهنوع‌هامثالیادداشت امروزی
اعداد صحیحint، long، long longint a = 25;int امروز معمولاً ۳۲ بیت است. برای عرض دقیق از int32_t / int64_t در <cstdint> استفاده کنید.
اعداد اعشاریfloat، doubledouble pi = 3.14159;double استاندارد پیش‌فرض امروز است؛ float تنها وقتی که حافظه مهم باشد.
نویسهcharchar c = 'A';نویسهٔ تک‌بایتی؛ برای فارسی و یونیکد از std::string و انواع char16_t/char32_t استفاده کنید.
منطقیboolbool ok = true;دو مقدار true و false.
رشتهstd::string (در منبع قدیمی: آرایهٔ char)std::string name = "Ali";کلاس آمادهٔ کتابخانهٔ استاندارد؛ مدیریت حافظه را خودش انجام می‌دهد.

کلمات کلیدی و قواعد نام‌گذاری

کلمات کلیدی کلماتی‌اند که برای کامپایلر معنای خاصی دارند و نمی‌توان از آن‌ها برای نام‌گذاری استفاده کرد: if، int، while، return و…

قواعد نام متغیر: از ترکیب حروف، ارقام و زیرخط _ ساخته می‌شود · حتماً باید با حرف (یا زیرخط) شروع شود · به بزرگی و کوچکی حروف حساس است، پس Sum و sum دو متغیر متفاوت‌اند · نام کلیدی زبان نباید باشد.
مجاز: 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     // روش قدیمی: پیش‌پردازشی و بدون نوع — امروز توصیه نمی‌شود
از const و constexpr به‌جای #define استفاده کنید
۶.۲
بخش ۶.۲

عملگرها و اولویت آن‌ها

Operators & precedence

سه خانوادهٔ عملگر: محاسباتی، مقایسه‌ای و منطقی.

➗محاسباتی arithmetic

+ − * / و باقیماندهٔ صحیح % · عملگرهای مرکب +=، -=، *=، /= · افزایش و کاهش ++ و --.

⚖️مقایسه‌ای relational

>، >=، <، <=، تساوی == و نامساوی !=. حاصل این عملگرها مقدار درست/نادرست است.

🔗منطقی logical

&& (و) · || (یا) · ! (نقیض).

جدول درستی: حاصل x && y تنها وقتی درست است که هر دو درست باشند؛ حاصل x || y وقتی درست است که حداقل یکی درست باشد؛ و !x برعکس مقدار x است. توجه کنید که = عملگر انتساب است و == عملگر مقایسه — این دو را با هم اشتباه نگیرید.

اولویت عملگرها

اولویتعملگرهاملاحظه
بالاترینپرانتز ( )هر چیزی داخل پرانتز اول محاسبه می‌شود
—پیشوندی ++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
مقدار نهایی: a = 3, d = e = f = 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)

Conditional structures

شکل کلی دستور شرط: اگر شرط درست بود بلوک اول، در غیر این صورت بلوک دوم اجرا می‌شود. در این کتاب بدنهٔ شرط را همیشه — حتی برای یک دستور — داخل آکولاد می‌نویسیم؛ خوانایی بیشتر و پیشگیری از خطا از همین‌جا شروع می‌شود.

شکل کلی
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
یافتن مقدار y برای x ≥ 10 و x < 10
زنجیرهٔ شرط (else if)
#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
ردگیری: شرط‌ها از بالا به پایین بررسی می‌شوند
۶.۴
بخش ۶.۴

ساختارهای تکرار

Loops

سه ساختار تکرار در زبان: for، while و do-while. هر سه یک هدف دارند: تکرار دستورات تا وقتی شرط برقرار است.

ساختارشکل کلیویژگیکاربرد
forfor (مقدار اولیه; شرط پایان; گام تغییر)شمارنده در همان سطر تعریف می‌شود؛ بررسی شرط پیش از هر تکراروقتی تعداد تکرارها از پیش معلوم است
whilewhile (شرط)بررسی شرط پیش از اجرای بدنه؛ ممکن است بدنه یک بار هم اجرا نشودوقتی تعداد تکرارها به داده بستگی دارد
do-whiledo { … } 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;
}
ورودی: ۳ نمرات ۱۵ ۱۸ ۱۲ ← میانگین = ۱۵
۶.۵
بخش ۶.۵

آرایه‌ها

Arrays

برای نگه‌داری چندین مقدار هم‌نوع، به‌جای تعریف صد متغیر جداگانه، یک آرایه تعریف می‌کنیم. اندیس خانه‌ها از صفر شروع می‌شود.

تعریف و کار با آرایه
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;
}
الگوی «بیشینه»: یک نگه‌دارندهٔ بهترین مقدار و یک پیمایش
نکات ایمنی آرایه: مرزهای آرایه در C++ بررسی نمی‌شوند؛ a[5] در آرایه‌ای با ۵ خانه، خطای برنامه (رفتار تعریف‌نشده) است و ممکن است بی‌سروصدا داده‌های دیگری را خراب کند. اندازه را در یک ثابت نگه دارید و در حلقه‌ها از همان استفاده کنید تا مرزها همیشه هم‌خوان بمانند.
۶.۶
بخش ۶.۶

زیربرنامه‌ها (توابع)

Functions

تابع، قطعه‌ای نام‌دار از برنامه است که با گرفتن پارامترهای ورودی کاری را انجام می‌دهد و در صورت نیاز مقدار برگشتی می‌دهد. ساختار کلی: نوع مقدار برگشتی، نام تابع، فهرست پارامترها و بدنه.

ساختار کلی و مثال‌های منبع
<نوع مقدار برگشتی> نام‌تابع (فهرست پارامترهای ورودی) {
    دستورات تابع
    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 << "*";
}
اگر تابع مقداری برنگرداند، از void استفاده می‌کنیم
تابع فاکتوریل و کاربرد آن در یک مجموعه
#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;
}
n = 4 ← مثلث ستاره در چهار سطر
چرا تابع؟ یکی از مهم‌ترین ابزارهای مدیریت پیچیدگی: کد را به قطعات کوچک، نام‌دار و آزمون‌پذیر می‌شکند. یک تابع را یک بار می‌نویسید و هر چند بار لازم باشد فراخوانی می‌کنید — و اگر خطایی باشد، فقط یک جا باید اصلاح شود.
۶.۷
بخش ۶.۷

به‌روزرسانی با دانش امروز

2026 update

اسلایدهای منبع، 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++ امروزی)
جمع‌بندی تعاملی

پازل مفاهیم فصل

Chapter puzzle — match the concepts

همهٔ مفاهیم این فصل، یک‌جا و به‌شکل یک بازی: هر مفهوم را انتخاب کنید و به تعریف درستش وصل کنید — جفت درست همان لحظه سبز می‌شود و به آسمانِ جدول می‌پرد، جفت اشتباه با یک جرقه باز می‌شود. وقتی همهٔ جفت‌ها کامل شد، «بررسی پاسخ‌ها» را بزنید تا بالن‌ها بترکند و در آسمانِ جدول به هم گره بخورند. هر وقت خواستید پاسخ‌نامه را ببینید، دکمهٔ «نمایش پاسخ‌ها» آن را کامل نشان می‌دهد.

🧩 جدول تطبیق مفاهیم — ۱۶ جفت ۰ از ۱۶

مفاهیم

تعریف‌ها

یک مفهوم را انتخاب کنید، سپس تعریفش را بزنید.