سوال سال ۹۰ - نسخهی قابل چاپ |
سوال سال ۹۰ - commasoud - 06 دى ۱۳۹۱ ۰۲:۳۲ ب.ظ
با سلام سوال زیر رو هر چقدر فکر به نتیجه نرسیدم دستور case به شرح زیر است ، اندازه جدول پرش در کد تولید شده ان کدام است؟ Case I of
۲ : St1; ۱۰: St2; ۵,۶:St3; End case |
RE: سوال سال ۹۰ - mp1368 - 06 دى ۱۳۹۱ ۰۴:۰۱ ب.ظ
سلام . کلا این بخش کامپایلر و طراحی پیاده سازی توی مانشت مظلوم واقع شدن و فک کنم مدیر هم ندارن متاسفانه کتاب پوران من چاپ جدید نیست که بینم استدلالش واسه حل تشریحی این سوال چی بوده ولی در هر صورت با توجه به کلید سوال که از سایت قدسی دیدم، دقیقا با جواب من یکی بود. در مورد این سوال ابتدا باید به این نکته دقت کنیم که : باید ثابت t رو که برای به دست آورن آدرس در جدول پرش استفاده میشود، بر طبق الگوریتم بهینه سازی خودمون محاسبه کنیم و بعد جدول پرش رو بر مبنای t ایجاد کنیم . دقیقا همین قضیه در مورد سوال کنکور ۸۶ هم صدق میکنه. خب حالا اگر به اعداد شروط نگاه کنیم می بینیم اعداد در بازه ی [۲ -- ۱۰] هستند که اگر بخوایم جدول پرش رو با استفاده از این اعداد بسازیم بهینه نیست و اندازه اون ۱۱ میباشد که در گزینه ها نیست(باید از آدرس ۰ تا ۱۰ رو محاسبه کنیم) . ولی اگر یه کم بهینه سازی کنیم و اعداد [۲ -- ۱۰] رو به اعداد [۰ -- ۸] نگاشت کنیم (یعنی هر مرحله I رو منهای ۲ کنیم) . اون وقت جواب بهینه به دست میاد. روال کار : t رو با استفاده از شرط پرش و نکته ی بهینه سازی به دست میاریم ،مثلا برای زمانی که شرط ۲ است با کم کردن ۲ تا از اون به t=0 تبدیل میشود و در ادامه محاسبه آدرس [tex]Jump $ L0 t[/tex] حالا باید آدرس هایی رو که از این دستور به دست میاد رو Label گذاری کنیم : ابتدا برای حالت I=2 که t=0 به دست میاد و به آدرس L1 پرش میکند که قمست Instruction1 رو پوشش میده [tex]L0: Jump $ To $ L1[/tex] برای حالت I=3 و I=4 که t=1 و t=2 به دست میاد (حالت های غیر مجاز که به آدرس بعد از Case پرش میکنیم L4) [tex]Jump $ To $ L4[/tex] [tex]Jump $ To $ L4[/tex] برای حالت I=5 و I=6 که t=3 و t=4 به دست میاد و به آدرس L2 پرش میکند که قمست Instruction3 رو پوشش میده [tex]Jump $ To $ L2[/tex] [tex]Jump $ To $ L2[/tex] برای حالت I=7 و I=8 و I=9 که t=5 و t=6 و t=7 به دست میاد (حالت های غیر مجاز که به آدرس بعد از Case پرش میکنیم L4) [tex]Jump $ To $ L4[/tex] [tex]Jump $ To $ L4[/tex] [tex]Jump $ To $ L4[/tex] برای حالت I=10 که t=8 به دست میاد و به آدرس L3 پرش میکند که قمست Instruction2 رو پوشش میده [tex]Jump $ To $ L3[/tex] خب حالا همه ی دستورات رو پشت سر هم مینویسیم [tex]--Jump $ L0 t[/tex]
[tex]L0: Jump $ To $ L1[/tex] [tex]--Jump $ To $ L4[/tex] [tex]--Jump $ To $ L4[/tex] [tex]--Jump $ To $ L2[/tex] [tex]--Jump $ To $ L2[/tex] [tex]--Jump $ To $ L4[/tex] [tex]--Jump $ To $ L4[/tex] [tex]--Jump $ To $ L4[/tex] [tex]--Jump $ To $ L3[/tex] [tex]L1: Instruction1[/tex] [tex]-- Jump$ To $ L4[/tex] [tex]L2: Instruction3[/tex] [tex]-- Jump$ To $ L4[/tex] [tex]L3: Instruction2[/tex] [tex]-- Jump$ To $ L4[/tex] [tex]L4:Other $ Code $ ...............[/tex] [tex].[/tex] در انتها باید دقت کنیم که منظور از اندازه جدول پرش همان قسمت L0 کد میباشد که برابر ۹ دستور است پ.ن :سوال ۸۶ که گفتم شرط Case اعداد ۲۰۰و۳۰۰و۴۰۰ هستند که با تقسیم کردن اعداد بر ۱۰۰، t رو ۱،۲،۳ به دست آورده. |