زبان برنامه نویسی سی/دستور if و else if و else

ویکی‎کتاب، کتابخانهٔ آزاد

اگر ، در غیر این صورت اگر ... ، در غیر این صورت
if, else if, else
[ویرایش]

شکل کلی استفاده از if ها :

if(expression)
{
statements;
}
else if(expression)
{
statements;
}
else
{
statements;
}

if به معنی اگر می‌باشد ؛ که اگر عبارت داخل پرانتز رو به روی خود ( که شرط یا شرط‌های دستور if هستند ) صدق کند و برقرار باشد ، آنگاه حکم پس از آن ( در یک خط ) یا حکم‌های داخل بلوک خود را به اجرا در می‌آورد و اگر این عبارت برقرار نباشد بلوک if نادیده گرفته می‌شود ولی اگر شرط بعدی که در else if نوشته شده است ( که آن هم یک عبارت است که می‌تواند از زیر عبارت‌هایی تشکیل شده باشد ) برقرار باشد حکم پس از آن ( همچنان در یک خط ) یا حکم‌های داخل بلوک آن به اجرا در می‌آیند . else if به معنی « در غیر این صورت اگر ... » می‌باشد که ممکن است یک یا دو یا چند else if برای هر if وجود داشته باشد . در پایان اگر هیچ کدام از شرط‌های if و else if ها برقرار نبودند ، آنگاه حکم یا حکم‌های بلوک else به اجرا در می‌آیند . دقت کنید که else شرطی ندارد و نمی‌توانید برای آن شرط بنویسید ( در واقع اگر if و else if هایش ، شروظشان برقرار نبود ، حکم یا بلوک else به اجرا در می‌آید )

مثال :

#include<stdio.h>

int digits(unsigned int a);
int main(void)
{
	printf("Enter A Number :\n");
	unsigened int i = 0;
	scanf("%d", &i);	
	digits(i);
	return 0;
}

int digits(unsigned int a)
{
	if((a>=0)&&(a<10))
	{
	printf("Your Number has One Digit\n");
	}
	else if((a>=10)&&(a<100))
	{
	printf("Your Number has Two Digits\n");
	}
	else if((a>=100)&&(a<1000))
	{
	printf("Your Number has Three Digits\n");
	}
	else
	{
	printf("Your Number is Huge!\n");
	}
	printf("This is End!\n");
	return 0;
}

در مثال بالا با دستور مستقیم include فایل سرآیند stdio را ضمیمه فایل برنامه خود نموده‌ایم تا بتوانیم از دو تابع کتابخانه‌ای printf و scanf در برنامه خود استفاده کنیم . سپس تابع digits را اعلان نموده‌ایم که یک پارامتر صحیح بدون علامت با نام a دارد ، بنابراین می‌توانیم هر عدد صحیح مثبتی را در هنگام فراخوانی آن ، به عنوان آرگومان به آن پاس بدهیم . در تابع اصلی برنامه یعنی main با تابع printf در خروجی خط‌دستوری چاپ کرده‌ایم Enter A Number یعنی یک عدد را وارد کنید که کاربر باید یک عدد وارد کند و دکمه Enter را بزند . یک متغیر صحیح بدون علامت با نام i و مقدار 0 تعریف نموده‌ایم . سپس با کمک تابع scanf متغیر i را از کاربر توسط صفحه کلید ( Keyboard ) دریافت نموده‌ایم . بعد از آن تابع digits را فراخوانی نموده‌ایم که متغیر i را به عنوان آرگومان به تابع خود پاس داده‌ایم ( متغیر i یک عدد است که کاربر برنامه ، آن را از طریق صفحه کلید خود وارد می‌کند که تابع digits بر روی آن عدد ، پردازش انجام می‌دهد ) در پایان ، تابع main با موفقیت به پایان می‌رسد که نوشته‌ایم ;return 0

تعریف تابع digits در پایان فایل برنامه قرار دارد که یک پارامتر از نوع صحیح بدون علامت با نام a دارد . پردازشی که بر روی a انجام می‌دهد بدین شکل است :

