PDA

View Full Version : تمرین برنامه نویسی: نکته هایی از If - قسمت اول



BORHAN TEC
چهارشنبه 15 آذر 1391, 12:54 عصر
سلام
لطفاً این پست را قبل از اینکه کاری انجام دهید تا انتها بخوانید! :چشمک:

در مورد یاد گرفتن نکات زبان برنامه نویسی دلفی تصمیم گرفتم تا یکسری تمرین نسبتاً جالب را برای دوستان مبتدی تر طرح کنم و دوستان هم در صورتی که به این موارد علاقه دارند می توانند در همین تاپیک به سوال پاسخ دهند. هدف از این سری تمرینات به چالش کشیدن برنامه نویسان مبتدی است و خواهشمندم که دوستان حرفه ای تر در صورتی که جواب را می دانند از پاسخ دادن به آنها تا زمان پایان یافتن زمان پاسخگویی خودداری نمایند.
از تمام کسانی که در این قسمت می خواهند فعالیت کنند خواهشمندم که بحث را به حاشیه نکشند و اگر مشاهده شود که اشخاصی این بحث ها را به حاشیه می کشند بر خلاف میلم مجبورم که این روال را متوقف کنم. طبیعی است که هر چه از این روال بگذرد سوالات سخت تر خواهند شد. خواهشمندم که دوستان حرفه ای تر هم در طرح سوالات مرا یاری کنند. :قلب:
مدت پاسخگویی به این سوال تا ساعت 9 شب جمعه تاریخ 1391/09/17 می باشد و بعد از این زمان تعیین شده بهترین جواب مشخص خواهد شد و در صورتی که کسی به جواب نرسیده باشد جواب داده خواهد شد و مدتی بعد از پاسخ نهایی در صورتی که دیگر مسئله ای باقی نماند تاپیک قفل خواهد شد!

سوال اول:
در مورد کد زیر چه فکر می کنید؟ متغیر bln می تواند مقدار True یا False داشته باشد. در صورتی که متغیر هر یک از مقادیر True و یا False را داشته باشد چه اتفاقی می افتد؟ با تست کردن این کد متوجه چه رفتاری از طرف کامپایلر دلفی می شوید؟
var
bln: Boolean;
begin
bln := False; // True or False

if (bln) and (MessageBox(0, 'Text 1', '', MB_YESNOCANCEL) = IDYES) then
begin
MessageBox(0, 'Text 2', '', MB_YESNOCANCEL) = IDYES
end;
end;

BORHAN TEC
چهارشنبه 15 آذر 1391, 19:05 عصر
یعنی همه خودشون رو جزو حرفه ای ها می دانند؟ ماشاالله. من موندم که این همه سوال مبتدی رو کی توی این تالار مطرح میکنه؟!!!

dark-man
چهارشنبه 15 آذر 1391, 20:20 عصر
سلام
لطفاً این پست را قبل از اینکه کاری انجام دهید تا انتها بخوانید! :چشمک:

در مورد یاد گرفتن نکات زبان برنامه نویسی دلفی تصمیم گرفتم تا یکسری تمرین نسبتاً جالب را برای دوستان مبتدی تر طرح کنم و دوستان هم در صورتی که به این موارد علاقه دارند می توانند در همین تاپیک به سوال پاسخ دهند. هدف از این سری تمرینات به چالش کشیدن برنامه نویسان مبتدی است و خواهشمندم که دوستان حرفه ای تر در صورتی که جواب را می دانند از پاسخ دادن به آنها تا زمان پایان یافتن زمان پاسخگویی خودداری نمایند.
از تمام کسانی که در این قسمت می خواهند فعالیت کنند خواهشمندم که بحث را به حاشیه نکشند و اگر مشاهده شود که اشخاصی این بحث ها را به حاشیه می کشند بر خلاف میلم مجبورم که این روال را متوقف کنم. طبیعی است که هر چه از این روال بگذرد سوالات سخت تر خواهند شد. خواهشمندم که دوستان حرفه ای تر هم در طرح سوالات مرا یاری کنند. :قلب:
مدت پاسخگویی به این سوال تا ساعت 9 شب جمعه تاریخ 1391/09/17 می باشد و بعد از این زمان تعیین شده بهترین جواب مشخص خواهد شد و در صورتی که کسی به جواب نرسیده باشد جواب داده خواهد شد و مدتی بعد از پاسخ نهایی در صورتی که دیگر مسئله ای باقی نماند تاپیک قفل خواهد شد!

