PDA

View Full Version : سوال: به توضیح کامل راجع به یک کد خیلی مبتدی در سی شارپ نیاز دارم



ro-programing
چهارشنبه 24 آبان 1391, 22:59 عصر
این سوال حل شد لطفا پست شماره 4 و سوال دوم را بخوانید





با سلام و خسته نباشید خدمت اساتید محترم
یه چند تا کد هست که من خیلی راجه به اونها سوال دارم که همه رو تو همین تاپیک میپرسم ... جواب اولی رو که گرفتم سوال بعدی رو همینجا میپرسم ...
دوستان کد اول اینجوریه که عددی رو میگیره و اعداد زوج و فرد کوچکتر یا مساوی خودش رو در دوتا لیست باکس نشون میده و این کد اون هست :

private void button1_Click(object sender, EventArgs e)
{
int n = Convert.ToInt32(textBox1.Text);
int i, even, odd;
odd = even = n;
if (n % 2 == 0)
odd = n - 1;
else
even = n - 1;
listBox1.Items.Clear();
listBox2.Items.Clear();
for (i = 0; i <= even; i += 2)
listBox1.Items.Add(i.ToString());
for (i = odd; i >= 1; i -= 2)
listBox2.Items.Add(i.ToString());







}
}
}


حالا لطفا اگه میشه خط به خط این کد رو برام توضیح بدید اخه خیلی تازه کارم ...
مثلا در خط اول گفته int n آیا n همون عددی هست که ما قراره وارد کنیم ؟
خط دوم گفته i,even,odd من even و odd رو میدونم خب برای فرد و زوج هست منتهی این i چیه؟ و برای چیه؟
خط سوم چرا اینها رو مساوی قرار داده؟

و به همین ترتیب تا اخر ... خیلی خوشحال میشم از شما دوستان کمک بگیرم

masoodz
چهارشنبه 24 آبان 1391, 23:17 عصر
سلام دوست من
خط سوم یه متغیر از نوع Int تعریف می کنه و طرف راست مساوی داره عبارت داخل تکست باکس رو به int تبدیل می کنه .
خط چهارم سه متغیر از نوع Int تعریف می کنه .
خط پنجم odd و even رو برابر مقدار nقرار میده که همون ورودی تکست باکس باشه .(دلیل = برای اینکه شرطی رو که پایین می ذاره بررسی کنه که آیا عدد زوج هست یا فرد - بر دو تقسیم می کنه و باقیمانده رو چک می کنه )
خط ششم یه دستور شرطی هست که دارای یک خط کد هست و بدین صورت کار می کنه که اگر باقیمانده n بر صفر برابر با صفر بود odd رو برابر n-1 قرار می ده
خط هفتم دستور else هست که بعد دستور if میاد (if یعنی اگر این شرط برقرار بود و else یعنی اگر شرط برقرار نبود اینکارو کن) . اینجا else هم یه خط کد داره و even رو برابر n-1 قرار می ده
نکته : تو این شرط عدد زوج و فردی رو که باید تا اونجا مشخص کنیم اعداد رو پیدا کردیم .
خط هشت و نه میاد عناصر داخل لیست باکس ها رو پاک می کنه
خط دوازده و سیزده : یه حلقه for هست که مقدار اولیه i=0 رو گرفته و تازمانی که مقدار به even برسه دو تا دوتا بالا می ره و در خط بعدیش میاد i رو توی لیست باکس قرار می ده (البته تو این خط یه تغییر متغیر int به string رو داریم) (جواب سوالتون : این i یه متغیر هست که اعداد زوج و فرد رو از صفر تا اون عدد مورد نظر تو خودش ذخیره می کنه و چاپ می کنه از طریق حلقه for )
در دو خط بعدی به اینصورت عمل میشه که i=odd قرار میگیره که مقدارشو تو شرط بالا تعیین کردیم و می خوایم مقادیر فرد رو پیدا کنیم به همین خاطر دو تا دوتا ازش کم می کنیم تا به یک برسم (چون یک کوچکترین عدد فرد هستش ) و بعد این مقادیر رو در Listbox می ریزیم(البته قرار دادن تو لیست باکس تو هر چرخش حلقه اتفاق میفته می تونی برای قشنگیه کارت یه sort بذاری که از پایین به بالا مرتبش کنه )
امیدوارم واضح بوده باشه دوست من

