دستور for
برای انجام یک کار مشخص، راههای خیلی مختلفی برای نوشتن یک برنامه وجود داره. بیایید یک نسخهی متفاوت از برنامه مبدل دما رو امتحان کنیم.
#include <stdio.h>
/* چاپ جدول فارنهایت-سلسیوس */
main()
{
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}
این برنامه دقیقاً همون خروجی قبلی رو تولید میکنه، ولی ظاهرش کاملاً متفاوته. یکی از تغییرات بزرگ، حذف کردن بیشتر متغیرهاست؛ فقط متغیر fahr باقی مونده که اون رو هم از نوع int تعریف کردیم. حد پایین، حد بالا و اندازه گام (step) فقط به عنوان مقادیر ثابت داخل دستور for اومدن که خودش یک ساختار جدیده. همینطور، عبارتی که دمای سلسیوس رو محاسبه میکرد، حالا به جای اینکه توی یک دستور انتساب (assignment) جدا باشه، مستقیماً به عنوان آرگومان سوم تابع printf قرار گرفته.
این تغییر آخر، نمونهای از یک قانون کلی در C هست: در هر جایی که مجاز به استفاده از مقدار یک نوع (type) خاص هستید، میتونید از یک عبارت (expression) پیچیدهتر از همون نوع هم استفاده کنید. از اونجایی که آرگومان سوم تابع printf باید یک مقدار از نوع ممیز شناور (floating-point) باشه تا با فرمت %6.1f هماهنگ باشه، هر عبارت دیگهای که خروجیش از نوع ممیز شناور باشه هم میتونه در این قسمت قرار بگیره.
ساختار حلقهی for
دستور for یک حلقه (loop) و در واقع شکل کلیتر و پیشرفتهتری از حلقهی while هست. اگه اون رو با حلقهی while قبلی مقایسه کنید، عملکردش براتون روشن میشه. داخل پرانتزهای for، سه بخش وجود داره که با نقطه-ویرگول (semicolon) از هم جدا شدن:
-
بخش اول: مقداردهی اولیه (Initialization) fahr = 0 این بخش فقط یک بار، قبل از اینکه حلقه شروع به کار کنه، اجرا میشه.
-
بخش دوم: شرط (Condition) fahr <= 300 این شرط، حلقه رو کنترل میکنه. این شرط ارزیابی میشه؛ اگه درست (true) باشه، بدنهی حلقه (که اینجا فقط یک دستور printf هست) اجرا میشه.
-
بخش سوم: گام افزایش (Increment) fahr = fahr + 20 بعد از اجرای بدنهی حلقه، این بخش اجرا میشه و سپس شرط دوباره ارزیابی میشه.
حلقه زمانی به پایان میرسه (terminate) که شرط دیگه درست (true) نباشه و نادرست (false) بشه. درست مثل while، بدنهی حلقه میتونه یک دستور تنها یا گروهی از دستورات باشه که داخل آکولاد {} قرار گرفتن. هر سه بخش مقداردهی اولیه، شرط و افزایش میتونن هر نوع عبارت معتبری در زبان C باشن.
for یا while؟ کدام بهتر است؟
انتخاب بین while و for کاملاً سلیقهایه و بستگی به این داره که کدومشون توی اون موقعیت خاص، کد رو خواناتر میکنه. اما به عنوان یک قاعده کلی، حلقهی for معمولاً برای حلقههایی مناسبه که مقداردهی اولیه و گام افزایش، دستورات ساده و تکی هستن و از نظر منطقی به هم ربط دارن (مثل شمردن از ۱ تا ۱۰). مزیت for اینه که هم کد رو خلاصهتر میکنه و هم تمام دستورات کنترلی حلقه (مقدار اولیه، شرط و گام افزایش) رو یکجا کنار هم نگه میداره.
تمرین ۱-۵
برنامه تبدیل دما رو طوری تغییر بدید که جدول رو به صورت برعکس چاپ کنه؛ یعنی از ۳۰۰ درجه شروع بشه و به ۰ درجه برسه.