فصل ۴: ساختارهای کنترلی در C++
🎯 هدف این فصل
در پایان این فصل شما توانایی خواهید داشت:
- تصمیمگیری در برنامه را با شرطها (if / switch) انجام دهید.
- اعمال تکراری را با حلقهها (for / while / do-while) پیادهسازی کنید.
- از دستورات کنترلی
break
,continue
وgoto
استفاده کنید (با احتیاط). - الگوهای رایج کنترل جریان برنامه را درک کنید.
۱. مقدمه
برنامهها به سه دسته ساختار جریان اجرا تقسیم میشوند:
- توالی (Sequence) → اجرای خط به خط
- تصمیمگیری (Selection) → انتخاب مسیر بر اساس شرط
- تکرار (Iteration) → تکرار بخشی از کد چند بار
در دو فصل قبل یاد گرفتیم که دادهها و عملگرها چه هستند، حالا میخواهیم یاد بگیریم چطور کنترل کنیم کدام بخش برنامه اجرا شود و چهقدر تکرار شود.
۲. ساختار شرطی if
۲.۱ شکل ساده
if (condition) {
// اگر شرط درست باشد، این کد اجرا میشود
}
مثال:
int age = 20;
if (age >= 18) {
cout << "You are an adult." << endl;
}
۲.۲ if...else
برای دو مسیر:
if (condition) {
// مسیر اول
} else {
// مسیر دوم
}
مثال:
int score = 55;
if (score >= 60) {
cout << "Passed" << endl;
} else {
cout << "Failed" << endl;
}
۲.۳ if...else if...else
برای چند شرط:
if (score >= 90) {
cout << "Grade A";
} else if (score >= 80) {
cout << "Grade B";
} else if (score >= 70) {
cout << "Grade C";
} else {
cout << "Fail";
}
۲.۴ تو در تو (Nested if)
if (age >= 18) {
if (age < 65) {
cout << "Adult";
} else {
cout << "Senior";
}
}
📌 اما مراقب پیچیدگی بیش از حد باشید؛ گاهی بهتر است با منطقی ترکیبی شرطها را ساده کنید:
if (age >= 18 && age < 65)
۳. ساختار شرطی switch
برای انتخاب یکی از چند گزینه بر اساس یک مقدار عدد صحیح یا کاراکتر (و از C++17 حتی رشته ثابت):
switch (expression) {
case value1:
// کد
break;
case value2:
// کد
break;
default:
// در غیر این صورت
}
مثال:
char grade = 'B';
switch (grade) {
case 'A':
cout << "Excellent";
break;
case 'B':
cout << "Good";
break;
case 'C':
cout << "Average";
break;
default:
cout << "Invalid grade";
}
📌 نکات:
- استفاده از
break
ضروری است، وگرنه ادامه caseها اجرا میشود (Fall-through). - شرطها باید مقادیر ثابت باشند.
۴. حلقهها (Loops)
۴.۱ حلقه for
برای تکرار یک تعداد مشخص:
for (initialization; condition; update) {
// اجرا
}
مثال:
for (int i = 1; i <= 5; i++) {
cout << i << endl;
}
خروجی:
1
2
3
4
5
۴.۲ حلقه while
برای تکرار تا وقتی شرط درست باشد:
while (condition) {
// اجرا
}
مثال:
int i = 1;
while (i <= 5) {
cout << i << endl;
i++;
}
۴.۳ حلقه do...while
حداقل یک بار اجرا میشود:
do {
// اجرا
} while (condition);
مثال:
int number;
do {
cout << "Enter a positive number: ";
cin >> number;
} while (number <= 0);
۵. کنترل جریان در حلقهها
۵.۱ دستور break
خروج فوری از حلقه:
for (int i = 1; i <= 10; i++) {
if (i == 5) break;
cout << i << " ";
}
خروجی:
1 2 3 4
۵.۲ دستور continue
رفتن به تکرار بعدی:
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
cout << i << " ";
}
خروجی:
1 2 4 5
۵.۳ استفاده محدود از goto
در C++ توصیه نمیشود چون کد را نامرتب میکند:
goto label;
...
label:
📌 بهترین جایگزین: حلقهها و توابع.
۶. تو در تو بودن حلقهها (Nested Loops)
مثال چاپ جدول ضرب:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
cout << i << " * " << j << " = " << i*j << "\t";
}
cout << endl;
}
۷. ترکیب شرط و حلقه
مثال بررسی اعداد زوج بین ۱ تا ۱۰:
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
cout << i << " is even" << endl;
}
}
۸. نکات و هشدارها
⚠ همیشه مراقب حلقه بینهایت باشید:
while (true) { ... } // اگر شرط خروج نگذارید، بیوقفه اجرا میشود
⚠ در switch
همیشه break
بگذارید مگر عمداً بخواهید Fall-through کنید.
⚠ متغیرها در محدوده حلقه تعریف کنید تا خارج از آن در دسترس نباشند.
۹. اشتباهات رایج
❌ تغییر ندادن مقدار شرط در حلقه → حلقه بیپایان
❌ استفاده نادرست از عملگر =
به جای ==
❌ پیچیده کردن شرطها و حلقهها به جای ساده کردن با ترکیب مناسب
۱۰. تمرینها
تمرین ۱
برنامهای بنویسید که عددی از کاربر بگیرد و بگوید زوج است یا فرد.
تمرین ۲
با حلقه for
اعداد ۱ تا ۱۰۰ که مضرب ۳ هستند را چاپ کنید.
تمرین ۳
با استفاده از while
مجموع اعداد مثبت ورودی کاربر را تا وقتی ۰ وارد شود محاسبه کنید.
تمرین ۴ (چالش)
یک منوی چندگزینهای با switch
طراحی کنید که کاربر بتواند عملیاتهای جمع، تفریق، ضرب یا تقسیم دو عدد را انجام دهد.
۱۱. جمعبندی
- ساختارهای شرطی (if / switch) برای تصمیمگیری هستند.
- حلقهها (for / while / do-while) برای تکرار هستند.
- دستورات
break
وcontinue
کنترل دقیقتر حلقهها را میدهند. - استفاده درست از این ابزارها ساختار کلی برنامه را مشخص میکند.