در قسمت سیزدهم با دستور goto و توضیحات تکمیلی دستور switch آشنا شدید. اگر بهیاد داشته باشید در قسمت نهم با حلقهی for آشنا شدیم. تا به اینجا ما تنها با یک حلقهی for و در یک سطح کار میکردیم ولی اکنون قصد داریم با حلقههای for تودرتو آشنا شویم.
به مثال زیر و خروجی آن دقت کنید تا در ادامه به شرح و تفصیل آن بپردازیم:
using System; class Example { static void Main() { for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { Console.Write(j); } Console.WriteLine(); } } }
خروجی:
شاید اگر با دقت تمام خودتان این برنامه را تجزیه و تحلیل کنید به ماهیت و چگونگی آن پی ببرید اما بهتر است توضیحی کامل در مورد این برنامه داده شود. هنگامیکه حلقهها تودرتو میشوند شامل یک حلقهی داخلی و یک حلقهی خارجی هستند که حلقهی داخلی کاملاً در حلقهی خارجی قرار دارد. اگر به فلوچارت زیر دقت کنید کاملاً متوجه خواهید شد که چه اتفاقی در حلقههای تودرتو میافتد:
در فلوچارت بالا دیاگرام خاکستری رنگ، حلقهی داخلی (inner loop) است که درون حلقهی خارجی (outer loop) قرار دارد. همانطور که میبینید ابتدا شرط حلقهی خارجی بررسی شده و در صورت true بودن وارد حلقهی داخلی میشود (در واقع تمام حلقهی داخلی، بدنهی حلقهی خارجی است). اکنون شرط حلقهی داخلی بررسی شده و تا زمانیکه شرط true است بدنهی حلقهی داخلی اجرا میشود. بهمحض اینکه شرط حلقهی داخلی false شود کامپایلر به ابتدای حلقهی خارجی برمیگردد و متغیر کنترلکنندهی حلقهی خارجی را بهروز رسانی کرده و مجدداً شرط حلقهی خارجی را بررسی میکند که در صورت true بودن دوباره حلقهی داخلی اجرا شده و در صورت false بودن اجرای حلقههای تودرتو پایان مییابد.
در مثال ابتدای مقاله، در حلقهی for خارجی، متغیر i شامل مقدار ۱ بوده که کمتر از ۱۰ است بنابراین شرط برقرار بوده و کامپایلر وارد حلقه میشود. درون این حلقه (حلقهی خارجی)، حلقهی دیگری قرار دارد (حلقهی داخلی) که شامل متغیر j با مقدار ۱ است. در قسمت condition حلقهی داخلی بررسی میشود که مقدار j کوچکتر یا مساوی مقدار i باشد. در اینجا مقدار j و i هردو برابر با ۱ هستند بنابراین شرط برقرار است و کامپایلر وارد حلقهی داخلی میشود. درون حلقهی داخلی، مقدار j چاپ شده سپس متغیر کنترلکنندهی حلقهی داخلی بهروز رسانی میشود (++j) و شرط حلقهی داخلی بررسی خواهد شد. همانطور که میدانید اکنون مقدار j برابر با ۲ و مقدار i برابر با ۱ است. بنابراین دیگر شرط برقرار نبوده و برنامه از حلقهی داخلی خارج میشود.
در خط بعد، دستور ()Console.WriteLine خروجی برنامه را به خط جدید سوق میدهد.
خروجی برنامه تا اینجا (مرحلهی اول):
اکنون از بلاک حلقهی داخلی خارج شدیم ولی هنوز در بلاک حلقهی خارجی قرار داریم. پس متغیر کنترلکنندهی حلقهی خارجی بهروز رسانی شده و شرط حلقهی خارجی ارزیابی میشود. پس از برقراری شرط، برنامه مجدداً وارد حلقه شده و شرط حلقهی داخلی را ارزیابی میکند. اکنون مقدار j برابر با ۱ و مقدار i نیز برابر با ۲ است (متغیر j روی حلقهی داخلی مجدداً برابر با ۱ شده و هربار که برنامه میخواهد از نو وارد حلقه شود متغیر کنترلکنندهی آن به اصطلاح ریست – Reset میشود). همانطور که میبینید شرط برقرار است و برنامه وارد بدنهی حلقهی داخلی میشود و مقدار j را در خروجی چاپ میکند. سپس متغیر کنترلکنندهی حلقهی داخلی بهروز رسانی شده (برابر با ۲ می شود) و دوباره شرط بررسی میشود. اکنون i و j هردو برابر با ۲ هستند پس شرط برقرار است و یکبار دیگر مقدار j چاپ خواهد شد.
خروجی برنامه در مرحلهی دوم:
خروجی برنامه در مرحلهی سوم:
خروجی برنامه در مرحلهی چهارم:
این روند همینطور ادامه دارد تا زمانیکه برنامه به مرحلهی نهم برسد و شرط حلقهی خارجی نقض شود:
تمرین
تمرین شماره ۶: برنامهای بنویسید که شکل مثلث قائمالزاویه را توسط کاراکتر * چاپ کند (سایز مثلث را از کاربر بگیرید).
نمونه:
تمرین شماره ۷: برنامهای بنویسید که شکل مثلث متساویالساقین را توسط کاراکتر * چاپ کند (سایز مثلث را از کاربر بگیرید).
نمونه:
تمرین شماره ۸: برنامهای بنویسید که دو عدد (پایه و توان) را از کاربر گرفته و عدد اول را به توان عدد دوم برساند.
تمرین شماره ۹: توسط دستور switch یک فرهنگ لغت کوچک بسازید.
تمرین شماره ۱۰: توسط کاراکتر █ یک مستطیل طراحی کنید. (سایز مستطیل را از کاربر بگیرید).
تمرین شماره ۱۱: برنامهی جدول ضربی بنویسید که طول و عرض جدول را از کاربر بگیرد و جدول را نمایش دهد.
بدیهی است که تمرینهای ۶، ۷، ۱۰ و ۱۱ باید توسط حلقههای تودرتو انجام شوند.
f1
10 November 2012
سلام اقا مسعود من مطالب شما رو دانلود كردم و مي خوام پرينتش كنم و به استاد اين فايل ها رو نشون بدم كه اگه موافق باشند مطالب شما رو با ذكر منبع چاپ و براي ترم اولي هايي كه سي شارپ دارند.
مي خواسم بودنم كه اين مطالب پي دي اف فايل ورد هم دارند يا نه؟
چون پي دي اف رو ويرايش كردم البته براي اينكه حجم چاپ صفحه و هزينه كم بشه فقط
مسعود درویشیان
10 November 2012
همانطور که در قوانین کپیرایت سایت ذکر شده، تنها با ذکر و درج لینک منبع مجاز به اینکار هستید.
فایلها فقط بهصورت پیدیاف هستند.
موفق باشید
mandana
10 November 2012
برنامه اي مي خواهم كه تابع sinx را بروي محورمختصات رسم كند
محور xها با علامت + نمايش داده شود
محور yها با علامت * نمايش داده شود
تابعSinx با علامت ؟ نمايش داده شود
که با forویا whileرسم شود
f1
11 November 2012
ممنونم از پاسخ شما
و من مطالب رو باذكر منبع ارائه مي دم
و لطف كنيد ادرس ايميل من رو در قسمت پاسخ برداريد ممنونم
ز مطالب مفيدون
داوود
14 November 2012
سلام آقا مسعود عزیز؛
امکانش هست اگه ایرادی نداره برای حل تمرینها تا شنبه فرصت بدید تا حل کنیم و بعدش شما راه حلشو بذارید؟؟
البته اگه اشکالی نداره و بقیه دوستان هم مخالف نیستند.
ممنونم ازتون بخاطر زحماتتون
Amin
15 November 2012
فقط می خواستم بدونم windows form رو هم می گین یا نه؟
باتشکر
مسعود درویشیان
15 November 2012
خیر
داوود
24 November 2012
سلام مسعود جان؛ وقتت بخیر، بازهم از شما بخاطر تمرینهای خوبی که گذاشتید ممنون و سپاسگزارم.
علیرغم اینکه تمایل داشتم تمرینها رو هرچه سریعتر حل کنم و بفرستم ولی تمرین شماره هفت 7 واقعا چالش برانگیز و وقت گیر بود؛ ولی خوشبختانه با چند ساعت تلاش غیر مداوم( تقریبا اگه بخوام جمعشو حساب کنم فکر کنم 4 ساعت زمان برد) حل شد.
میدونم سرتون حسابی شلوغه و وقتتون هم حسابی پر.
ولی اگه وقت آزادی داشتید و تونستید به برنامه هام نگاهی بکنید و ایراداتشو از نظر فنی بهم بگید تا اصلاح کنم. البته همه برنامه های که فرمودید به درستی کار میکنه و نتیجه درخواست شده رو میده ولی از نظر اصولی و فنی منظورم هست. در هر صورت از شما مجددا ممنون و متشکرم.
دستتون درد نکنه.
لینک دانلود برنامه رو اینجا قرار میدم؛ چون گاهاً تجربه نشون داده وقتی که برنامه رو اینجا میذارم ممکنه بعضی از قسمتهاش کپی نشه:
http://uplod.ir/fah67jtuwfie/Program.cs.htm
و اینهم کل برنامه :
مسعود درویشیان
24 November 2012
سلام
وقت بهخیر
خیلی خوبه، همه جوابهاتون درسته تا اونجا که من دیدم مشکلی نداشتن. علاوه بر این جواب تمرینها هم توی قسمت پانزدهم هست میتونید مقایسه کنید.
یه نکتهای که به نظرم اومد و باید رعایت کنید این هست که سعی کنید از اسمهای بامعنی برای متغیرهاتون استفاده کنید و تا اونجا که میتونید از اسمهای بیمعنی و مختصر پرهیز کنید.
یه سری از قواعد نامگذاری رو توی قسمت چهارم ذکر کردم که میتونید مجددا ببینید.
در کل عالی بود
ممنون
داوود
24 November 2012
سلام آقا مسعود؛
ممنونم از اینکه اینقدر سریع برنامه ها رو دیدید و نظرتون رو مرقوم فرمودید.
آره خودم هم بعد از اینکه حل برنامه ها رو براتون فرستادم رفتم و حل برنامه های شما رو تو قسمت 15 دیدم، و حدس زدم که این مورد ضعف برنامه های ارسال شده من هستش.
چشم سعی می کنم رعایت کنم.
بهرحال ممنون از ابراز لطف و اظهار نظرتون.
دستتون درد نکنه آقای مهندس.
علیرضا اسکندرپور شوفری
20 April 2013
تمام تمرینات رو انجام دادم. سعی کردم به سخت ترین شکل ممکن انجام بدم یا به استاندارد ترین شکل ممکن. مثلا استفاده از توابع موجود یا در تمرین چهارم مستطیل رو تو خالی بسازم.
میثم
28 July 2013
سلام اقای مهندس مسعود درویشیان امیدوارم حالتون همیشه خوب باشه و مورد لطف خدای مدنان قرار گرفته باشی.
دوست عزیز من دانشجوی کارشناسی ترم آخر رشته نرم افزار هستم و در حال حاضر در آموزشگاهی جدیدا کار میکنم، من علاقه خاصی به زبانهای برنامه نویسی دارم و در آموزشگاه تصمیم دارم این زبان را برای دانشجویان تدریس کنم،راستش به علت کمبود وقت نتونستم خودم جزوه ای کامل برای تدریس سی شارپ ایجاد کنم و به خاطر همین تو اینترنت دنبال آموزش سی شارپ به صورت کنسول میگشتم که منبع خاص و کاملی پیدا کنم ولی منبع کامل پیدا نشد تا اینکه اتفاقی به سایت شما وصل شدم و مطالبش رو به طور کامل چک کردم و دیدم واقعا توضیحات کامل توش هست. خواستم اگه اجازه میدید بعضی از جلساتتون را وارد جزوه خودم کنم ونام و سایت شما را هم به عنوان منبع در جزوه انتشار کنم.ممنون میشم اگه بهم اجازه بدبد.آدرس ایمیلمو هم واستون فرستادم،منتظر جوابتون هستم.ممنون از کار خوبتون،موفق باشید.یا علی. باتشکر
مسعود درویشیان
28 July 2013
سلام ممنون از لطفتون. اگر لینک منبع رو ذکر کنید هیچ مشکلی نداره
موفق باشید
Mersad
5 August 2013
سلام
ممنون از آموزش های عالیتون.
دوتا سوال داشتم خدمتتون.
اول اینکه تفاوت Convert.ToInt32 و int.Parse چیه؟
دوم اینکه وقتی از Convert.ToInt میخوایم استفاده کنم، سه تا گزینه داره با نام های Int16 و Int32 و Int64، اینا تفاوتشون چیه و در چه زمانی باید از کدوم استفاده کرد؟
بازم تشکر میکنم ازتون بابت این سایت پر محتوا و همت و تلاش بی وقفتون.
یا علی
مسعود درویشیان
5 August 2013
سلام ممنون از لطفتون
جواب سوال اول: اساساً هردوشون یه کار رو انجام میدن و فقط توی یه مسائل کوچیکی تفاوت دارن که ممکنه توی موقعیتهای خاصی این تفاوت مهم بشه! مثلاً متد (Int32.Parse(string s فقط string هارو به int تبدیل میکنه. اگه s برابر با null باشه، این متد، ArgumentNullException رو throw میکنه (مبحث exception handling). اگر s یه عدد اعشاری باشه مثل 23.5 باشه، این متد FormatException رو throw میکنه و… از طرف دیگه متد (Convert.ToInt32(string s با هر شیءای که IConvertible رو implement کنه (مبحث interface) و قابل تبدیل به int باشه سر و کار داره. (Convert.ToInt32(String, IFormatProvider برای convert کردن میاد متد ()Int32.Parse رو صدا میزنه. تفاوتش اینه که اگه s برابر با null باشه، این متد بهجای اینکه ArgumentNullException رو throw کنه، مقدار صفر رو return میکنه
جواب سوال دوم: Int16 همون short هست، Int32 همون int و Int64 هم همون long هست. برای استفاده از هر کدوم از اینها باید ببینی که ماکزیموم مقداری که توی یه متغیر میخوای ذخیره کنی چقدر هست و با توجه به بازهای که هر کدوم از اینا دارن یه کدومشون رو که بهینهتره انتخاب کنی
Mersad
6 August 2013
ممنونم از راهنماییتون و وقتی که گذاشتین
علی ابراهیمی
1 January 2014
با سلام
اول از همه از شما به خاطر این آموزش ها بسیار متشکرم
یه سوال:
برای جلوگیری از ریست شدن متغیر های حلقه های داخلی چه کار باید بکنیم؟
علی ابراهیمی
4 January 2014
با سلام و تشکر از سایت و آموزش های خوبتون
لطفا یه بار این کد هارو هم چک کنین ببینین اشکالی که ندارن اگه اشکال سینتکسی یا اشکال الگوریتمی هم بود بگین (البته اینو بگم که سومین حلقه ی داخلی از تمرین شماره هفت رو با تقلب نوشتم بعد از دو روز تلاش برای پیدا کردن جواب)
چند تا سوال داشتم خدمتتون به علاوه ی سوال قبلی که هنوز جواب ندادین
1- فرق int و uint دقیقا چیه؟ من از این نوع برای مثبت کردن عدد منفی در گرفتن توان تمرین هشت استفاده کردم اما هنگام وارد کردن عدد منفی خطا گرفت.
2- متد try parse رو یه بار لطفا توضیح بدین. به جای آرگومان دوم این متد چی باید بنویسیم؟
3- کاراکتر █ چطوری نوشته می شه؟ نتونستم پیدا کنم آخرش کپی کردم.
4- می تونیم تو محیط کنسول فارسی بنویسیم؟ چه جوری؟
]code lang=csharp[
using System;
namespace S14_EXS
]/code[
علی ابراهیمی
19 June 2014
لطفا به سوالات بالا جواب بدین
خیلی وقت هست که سایتتون بروز نشده
اگه میشه سری جدید زنگ سی شارپ رو برای پلتفرم WinForm یا همون کنسول ادامه بدین
خیلی ممنون
علی ابراهیمی
4 January 2014
اینم از کدها (پست قبلی رو برای امتحان به هم ریختن کد ها ارسال کردم):
using System;
namespace S14_EXS
{
class Program
{
static void Main()
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(“Enter the number of exercise(6 to 11): “);
string n = Console.ReadLine();
if (n == “6”)
{
Console.WriteLine(“Exercise number 6: Drawing a right-angled triangle with *\n”);
Console.Write(“Enter the height: “);
int x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
for (int y = 1; y <= x; y++)
{
for (int m = 1; m <= y; m++) Console.Write("*");
Console.WriteLine();
}
Console.ReadKey();
}
if (n == "7")
{
Console.WriteLine("Exercise number 7: Drawing a isosceles triangle with *\n");
Console.Write("Enter the height: ");
int x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
for (int a = 1; a = a;b–) Console.Write(” “);
for (int c = 1; c <= a; c++) Console.Write("*");
for (int c = 2; c <= a; c++) Console.Write("*");
Console.WriteLine();
}
Console.ReadKey();
}
if (n == "8")
{
Console.WriteLine("Exercise number 8: Powering a number\n");
Console.Write("Enter the number: ");
int b = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter the power: ");
uint p = Convert.ToUInt32(Console.ReadLine());
Console.WriteLine();
int result = b;
if (p == 0)
result = 1;
else
{
for (int i = 1; i < p; i++) result *= b;
Console.WriteLine("The result is: " + result);
}
Console.ReadKey();
}
if (n == "9")
{
Console.WriteLine("Exercise number 9: a small dictionary\n");
Console.Write("Enter the word (computer or cell phone): ");
string word = Console.ReadLine();
switch (word)
{
case ("computer"):
Console.WriteLine("an electronic device that can store large amounts of information " +
"and be given sets of instructions to organize and change it very quickly\n");
break;
case ("cell phone"):
Console.WriteLine("a phone that is connected to the phone system by radio instead of by a wire, " +
"and can be used anywhere where its signals can be received\n");
break;
default:
Console.WriteLine("There's not such a word in glossory");
break;
}
Console.ReadKey();
}
if (n == "10")
{
Console.WriteLine("Exercise number 10: Drawing a rectangle with ?\n");
Console.Write("Enter the length: ");
int length = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter the width: ");
int width = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
for (int i = 1; i <= width; i++)
{
for (int j = 1; j <= length; j++) Console.Write("?");
Console.WriteLine();
}
Console.ReadKey();
}
if (n == "11")
{
Console.WriteLine("Exercise number 11: Multiplication table\n");
Console.Write("Enter the length: ");
int length = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter the width: ");
int width = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
int result;
for (int i = 1; i <= width; i++)
{
for (int j = 1; j <= length; j++)
{
result = i * j;
Console.Write(result + "\t");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
}
a-p
30 July 2014
بسم الله الرحمن الرحیم
سلام
نام سایت یا سایت های خوب انگلیسی برای پرسش و پاسخ در مورد سی شارپ می خواهم
فکر کنم یک دانه خوبش را در درسها معرفی کردید ولی هرچی گشتم پیدا نکردم
لطف کنید جواب را به ایمیلم بفرستید
مسعود درویشیان
30 July 2014
http://stackoverflow.com/
نفس
13 October 2015
سلام.میشه بگید چجوری میشه برنامه ای بنویسیم که ده تا نمره را از ورودی دریافت کنه به همراه واحدش بعد هرنمره ضرب در واحدش بشه و سپس همه باهم جمع شود و تقسیم بر مجموع واحدها شود.ممنون میشم جواب بدید
رادین
12 December 2015
سلام اقای درویشیان واقعا خسته نباشید……..
مطالبتون تکه تک
میشه جزوه ی دستورات کنترلی #c رو برام بفرستین…..
[email protected]