در این قسمت به حل تمرینهای 6 تا 11 میپردازیم. هدف از انجام این تمرینها آشنایی بیشتر با حلقههای تو در تو و دستور switch است.
حل تمرین شماره ۶: همانطور که میدانید این تمرین شباهت زیادی با مثال قسمت قبل دارد با این تفاوت که اندازه مثلث از کاربر گرفته میشود:
using System; class Solution { static void Main() { // Solution 06 Console.Write("Please enter triangle size: "); int size = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(); for (int i = 0; i < size; i++) { for (int j = 0; j <= i; j++) { Console.Write("*"); } Console.WriteLine(); } Console.WriteLine(); } }
نحوهی دریافت ورودی از کاربر در قسمت چهارم مورد بحث قرار گرفت. تفاوت دریافت ورودی در این تمرین و مثال قسمت چهارم در نوع ورودی آنها است. در مثال قسمت چهارم، ورودی گرفته شده از کاربر از جنس string بود اما در اینجا ورودی دریافت شده باید یک عدد باشد. هنگامیکه ورودی را به برنامه میدهید، مقدار وارد شده از جنس string است و شما باید آن را به عدد تبدیل کنید. همانطور که میبینید، مقدار دریافت شده از کاربر توسط دستور ()Convert.ToInt32 به یک عدد صحیح 32 بیتی علامتدار (شامل مقدار مثبت و منفی) تبدیل شده و مستقیماً در متغیر size قرار گرفته است. ()Convert.ToInt32 متدی است که مقدار string را دریافت کرده و به یک عدد صحیح 32 بیتی علامتدار (32bit signed integer) تبدیل میکند. در ادامهی تمرین بالا، مانند مثال قسمت قبل حلقههای تو در تو به جای نمایش اعداد کاراکتر ستاره را نمایش میدهند. در قسمتهای آینده مبحث متدها و کلاسها بهطور کامل و دقیق مورد بررسی قرار میگیرد پس در این مورد هیچ جای نگرانی نیست که شما کاملاً با شیگرایی آشنا شده و بر آن مسلط میشوید.
حل تمرین شماره 7: این مسئله بسیار ساده است. کافی است همه مراحل انجام کار را بهروی کاغذ بیاورید تا به روش حل آن پی ببرید. اجازه دهید در ابتدا جواب را با هم ببینیم و سپس به توضیح و شرح آن بپردازیم.
// Solution 07 using System; class Solution { static void Main() { // Getting input from the user Console.Write("Please enter the size: "); int size = Convert.ToInt32(Console.ReadLine()); // Variables declaration int rowNumber, j, k; // 1st loop that's counting the rows for (rowNumber = 1; rowNumber <= size; rowNumber++) { // 2nd loop that write space character for (j = 1; j <= size - rowNumber; j++) { Console.Write(" "); } // 3rd loop that write star character for (k = 1; k <= (2 * rowNumber) - 1; k++) { Console.Write("*"); } // finally, this WriteLine() method makes a break. Console.WriteLine(); } } }
همانطور که میدانید خروجی برنامه این چنین است:
در ابتدا سایز مثلث از کاربر گرفته میشود. در واقع سایز مثلث همان تعداد سطر برنامهی ما است و با اینکار ما بهنحوی تعداد سطری که مثلث قرار است داشته باشد را از کاربر دریافت کردیم. این برنامه شامل یک حلقهی خارجی و دو حلقهی داخلی است. حلقهی خارجی که اولین حلقهی ما است این وظیفه را بر عهده دارد که تعداد سطرها را کنترل کند. دومین حلقه وظیفهی چاپ کردن تعداد مشخصی کاراکتر space را در هر سطر بر عهده دارد. سومین حلقه نیز موظف است که در هر سطر تعداد مشخصی کاراکتر ستاره را چاپ کند.
به تصویر زیر دقت کنید: (روی تصویر کلیک کنید)
چرا در قسمت شرطی حلقهی اول نیاز داریم که متغیر rowNumber کوچکتر یا مساوی متغیر size باشد؟ جواب واضح است زیرا سایز مثلث همان تعداد سطر برنامهی ما است. در حلقهی دوم مشاهده میکنیم که متغیر j باید کوچکتر یا مساوی size – rowNumber باشد. علت این امر این است که در هر سطر باید تعدادی کاراکتر اسپیس چاپ شود و این کاراکترها باید با افزایش شماره هر سطر یک واحد کاهش یابند. در قسمت شرطی حلقهی سوم مشاهده میکنید که متغیر k باید کوچکتر یا مساوی 1 – (rowNumber * 2) باشد. اگر به تعداد ستارهها در هر سطر توجه کنید متوجه میشوید که اعداد فرد را در بر میگیرند: 1،3، 5، 7 و… بنابراین باید در هر سطر معادل با اعداد فرد، ستارهها نمایش داده شوند. در نهایت ()Console.WriteLine برنامه را به خط بعد سوق میدهد.
حل تمرین شماره 8: در این تمرین قصد داریم دو عدد را از کاربر دریافت کنیم و عدد اول را به توان عدد دوم برسانیم:
// Solution 08 using System; class Example { static void Main() { Console.Write("Enter base number: "); int baseNo = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter power number: "); int powerNo = Convert.ToInt32(Console.ReadLine()); int result = 1; for (int counter = 1; counter <= powerNo; counter++) result = baseNo * result; Console.WriteLine(); Console.WriteLine("The result is " + result); Console.WriteLine(); } }
در ابتدای این مقاله با نحوهی دریافت ورودی از کاربر و تبدیل آن به عدد صحیح آشنا شدید. در اینجا ما علاوه بر متغیرهای پایه و توان به یک متغیر برای ذخیرهی نتیجهی نهایی (result) و یک متغیر برای شمارندهی حلقه (counter) نیازمندیم. حلقه تا زمانیکه کوچکتر یا مساوی عدد توان است تکرار میشود و عدد پایه را در مقدار result ضرب و حاصل آن را در خود متغیر result ذخیره میکند. به این ترتیب عدد پایه به اندازهی عدد توان در خودش ضرب میشود.
حل تمرین شماره 9: در این تمرین قصد داریم با استفاده از دستور switch یک فرهنگ لغت کوچک بسازیم:
// Solution 09 using System; class Example { static void Main() { Console.Write("Enter a word to translate: "); string word = Console.ReadLine(); switch (word) { case "window": Console.WriteLine("Window means panjereh"); break; case "library": Console.WriteLine("Library means ketab khaneh"); break; case "easy": Console.WriteLine("Easy means asan"); break; case "memory": Console.WriteLine("Memory means hafezeh"); break; case "software": Console.WriteLine("Software means narm afzar"); break; default: Console.WriteLine("Oops! Your word doesn't exist in our dictionary."); break; } } }
در قسمت دوازدهم در مورد دستور switch بحث شد. البته برای ساخت فرهنگ لغت باید از دستوراتی برای ذخیرهسازی اطلاعات استفاده کرد و این روش غیر استاندارد است. این تنها تمرینی برای آشنایی بیشتر با دستور switch بود.
حل تمرین شماره 10: در این تمرین قصد داشتیم توسط حلقههای تو در تو و کاراکتر █ یک مستطیل را رسم کنیم:
// Solution 10 using System; class Example { static void Main() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 14; j++) { Console.Write("█"); } Console.WriteLine(); } } }
همانطور که میدانید حلقهی اول مشخص میکند که عرض مستطیل شامل ۴ کاراکتر █ و حلقهی دوم نشان میدهد که طول مستطیل شامل 14 کاراکتر █ است و ()Console.WriteLine باعث میشود برنامه بعد از چاپ هر سطر به خط بعد برود.
حل تمرین شماره 11:
using System; class Example { static void Main() { Console.Write("Enter table width: "); int tableWidth = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter table height: "); int tableHeight = Convert.ToInt32(Console.ReadLine()); int result; for (int i = 1; i <= tableHeight; i++) { result = 0; for (int j = 1; j <= tableWidth; j++) { result = i * j; Console.Write(result + "\t"); } Console.WriteLine(); } } }
برای حل این تمرین ابتدا طول و عرض جدول ضرب را از کاربر دریافت کردهایم سپس از طریق دو حلقهی تو در تو متغیر i را در j ضرب کرده و حاصل آن را در متغیر result ذخیره کردهایم و در نهایت آن را نمایش دادهایم.
در صورت قابل درک نبودن هر قسمت و هر تمرین میتوانید سوالات، دیدگاه و پیشنهادات خود را در قسمت نظرات بیان کنید.
داوود
16 November 2012
من هنوز حل تمرینها رو ندیدم که ازتون سوال بپرسم، چون اول میخوام خودم حل کنم و بعدش ببینم. ولی عالی بود. دستتون درد نکنه! ممنون
فرامرز
17 November 2012
سلام
خدا قوت دست شما درد نکن خیلی عالی بود
mmr
17 November 2012
سلام
برنامه شكل زير بكمك
الف )دستور For
ب)دستور While
چكونه نوشته مي شود
+**b** b** b**+
+***b*** b*** b***+
+*b*b*b* b*b* +
+**b** b** b**+
b بک اسپیس می باشد
نمی دونم هرچی بفکر رسیدنتونستم بنویسم
مسعود درویشیان
18 November 2012
اگه ممکنه منظورتون رو واضحتر بیان کنید!
mmr
18 November 2012
سلام
می خواهم 4خط خروجی بالا بوسیله کد نویسی از طریق دستورات
For
While
نوشته شود
+در همه اول آخر است
اولی بعداز+ دوتا* است و یعد بک اسپیس و همین طوری تا آخر
مسعود درویشیان
18 November 2012
اینکار رو از روشهای زیادی میشه انجام داد، من از روش زیر تا 2 خط برنامه رو براتون نوشتم که این تقریباً ساده ترین حالت ممکنه
باید خودتون برنامه رو تجزیه تحلیل کنید ببینید راههای بهینهتری هم هست که خط کد کمتری تولید بشه یا نه
من این رو برای نمونه براتون نوشتم:
رامیتن
22 November 2012
سلام دوست عزیز .
من قسمت result رو متوه نشدم . دلیل اینکه تو تمرین 8
result = 1 ;
بعد تو یه تمرین دیگه گذاشتی result = 0
دلیلش چیه ؟
مگه می شه نوشت result = result * powerNO ؟
دو تا result با هم
از Counter هم که اصلا استفاده نشد ؟ به چه وسیله ای ازش استفاده کردید ؟
ممنون
مسعود درویشیان
22 November 2012
سلام
توی تمرین 8 اگه result برابر با صفر باشه نتیجهی نهایی هم برابر با صفر میشه پس باید 1 باشه تا توی عملیات ضرب مشکلی بههم نزنه
result = baseNo * result به این معناست که در ابتدا baseNo (عدد پایه) در متغیر result ضرب میشه و نتیجهی این ضرب در خود متغیر result ذخیره میشه و این روند تا زمانی که متغیر counter کوچکتر مساوی powerNo (عدد توان) هست ادامه داره
توی تمرین شماره 11 به این دلیل متغیر result رو توی حلقهی اول برابر با صفر قرار دادیم چون باید توی هر سطر مقدار result از نو مقدار دهی کنیم
f1
26 November 2012
سلام
ببخش ميشه درباره نحوه ساخت مسطتيل يكم بيشتر توضيح بدين؟
ممنون ميشم
مسعود درویشیان
2 December 2012
سلام. حلقهی اول مشخصکنندهی تعداد کاراکتر عرض مستطیل هست و حلقهی داخلی مشخصکنندهی طول مستطیل. نحوهی عملکرد این دو حلقه به این صورت هست که ابتدا برنامه شرط حلقهی اول رو بررسی میکنه و وارد حلقه میشه که درونش یه حلقهی دیگه هست. حلقهی داخلی ۱۴ بار تکرار میشه و کاراکتر مربوطه رو چاپ میکنه. برنامه از حلقهی داخلی خارج میشه اما هنوز توی حلقهی خارجی هست! متغیر کنترلکنندهی حلقهی خارجی یه واحد افزایش داده میشه و از 0 به 1 تغییر پیدا میکنه و مجدداً وارد حلقهی دوم میشه و دوباره 14 کاراکتر چاپ میکنه و این روند همینطور ادامه داره تا شرط حلقهی خارجی نقض بشه و برنامه به پایان برسه…
davoud
9 April 2013
سلام
میشه راهنمایی کنید اگه از کاربر بخوایم طول و عرض وارد کنه برنامش چطور میشه
davoud
9 April 2013
سوال منو تو مثال بعد جواب دادید مرسی
HoSsEin
17 April 2013
ممنون..
خیلی با سرعت و البته دقت دارم میخونم خیلی خوب بود..
مخصوصاً تمرین مثلث متساویالاضلاع :D.
mohammad sadegh
19 April 2013
salam.mikham barname sin x ro benevisam mishe komakam konid!
sin x =x – x3/2+x5/120
nemitonam tavan haro beheshoon 3 ta ezafe konam hamchenim factoriel haro
مسعود درویشیان
19 April 2013
از ()Math.Sin واسه سینوس و از ()Math.Pow واسه به توان رسوندن استفاده کنید.
علی ابراهیمی
4 January 2014
با سلام
ورودی و خروجی تابع Math.Sin() بر حسب رادیان هست. چطور می تونیم ورودی و خروجی برحسب درجه داشته باشیم؟
میلاد
24 April 2013
خیلی مرسی آقا مسعود
با استفاده و تغییر کدهای اون مثلثی که حل کرده بودید
مشکل مثلث تو خالی خودمم حل شد.
محمد
21 May 2013
سلام من تو php تخصص دارم و تا حالا که آموزش هارو نگاه کردم نحوه کد زدنش با php فرق چندانی نداره تو کنسول
اما میخوام بدونم برنامه نویسی اپ و سرویس هم تو برنامه آموزشی هست یا نه؟
مسعود درویشیان
21 May 2013
توی زنگ سیشارپ فقط توی محیط کنسول کار میکنیم.
محمد
22 May 2013
خوب اصلا هیچ برنامه ای ندارید بعد از زنگ سی شارپ؟
مسعود درویشیان
22 May 2013
چون خود زنگ سیشارپ مقالات زیادی داره (حدوداً صد قسمت یا بیشتر) فعلاً واسه بعد از اون برنامهی خاصی مد نظرم نیست. شاید برنامهنویسی موبایل، شاید وب… هنوز مشخص نیست ولی این مشخص هست که دیگه روی یه پلتفرم پیشرفتهتر کار میکنیم.
reza
26 July 2013
من با تمرین 8 یه مشکل دارم وقتی از int استفاده میکنم مقدار 10 به توان 10 رو اشتباه میده ولی اگه از double استفاده کنم درست میشه الان میخوام بدونم کجا باید از int کجا از double استفاده کنم
مرسی بابت آموزش خوبتون
مسعود درویشیان
28 July 2013
وقتی ۱۰ رو به توان ۱۰ میرسونید دیگه از بازهی int خارج میشید واسه همین جواب درستی نمیده! اصولاْ باید با توجه به نوع و بازهای که نیاز دارید از یک data type استفاده کنید.
رضا
11 December 2013
چه نکته ی ظریفی !
پس احتمالا به همین دلیله که Math.Pow مقادیر دوبل می خواد ! درسته؟
چون اعداد وقتی به توان می رسند خیلی زود رشد می کنند و احتمال خروجشون از بازهی int زیاد میشه؟
سمیه سلطانی
28 June 2014
با سلام و تشکر از مطالب بسیار مفید این سایت
من سوالی داشتم که نتونستم کاملا متوجه بشم این که فرق cast, convert, parse, boxcing and unboxcing رو اگر ممکن هست با مثال و این که در حافظه و استک چه اتفاقی می افتد . ممنونم از توجه شما
فاطمه
15 October 2014
سلام ممنون از اموزش های خوبتون میشه در مورد جدول ضرب یکم توضیح بدین
ممنون میشم
نیکی
25 December 2014
سلام خسته نباشید . ممنون از راهنمایی هاتون . اگه میشه لطفا به توی حل سوال به من کمک کنید .
سوال: برنامه ای بنویسید که شکل زیر را در کنسول نمایش دهد .
*
* *
* *
* *
*
نیکی
25 December 2014
این شکل خرابه , شکل مورد نظرم یک لوزی تو خالی هستش . ممنون
رضا
12 December 2015
سلام، ممنون از پستهای فوق العاده خوبتون!
در خصوص تمرین شماره 9، اگه لغتی که ما در برنامه می نویسیم با حرف کوچک بشه و کسی اون لغت رو با حرف بزرگ بنویسه دیگه معنیش رو نشون نمیده. برای حل این مشکل راهی هست که توی همون case لغت رو هم با حرف بزرگ نوشت و هم با حرف کوچک؟
حسین
14 December 2015
سلام یه خسته نباشید باید به مسئول سایت خوبتون بگم واقعا زحمت کشید،
من دچار یه مشکلی شدم میخوام یه برنامه بنویسم توش موندم نیاز به کمک دارم
مسئله: برنامه ی بنویسید که مقدار صحیح ار ورودی بخواند و کار های زیر را انجام دهد
1-میان گین 5 مقدار
2-بزرگ ترین مقدار و کوچکترین مقدار را نشان دهد
3-حاصل ضرب
4-منفی بودن یا مثبت بودن عدد را در Message box نشان دهد
لطفا کمک کنید
[email protected]
مهدی
11 September 2016
سلام آقا مسعود بابت آموزش ها خیلی ممنونم.
یه سوالی داشتم درباره ی تمرین فرهنگ لغت
من توی فرهنگ لغتم نمیتونم کاری کنم که به بزرگی و کوچیکی حروف حساس باشه؟؟
محمدباقر
6 November 2016
سلام درباره تمرین 7
اونجا که اسپیس رو محاسبه میکنه. هر اسپیس رو با تکرار حلقه توی یه خط ایجاد میکنه یا نه فقط یه تفریق ساده است؟ یعنی 4 اسپیس خط اول رو با 4 بار تکرار حلقه داخلی اولی بدست میاریم. یا اینکه از عبارت size – row =4 به تعداد اسپیس ها میرسیم؟
ممنون
سهیلا
16 May 2017
سلام
قسمت 15 از زنگ سی شارپ رو مطالعه کردم، و تا سوالاتی دارم؛
آیا هنوز به سوالات جواب می دین؟
خیلی ممنون :)
علیرضا
27 October 2017
سلام خسته نباشید ببخشید میتوند ی برنامه ای برام بنویسید که یک عدد را از ورودی بگیرد و یک مثلث افزایشی با همان ارتفاع رسم کند
Zahra
26 January 2018
*
* *
* * *
* * * *
ببخشید این مثلث رو پاسخ بدین
رضا
15 July 2020
سلام خسته نباشید ممنونم بابت آموزش ها . یک سوال دارم ، این آموزشها برای افراد مبتدی هستش ؟ چون شما در قسمت چهار فقط وارد کردن کارکتر رو توسط کاربر آموزش دادید ؛ اما تمرین می دید که عدد رو از کاربر بگیرید . خب به این صورت باید به آموزش دیگری مراجعه کرد یا اینکه تمرین رو نتونیم حل کنیم و یک راست بیام دنبال جوابش
پوریا
1 May 2021
سلام با تشکر از شما و عرض خسته نباشید
اگر بخواهیم با توجه به تمرین شماره ۷ تعداد ستاره ها را به صورت کاهشی نشان دهیم از چه دستوری باید استفاده کنیم؟
ممنون میشوم اگر پاسخ دهید…..
پوریا
9 May 2021
سلام خسته نباشید،ممنون بابت مقالات عالی شما و زنماتی که میکشید
در مورد سوال شماره هفت که کاراکتر ستاره رو به صورت افزایشی نشون میده
میخواستم ببینم که به صورت کاهشی چطور میشه نوشت
یعنی دقیقا برعکس تمرین بالا
ممنون میشم جواب بدین
پوریا
9 May 2021
سلام خسته نباشید،ممنون بابت مقالات عالی شما و زنماتی که میکشید
در مورد سوال شماره هفت که کاراکتر ستاره رو به صورت افزایشی نشون میده
میخواستم ببینم که به صورت کاهشی چطور میشه نوشت
یعنی دقیقا برعکس تمرین بالا
هرچقدر فکر کردم نتونستم فرمول چاپ کاراکتر ستارشو پیدا کنم
ممنون میشم اگه جواب بدین