View Full Version : سوال درباره حلقه در مسائل پاسکال (نمونه سوال)
hercool
چهارشنبه 13 خرداد 1388, 16:43 عصر
سلام خدمت دوستان جواب این سوال 8 میاد یا 96 ممنون میشم راهنمایی بفرمایید
http://tehransar.ir/pics8/e8f3105b477f9f458c72f8a6abcf7339.jpg
این سیستمتون هم که گیرای الکی میده مجبورم :عصبانی::عصبانی::عصبانی::عصب نی::عصبانی::عصبانی:
Felony
چهارشنبه 13 خرداد 1388, 17:27 عصر
8 بار چاپ می شود ، چون حلقه ی اول اصلا تو حلقه ی دوم دخیل نیست ( حلقه تو در تو نیست ) و هر کدام جداگانه عمل میکنن .
hercool
چهارشنبه 13 خرداد 1388, 17:39 عصر
ممنون میشم در موردش یکم توضیح بدید چرا تو در تو نیست ؟
اگه معیار یا نکته ای در شناسایی حلقه های تو در تو است ممنون میشم راهنمایی بفرمایید
Felony
چهارشنبه 13 خرداد 1388, 18:07 عصر
ببینید کد شما این هست :
for i:=-1 to 10 do;
for k:=-2 to 5 do
Writeln('Pascal');
در خط اول یه حلقه داریم از 1- تا 10 که به عبارتی میشه 12 بار تکرار ، یعنی حلقه شروع میشه و در آخر همان خط بعد از do به وسیله ی سمیکالن ( ; ) به حلقه پایان داده شده .
بعد در خط بعدی یک حلقه داریم از -2 تا 5 که به عبارتی میشه 8 دور ( 2- ، 1- ، 0 ، 1 ، 2 ، 3 ، 4 ، 5 ) و میبینیم که این بار بعد از کلمه ی do به حلقه پایان داده نشده و دستور حلقه چاپ کلمه ی pascal هست .
پس به عبارتی اول حلقه ی اول ( i ) اجرا میشه و چون دستوری نداره هیچ عملیاتی انجام نمیده ، بعد از اون حلقه ی دوم ( j ) اجرا میشه و دستور اون هم چاپ کلمه ی پاسکال هست که به تعداد تکرار حلقه یعنی 8 بار این دستور اجرا میشه و 8 بار کلمه ی پاسکال چاپ میشه .
hercool
چهارشنبه 13 خرداد 1388, 18:19 عصر
از نظر دستوری یه سوال اونم اینه که مگه نباید پشت حلقه سمیکالن نباشه ؟
از توضیحت ممنونم فقط یک نکته اگر حلقه اول سمیکالن نداشت اونموقع می شد 96 درسته؟
Felony
چهارشنبه 13 خرداد 1388, 18:51 عصر
از نظر دستوری یه سوال اونم اینه که مگه نباید پشت حلقه سمیکالن نباشه ؟
نه از نظر دستوری همچین قانونی نداریم .
از توضیحت ممنونم فقط یک نکته اگر حلقه اول سمیکالن نداشت اونموقع می شد 96 درسته؟
بله .
hercool
پنج شنبه 14 خرداد 1388, 18:40 عصر
دوست من میشه در این مورد هم نظرتون رو بگید و بنده رو راهنمایی بفرمایید (ممنونتون میشم جواب اون تاپیک رو هم لطف کنید بدید)
چرا جواب ها اینطوری میاد
http://tehransar.ir/pics8/5a21330171b14d28cfd10515e31f68c4.jpg
http://tehransar.ir/pics8/5a21330171b14d28cfd10515e31f68c4.jpg
shervin farzin
پنج شنبه 14 خرداد 1388, 19:18 عصر
سلام
جواب سوال اول : جواب اين سوال بستگي به نوع كامپايلر داره . اگر كامپايلر اجازه تغيير مقدار عدد
شمارنده رو در داخل حلقه نده پر واضحه كه با خطاي كامپايلر مواجه ميشه . اگر كامپايلر چنين
اجازه اي رو بده نظر من اينه كه جواب صحيح در هيچ گزينه اي نيامده ، فرض كنيم حلقه تا جايي
پيش بره كه i برابر 8 بشه . مقدار 8 وارد حلقه ميشه . در خط اول تغييراتي روي متغيير s اتفاق
ميفته كه هيچ اهميتي در تكرار حلقه نداره . وقتي به خط دوم برسه مقدار i خواهد شده 16 ، بعد
برميگرده به ابتداي حلقه و چك ميكنه كه آيا 16 از 30 كوچكتره يا نه ، كه هست پس حلقه ادامه
پيدا ميكنه تا در انتهاي اين دور مقدار i بشه 2 * 16 يعني 32 . از اونجايي كه 32 از 30 كوچكتر
نيست حلقه تمام ميشه و مقدار i يعني 32 چاپ ميشه .
جواب سوال دوم : چون شرط حلقه هميشه صحيحه ( 1 هميشه از 10 كوچكتره و هيچ ربطي به
مقدار i نداره ) .
موفق باشيد .
vcldeveloper
پنج شنبه 14 خرداد 1388, 19:19 عصر
این سوالات را چه کسی طرح کرده، و جواب ها را چه کسی داده؟!
آخه کی متغیر حلقه در یک حلقه for را در داخل حلقه تغییر میده؟!!
جواب سوال دوم هم الف میشه. کی گزینه ج را به عنوان جواب مطرح کرده؟!
hercool
پنج شنبه 14 خرداد 1388, 19:42 عصر
با سلام
ممنون بابت جوابهاتون
این سوالات دانشگاه پیام نور است و جواب ها رو هم از پاسخنامه سیستم گرفتم
و سوالات رو با پاسخنامه برای دوستان قرار خواهم داد ممنون میشم در این باره به من راهنمایی برسونید هر چند که در حال حاضر این منت را بر سر من گذاشته اید
با تشکر
hercool
پنج شنبه 14 خرداد 1388, 19:47 عصر
این سوالات را چه کسی طرح کرده، و جواب ها را چه کسی داده؟!
آخه کی متغیر حلقه در یک حلقه for را در داخل حلقه تغییر میده؟!!
جواب سوال دوم هم الف میشه. کی گزینه ج را به عنوان جواب مطرح کرده؟!
ممنون میشم بیشتر توضیح بدید
hercool
پنج شنبه 14 خرداد 1388, 19:54 عصر
این سوالات است
http://companyforex.parsaspace.com/PNU/Pascal%2087881(www.itstudent.ir).zip
پاسخنامه هم در ضمیمه سایت قرار دارد
ممنون میشم جواب ها رو تصحیح بفرمایید
اگه اشتباهات فراتر برود با مسئول اموزش این مبحث را عنوان خواهم کرد چون حق زیادی از افراد در صورت اشتباه در طرح سوالات و پاسخنامه ها اجحاف می شود
Felony
پنج شنبه 14 خرداد 1388, 20:29 عصر
ممنون میشم بیشتر توضیح بدید
در پاسکال ما اجازه نداریم متغییری رو که به حلقه اختصاص دادیم تو خود همون حلقه دستکاری کنیم و سوالی که شما عنوانش رو قرار دادی دقیقا همین کار رو انجام داده و کاملا اشتباه است .
hercool
پنج شنبه 14 خرداد 1388, 21:13 عصر
این سوالات را چه کسی طرح کرده، و جواب ها را چه کسی داده؟!
آخه کی متغیر حلقه در یک حلقه for را در داخل حلقه تغییر میده؟!!
جواب سوال دوم هم الف میشه. کی گزینه ج را به عنوان جواب مطرح کرده؟!
میشه بیشتر توضیح بدید مخصوصا سوال دوم
ممنون میشم به این سوال هم جواب بدید
http://barnamenevis.org/forum/showthread.php?t=162835
Felony
پنج شنبه 14 خرداد 1388, 22:08 عصر
در مورد سوال اول فرض کنید کد زیر رو داریم :
for i:=0 to 10 do
begin
write('A');
i:=i+5;
end;
در این کد میبینید که متغیر i به حلقه اختصاص داده شده ولی داخل حلقه ما قصد داریم در مقدار موجود در متغیر i دست ببریم که این از نظر کامپایلر پاسکال غیر قابل قبول است و پاسکال اجازه نمیدهد تا اتمام حلقه به مقدار موجود در متغیر حلقه دست ببریم ، حال آنکه کد زیر درست است چون بعد از اتمام حلقه در مقدار موجود در متغیر دست برده ایم :
for i:=0 to 10 do
begin
write('A');
end;
i:=i+5;
i:=0;
While(1<=10) do
begin
Write(i);
Inc(i);
end;
من هم اول مثل آقای کشاورز دقت نکردم و فکر کردم شرط حلقه i هست ولی اگر دقت کنیم در داخل شرط i با 10 مقایسه نشده و اون 1 هست نه i ، که در این شرایط شرط پایان حلقه هیچ وقت اعمال نمی شود چون همیشه 1 کوچکتر از 10 می باشد و در اینجا یه حلقه ی بی نهایت داریم .
vcldeveloper
جمعه 15 خرداد 1388, 06:54 صبح
پاسکال اجازه نمیدهد تا اتمام حلقه به مقدار موجود در متغیر حلقه دست ببریمکامپایلر ایرادی از این موضوع نمیگیره، بلکه منطق کد به هم میریزه. اگر کدی مثل این داشته باشیم:
for i := 1 to 10 do
begin
writeln(i);
i := i + 2;
end;
ابتدا 1 چاپ میشه، سپس مقدار i میشه 1+2=3، سپس در دور بعدی حلقه یک واحد به مقدار i اضافه میشه، یعنی i میشه 4. مقدار 4 چاپ میشه. مقدار i میشه 4+2=6. در دور جدید یک واحد به آن اضافه میشه، میشه 7. مقدار 7 چاپ میشه. i میشه 7+2=9. در دور جدید یک واحد به آن اضافه میشه، و مقدارش میشه 10. مقدار 10 چاپ میشه. اینطوری منطق حلقه بهم میریزه.
فکر کردم شرط حلقه i هست ولی اگر دقت کنیم در داخل شرط i با 10 مقایسه نشده و اون 1 هست نه iآخه اون بدبختی که این رو روی صفحه کاغذ میبینه، چطور میخواد تشخیص بده که I هست یا 1؟! اینقدر سوالات تکنیکی کم هستند که طراحان سوال به فکر بازی با حروف افتادند؟!
Felony
جمعه 15 خرداد 1388, 09:11 صبح
کامپایلر ایرادی از این موضوع نمیگیره، بلکه منطق کد به هم میریزه.
بله درسته در داخل پاسکال اجرا شد ، ولی کامپایلر دلفی ازش این ایراد رو گرفت که من اشتباه فکر کردم پاسکال هم همین ایراد رو میگیره :
[Error] Unit1.pas(32): Assignment to FOR-Loop variable 'i'
راستی آقای کشاورز من کدی که شما گزاشتید رو به شکل زیر نوشتم و در پاسکال اجرا کردم ولی یک حلقه به وجود اومد که چند هزار بار اجرا میشه و اعداد عجیبی هم چاپ میشه ، میشه دلیلشو بگین .
uses wincrt;
var i:integer;
begin
for i := 1 to 10 do
begin
writeln(i);
i := i + 2;
end;
end.
آخه اون بدبختی که این رو روی صفحه کاغذ میبینه، چطور میخواد تشخیص بده که I هست یا 1؟! اینقدر سوالات تکنیکی کم هستند که طراحان سوال به فکر بازی با حروف افتادند؟!
بله همینطوره ، هرکی این سوال رو ببینه اون اول میبینه i با 0 مقدار دهی شده و زیاد رو اون شرط تمرکز نمیکنه و جواب رو اشتباه میده .... ، :قهقهه: زیادی تکنیکی بوده .
saeedemrah
شنبه 20 تیر 1388, 17:42 عصر
سلام ببخشید که این سوال رو اینجا مطرح میکنم این سوال رو یکی از دوستام پرسیده و من هم قول دادم که جوابش رو پیدا کنم سوال: برنامه ای بنویسید که دو عدد صحیح را گرفته،فاکتوریل هرکدام را به صورت مجزا محاسبه و با هم جمع کنید(به روش while) خیلی ممنون میشم اگه کمک کنین
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.