پرش به محتوا

زبان برنامه نویسی سی/دستور switch و case و default

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

دستور سوئیچ switch

[ویرایش]

شکل کلی نوشتن حلقه گزینشی switch بدین شکل است :

switch(expression)
{
case constant-expression: statement1; statement2;...
break;
case constant-expression: statement1; statement2;...
break;
.
.
.
default: statement1; statement2;...
break;
}

دستور گزینشی switch عبارتی که در جفت پرانتز رو به روی خود دارد را مورد ارزیابی قرار می‌دهد که می‌تواند شناسه یک متغیر باشد ( تا مقدار آن را امتحان کند ) تا در این ارزیابی اگر با مقادیر داده شده به هر کدام از case ها مساوی و برابر بود ، حکم‌های آن case را به اجرا بگذارد ( که case ها موارد و گزینه‌های switch هستند ) . اگر هیچ کدام از مقادیر case ها مساوی با مقدار مورد ارزیابی نبود ، حکم‌های default یا همان پیش‌فرض اجرا می‌شوند . دقت کنید که تنها می‌توانید مقادیر غیر اعشاری را در دستور switch به کار ببرید تا کامپایلر ارزیابی کند و مقادیری که به موردها case ها نسبت داده‌اید را بسنجد ( مقادیر صحیح که در int و long یا long long می‌توانید ذخیره کنید و یا کاراکترها را ، ولی نه رشته‌ها را ) نوشتن دستور default اختیاری است اما اگر ننویسید و مقدار مورد ارزیابی برابر با مقدار هیچ کدام از case ها نباشد ، دستور switch نادیده گرفته خواهد شد و هیچ عملی را به انجام نخواهد رساند

همچنین دقت کنید که مقدار هر case تنها می‌تواند یک عدد صحیح و یا یک کاراکتر ( داخل یک جفت سینگل کوت ) باشد . طبق استاندارد C شما مجاز به نوشتن چند case که مقدار یکسانی دارند نیستید . دستور break نیز تا حدودی اختیاری است . شما می‌توانید آن را ننویسید اما در صورت ننوشتن آن و تساوی مقدار مورد ارزیابی با هر case حکم‌های آن اجرا می‌شود و اگر break وجود نداشته باشد حکم‌های case بعدی نیز اجرا می‌شود و این عمل تا جایی ادامه پیدا می‌کند که بالأخره یک جا کامپایلر به break برسد و اگر هیچ break ـی وجود نداشته باشد تمام حکم‌ها اجرا خواهند شد . طبق استاندارد C شما تنها یک default در هر switch می‌توانید بنویسید ولی نه بیشتر ( می‌توانید همان طور که گفتیم اصلاً آن را ننویسید ولی در این صورت اگر عبارت و مقدار متغیری که می‌خواهید ارزیابی شود با هیچ کدام از case ها مساوی نباشد ، هیچ حکمی اجرا نخواهد شد ) . شما می‌توانید چند case را بدون ;break پشت سر هم بنویسید و برای همه آنها یک حکم یا چند حکم بنویسید . در این صورت اگر مقدار مورد ارزیابی برابر هر کدام از case ها باشد همه حکم یا حکم‌های نوشته شده پس از آن مورد صحیح ، اجرا خواهند شد ( مثلاً یک case مقدار 1 دارد و یک case مقدار 2 دارد و یک case مقدار 3 دارد ، اگر عدد ۲ صحیح باشد و برابر با مقدار مورد ارزیابی واقع شده باشد ، حکم یا حکم‌های همه آن case های پشت سر هم پس از ۲ به اجرا در می‌آیند )

نکته : شما می‌توانید دستورهای switch را تو در تو بنویسید

مثال :

#include<stdio.h>

int main()
{
	char c;
	scanf("%c", &c);
	switch(c)
	{
	case 'a': printf("Your letter is a\n");
	 break;
	case 'b': printf("Your letter is b\n");
	 break;
	case 'c': printf("Your letter is neither a or b\n");
	 break;
	default : printf("WooHoo!\n");
	 break;
	}
	
	return 0;
}

در مثال بالا بعد از ضمیمه نمودن فایل سرآیند stdio ( جهت استفاده از تابع printf و scanf که در آن قرار دارد ) در تابع اصلی برنامه main یک کاراکتر با نام c اعلان نموده‌ایم که مقدار آن را از کاربر دریافت می‌کنیم ؛ سپس با کمک دستور گزینشی switch مقدار c را مورد ارزیابی قرار می‌دهیم تا اگر حرف a بود در خروجی خط دستوری چاپ شود حرف شما a است ، و اگر b بود چاپ کند حرف شما b است و اگر c بود چاپ کند حرف شما a یا b نیست و اگر هر چیز دیگری بود چاپ کند WooHoo ! تابع main با موفقیت به پایان می‌رسد و نوشته‌ایم ;0 return