هر عدد صحیحی که به تابع digits فرستاده شود ، digits بررسی می‌کند که اگر a بزرگتر یا مساوی 0 و همچنین کوچکتر از 10 است ، چاپ می‌کند : Your Number has One Digit ؛ یعنی عدد شما یک رقم دارد در غیر این صورت اگر a بزرگتر مساوی 10 و هچنین از عدد 100 کوچکتر باشد ، چاپ می‌کند : Your Number has Two Digits یعنی عدد شما دو رقم دارد در غیر این صورت اگر a بزرگتر مساوی 100 و همچنین کوچکتر از 1000 باشد ، چاپ می‌کند : Your Number has Three Digits یعنی عدد وارد شده سه رقم دارد در غیر این صورت ؛ یعنی وقتی هیچ کدام از شرایط if و else if هایش برقرار نبود و عدد وارد شده ، خارج از مقادیر تعیین شده بود ؛ که می‌شود بزرگتر از 1000 برنامه چاپ می‌کند !Your Number is Huge یعنی عدد شما خیلی بزرگ است

در پایان ، تابع چاپ می‌کند !This is End یعنی برنامه اینجا به اتمام می‌رسد

توضیح : تابع scanf یک تابع استاندارد در زبان C است که در فایل سرآیند stdio تعریف می‌شود و می‌تواند از طریق صفحه‌کلید ( Keyboard ) اعداد یا کاراکترها یا رشته‌هایی را دریافت کند که اینکه چه می‌تواند دریافت کند وابسته به کاراکترهای کنترل ( فرمت کننده ) نوشته شده توسط برنامه‌نویس می‌باشد که ما در اینجا d% را نوشته‌ایم که به معنی عدد دسیمال ( Decimal ) و دهدهی می‌باشد . اما این تابع در زبان C با کمک اشاره‌گرها نوشته می‌شود که به همین خاطر برای نوشتن کد توسط برنامه‌نویس باید شناسه‌های خود را که باید مقداری را دریافت و ذخیره کنند با عملگر آدرس‌دهی ( & ) به تابع scanf پاس بدهید تا کاربر بتواند از طریق صفحه‌کلید خود ، مقادیری را وارد کند ( در ادامه کتاب با مباحث مربوطه به صورت کامل آشنا خواهید شد )

می‌بینید که با کمک دستورهای شرطی if شما می‌توانید مقادیر مختلف ورودی را بررسی کنید و در ازای هر مقدار در هر ورودی یک خروجی بدهید

ممکن است نیازی به else if ها و else نداشته باشید و فقط یک شرط بگذارید که اگر صدق کرد ، حکمی یا احکامی به اجرا در بیایند . مثل :

if(a==5)
printf("Your number is 5");

یا ممکن است از else if ها استفاده کنید ولی گزینه‌هایی که جز مد نظر شما هستند را نادیده بگیرید و از else استفاده نکنید . مثل :

if(a==5)
{
printf("Your number is 5\n");
}
else if(a==10)
{
printf("Your number is 10\n");
}
else if(a==14)
{
printf("Your number is 14\n");
}

یا اینکه از else if ـی استفاده نکنید و شرطی را بگذارید که اگر برقرار بود حکم‌های if اجرا شوند و اگر برقرار نبود حکم‌های else به اجرا در بیایند . مثل :

if(k<9)
{
//some codes
}
else
{
//some other codes
}

اگر آکولادهای if و else if و else را ننویسید برای هر کدام از آنها تنها می‌توانید یک حکم بنویسید ؛ یعنی حکم‌های بعدی را که بنویسید ، بدون شرظ و به صورت حتمی اجرا می‌شوند چرا که جزء شرط حساب نمی‌شوند . برای همین اگر چند حکم ( که با سمی‌کالن پایان می‌یابند ) را می‌خواهید بنویسید برای دستورات مذکور ، بلوک ایجاد کنید ( با کمک آکولادها ) . دقت کنید که اگر داده‌ای را داخل بلوک if ها ( یعنی if و یا else if و یا else ) اعلان کنید ، داده محلی می‌باشد و فقط قابل دسترسی داخل همان بلوک و بلوک‌های داخل آن بلوک می‌باشد . دقت کنید : هر else برای آخرین if ( و else if هایش ) می‌باشد . همچنین شما می‌توانید برای هر if و else if ، به تعداد مورد نیاز if ها و else if ها و برای هر کدام else ـی را داخل آنها بنویسید . برای اینکه در کدنویسی‌های پیچیده و if های تو در تو دچار مشکل نشوید سعی کنید از بلوک‌ها استفاده کنید و با قابلیت دندانه‌دار شدن متن با کمک دکمه tab آنها را از یکدیگر متمایز کنید ( که در IDE ها این عمل به صورت خودکار انجام می‌شود ) . یعنی if های داخلی‌تر ( به همراه else if هایشان و else ) را با tab های بیشتر بنویسید ( هر چه داخلی‌تر با tab بیشتر ؛ البته آنهایی که با هم هستند را به یک تعداد وارد کنید ، مثلاً همگی ۳ tab )

