قسمت سیزدهم - ساختارهای تصمیم (بخش 1)

تقریبا همه زبان های برنامه نویسی به شما اجازه اجرای کد را در شرایط مطمئن می دهند. حال تصور کنید که یک برنامه دارای ساختار تصمیم گیری نباشد و همه کدها را اجرا کند. این حالت شاید فقط برای چاپ یک پیغام در صفحه مناسب باشد ولی فرض کنید که شما بخواهید در صورتیکه مقدار یک متغیر با یک عدد برابر باشد، سپس یک پیغام چاپ شود آن وقت با مشکل مواجه خواهید شد. سی شارپ راه های مختلفی برای رفع این نوع مشکلت ارائه می دهد. در این بخش با مطالب زیر آشنا خواهید شد:if دستورif...else دستورعملگر سه تاییدستور if چندگانهدستور if تو در توعملگرهای منطقیswitch دستوردستور ifمیتوان با استفاده از دستور if و یک شرط خاص که باعث ایجاد یک کد می شود یک منطق به برنامه خود اضافه کنید. دستور if ساده ترین دستور شرطی است که برنامه می گوید اگر شرطی برقرار است، کد معینی را انجام بده. ساختار دستور if به صورت زیر است:if(condition) { code to execute; }قبل از اجرای دستور if ابتدا شرط بررسی می شود. اگر شرط برقرار باشد یعنی درست باشد سپس کد اجرا می شود. شرط یک عبارت مقایسه ای است. میتوان از عملگرهای مقایسه ای برای تست درست یا اشتباه بودن شرط استفاده کرد. اجازه بدهید که نگاهی به نحوه استفاده از دستور if در داخل برنامه بیندازیم. برنامه زیر پیغام Hello World را اگر مقدار number کمتر از 10 و Goodbye World را اگر مقدار number از 10 بزرگتر باشد در صفحه نمایش می دهد.Hello World. Goodbye World. Hello World.Goodbye World.در خط 10 یک متغیر با نام number تعریف و مقدار 5 به آن اختصاص داده شده است. وقتی به اولین دستور if در خط 13 میرسیم برنامه تشخیص میدهد که مقدار number از 10 کمتر است؟ یعنی 5 کوچکتر از 10 است؟ منطقی است که نتیجه مقایسه درست میباشد. بنابراین خط 14 اجرا و پیغام Hello World چاپ می شود. حال مقدار number را به 15 تغییر می دهیم (خط 18). وقتی به دومین دستور if در خط 21 میرسیم برنامه مقدار number را با 10 مقایسه می کند و چون مقدار number یعنی 15 از 10 بزرگتر است برنامه پیغام Goodbye World را چاپ می کند (خط 22). به این نکته توجه کنید که دستور if را می توان در یک خط نوشت:if (number > 10) Console.WriteLine(&quotGoodbye World.&quot);شما می توانید چندین دستور را در داخل دستور if بنویسید. کافیست که از یک آکولاد برای نشان دادن ابتدا و انتهای دستورات استفاده کنید. همه دستورات داخل بین آکولاد جزء بدنه دستور if هستند. نحوه تعریف چند دستور در داخل بدنه if به صورت زیر است:if(condition) { statement1; statement2; . . . statementN; }این هم یک مثال ساده:if (x > 10) { Console.WriteLine(&quotx is greater than 10.&quot); Console.WriteLine(&quotThis is still part of the if statement.&quot); }در مثال بالا اگر مقدار x از 10 بزرگتر باشد دو پیغام چاپ می شود. حال اگر به عنوان مثال آکولاد را حذف کنیم و مقدار x از 10 بزرگتر نباشد مانند کد زیر:if (x > 10) Console.WriteLine(&quotx is greater than 10.&quot); Console.WriteLine(&quotThis is still part of the if statement. (Really?)&quot);کد بالا در صورتی بهتر خوانده می شود که بین دستورات فاصله بگذاریم.if (x > 10) Console.WriteLine(&quotx is greater than 10.&quot); Console.WriteLine(&quotThis is still part of the if statement. (Really?)&quot);به یاد داشته باشید که if یک مقایسه را انجام می دهد و دستور اجرایی نیست. بنابراین برنامه شما با یک خطای منطقی مواجه می شود. همیشه به یاد داشته باشید که قرار گرفتن سمیکالن در سمت راست پرانتز if به منزله این است که بلوک کد در اینجا به پایان رسیده است. مثالی دیگر در مورد دستور if:Enter a number: 2Enter another number: 52 != 52 < 52 <= 5Enter a number: 103 Enter another number:10 != 310 > 310 >= 3Enter a number: 5Enter another number: 55 == 55 <= 55 >= 5ما از عملگرهای مقایسه ای در دستور if استفاده کرده ایم. ابتدا دو عدد که قرار است با هم مقایسه شوند را به عنوان ورودی از کاربر می گیریم. اعداد با هم مقایسه می شوند و اگر شرط درست بود پیغامی چاپ می شود. به این نکته توجه داشته باشید که شرط ها مقادیر بولی هستند، بنابراین شما می توانید نتیجه یک عبارت را در داخل یک متغیر بولی ذخیره کنید و سپس از متغیر به عنوان شرط در دستور if استفاده کنید.bool isNewMillenium = year == 2000; if (isNewMillenium) { Console.WriteLine(&quotHappy New Millenium!&quot); }اگر مقدار year برابر 2000 باشد سپس حاصل عبارت در متغیر isNewMillenium ذخیره می شود. می توان از متغیر برای تشخیص کد اجرایی بدنه دستور if استفاده کرد خواه مقدار متغیر درست باشد یا نادرست.if...else دستوردستور if فقط برای اجرای یک حالت خاص به کار می رود یعنی اگر حالتی برقرار بود کارخاصی انجام شود. اما زمانی که شما بخواهید اگر شرط خاصی برقرار شد یک دستور و اگر برقرار نبود دستور دیگر اجرا شود باید از دستور if…else استفاده کنید. ساختار دستور if…else در زیر آمده است:if(condition) { code to execute if condition is true; } else { code to execute if condition is false; }از کلمه کلیدی else نمی توان به تنهایی استفاده کرد بلکه حتما باید با if به کار برده شود. اگر فقط یک کد اجرایی در داخل بدنه if وبدنه else دارید استفاده از آکولاد اختیاری است. کد داخل بلوک else فقط در صورتی اجرا می شود که شرط داخل دستور if نادرست باشد. در زیر نحوه استفاده از دستور if…else آمده است.The number is less than 10.The number is either greater than or equal to 10.وقتی مقدار number از 10 کمتر باشد کد داخل بلوک if اجرا می شود و اگر مقدار number را تغییر دهیم و به مقداری بزرگتر از 10 تغییر دهیم شرط نادرست می شود و کد داخل بلوک else اجرا می شود. مانند بلوک if نباید به آخر کلمه کلیدی else سمیکالن اضافه شود.عملگر شرطیعملگر شرطی (:?) در سی شارپ مانند دستور شرطی else…if عمل می کند. در زیر نحوه استفاده از این عملگر آمده است:<condition> ? <result if true> : <result if false>عملگر شرطی تنها عملگر سه تایی سی شارپ است که نیاز به سه عملوند دارد: شرط، یک مقدار زمانی که شرط درست باشد و یک مقدار زمانی که شرط نادرست باشد. اجازه بدهید که نحوه استفاده این عملگر را در داخل برنامه مورد بررسی قرار دهیم.برنامه بالا نحوه استفاده از این عملگر شرطی را نشان می دهد. خط یک به صورت زیر ترجمه می شود: اگر مقدار pet1 برابر با puppy بود، مقدار dog را در type1 قرار بده در غیر اینصورت مقدار cat را type1 قرار بده. خط دو به صورت زیر ترجمه می شود: اگر مقدار pet2 برابر با kitten بود، مقدار cat را در type2 قرار بده در غیر اینصورت مقدار dog. حال برنامه بالا را با استفاده از دستور else if می نویسیم:if (pet1 == &quotpuppy&quot) type1 = &quotdog&quot else type1 = &quotcat&quotهنگامی که چندین دستور در داخل یک بلوک if یا else دارید از عملگر شرطی استفاده نکنید، چون خوانایی برنامه را پایین می آورد.دستور if چندگانهاگر بخواهید چند شرط را بررسی کنید چکار می کنید؟ میتوانید از چندین دستور if استفاده کنید و بهتر است که این دستورات if را به صورت زیر بنویسید:if (condition) { code to execute; } else { if (condition) { code to execute; } else { if (condition) { code to execute; } else { code to execute; } } }خواندن کد بالا سخت است. بهتر است دستورات را به صورت تو رفتگی در داخل بلوک else بنویسید. میتوانید کد بالا را ساده تر کنید:if(condition) { code to execute; } else if(condition) { code to execute; } else if(condition) { code to execute; } else { code to execute; }حال که نحوه استفاده از دستور else if را یاد گرفتید باید بدانید که مانند else ،else if نیز به دستور if وابسته است. دستور else if وقتی اجرا می شود که اولین دستور if اشتباه باشد. حال اگر else if اشتباه باشد دستور else if بعدی اجرا می شود. و اگر آن نیز اجرا نشود در نهایت دستور else اجرا می شود. برنامه زیر نحوه استفاده از دستور else if را نشان می دهد:What's your favorite color? [1] Black [2] White [3] Blue [4] Red [5] Yellow Enter your choice: 1 You might like my black t-shirt.-----------------------------------------------------------------------------------------------------------------What's your favorite color? [1] Black [2] White [3] Blue [4] Red [5] Yellow Enter your choice: 999 Sorry, your favorite color is not in the choices above.خروجی برنامه بالا به متغیر choice وابسته است. بسته به اینکه شما چه چیزی انتخاب می کنید پیغام های مختلفی چاپ می شود. اگر عددی که شما تایپ می کنید در داخل حالت های انتخاب نباشد، کد مربوط به بلوک else اجرا می شود.دستور if تو در تومی توان از دستور if تو در تو در سی شارپ استفاده کرد. یک دستور ساده if در داخل دستور if دیگر.if (condition) { code to execute; if (condition) { code to execute; } else if (condition) { if (condition) { code to execute; } } } else { if (condition) { code to execute; } }اجازه بدهید که نحوه استفاده از دستور if تو در تو را نشان دهیم:Enter your age: 18 Enter your gender: male You are a teenage boy.-----------------------------------------------------------------------------------------------------------------Enter your age: 12 Enter your gender: female You are still too young.اجازه بدهید که برنامه را کالبد شکافی کنیم. ابتدا برنامه از شما درباره سن تان سؤال می کند (خط 12). در خط 15 درباره جنستان از شما سؤال می کند. سپس به اولین دستور if می رسد (خط 19).در این قسمت اگر سن شما بیشتر از 12 سال باشد برنامه وارد بدنه دستور if می شود در غیر اینصورت وارد بلوک else (خط 37) مربوط به همین دستور if می شود. حال فرض کنیم که سن شما بیشتر از 12 سال است و شما وارد بدنه اولین if شده اید. در بدنه اولین if دو دستور if دیگر را مشاهده می کنید. اگر سن کمتر 20 باشد شما وارد بدنه if دوم می شوید و اگر نباشد به قسمت else متناظر با آن می روید (خط 32). دوباره فرض می کنیم که سن شما کمتر از 20 باشد، در اینصورت وارد بدنه if دوم شده و با یک if دیگر مواجه می شوید (خط 23). در اینجا جنسیت شما مورد بررسی قرار می گیرد که اگر برابر "male "باشد کدهای داخل بدنه سومین if اجرا می شود در غیر اینصورت قسمت else مربوط به این if اجرا میشود (خط 27). پیشنهاد می شود که از if تو در تو در برنامه کمتر استفاده کنید چون خوانایی برنامه را پایین می آورد.استفاده از عملگرهای منطقیعملگرهای منطقی به شما اجازه می دهند که چندین شرط را با هم ترکیب کنید. این عملگرها حداقل دو شرط را در گیر می کنند و در آخر یک مقدار بولی را بر می گردانند. در جدول زیر برخی از عملگرهای منطقی آمده است:به عنوان مثال جمله (10 > y) && (z = (2 < x را به این صورت بخوانید: "در صورتی مقدار z برابر true است که مقدار x بزرگتر از 2 و مقدار y کوچکتر از 10 باشد در غیر اینصورت false است". این جمله بدین معناست که برای اینکه مقدار کل دستور true باشد باید مقدار همه شروط true باشد. عملگر منطقی OR (||) تأثیر متفاوتی نسبت به عملگر منطقی AND (&&) دارد. نتیجه عملگر منطقی OR برابر true است اگر فقط مقدار یکی از شروط true باشد. و اگر مقدار هیچ یک از شروط true نباشد نتیجه false خواهد شد. می توان عملگرهای منطقی AND و OR را با هم ترکیب کرده و در یک عبارت به کار برد مانند:if ( (x == 1) && ( (y > 3) || z < 10) ) ) { //do something here }در اینجا استفاده از پرانتز مهم است چون از آن در گروه بندی شرط ها استفاده می کنیم. در اینجا ابتدا عبارت (10 > z) || (3 < y) مورد بررسی قرار می گیرد (به علت تقدم عملگرها). سپس نتیجه آن بوسیله عملگر AND با نتیجه (1 == x) مقایسه می شود. حال بیایید نحوه استفاده از عملگرهای منطقی در برنامه را مورد بررسی قرار دهیم:Enter your age: 18 Enter your gender (male/female): female You are a teenage girl.-----------------------------------------------------------------------------------------------------------------Enter you age: 10 Enter your gender (male/female): male You are not a teenager.برنامه بالا نحوه استفاده از عملگر منطقی AND را نشان می دهد (خط 18). وقتی به دستور if می رسید (خط 18) برنامه سن شما را چک می کند. اگر سن شما بزرگتر از 12 و کوچکتر از 20 باشد (سنتان بین 12 و 20 باشد) یعنی مقدار هر دو true باشد سپس کدهای داخل بلوک if اجرا می شوند. اگر نتیجه یکی از شروط false باشد کدهای داخل بلوک else اجرا می شود. عملگر AND عملوند سمت چپ را مورد بررسی قرار می دهد. اگر مقدار آن false باشد دیگر عملوند سمت راست را بررسی نمی کند و مقدار false را بر می گرداند. بر عکس عملگر || عملوند سمت چپ را مورد بررسی قرار می دهد و اگر مقدار آن true باشد سپس عملوند سمت راست را نادیده می گیرد و مقدار عملگر || عملوند سمت چپ را مورد بررسی قرار می دهد و اگر مقدار آن true باشد سپس عملوند سمت راست را نادیده میگیرد و مقدار true را بر می گرداند. نکته مهم اینجاست که شما می توانید از عملگرهای & و | به عنوان عملگر بیتی استفاده کنید.if (x == 2 & y == 3) { //Some code here } if (x == 2 | y == 3) { //Some code here }تفاوت جزئی این عملگرها وقتی که به عنوان عملگر بیتی به کار می روند این است که دو عملوند را بدون در نظر گرفتن مقدار عملوند سمت چپ مورد بررسی قرار می دهند. به عنوان مثال حتی اگر مقدار عملوند سمت چپ false باشد، عملوند سمت چپ به وسیله عملگر بیتی (&) AND ارزیابی می شود. اگر شرط ها را در برنامه ترکیب کنید استفاده از عملگرهای منطقی (&&) AND و (||) OR به جای عملگرهای بیتی (&) AND و (|) OR بهتر خواهد بود. یکی دیگر از عملگرهای منطقی عملگر (!) NOT است که نتیجه یک عبارت را خنثی یا منفی می کند. به مثال زیر توجه کنید:if (!(x == 2)) { Console.WriteLine(&quotx is not equal to 2.&quot); }اگر نتیجه عبارت 2 == x برابر false باشد عملگر! آن را True می کند.