دقت کنید : اگر دستورهای break را نمی‌نوشتیم و کاربر برنامه ، حرف a را وارد می‌کرد ، آنگاه تمام تابع‌های printf های بعدی نیز اجرا می‌شدند و در خروجی خط دستوری جملات خود را چاپ می‌نمودند

مثال :

#include<stdio.h>

int main()
{
	int i = 0;
	scanf("%d", &i);
	switch(i+1)
	{
	case 1: printf("Your number is 0\n");
	 break;
	case 2: printf("Your number is 1\n");
	 break;
	case 3: printf("Your number is 2");
	 break;
	default : printf("Your number is greater than 2\n");
	 break;
	}
	
	return 0;
}

مثال بالا همانند مثال قبلی است با این تفاوت که اولاً از یک عدد ( عدد صحیح که از نوع int است ) به جای کاراکتر استفاده نموده‌ایم و دوماً به جای چک کردن مقدار متغیر به صورت عادی آن را با 1 جمع کرده‌ایم . اگر مقدار داده شده توسط کاربر برنامه به علاوه 1 ، ۱ شود یعنی 0 است که ما چاپ کنیم مقدار وارد شده توسط شما ۰ است و اگر به علاوه 1 ، ۲ شود چاپ می‌کنیم عدد وارد شده شما ۱ است ، همچنین اگر مجموع عدد وارد شده با ۱ بشود ۳ آنگاه چاپ می‌کنیم عدد وارد شده شما ۲ است و اگر مجموع عدد وارد شده با ۱ هر چیزی جز ۱ ، ۲ و ۳ شود چاپ می‌کنیم عدد وارد شده شما بزرگتر از ۲ است

همانند if ها که می‌توانند تو در تو باشند ، switch ها نیز می‌توانند تو در تو نوشته شوند و اگر دقت کنید switch شکلی از if است که کار را کمی آسان‌تر نموده است . برای نوشتن سوئیچ‌های تو در تو باید در ازای هر مورد و گزینه‌ای که میخواهید ( case ) در صورت تساوی با مقدار مورد ارزیابی برای آن case علاوه بر یک حکم که اختیاری است یک سوئیچ دیگر بنویسید تا مقدار دیگری را مورد ارزیابی قرار دهد

مثال :

#include<stdio.h>

int main()
{
	int i, j;
	scanf("%d%d", &i, &j);
	switch(i)
	{
	case 1: printf("Your first number is 1\n");
			switch(j)
			{
			case 1: printf("Your second number is also 1\n");
			 break;
			case 2: printf("Your second number is different from Your first number\n");
			 break;
			default : printf("WooHoo!\n");
			 break;
			}
	 break;
	case 2: printf("Your number is 2\n");
	 break;
	case 3: printf("Your number is 3");
	 break;
	default : printf("Your number is greater than 3\n");
	 break;
	}
	
	return 0;
}

در مثال بالا دو متغیر از نوع صحیح int اعلان نموده‌ایم که مقدار آنها را از کاربر دریافت می‌کنیم . در سوئیچ اول مقدار i مورد ارزیابی قرار می‌گیرد تا بررسی شود مساوی با مقدار کدام case است . اگر i یک باشد چاپ می‌شود مقدار شما ۱ است ( که می‌توانید حتی حکمی ننویسید و فقط یک سوئیچ برای case خودتان بنویسید ) و سپس توسط سوئیچ دوم ( داخلی ) بررسی می‌شود که j چه مقداری دارد اگر ۱ بود چاپ می‌شود مقدار دوم شما نیز ۱ است . اگر ۲ بود چاپ می‌شود مقدار اول و دوم شما متفاوت است . اگر عدد دیگری بود default و پیش‌فرض به اجرا در می‌آید که چاپ می‌کند WooHoo ! و سپس سوئیچ دوم و داخلی به اتمام می‌رسد و کنترل برنامه به ادامه روند برنامه واگذار می‌شود که مقدار i مورد بررسی قرار می‌گیرد ( مقدار اولی ) که اگر ۲ بود چاپ شود ۲ است و اگر ۳ بود چاپ شود ۳ است و در غیر این صورت ( هر عدد دیگری ) به صورت پیش‌فرض چاپ شود عدد شما از ۳ بزرگ‌تر است