مثال :

if(g < 9)
a++;
printf("Some sentence\n");

در مثال بالا اگر g کوچکتر از 9 باشد a یک واحد ، افزایش خواهد یافت . اما تابع printf چه g کوچکتر از 9 باشد و چه مساوی باشد و چه بزرگتر ؛ جمله Some sentence را چاپ خواهد نمود چرا که داخل شرط if نیست ( همان طور که گفته شد ، اگر بلوکی ایجاد نکنید تنها می‌توانید یک حکم برای if و یا else if و یا else بنویسید )

هر else برای یک if می‌باشد که if می‌تواند else if هایی هم داشته باشد و همان طور که گفته شد در if های تو در تو اولین else برای آخرین if نوشته شده می‌باشد

مثال :

	if( x > 0 ) 
			if( y > 0 ) 
				printf( "x > 0 && y > 0\n" ); 
			else 
				printf( "x > 0\n" );

در مثال بالا اگر x بزرگ‌تر از 0 باشد آنگاه شرط y بررسی خواهد شد که اگر y نیز بزرگ‌تر از 0 باشد جمله x و y بزرگ‌تر از 0 هستند چاپ خواهد شد در غیر این صورت که y کوچک‌تر یا مساوی 0 باشد حکم else نادیده گرفته می‌شود و دستور if بیرونی حکمی ندارد بنابراین برنامه هیچ کاری انجام نخواهد داد برای نوشتن کد قابل درک ، بهتر است بنویسید :

	if( x > 0 )
{
		if( y > 0 )
		{
			printf( "x > 0 && y > 0\n" );
		}
		else
		{
			printf( "x < 0\n" );
		}
}

گاهی نیاز است که اگر شرطی برقرار بود ، بررسی شود که شرط‌های دیگری نیز برقرار هستند یا نه و بر اساس شروط تو در تو تعیین کنیم تا برنامه چه خروجی‌ای بدهد . در این مواقع هر if و else if هایش خودشان یک if و یک یا چند else if و یک else دیگر دارند که خود آنها نیز می‌توانند if ها و else if های دیگری داشته باشند . مثال :

#include <stdio.h>
int main()
{
    int number1, number2;
    printf("Enter two integers: ");
    scanf("%d %d", &number1, &number2);

    if (number1 >= number2)
    {
      if (number1 == number2) 
      {
        printf("Your numbers are equal");
      }
      else 
      {
        printf("Your first number is greater");
      }
    }
    else
    {
        printf("Your second number is greater");
    }

    return 0;
}

در مثال بالا دو متغیر صحیح با نام‌های number1 و number2 اعلان کرده‌ایم . با تابع printf چاپ کرده‌ایم که کاربر باید دو عدد وارد کند ( که در خروجی خط‌دستوری نمایش داده خواهد شد ) . سپس برنامه با تابع scanf دو عدد را از کاربر به واسطه صفحه‌کلید ، دریافت می‌کند که اولی number1 و دومی number2 هستند . بعد با if اول بررسی می‌شود اگر number1 بزرگتر مساوی number2 باشد داخل بدنه if اول ارزیابی خواهد شد و در صورتی که if اول if number1 >= number2 درست نباشد ، یعنی number1 بزرگتر مساوی number2 نباشد else دوم به اجرا در می‌آید ( چون عدد دوم وارد شده بزرگتر است ) و Your second number is greater چاپ می شود که می‌گوید عدد دوم بزرگتر است اما در صورتی که عدد اول بزرگتر یا مساوی عدد دوم باشد ( شرط if اول برقرار باشد ) با if دوم ( if (number1 == number2) ) بررسی شود که اگر number1 مساوی number2 است Your numbers are equal چاپ شود که یعنی دو عدد مساوی هم هستند و در غیر این صورت ( else داخل if اول ) یعنی اگر number1 بزرگتر از number2 باشد Your first number is greater چاپ شود ، یعنی عدد اول وارد شده بزرگتر است .