harani
چهارشنبه 24 آبان 1391, 23:29 عصر
private void button1_Click(object sender, EventArgs e)
//اگر کلید1 فشرده شد (رویداد کلیک باتن)
{
int n = Convert.ToInt32(textBox1.Text);
//در ابتدا متغیر اِن از نوع اینت (اینتیجر) {(عدد صحیح)} تعریف شده که مقدار اولیه اون برابر متنی که در کنترل تکست نوشته میشه از آنجایی متن , تکست باکس دات تکست یک مقدار استرینگ است و اِن عدد صحیح است باید استرینگ به اینت تبدیل بشه برای این کار از دستور کانورت دات اینت 32 استفاده میکنیم
int i, even, odd;
//سه عدد از نوع عدد از نوع اینت تعریف شده
odd = even = n;
//که مقدار هر کدام برابر دیگری است
if (n % 2 == 0)
// در اینجا چک میشه که اگر باقیمانده عدد اِن بر 2 برابر صفر شد (یعنی همون شرط زوج بودن عدد
odd = n - 1;
//مقدار اولیه ی عدد اَدد را برابر مقدار عدد اِن - 1 کن
else
//ادر غیر اینصورت اگر شرط برقرار نبود
even = n - 1;
//مقدار اولیه ی عدد ایون را برابر مقدار عدد اِن - 1 کن
listBox1.Items.Clear();
//مقادیر و آیتمهای دو لیست باکس 1و 2 رو به کلی حذف کن
listBox2.Items.Clear();
for (i = 0; i <= even; i += 2)
//مقادیر 0 تا عدد ایون را با فاصله ی +2 درون لیست باکس 1 بریز
listBox1.Items.Add(i.ToString());
for (i = odd; i >= 1; i -= 2)
// از مقدار اُدد تا 1 رو با فاصله ی -2 درون لیست باکس 2 بریز
listBox2.Items.Add(i.ToString());
}
}
}

ro-programing
پنج شنبه 25 آبان 1391, 20:05 عصر
سوال دوم


از پاسختون ممنون واقعا کمکم کرد
حالا این کد خیلی آسون تر از کد قبلی هست منتهی برای من درکش مشکله یکم
میخواستم یه راهنمایی راجه به این کد هم بکنید بی زحمت :

private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "";
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
label1.Text = label1.Text + j.ToString() + " ";
}
label1.Text = label1.Text + "\n";
}
}
}

مثلا میخوام بدونم اگر من کد خط شماره 3 رو ننویسم و در خود فرم روی label1 کلیک کنم و text اون رو پاک کنم هم میشه؟
و اینکه راجه به i و j اگه میشه توجیح کنید...
ممنونم از همتون

morteza271
پنج شنبه 25 آبان 1391, 20:22 عصر
اگر من کد خط شماره 3 رو ننویسم و در خود فرم روی label1 کلیک کنم و text اون رو پاک کنم هم میشه؟
اره میشه این کار رو هم انجام داد به جای خط شماره 3 ...

در مورد i و j :
حلقه اول 5بار تکرار میشه و فقط شمارنده آن یعنی i اضافه میشه و در هر بار اضافه شدن i تا زمانی که 6 نشده (یعنی کوچکتر یا برابر 5 هست) حلقه دوم یکبار اجرا میشه و مقدار j رو به متن label1 اضافه می کنه و بعد از اجرای حلقه دوم یه اینتر به انتهای متن label1 اضافه میشه تا عبارت بعدی در خط بعدی نوشته بشه...

امیدوارم متوجه شده باشید...

