Pascal_HW4.pdf

‫هوالعلیم‬
‫مبانی برنامهسازی (‪)40151‬‬
‫)‪Fundamentals of Programming (Pascal‬‬
‫دانشکده مهندسی کامپیوتر‬
‫دانشگاه صنعتی‬
‫مدرس‪ :‬صادق دری نوگورانی‬
‫شریف‬
‫تمرین سری ‪4‬‬
‫مهلت ارسال تمرین‪ 82 :‬خرداد ‪11‬‬
‫توضیحات اولیه‬
‫‪ ‬آخرین مهلت تحویل تمرین اول‪ ،‬ساعت ‪ 85:31‬روز ‪ 82‬خرداد می باشد‪.‬‬
‫‪ ‬تمرین به صورت انفرادی میباشد‪.‬‬
‫‪ ‬بعد از نوشتن تمرینها‪ ،‬فایلهای ‪ .pas‬تمرین خود را در یک فولدر با نام ‪ HW4_STDID‬قرار دهید‪.‬‬
‫(‪ STDID‬شماره دانشجویی شما می باشد)‪ .‬این فولدر را ‪ zip‬کنید‪ .‬فایل فشرده شده را به آدرس‬
‫‪ [email protected]‬ارسال نمایید‪( .‬از فرستادن جواب تمرین به گروه پستی‬
‫جدا خودداری کنید)‬
‫‪ ‬عنوان ایمیل باید به صورت ‪ HW4_STDID‬باشد‪ .‬که ‪ STDID‬شماره دانشجویی شما می باشد‪.‬‬
‫‪ ‬فرستادن کل یا قسمتی از برنامه تان برای افراد دیگر‪ ،‬یا استفاده از کل یا قسمتی از برنامه فردی دیگر‬
‫به نام خود‪ ،‬تقلب محسوب میشود‪.‬‬
‫‪ ‬در صورت مشاهده تقلب‪ ،‬به میزان نمره سوال‪ ،‬نمره منفی تعلق خواهد گرفت‪ ( .‬یعنی اگر نمره سوال‬
‫‪ 82‬نمره بود‪ ،‬نمره ‪ -82‬برای هر ‪ 8‬نفر منظور خواهد شد) در صورتی که در ‪ 8‬سوال از یک تمرین تقلب‬
‫علمی مشاهده شود‪ ،‬نمره تمرین هر ‪ 8‬نفر‪ ،‬صفر خواهد شد‪ .‬پس لطفا کپ نزنید!‬
‫‪ ‬پس از اتمام زمان ارسال تمرین‪ ،‬تا ‪ 4‬روز می توانید تمرین خود را ارسال کنید‪ .‬هر روز تاخیر در ارسال‬
‫برنامه‪ %82 ،‬از نمره شما کسر خواهد شد‪.‬‬
‫‪ ‬اگر هر گونه ابهام یا مشکل در مورد تمرین داشتید که فکر میکنید پاسخ آن برای همه مفید خواهد‬
‫بود‪ ،‬لطفا آن را به گروه پستی درس ارسال کنید‪ .‬در غیر این صورت به آدرس‬
‫‪ [email protected]‬بفرستید‪.‬‬
‫‪1‬‬
‫تمرین های عملی‬
‫‪1‬ـ اصالح برنامه (‪ 02‬نمره)‬
‫برنامهی زیر را که به کمک اشارهگرها نوشته شده است‪ ،‬اصالح کنید و به طور کامل بازنویسی نمایید‪ .‬دلیل هر‬
‫خطا را در یک جمله توضیح دهید‪:‬‬
‫;‪Program Pointers‬‬
‫‪Type‬‬
‫;‪PInteger = ^Integer‬‬
‫;‪PReal = ^Real‬‬
‫‪Var‬‬
‫;‪A, B: PInteger‬‬
‫;‪E, F: Integer‬‬
‫‪Begin‬‬
‫;)‪New(A); New(B‬‬
‫;‪A^ := 10‬‬
‫;‪B := A‬‬
‫}‪{1‬‬
‫;)^‪Readln(B‬‬
‫;)‪New(E‬‬
‫;^‪E := A^ + B‬‬
‫;‪F := A‬‬
‫;)‪Dispose(A‬‬
‫;)‪Dispose(B‬‬
‫;)‪New(A‬‬
‫;‪A := 42‬‬
‫;‪B := A‬‬
‫;‪F := B^ * 2‬‬
‫;)‪Dispose(B); Dispose(E); Dispose(F‬‬
‫‪End.‬‬
‫آیا میتوانید توضیح دهید خط }‪ {1‬چه مشکلی را ایجاد میکند؟‬
‫‪8‬‬
‫‪0‬ـ مجموعهی حروف (‪ 02‬نمره)‬
‫به کمک استفاده از مجموعهها در زبان پاسکال‪ ،‬برنامهای بنویسید که یک رشته‪ ،‬تنها شامل حروف ‪ A‬تا ‪Z‬‬
‫(بزرگ یا کوچک) و فاصله را از ورودی دریافت کند و مجموعهی حروفی را که در این رشته حضور ندارند را در‬
‫خط اول و مجموعهی حروفی که فقط یک بار در جمله ظاهر شدهاند را در خط دوم خروجی چاپ کند‪ .‬دقت‬
‫کنید که تمایزی بین حروف بزرگ و کوچک نمیباشد (خروجی را با حروف کوچک چاپ کنید)‪.‬‬
‫دقت کنید که برای این برنامه لزوماً باید از مجموعهها استفاده کنید‪.‬‬
‫ورودی نمونه‬
‫‪AabB Cc cddeeeffg hiJK lmNo‬‬
‫خروجی نمونه‬
‫] ‪q r s t u v w x y z‬‬
‫] ‪h I j k l m n o‬‬
‫‪abcdefghijklmnopqrstuvwxyz‬‬
‫‪b c d e f g h i j k l m n‬‬
‫] ‪q r s t u v w x y z‬‬
‫‪p‬‬
‫‪g‬‬
‫]‬
‫‪a‬‬
‫‪p‬‬
‫[‬
‫[‬
‫[‬
‫[‬
‫‪o‬‬
‫‪3‬ـ اشارهگرها (‪ 32‬نمره)‬
‫قطعه کد زیر را در نظر بگیرید‪:‬‬
‫;)‪New(P‬‬
‫;'‪P^.Data := 'ABC‬‬
‫;)‪New(P^.Pointer‬‬
‫;‪Q := P^.Next‬‬
‫;'‪Q^.Data = 'abc‬‬
‫;‪Q^.Pointer = nil‬‬
‫تعاریف مربوط به ‪Type‬ها‪Var ،‬ها و ‪Record‬های موردنیاز برای اینکه این قطعه کد به درستی اجرا شود را‬
‫بنویسید‪.‬‬
‫‪4‬ـ (سوال امتیازی) لیست دوپیوندی (‪ 02‬نمره)‬
‫لیستهای دوپیوندی‪ ،‬همانند لیستهای پیوندی هستند‪ ،‬با این تفاوت که هر گره در این لیستها‪ ،‬عالوه بر‬
‫اشارهگر به گره بعدی‪ ،‬اشارهگری به گره قبلی نیز ذخیره میشود‪ .‬در این لیستهای میتوان از هر گره به هر دو‬
‫جهت حرکت نمود و تنها حرکت مانند لیست پیوندی به یک جهت محدود نیست‪.‬‬
‫‪5‬‬
‫در این تمرین باید یک لیست دوپیوندی (مشابه لیست پیوندی تدریس شده در کالس) را پیادهسازی نمایید و‬
‫توابع زیر را برای آن بنویسید‪:‬‬
‫;)‪ Procedure AppendNode(var ListHead: PNode; Value: Integer‬‬
‫این تابع‪ ،‬یک گره با مقدار ‪ Value‬در انتهای لیست اضافه میکند‪ .‬دقت کنید که ‪ Value‬عددی است که باید‬
‫در گره ذخیره شود‪ .‬در صورتی که لیست خالی باشد‪ ListHead ،‬برابر با ‪ Nil‬بوده و باید مقدار جدید سرلیست‬
‫در ‪ ListHead‬قرار داده شود‪.‬‬
‫;)‪ Procedure DeleteNode(var ListHead: PNode, Index: Integer‬‬
‫گره با اندیس ‪ Index‬را از لیست حذف میکند‪ .‬اگر ‪ Index‬برابر با ‪ -1‬باشد‪ ،‬باید گره آخر حذف شود‪ .‬در‬
‫صورت خالی شدن لیست‪ ListHead ،‬باید ‪ Nil‬شود و همواره سرلیست جدید در ‪ ListHead‬حضور داشته‬
‫باشد (مثالً در صورتی حذف خود سرلیست)‪.‬‬
‫;‪ Function GetNode(ListHead: PNode, Index: Integer) : Integer‬‬
‫مقدار گرهای که با ‪ Index‬مشخص شده است را بر میگرداند‪ .‬اگر ‪ Index‬برابر با ‪ -1‬باشد‪ ،‬مقدار گره آخر را باز‬
‫میگرداند‪.‬‬
‫;)‪ Procedure PrintList(ListHead: PNode‬‬
‫عناصر لیست را با یک فاصله از هم به ترتیب چاپ میکند‪ .‬این تابع را به صورت بازگشتی پیادهسازی‬
‫کنید‪.‬‬
‫;)‪ Procedure SortList(var ListHead: PNode‬‬
‫لیست را مرتب می کند‪ .‬از هر الگوریتم مرتبسازی دلخواه برای این قسمت میتوانید استفاده کنید‪.‬‬
‫;‪ Function IsInList(ListNode: PNode, Value: Integer) : Boolean‬‬
‫این تابع به دنبال مقدار ‪ Value‬در لیستی میگردد که یکی از گرههای آن با ‪ ListNode‬مشخص شده است‪.‬‬
‫دقت کنید که ‪ ListNode‬لزوماً عنصر اول یا آخر لیست نمیباشد و ممکن است یکی از عناصر میانی لیست‬
‫باشد‪ .‬در صورتی که مقدار ‪ Value‬در این لیست وجود داشت‪ True ،‬و در غیر این صورت ‪ False‬بر میگرداند‪.‬‬
‫‪4‬‬