دقت کنید که if اول if بیرونی‌تر می‌باشد و فقط در صورتی که صحیح باشد if ها و else if ها و else داخل آن بررسی خواهند شد . در غیر این صورت کامپایلر به دنبال else if بیرونی و اول تر خواهد گشت که اگر موجود باشد شرط و یا شروط else if یا else if ها را بررسی خواهد کرد که اگر هرکدام درست باشند ، حکم‌های آنها به اجرا در خواهند آمد ؛ اما در صورتی که شروط else if ها نیز هیچ کدام برقرار نباشند ، حکم یا حکم‌های else به اجرا در خواهند آمد . همچنین اگر شرط هر کدام از if ها و یا else if ها برقرار باشد که خود ، if و else if ها و else داخل خود را داشته باشند ، آن if و یا else if های داخل شرط‌ها بررسی خواهند شد که اگر هر کدام درست باشد ، حکم آنها اجرا خواهد شد اما اگر نباشد else داخلی if اجرا می‌شود

فرض کنید شما می‌خواهید عدد مجهولی را بین ۰ تا ۱۰٫۰۰۰ که کاربر در نظر دارد ، حدس بزنید ، با کمک کدنویسی به همراه شرط‌ها و حلقه‌ها بررسی می‌کنید که آیا عدد بزرگ‌تر از ۱۰۰۰ است یا خیر ، اگر بزرگتر بود بررسی می‌کنید که آیا بزرگتر از ۲۰۰۰ است یا خبر و همین طور الی آخر ؛ ولی اگر کوچکتر از ۱۰۰۰ بود بررسی می‌کنید که آیا بین ۱۰۰ و ۱۰۰۰ است یا خیر ، اگر نبود ( که یعنی از ۱۰۰ کوچکتر است ) بررسی می‌کنید که آیا کوچکتر از ۱۰ است یا بزرگتر از ۱۰ و کوچکتر از ۲۰ است و یا بزرگتر از ۲۰ و یا کوچکتر از ۳۰ است و همین طور الی آخر . فرض کنیم عدد ۲۴ است و کوچکتر از ۳۰ و بزرگتر از ۲۰ است . حالا باید یکی یکی بررسی کنیم که آیا ۲۱ است یا ۲۲ یا ۲۳ یا ۲۴ یا ۲۵ یا ۲۶ یا ۲۷ یا ۲۸ یا ۲۹ . در این گونه مواقع نیاز به شروط تو در تو خواهیم داشت

با دستورهای if و else if ها و else ما می‌توانیم گزینه‌های ممکن ورودی را طبقه‌بندی کنیم . محدوده‌ها و طبقه‌های بزرگتر و کلی‌تر در if ها و else if های بیرونی‌تر بررسی می‌شوند و هر چه بیشتر وارد جزئیات شویم با if ها و else if های بیشتری که داخلی‌تر هستند و داخل if و else if های بیرونی قرار دارند به بررسی گزینه‌های ممکن می‌پردازیم

جمله‌های شرطی[ویرایش]

در داخل پرانتزهای باز و بسته هر شرط یعنی if و یا else if یک عبارت نوشته می‌شود که ممکن است خود متشکل از چند زیر عبارت باشد که می‌تواند عملوند و یا عملوندهایی که عدد یا شناسه هستند داشته باشد و عملگرها که عموماً عملگرهای مقایسه‌ای و بررسی در کنار عملگرهای منطقی هستند شرط را لحاظ می‌کنند . دقت کنید که شناسه‌ها می‌توانند نام متغیرها و یا تابع باشند که در نهایت هر چه در پرانتزهای باز و بسته شرط ، قرار داشته باشد ارزیابی می‌شود که اگر درست true یا غیر 0 بود ، شرط برقرار است و حکم‌های شرط اجرا می‌شوند و اگر غلط false و یا 0 بود برنامه ادامه می‌یابد و اگر if ، شرط‌های دیگری داشته باشد ( else if ها ) به همین شکل بررسی خواهند شد که اگر هیچ‌کدام درست نبودند else به اجرا در می‌آید و اگر else ـی هم وجود نداشته باشد آن قسمت از برنامه که شرط‌ها را داشته است بدون اثر گذاری بر روی برنامه ، نادیده گرفته خواهد شد ؛ چرا که هیچ‌کدام از شرط‌ها برقرار نبوده‌اند