sgh_programer
پنج شنبه 25 آبان 1391, 20:33 عصر
سلام دوست عزیز
برای این که این کد ها رو بهتر بفهمی اونا رو توی یه button بنویس و خط به خط را کامنت کن تا بهتر متوجه تغیر خروجی بشی

مثلا میخوام بدونم اگر من کد خط شماره 3 رو ننویسم و در خود فرم روی label1 کلیک کنم و text اون رو پاک کنم هم میشه؟ بله این کار شدنیه مشروط بر این که اول text مربوط به label رو خالی کنی بعد ادامه کد ها رو اجرا کنی
label1.Text = "";


و اینکه راجه به i و j اگه میشه توجیح کنید...i,j دو حلقه تودر تو هستند یعنی اینکه به ازای یکی اضافه کردن i حلقه داخلی که همون j است n بار اجرامیشه که در اینجا شما از یک تا یک تعریف کردید که یه بار بیشتر اجرا نمیشه

label1.Text = label1.Text + "\n";
این کد باعث میشود که داده ها درون lable زیر هم قرار گیرند

و این که چون حلقه داخلی شما از یک تا یک است این کد ها خروجی یکسانی با کد های بالا دارند
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "";
for (int i = 1; i <= 5; i++)
{

label1.Text = label1.Text + "1" + " ";

label1.Text = label1.Text + "\n";
}
}

موفق باشی

ro-programing
پنج شنبه 25 آبان 1391, 20:42 عصر
و این که چون حلقه داخلی شما از یک تا یک است این کد ها خروجی یکسانی با کد های بالا دارند
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "";
for (int i = 1; i <= 5; i++)
{

label1.Text = label1.Text + "1" + " ";

label1.Text = label1.Text + "\n";
}
}

موفق باشی[/QUOTE]


عذر میخوام حلقه از j تا i بود که من کد رو اشتباهی نوشتم در واقع اینجوری جواب به دست میاد :
1
12
123
1234
12345

حالا چی؟

masoodz
پنج شنبه 25 آبان 1391, 20:43 عصر
دوست من تو این برنامه حلقه دوم کاری برات نمی کنه و فقط کدت رو اضافه کردی . می تونی برداریش چون تعداد چرخشش یک بار هست

سوال دوم


از پاسختون ممنون واقعا کمکم کرد
حالا این کد خیلی آسون تر از کد قبلی هست منتهی برای من درکش مشکله یکم
میخواستم یه راهنمایی راجه به این کد هم بکنید بی زحمت :

private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "";
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
label1.Text = label1.Text + j.ToString() + " ";
}
label1.Text = label1.Text + "\n";
}
}
}

مثلا میخوام بدونم اگر من کد خط شماره 3 رو ننویسم و در خود فرم روی label1 کلیک کنم و text اون رو پاک کنم هم میشه؟
و اینکه راجه به i و j اگه میشه توجیح کنید...
ممنونم از همتون

ro-programing
پنج شنبه 25 آبان 1391, 20:52 عصر
و حالا سوالی که منو گیج کرده اینه که چرا کد خط 4 کاری میکنه که پنج بار 1 زیر هم نوشته بشه؟ \n رو میدونم برای اینتره ولی چرا 5 تا 1؟ چرا از 1 تا 5 ننوشت زیر هم؟

sgh_programer
پنج شنبه 25 آبان 1391, 21:00 عصر
اگه کدها به شکل زیر باشند
label1.Text = "";
for (int i = 1; i <= 5; i++)
{
for(int j=1;j<=i;j++)
{
label1.Text = label1.Text +j.ToString()+ " ";
}
label1.Text = label1.Text + "\n";
}

بار اول i یک و j هم از 1 تا 1 خروجی 1
مرحله دوم i دو و j هم از 1 تا 2 خروجی 2 1
مرحله سوم i سه و j هم از 1 تا 3 خروجی 3 2 1
مرحله چهارم i چهار و j هم از 1 تا 4 خروجی 4 3 2 1
مرحله پنجم i پنج و j هم از 1 تا 5 خروجی 5 4 3 2 1

و نهایتا
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1

موفق باشی