PDA

View Full Version : چرا در do-while loop پاسخ داده شده مطابق با شرط نیست ؟



niegrua
یک شنبه 15 اردیبهشت 1392, 00:16 صبح
چرا در do-while loop با عدم درستی شرط، output داده شده مطابق با شرط نیست !؟ مثل مثال زیر.
output داده شده، عدد 20 است .
درحالیکه بصورت مشابه، در while-loop و for-loop عدد 20 داده نمیشه !








class Program
{


static void Main(string[] args)
{

int myVal = 20;

// the do-while loop
Console.WriteLine("The do-while() loop:");
do
{
Console.WriteLine("myVal is currently {0}", myVal);
myVal += 3;
} while (myVal < 20);
Console.WriteLine();



}
}

Mahmoud.Afrad
یک شنبه 15 اردیبهشت 1392, 04:58 صبح
در حلقه do-while ابتدا دستورات بدنه do انجام میشه و بعد شرط چک میشه(در این نوع خلقه ، دستوارت داخل حلقه ، حداقل یک بار انجام خواهند شد، حتی اگر شرط از همان ابتدا غلط باشه)
در این مثال myVal در ابتدا برابر 20 هست که در بدنه do عدد 3 بهش اضافه میشه نتیجه 23. بعد شرط چک میشه که نتیجه نقض شرط هست و از حلقه خارج میشه. پس myVal در انتها 23 خواهد بود.

niegrua
یک شنبه 15 اردیبهشت 1392, 08:03 صبح
دوست من، متاسفانه پاسخ 23 نیست ! بلکه 20 هست !!
بنظر میرسه ذر do-while loop دستورات کد بلاک برای do یکبار انجام میشه جدای increment و decrement !
ولی اگر شرط درست می بود، مثلا مقدار myVal = 19 بود، جواب میشد 19+3=22 !
برام سوال شده که این کجا می تونه کاربرد داشته باشه !؟

Mahmoud.Afrad
یک شنبه 15 اردیبهشت 1392, 08:47 صبح
اشتباه میکنید.
دوست عزیز اگر پاسخ رو میخواهی میتونی دو کار انجام بدی. یا باید بعد از حلقه مقدار رو بررسی کنی و یا چاپ مقدار رو بعد از دستکاری متغیر انجام بدی. خروجی هم 23 خواهد بود.

do
{
myVal += 3;
Console.WriteLine("myVal is currently {0}", myVal);
} while (myVal < 20);

niegrua
یک شنبه 15 اردیبهشت 1392, 09:06 صبح
شما این 2 تصویر رو ببین و اگر دلیل تفاوتش رو تونستید به من بگید، ممنون میشم !

http://barnamenevis.org/attachment.php?attachmentid=103720
http://barnamenevis.org/attachment.php?attachmentid=103719

increment += 3 رو یکبار قبل writeLine که جواب 23 میشه و یکبار بعد writeLine، که جواب 20 میشه !




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

do
{
myVal += 3;
Console.WriteLine("myVal is currently {0}", myVal);
} while (myVal < 20);

wolf_majid
یک شنبه 15 اردیبهشت 1392, 11:08 صبح
do while برای زمانی طراحی شده که شما می خواهید حتما" یکبار داخل حلقه اجرا بشه و بعد شرط بررسی بشه
کد زیر رو ببینید :
int num;
int[] nums = {1, 2, 3, 4, 5};

do
{
Console.WriteLine("Plz Enter One Numer Between 1 and 5 To Continue");
Console.WriteLine("Or Other Keys For Exit .");
if (!int.TryParse(Console.ReadLine(), out num))
num = 0;
} while(nums.Contains(num));

Console.WriteLine("Bye Bye ...");
Console.ReadKey();

niegrua
یک شنبه 15 اردیبهشت 1392, 11:37 صبح
مثال جالبی بود . ممنون. اگرچه سوال من همچنان باقیست که تفاوت در اون 2 مدلی که نوشته شده و در تصاویر هست، دلیلش چیه که پاسخشون متفاوت است؟ increment += 3 رو یکبار قبل writeLine که جواب 23 میشه و یکبار بعد writeLine، که جواب 20 میشه !

اگر این 3 خط رو هم توضیح بدید ممنون میشم. من مبتدی هستم !


if (!int.TryParse(Console.ReadLine(), out num))
num = 0;
} while(nums.Contains(num));




do while برای زمانی طراحی شده که شما می خواهید حتما" یکبار داخل حلقه اجرا بشه و بعد شرط بررسی بشه
کد زیر رو ببینید :
int num;
int[] nums = {1, 2, 3, 4, 5};

do
{
Console.WriteLine("Plz Enter One Numer Between 1 and 5 To Continue");
Console.WriteLine("Or Other Keys For Exit .");
if (!int.TryParse(Console.ReadLine(), out num))
num = 0;
} while(nums.Contains(num));

Console.WriteLine("Bye Bye ...");
Console.ReadKey();

wolf_majid
یک شنبه 15 اردیبهشت 1392, 12:17 عصر
myVal += 3;
Console.WriteLine("myVal is currently {0}", myVal);
قبلا داشتیم که myVal برابر با 20 بود پس :
خط اول میگه 3 تا به myVal اضافه کن پس myVal=23
خط دوم میگه رشته مورد نظر من رو با مقدار 23 (همون myVal ) چاپ کن

Console.WriteLine("myVal is currently {0}", myVal);
myVal += 3;
رشته مورد نظر من را با مقدار myVal که الان 20 است چاپ کن (چون هنوز 20+3 نشده)
حالا 3 تا بهش اضافه کن
الان اگر یک چاپ دیگه بگذاری میبینی که 23 را چاپ می کنه

و اما در مورد سوال آخرتون :
if (!int.TryParse(Console.ReadLine(), out num))
num = 0;
} while(nums.Contains(num));
int.TryParse :
دو ورودی میگیره یک رشته و یک متغیر صحیح از نوع مرجع (زمانی که out به کار برده میشه متغیر ورودی به متد پس از پایان متد توسط متد مقدار دهی میشه- یک جور اشاره گر)
اگر بتونه رشته را به عدد تبدیل کنه عدد را درون متغیر صحیح میریزه و مقدار true بر میگردونه در غیر این صورت false
اگر دقت کنی من قبل از int.TryParse یک ! گذاشتم به این معنی که اگر نتونستی عدد از رشته در بیاری برو به داخل بلاک if و عدد ما رو با 0 مقدار دهی کن

nums.Contains(num)
Contains یک متده که آرایه ها دارند و بررسی می کنه که ورودی شما داخل آرایه هست یا نه

به عبارتی من می خواستم ببینم ورودی از کنسول شامل اعداد 1 تا 5 که داخل آرایه نوشتم هست یا نه

Mahmoud.Afrad
یک شنبه 15 اردیبهشت 1392, 17:46 عصر
مقدار myVal در انتها در هر دو مورد برابر 23 خواهد بود. منتها شما قبل از اضافه کردن مقدار رو نشون میدادید که 20 چاپ میشد ولی جواب صحیح اینه که بعد از اضافه کردن مقدار رو نشون بدید تا تغییرات رو ببینید. اما اگر جواب نهایی رو میخواهید برای اطمینان چاپ متغیر رو از حلقه خارج کنید تا مطمئن بشید:

int myVal = 20;
Console.WriteLine("The do-while() loop:");
do
{
myVal += 3;
} while (myVal < 20);

Console.WriteLine("myVal is currently {0}", myVal);
Console.ReadKey();