دقت کنید که شما می‌توانید از عملگرهای دیگر نیز بر روی شناسه‌ها استفاده کنید تا اگر بعد از ارزیابی به همراه عملگر ، مقدار درست true یا غیر 0 پیدا کرد حکم‌های شرط اجرا شوند و اگر غلط false و یا 0 بود ، حکم‌ها نادیده گرفته شوند . بنابراین شما می‌توانید حتی نام یک متغیر را که می‌تواند نام یک تابع هم باشد داخل پرانتزهای باز و بسته شرط بنویسید

مثال :

#include<stdio.h>
int main(void)
{
	int a = 0;
	if(a)
	printf("A does exist\n");
	else
	printf("A doesn't exist\n");

	return 0;
}

در مثال بالا متغیری از نوع صحیح با شناسه a با مقدار 0 تعریف نموده‌ایم . سپس با دستور if بررسی کرده‌ایم که مقدار a چقدر است ، اگر مقدار a مغابر با 0 باشد و وجود داشته باشد شرط ، چاپ می‌کند A does exist و اگر 0 باشد و وجود نداشته باشد چاپ می‌شود A doesn't exist ( که واضح است حکم دستور else به اجرا در می‌آید چرا که مقدار a صفر است 0 و شرط برقرار نیست )

مثال :

#include<stdio.h>

int one(void);
int main(void)
{
	if(one())
	printf("Number does exist\n");
	else
	printf("Number doesn't exist\n");
	return 0;
}

int one(void)
{
	int i = 1;
	return i;
}

مثال بالا همانند مثال قبلی است با این تفاوت که تابعی با نام one داریم که مقدار 1 را در خود ایجاد می‌کند ( با متغیر i ) و متغیر i را که مقدار 1 دارد باز می‌گرداند . در دستورهای شرطی بررسی کرده‌ایم که آیا تابع one مقداری دارد یا نه . که اگر داشت چاپ می‌شود Number does exist یعنی عددی وجود دارد و اگر نه چاپ می‌شود Number doesn't exist ( که واضح است حکم دستور if به اجرا در می‌آید چرا که تابع one مقدار 1 را باز می‌گرداند و موجود است )

مثال :

#include<stdio.h>

int main(void)
{
	int number;
	printf("Enter a number :\n");
	scanf("%d", &number);
	if(!((number==5)||(number==10)))
	printf("Your number is neither 5 nor 10\n");
	else
	printf("Your number is either 5 or 10\n");
	return 0;
}

در مثال بالا یک عدد از کاربر دریافت می‌کنیم که اگر عدد یکی از اعداد 5 یا 10 نبود ؛ چاپ می‌کند عدد شما 5 یا 10 نیست ، در غیر این صورت چاپ می‌کند عدد شما یکی از عداد 5 یا 10 است چگونگی : فایل سرآیند stido را ضمیمه برنامه خود نمودیم تا بتوانیم از تابع‌های printf و scanf استفاده کنیم . در تابع اصلی برنامه ( main ) یک متغیر صحیح با نام number اعلان نمودیم و با تابع printf چاپ کرده‌ایم که کاربر یک عدد وارد کند . سپس با دستور شرطی if بررسی کرده‌ایم که اگر عدد وارد شده هر یک از اعداد 5 یا 10 نبود چاپ کند عدد شما هیچ یک از اعداد 5 یا 10 نبوده است در غیر این صورت چاپ کند عدد شما یا 5 یا 10 بوده‌ است . اما به عبارت شرط دقت کنید ، نوشته‌ایم ((number==5)||(number==10))! که عبارت بدین شکل ارزیابی می‌شود : (number==5)||(number==10) یعنی اگر عدد مساوی 10 باشد یا مساوی 5 باشد خروجی صحیح است ؛ به بیان دیگر هر کدام از آنها باشد عبارت صحیح است . اما این عبارت داخل یک جفت پرانتز باز و بسته قرار دارد که یک علامت تعجب که عملگر نه منطفی است ، پشت آن قرار دارد که عبارتی که درست ارزیابی شود را نفی می‌کند و مقدار درست true و غیر 0 را غلط false و 0 می‌کند و مقدار غلط false و 0 را درست true و غیر 0 می‌کند . بنابراین در اینجا هر کدام از اعداد 5 یا 10 توسط کاربر وارد شوند ، عبارتِ درست ، غلط می‌شود و شرط مردود خواهد شد . یعنی عدد اگر 5 یا 10 باشد if به اجرا در خواهد آمد که چاپ می‌کند یکی از اعداد 5 یا 10 است و در غیر این صورت چاپ می‌کند عدد شما هیچ‌کدام از اعداد 5 با 10 نیست بنابراین می‌بینید که می‌توان به کمک عملگرها ، عبارت‌های پیچیده نوشت

