در این مقاله قصد داریم با نوشتن یک برنامه که کارش کشیدن یک مثلث با کارکتر * است کار با حلقه for
در زبان را یاد بگیریم.
کشیدن طرحها و نقشهای مختلف با کاراکترهای ساده مثل ستاره *، مربع #، یا خط | نه تنها تمرین خوبی برای آشنایی بیشتر و بهتر با حلقهها و کاربردهای آنها در برنامهنویسی است بلکه در توسعه اپلیکیشنهای کنسولی (اپلیکیشنهای CLI که در مقاله Hello, World راجع بهشان صحبت کردیم) نیز کاربردی هستند.

top
که مشابه Task Manager عمل میکند و برنامههای باز و منابع مصرفی آنها را در محیط ترمینال گزارش میکند.همچنین میتوان با این کارکتر ها ASCII Art ساخت! مثل =) یا O_o یا (•‿•) یا

یا حتی
اول بگذارید مسأله را به بخش کوچکتری بشکانیم و یک برنامه با استفاده از ابزارهایی که تا به حال یاد گرفتهایم بنویسیم که به جای پرینت کردن ستارهها اعداد ۱ تا ۱۰ را پرینت میکند.
یک متغیر از نوع عدد در نظر میگیریم و مقدار اولیه آن را ۰ میکنیم.
int i = 0;
و بعد یک حلقه وایل درست میکنیم که تا زمانی که i
به ۱۰ نرسیده (یعنی کوچکتر از ۱۰ است) به اجرا ادامه دهد.
while (i < 10) {
}
مسأله این است که این حلقه به طور نامتناهی اجرا میشود زیرا مقدار i
یعنی ۰ همیشه کوچکتر از ۱۰ است که هم کاری که ما از برنامهمان میخواستیم نیست، هم با ایجاد حلقهای بیپایان برنامه هنگ میکند و به اجرا ادامه نمیدهد.
برای حل این مشکل متغیر i
را هر بار که حلقه اجرا میشود افزایش میدهیم؛ برای این که یک را به مقدار i اضافه کنیم میتوانیم کد زیر را استفاده کنیم:
i = i + 1;
اما چون افزایش مقدار یک متغیر عموما کاربرد زیادی در برنامهنویسی دارد یک اُپراتور برای این کار در نظر گرفته شده: +=
i += 1;
که دقیقا به این معنی است که i
را به اندازه یک افزایش بده. حتی این عمل افزایش به اندازه یک نیز خود به طور کلی کاربرد زیادی داشته و به همین دلیل یک عملیات برای افزایش مقدار یک متغیر به اندازه یک نیز در نظر گرفته شده.
i++;
پس حلقه را برای پرینت کردن و افزایش دادن مقدار i
تغییر میدهیم
#include <iostream>
using namespace std;
int main() {
int i = 0;
while (i < 10) {
cout << i << endl;
i++;
}
}
0
1
2
3
4
5
6
7
8
9
حالا یک برنامه که از ۰ تا ۱۰ را به درستی چاپ میکند داریم اما میتوان این کد را مقداری خلاصه تر و تمیز تر با حلقه for نوشت:
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 10; i++) {
cout << i << endl;
}
}
0
1
2
3
4
5
6
7
8
9
حلقه فور معمولا در شرایطی که شمارش نیاز است (مثل همین مثال که نیاز به شمارش از ۰ تا ۱۰ داشت) انتخاب مناسبتری است. در کل تفاوتی بین منطق پشت این دو حلقه وجود ندارد و هر دو به بخشهای مشترکی نیاز دارند که در زیر میبینید:

اگر به مساله دقت کنیم میبینیم که در هر خط باید به اندازه شماره آن خط کارکتر ستاره چاپ کنیم.
برای این کار میتوانیم مجددا از حلقه for
کمک بگیریم و یک حلقه درون حلقه بالایی بنویسیم که به اندازه i
(شماره خط) تا ستاره را پرینت میکند.
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i; j++) {
cout << "*";
}
}
پس حلقه فور داخلی از ۰ تا i
حرکت میکند تا i
بار کارکتر ستاره را چاپ کند. البته این برنامه همه ستاره ها را در یک خط چاپ خواهد کرد چون که هیچوقت endl
یا \n
چاپ نشده. پس پرینت endl
را هم پس از حلقه فور داخلی که ستاره های هر خط را پرینت میکند میگذاریم تا بعد از چاپ شدن i
ستاره برنامه به خط بعد برود.
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i; j++) {
cout << "*";
}
cout << endl;
}
}
*
**
***
****
*****
******
*******
********
*********
دقت کنید که i
و j
فقط اسم متغیرها هستند و میتوانند هر چیز دیگری هم باشند.
اگر به خروجی برنامه دقت کنید میبینید که خط اول خالی است و خط آخر هم ۹ ستاره جای ۱۰ ستاره دارد؛ علت این مساله به برنامه اولی که نوشتیم برمیگردد که اعداد از ۰ تا ۹ را چاپ میکرد. درواقع برنامه حلقه بالایی را اجرا میکند و مقدار i
را ۰ میگذارد و حلقه تویی در خط اول ۰ ستاره چاپ میکند و به همین خاطر خط اول خالیست و بزرگترین مقدار i
چون شرط حلقه “کوچکتر از ۱۰” بودن است هم ۹ است که باعث میشود خط آخر ۹ ستاره داشته باشد.
حل این مشکل چندین راه دارد یکی که قطعا غلط نیست اما شاید ترجیح خیلی از برنامه نویسان نباشد این است که حلقه تویی تا i + 1
ادامه پیدا کند که کد ما را به این شکل در میآورد:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i + 1; j++) {
cout << "*";
}
cout << endl;
}
و راه دیگر این است که حلقه بیرونی به جای این که از ۰ تا ۹ حرکت کند از ۱ تا ۱۰ برسد. برای این کار میتوانیم از عملگر مقایسه “کوچکتر مساوی” که قبلا با آن آشنا شده بودیم، به جای “کوچکتر” استفاده کنیم یعنی جای این که حلقه تا کوچکتر از ۱۰ (تا قبل از ۱۰ یعنی ۹) برود تا خود ۱۰ پیش برود و همچنین مقدار اول i
را هم به جای صفر٬ یک میگذاریم:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < i; j++) {
cout << "*";
}
cout << endl;
}
}
*
**
***
****
*****
******
*******
********
*********
**********
در این مطلب به ساخت یک برنامه که یک مثلث ساده را با حلقه فور میکشد پرداختیم میتوانید به همین شکل میتوانید مربع٬ مثلث عکس مثلث کنونی و اشکال متنوع دیگری با یک کارکتر ساده مثل * بکشید امیدوارم در مقاله بعد که قرار است به ساخت یک ماشین حساب بپردازد ببینمتان. /(^-^)\
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < i; j++) {
cout << "*";
}
cout << endl;
}
}
*
**
***
****
*****
******
*******
********
*********
**********
برای این کار در هر خط ۱۰ ستاره چاپ میکنیم و این کار را برای ۱۰ خط انجام میدهیم تا مربعی ۱۰ در ۱۰ داشته باشیم.
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < 10; j++) {
cout << "*";
}
cout << endl;
}
}
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
البته هرچند که این شکل یک مربع ۱۰*۱۰ است آن را به شکل یه مستطیل میبینیم زیرا فاصله خطها از هم بیشتر از فاصله حروف از هم هست. اگر این خروجی را به برنامهای مثل مایکروسافت وورد ببرید و فاصله خط را کم کنید یا فاصله حروف را زیاد کنید، مربع ایجاد شده را بهتر میبینید
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
کلیت کد با کدی که در مقاله نوشتیم یکیاست اما باید جای این که از ۱ تا ۱۰ حرکت کنیم از ۱۰ به یک حرکت کنیم. (حلقه از ۱۰ تا بزرگتر از ۰ یعنی ۱ ادامه میدهد و عدد را یکی یکی کم میکند که برای این کار از --
استفاده میکنیم.)
#include <iostream>
using namespace std;
int main() {
for (int i = 10; i > 0; i--) {
for (int j = 0; j < i; j++) {
cout << "*";
}
cout << endl;
}
}
**********
*********
********
*******
******
*****
****
***
**
*
خط اول ۹ اسپیس و ۱ ستاره دارد و خط دوم ۸ اسپیس و ۲ ستاره و…
پس حلقه اول 10 - i
اسپیس و حلقه دوم i
ستاره چاپ میکنند
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < 10 - i; j++) {
cout << ' ';
}
for (int j = 0; j < i; j++) {
cout << "*";
}
cout << endl;
}
}
*
**
***
****
*****
******
*******
********
*********
**********
این برنامه اشتراکات زیادی با “مثلث عکس” دارد اما دو برابر آن در هر خط ستاره چاپ میکند تا به نوعی ۲ مثلث “نصفه” را به هم بچسباند.
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < 10 - i; j++) {
cout << ' ';
}
for (int j = 1; j < i * 2; j++) {
cout << "*";
}
cout << endl;
}
}
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************