نوع دیگری از حلقه که از آن در برنامه نویسی استفاده میشود حلقهی شمارشی میباشد. تفاوت این تکنیک با حلقهی شرطی در این است که در حلقهی شمارشی از ابتدا میدانیم که این حلقه چند بار اجرا خواهد شد. در حالی که در مثالهای حلقه شرطی متوجه شدیم که در بسیاری از موارد تعداد دقیق اجرای حلقهی شرطی را نمیدانیم. (مثلا به دست آوردن تعداد ارقام یک عدد)
فرمت کلی حلقه ی شرطی به صورت زیر می باشد:
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(); }
در دست تعمیرات :)
برای حرکت در محیط گرافیکی نیازمندیم که حرکت را مانند ساخت فیلم و انیمیشن به چند مرحله تبدیل کنیم...