نوع دیگری از حلقه که از آن در برنامه نویسی استفاده میشود حلقهی شمارشی میباشد. تفاوت این تکنیک با حلقهی شرطی در این است که در حلقهی شمارشی از ابتدا میدانیم که این حلقه چند بار اجرا خواهد شد. در حالی که در مثالهای حلقه شرطی متوجه شدیم که در بسیاری از موارد تعداد دقیق اجرای حلقهی شرطی را نمیدانیم. (مثلا به دست آوردن تعداد ارقام یک عدد)
فرمت کلی حلقه ی شرطی به صورت زیر می باشد:
for(مقدار اولیه شمارنده ; شرط ادامه ; گام حلقه)
{
}
توجه کنید که شرط ادامه به شمارشی گفته میشود که در صورت برقرار بودن آن، میتوان کارهای درون حلقه را انجام داد. روال این حلقه به این صورت است که در ابتدای دور اول حلقه مقدار متغیر شمارنده برابر با مقدار اولیه قرار میگیرد. پس از آن شرط چک کیشود و در صورت برقرار بودن شرط کنتل برنامه به داخل حلقه انتقال داده میشود و کارهای درون حلقه برای بار اول اجرا خواهند شد. در انتها کنترل دوباره به ابتدای حلقه بازمیگردد و گام حلقه افزایش مییابد( یعنی مقدار متغیر شمارنده طبق مقدار گام حلقه افزایش یا کاهش مییابد) پس از آن شرط دوباره بررسی میشود و در صورت برقرار بودن شرط کنترل برنامه به درون حلقه انتقال خواهد یافت. این روال تا زمانی که شرط حلقه دیگر برقرار نباشد ادامه خواهد یافت.
برنامهی زیر ده ستاره را در خروجی نمایش میدهد:
main()
{
for(int i = 1 ; i <= 10 ; i++)
{
cout << "*";
}
getch();
}
برنامهی زیر از یک تا صد را در خروجی نمایش میدهد:
main()
{
for(int i = 1 ; i <= 10 ; i++)
{
cout << i;
}
getch();
}
با دقت به این دو برنامه متوجه میشویم که متغیر شمارنده تعداد دفعات اجرای حلقه را کنترل میکند و لازمهی یک حلقهی شمارشی میباشد. اما در برنامهی دوم از متغیر شمارنده بهره بردهایم و با نمایش مقدار آن در واقع اعداد یک تا ده را نمایش دادهایم. در واقع شمارهی دورهای حلقه را چاپ کردهایم.
در ادامه به حل چند تمرین از حلقهی شمارشی میپردازیم.
مثال 1: برنامه ای بنویسید که ده بار در صفحه عبارن Hello World را نمایش دهد:
main() { int i; for( i = 1 ; i <= 10 ; i++) { cout << "Hello World! \t"; } getch(); }
مثال 2: برنامه ای بنویسید که در صفحه خروجی اعداد یک تا 100 را نمایش دهد:
main() { int i; for( i = 1 ; i <= 100 ; i++) { cout << i << "\t"; } getch(); }
مثال 3: برنامه ای بنویسید که در گرافیک، 20 دایره ی متحدالمرکز را با افزایش شعاع رسم کند:
main() { int x = 300,y = 300, r = 50; initwindow(600, 600); for(int i = 1 ; i <= 20 ; i++) { setcolor(i % 16); circle(x, y, r); r = r + 10; } getch(); }
برنامه ی زیر را اجرا کنید و تفاوت کد و اجرای آن را با برنامه ی بالا بیان کنید:
main() { int x = 300,y = 300, r = 50; initwindow(600, 600); for(int i = 1 ; i <= 20 ; i++) { setcolor(i % 16); circle(x, y, r); delay(150); r = r + 10; } getch(); }
مثال 4: برنامه ای بنویسید که در محیط گرافیکی ده بیضی متحدالمرکز توپر را نمایش دهد:
main() { int x = 400,y = 300, r1 = 350, r2 = 250; initwindow(800, 600); for(int i = 1 ; i <= 20 ; i++) { setfillstyle(i % 11, i % 16); fillellipse(x, y, r1, r2); delay(150); r1 = r1 - 10; r2 = r2 - 10; } getch(); }
مثال 5: برنامه ای بنویسید که در گرافیک ده مستطیل توپر تو در تو را رسم کند:
main() { int x1 = 100,y1 = 100, x2 = 600, y2 = 500; initwindow(800, 600); for(int i = 1 ; i <= 20 ; i++) { setfillstyle(i % 11, i % 16); bar(x1, y1, x2, y2); delay(150); x2 = x2 - 10; y2 = y2 - 10; x1 = x1 + 10; y1 = y1 + 10; } getch(); }
مثال 6: برنامه ای بنویسید که در گرافیک شکل زیر را نمایش دهد:
main() { int x1 = 100,y1 = 100, x2 = 200, y2 = 150; initwindow(800, 600); for(int i = 1 ; i <= 20 ; i++) { setfillstyle(i % 11, i % 16); bar(x1, y1, x2, y2); delay(150); x2 = x2 + 10; y2 = y2 + 10; x1 = x1 + 10; y1 = y1 + 10; } getch(); }
مثال 7: برنامه ای بنویسید که در گرافیک شکل زیر را نمایش دهد:
main() { int x = 100,y = 100, r = 50; initwindow(800, 600); for(int i = 1 ; i <= 20 ; i++) { setfillstyle(i % 11, i % 16); fillellipse(x, y, r, r); delay(150); x = x + 10; y = y + 10; } getch(); }
مثال 8: برنامه ای بنویسید که در گرافیک شکل زیر را نمایش دهد:
main() { int x = 100,y = 100, r = 50; initwindow(800, 600); for(int i = 1 ; i <= 30 ; i++) { setcolor(i % 16); circle(x, y, r); delay(150); y = y + 10; } getch(); }
مثال 9: برنامه ای بنویسید که در گرافیک شکل زیر را نمایش دهد:
مثال 10: برنامه ای بنویسید که در گرافیک شکل زیر را نمایش دهد:
مثال 11: برنامه ی زیر اعداد یک تا n (که آن را از ورودی میگیرد) را در خروجی نمایش می دهند:
main() { cout << "Please enter a number? \n"; int num; cin >> num; for(int i = 1 ; i <= num ; i++) { cout << i << "\t"; } getch(); }
دقت کنید که در این برنامه دستور "n\" همان کار endl را انجام میدهد.
خروجی:
مثال 12: برنامه ی زیر یک عدد را از ورودی گرفته و مقسوم علیه های آن را نمایش میدهد:
main() { cout << "Please enter a number? \n"; int num; cin >> num; for(int i = 1 ; i <= num ; i++) { if(num % i == 0) { cout << i << '\t'; } } getch(); }
مثال 12: برنامه ی زیر یک عدد را از ورودی گرفته و کامل بودن یا نبودن عدد را اعلام کند( عدد کامل عددی است که مجموع همه ی مقسوم علیه های خودش برابر با دو برابر خودش بشود.)
main() { cout << "Please enter a number? \n"; int num, sum = 0; cin >> num; for(int i = 1 ; i <= num ; i++) { if(num % i == 0) { sum = sum + i; } } if(sum == 2 * num) cout << "adad kamel ast. "; else cout << "adad kamel nist. "; getch(); }
مثال 13: برنامه ی زیر یک عدد را از ورودی گرفته و اول بودن یا نبودن عدد را اعلام کند.
main() { cout << "Please enter a number? \n"; int num, sum = 0; cin >> num; for(int i = 1 ; i <= num ; i++) { if(num % i == 0) { sum = sum + 1; } } if(sum == 2) cout << "adad aval ast. "; else cout << "adad aval nist. "; getch(); }
مثال 14: برنامه ی زیر دو عدد را از ورودی گرفته و ب.م.م و ک.م.م آن ها را بدست آورده و نمایش دهد:
main() { cout << "Please enter two number? \n"; int a, b, c, bmm, kmm; cin >> a >> b; for(int i = a ; i >= 1 ; i--) { if(a % i == 0 && b % i == 0) { bmm = i; i = 0; } } kmm = a * b / bmm; cout << " B.M.M = "<< bmm << " K.M.M = " << kmm; getch(); }
مثال 15: برنامه ای بنویسید که یک عدد n را از ورودی رفته و حاصل جمع n جمله ی اول سری زیر را نمایش دهد:
main() { cout << "Please enter a number? \n"; float n, s = 0, p = 1; cin >> n; for(int i = 1 ; i <= n ; i++) { p = p * i; s = s + i / p; } cout << "the sum is: " << s << "\n"; getch(); }
مثال 16: برنامه ی زیر یک عدد n را از ورودی گرفته و حاصل n جمله ی اول سری زیر را نمایش میدهد:
main() { cout << "Please enter a number? \n"; float n, s = 0, p = 1, i; cin >> n; for(i = 1 ; i <= n ; i++) { s = s + i * i / (i + 1); } cout << "the sum is: " << s << "\n"; getch(); }
مثال 17: برنامه ی زیر n را از ورودی گرفته ومجموع n جمله ی اول سری زیر را نمایش میدهد:
main() { cout << "Please enter a number? \n"; float n, s = 0, f = 1, i, a, m = 1; cin >> n; for(i = 1 ; i <= n ; i++) { a = (m * m) / ((m + 1) * (m + 1)); s = s + f * a; f = f * -1; m = m + 2; } cout << "the sum is: " << s << "\n"; getch(); }
توجه کنید که متغیر i فقط حکم شمارنده دارد و از یک تا n میشمرد و کار دیگری با آن انجام نمیدهیم.
سوال: اگر به جای m از i استفاده میکردیم چه اتفاقی رخ میداد؟ ...
مثال 18: برنامه ی زیر حاصل رشته ی زیر را نمایش میدهد:
نکته: در این برنامه ورودی نداریم!
main() { cout << "Please enter a number? \n"; float s = 0, f = 1, i; for(i = 100 ; i > 0 ; i--) { s = s + f * (i - (i - 1) / i); f = f * -1; } cout << "the sum is: " << s << "\n"; getch(); }
در دست تعمیرات :)
برای حرکت در محیط گرافیکی نیازمندیم که حرکت را مانند ساخت فیلم و انیمیشن به چند مرحله تبدیل کنیم...
گاهی در برنامه نویسی نیاز داریم که یک یا چند کار را چندین بار تکرار کنیم. برای این که از نوشتن مجدد خطوط برنامه جلوگیری کنیم از تکنیکی به نام حلقههای تکرار استفاده میکنیم.
تا اینجا برنامه هایی که مینوشتیم خط به خط اجرا میشدند و هیچ خطی از برنامه وجود نداشت که اجرا نشده باشد.
اما گاهی میخواهیم برنامههایی بنویسیم که در شرایط متفاوت نیازمند دستورات متفاوتی هستند.
محیط گرافیکی در زبان ++c با پنجره ی خروجی تفاوت دارد. یعنی میتوان همزمان از هر دوی این پنجرهها استفاده کرد.
برای کار در محیط گرافیکی، ابتدا باید کتابخانهی مربوط به دستورات گرافیکی را به برنامه اضافه کنیم. یعنی باید در ابتدای برنامه بنویسیم:
#include <graphics.h>
بعد از این کار میتوانیم از دستورات گرافیکی در برنامه استفاده کنیم و دستورات گرافیکی برای برنامه شناخته شده خواهند بود. در ابتدای نوشتن دستورات گرافیکی باید یک پنجره گرافیکی باز کنیم و بعد از آن مجاز به استفاده از دستورات گرفیکی هستیم. برای باز کردن پنجره گرافیکی به صورت زیر عمل میکنیم:
initwindow (600, 600);
دستور زیر برای شما پنجره گرافیکی به اندازهی 600 در 600 پیکسل باز میکند.
محیط گرافیکی محیطی است که با مختصات و x و y سر و کار دارد. نقطهی (0و0) این محیط در گوشهی بالا سمت چپ قرار دارد. در واقع به شکل زیر است که در آن هر چه به راست میرویم مقدار x از صفر بیشتر و بیشتر میشود و هرچقدر از بالا به پائین میرویم مقدار y از صفر بیشتر و بیشتر میشود.
پس در شکل بالا روابط زیر برقرار است:
x2>x1 , y2=y1
x4>x1 , y4>y2
x1=x3 , y3>y1
در شکل بالا دو خط به دلخواه رسم شدهاند.
خط 1 به 4 از نقطهی (50و50) به (450و450) و خط 3 به 2 از نقطهی (450و50) به (50و450) رسم شدهاند.
پس صورت کلی استفاده از دستورات به شکل زیر می باشد:
برای رسم دایره در محیط گرافیکی از دستور زیر استفاده میکنیم:
#include <graphics.h>
main()
{
initwindow(500, 500);
// dastoorate graphici inja neveshte shavand.
getch();
}
در ادامه برخی از دستورات گرافیکی را با هم مرور میکنیم.
دایره
دستور زیر برای رسم دایره استفاده میشود:
circle(x, y, r);
برای رسم دایره به سه عدد احتیاج داریم. دو عدد اول برای نشان دادن مختصات مرکز (x,y) استفاده میشوند. و عدد سوم r برای نشان دادن طول شعاع استفاده میشود.
مثلا برنامه زیر را ببینید:
main()
{
initwindow(300, 200);
circle(100, 100, 75);
getch();
}
خروجی آن به شکل زیر میباشد:
در این شکل پنجرهی گرافیکی به اندازهی 300 در 200 پیکسل باز شده است. دایره در مرکز (100و100) به شعاع 75 پیکسل رسم شده است.
مستطیل
برای رسم مستطیل تو خالی به دو نقطهی ابتدایی و انتهایی یک قطر از مستطیل احتیاج داریم و این یعنی چهار عدد:
rectangle(x1, y1, x2, y2);
مثلا برنامه زیر را ببینید:
main()
{
initwindow(300, 200);
rectangle(100, 100, 250, 150);
getch();
}
خروجی آن به شکل زیر میباشد:
در این شکل پنجرهی گرافیکی به اندازهی 300 در 200 پیکسل باز شده است. مستطیل از نقطهی (100و100) به نقطهی (150و250) رسم شده است.
اگر بخواهید مربع رسم کنید باید از همین دستور استفاده کنید. برای رسم مربع تنها نکتهای که باید به آن توجه داشته باشید این است که اختلاف x ها برابر با اختلاف y ها بشود.
main()
{
initwindow(300, 200);
rectangle(100, 50, 175, 125);
getch();
}
خروجی به شکل زیر میشود:
خط
برای رسم یک خط به مختصات دو نقطهی ابتدایی و انتهایی آن خط احتیاج داریم و این یعنی چهار عدد :
line(x1, y1, x2, y2);
مثلا برنامه زیر را ببینید:
main()
{
initwindow(300, 200);
line(100, 100, 250, 150);
getch();
}
خروجی آن به شکل زیر میباشد:
در این شکل پنجرهی گرافیکی به اندازهی 300 در 200 پیکسل باز شده است. خط از نقطهی (100و100) به نقطهی (150و250) رسم شده است.
برای استفاده از رنگ برای تغییر رنگ هر یک از این شکلها از دستور زیر استفاده میکنیم:
setcolor(عدد)
که در داخل پرانتز شمارهی رنگ مورد نظر را که یکی از اعداد 0 تا 15 را شامل میشود. هر یک از این اعدا نشان دهندهی یک رنگ میباشند. صفر رنگ سیاه و 15 رنگ سفید میباشند.
توجه داشته باشید که این قسمت درست مانند نقاشی روی کاغذ میباشد که ابتدا مداد رنگی را به دست میگیرید و بعد شکل دلخواه را رسم میکنید. پس ابتدا از دستور تغییر رنگ استفاده میکنیم و پس از آن شکل مورد نظر را رسم میکنیم.
به برنامهی زیر دقت کنید:
main()
{
initwindow(300, 200);
setcolor(14);
circle(100, 100, 50);
setcolor(12);
rectangle(100, 100, 250, 150);
setcolor(13);
line(100, 100, 250, 150);
getch();
}
خروجی برنامه به صورت زیر میباشد:
شما دیگر باید بتوانید مختصاتها را درست قرار بدهید تا بتوانید شکلهایی به صورت بالا بکشید. در شکل بالا دایره و مستطیل مماس هستند و خط رسم شده قطر مستطیل میباشد.
تا الان همهی شکلهایی که یاد گرفتید اشکال توخالی بودند. اکنون چند شکل توپر را نیز یاد خواهیم گرفت:
بیضی توپر
برای رسم بیضی توپر از دستور زیر استفاده میکنیم:
fillellipse(x, y, r1, r2);
که دو عدد اول مختصات مرکز بیضی و دو عدد بعدی شعاع بزرگ و کوچک بیضی را نشان میدهند. r1 شعاع افقی و r2 شعاع عمودی میباشند. پس برای رسم دایره توپر دستوری مجزا نداریم:
r1>r2 بیضی خوابیده
r1<r2 بیضی ایستاده
r1=r2 دایره توپر
به برنامهی زیر توجه کنید:
main()
{
initwindow(450, 200);
fillellipse(75, 80, 25, 75);
fillellipse(200, 80, 75, 25);
fillellipse(375, 80, 50, 50);
getch();
}
خروجی برنامه سه شکل زیر را رسم میکند:
مستطیل توپر
برای رسم مستطیل توپر به دو نقطهی ابتدایی و انتهایی یک قطر از مستطیل احتیاج داریم و این یعنی چهار عدد ( دقیقا مشابه دستور رسم مستطیل توخالی)
bar(x1, y1, x2, y2);
مثلا برنامه زیر را ببینید:
main()
{
initwindow(300, 200);
bar(100, 100, 250, 150);
getch();
}
خروجی آن به شکل زیر میباشد:
در این شکل پنجرهی گرافیکی به اندازهی 300 در 200 پیکسل باز شده است. مستطیل از نقطهی (100و100) به نقطهی (150و250) رسم شده است.
اگر بخواهید مربع توپررسم کنید باید از همین دستور استفاده کنید. برای رسم مربع تنها نکتهای که باید به آن توجه داشته باشید این است که اختلاف x ها برابر با اختلاف y ها بشود( درست مانند مربع توخالی)
main()
{
initwindow(300, 200);
bar(100, 50, 175, 125);
getch();
}
خروجی به شکل زیر میشود:
برای رنگی کردن و همچنین انتخاب مدل توپری اشکال توپر از دستور زیر استفاده میشود:
setfillstyle(p, c);
که عدد اول از یک تا یازده برای انتخاب الگوری پر کردن شکل و عدد دوم هم برای انتخاب رنگ شکل مورد نظر استفاده میشود.
برای رسم یک کمان از از دستور زیر استفاده میکنیم:
arc(x1, y1, sa, ea, r);
که دو عدد اول برای مختصات دایرهای که این کمان بخشی از آن بوده است استفاده میشوند. دو عدد بعدی برای زاویه شروع و پایان ( از 0 تا 360 درجه) کمان استفاده میشوند عدد پنجم هم برای طول شعاع دایره که کمان بخشی از آن بوده است استفاده میشود.
برای رسم مکعب مستطیل از دستور زیر استفاده میکنیم:
bar3d(a, b, c, d, e, f);
که این دستور به شش عدد احتیاج دارد. این اعداد به ترتیب مختصات سه نقطه ی چپ بالا،راست پایین و عمق بالا را نشان میدهند.
برای رسم بیضی تو خالی از دستور زیر استفاده میکنیم:
ellipse(x, y, sa, ea, r1, r2);
که دو عدد اول مختصات مرکز بیضی ، دو عدد دوم زاویه شروع و پایان بیضی(میتوان بیضی را لزوما کامل نکشید) و دو عدد آخر شعاعهای بیضی مربوطه میباشند.
برای استفاده از سایر دستورات به نکات دیگری نیازمندیم که در آینده بیان خواهند شد.
در ادامه به مرور و بررسی تمرینهای مطرح شده در کلاس میپردازیم...