کاربرد[ویرایش]

از if می‌توان برای طبقه‌بندی داده‌ها ، مخصوصاً داده‌ها و رویه‌های متفاوت و قابل تغییر و همچنین ایجاد رابطه استفاده نمود . با if ها می‌توانید ورودی‌ها را که می‌تواند مثلاً داده‌های فایل‌ها و یا سیگنال‌های سخت‌افزار باشد بررسی کنید تا اگر در محدوده یا طیف یا محدوده‌ها و طیف‌های خاصی وجود داشت ، برنامه شما پاسخ و عملکرد متناسب را اعمال کند . شما می‌توانید محدوده خاصی را تعیین کنید یا محدوده های مجزا از هم را تعیین و مابقی را با کمک else استثناء کنید یا اینکه داخل محدوده‌ای که مد نظر شماست را به محدوده‌ها و طبقه‌های دیگری تقسیم کنید که برخی از آنها را استثناء کنید . همچنین با کمک حلقه‌ها شما می‌توانید از if ها برای ایجاد یک رابطه استفاده کنید تا در ازای پارامترهایی ، پارامترهای دیگر تغییر کنند . با کمک if های تو در تو ، شما می‌توانید روابط را پیچیده و با جزئیات بیشتر کنید

دقت کنید که عبارت‌هایی که در else if بررسی می‌شوند باید در مورد همان داده یا همان داده‌هایی باشد که در if بررسی شده‌اند و برنامه شما برای کارکرد درست باید منطقی باشد . در غیر این صورت برنامه شما با مشکل مواجه خواهد شد که کامپایلر از شما خطایی نمی‌گیرد و حتی اخطاری هم نمی‌دهد اما برنامه شما درست کار نخواهد کرد . همچنین دقت داشته باشید که برنامه‌ای با کیفیت است و مطلوب کاربران خواهد بود که شرایط مختلف را بررسی کند . حتماً تا به حال به وفور با پیام‌های خطای ( Error Messages ) برنامه‌های مختلفی رو به رو شده باشید که به شما می‌گویند برنامه از نصب و اجرا بازماند چرا که فایل مورد نظر برنامه قابل خواندن نیست ( به طور مثال ) شما باید بررسی کنید که آیا تمام فایل‌های ( کتابخانه‌ها و فایل‌های تنظیمات ) مورد نیاز برنامه شما موجود هستند یا نه و اگر یکی موجود نیست نام همان را در پیغام خطای خود به همراه آدرسش به کاربر اعلام کنید که یافت نشد . ممکن است همگی یافت شوند اما یکی یا چند تا از آنها ویرایش شده و غیر قابل خواندن شده باشند ؛ در این صورت باید برنامه شما پیغام خطا بدهد که فایل یا فایل‌هایی با این اسامی و در این آدرس‌ها غیر قابل خواندن هستند . یکی از معایب سیستم عامل Windows 10 که موجب نارضایتی کاربران شده پیغام‌های خطای نامفهوم مثل Something Happened می‌باشد به معنی اتفاقی افتاده !! ویندوز دقیقاً گزارش نمی‌دهد که به چه علت سیستم عامل متوقف شده است . سعی کنید تمام شرایط و رویدادهای ممکن در طول نصب و اجرای برنامه خود را با کمک if ها بررسی کیند و خطاهای ممکن را لحاظ کنید و پیغام خطای مناسب و قابل فهم را به کاربر نمایش دهید ( این هم یکی از کاربردهای دستورهای شرطی می‌باشد )