سوال اول:
در مورد کد زیر چه فکر می کنید؟ متغیر bln می تواند مقدار True یا False داشته باشد. در صورتی که متغیر هر یک از مقادیر True و یا False را داشته باشد چه اتفاقی می افتد؟ با تست کردن این کد متوجه چه رفتاری از طرف کامپایلر دلفی می شوید؟
var
bln: Boolean;
begin
bln := False; // True or False

if (bln) and (MessageBox(0, 'Text 1', '', MB_YESNOCANCEL) = IDYES) then
begin
MessageBox(0, 'Text 2', '', MB_YESNOCANCEL) = IDYES
end;
end;

خب در مرحله ی اول ، در صورتی که هر دو بخش شرط درست باشه ، دستور داخل بلاک اجرا میشه ، در مرحله ی دوم ، MessageBox داخل بلاک if مقدار نمیگیره و کد خطا میده .
در واقع این بخش از کد MessageBox(0, 'Text 2', '', MB_YESNOCANCEL) = IDYES خطا برمی گردونه ، کامپایلر برنامه رو کامپایل نمی کنه .

Ananas
پنج شنبه 16 آذر 1391, 00:14 صبح
تا شرط اول برقرار نباشه سراغ شرط دوم نمیره.

یوسف زالی
جمعه 17 آذر 1391, 03:37 صبح
این رو تست کنید:

{$B+}

:لبخند:

BORHAN TEC
یک شنبه 19 آذر 1391, 13:31 عصر
جواب نهایی:
از آنجایی که در شرط مسئله از AND استفاده شده است، در صورتی که نتیجه شرط اول False باشد دلفی شرط دوم را بررسی نمی کند، در نتیجه در صورت False بودن شرط اول کد زیر اجرا نخواهد شد:
(MessageBox(0, 'Text 1', '', MB_YESNOCANCEL) = IDYES)
این به این خاطر است که دلفی به طور پیش فرض این رفتار را دارد و طبق گفته You-See موقعی که از راهنمای کامپایلر {+B$} استفاده شود رفتار دلفی عوض می شود و همه شرط ها بررسی می شوند.
خط 9 هم خطا دارد! نتیجه این خط باید یک مقدار True یا False باشد ولی نکته اینجاست که که در دلفی بر خلاف زبانهایی مثل C++ شما نمی توانید عبارتی مثل زیر را به عنوان یک خط دستور به کار برید(این هم نکته ای بود که خودم به تازگی متوجه آن شده ام):
True;

موفق باشید...

MohsenB
دوشنبه 20 آذر 1391, 13:05 عصر
سلام

صحبت از if شد یادم به قدیما افتاد . اون وقتایی که با وی بی 6 برنامه می نوشتیم یه دستوری داشت به نام iif که بعضی مواقع خیلی کار رو راحت میکرد . گفتم نمومه دلفیشو بزارم شاید بدرد کسی خورد :

function iif( testcase: boolean; ifyes, ifno: variant): variant;
begin
if testcase then Result := ifyes else Result := ifno;
end;

موفق باشید

Ananas
دوشنبه 20 آذر 1391, 16:54 عصر
البته تو یونیت Math دلفی هم تابعی برای همین کار هست به نام IfThen

یوسف زالی
سه شنبه 21 آذر 1391, 01:06 صبح
برای کارهای رشته ای هم یونیت StrUtils دارای یک تابع به همین نام هست.

MohsenB
سه شنبه 21 آذر 1391, 01:24 صبح
برای کارهای رشته ای هم یونیت StrUtils دارای یک تابع به همین نام هست.

سلام

اینو برای یادآوریه خاطرات گذشته گذاشتم ، شاید هم کسی بدردش خورد . بعدشم این خاصیتش اینه که فرقی نداره چی بهش میدی و چی ازش میخوای . خوب اونام هست اینم میشه ...


موفق باشید

Ananas
سه شنبه 21 آذر 1391, 13:52 عصر
ضمن تشکر، راه حل هایی که ما گفتیم صحبت شما رو نفی نمیکنه بلکه تکمیل میکنه.