دانشگاه شهید بهشتی دانشکده مهندسی برق و کامپیوتر ترم دوم ۹۰-۸۹ |
برنامهسازی پیشرفتهگروه درسی بر روی گوگلتارنامه ارسال تمرینات |
استاد : دکتر آزاده منصوری |
تمرینات سری ششم
بازنویسی اپراتورها و کلاسهای کاربردی
اکنون که بازنویسی عملگرها را آموختهایم، قصد داریم در این تمرین چندین کلاس کاربردی بنویسیم. این کلاسها را در ادامه ترم کامل خواهیم کرد و در امتحانات و پروژه پایانی از آنها بسیار استفاده خواهیم کرد. توجه داشته باشید که نوشتن یک کلاس کامل و بی نقص کار بزرگیست و باعث تولید قطعه برنامهای خواهد شد که همواره و توسط تمام برنامهنویسان دیگر قابل استفاده خواهد بود. از آنجایی که این تمرین بسیار زمانگیر است، هر کدام از سوالات آن باید در زمان جداگانهای ارسال گردد تا زمان مناسب برای هرکدام صرف کنید.
تمرین اول : لیست با اپراتور
کلاسهای DynamicArray و LinkedArray که یادتان هست؟ برای آنها عملگر دسترسی به عناصر [] بنویسید. برای نوشتن آن کافیست بدینسان عمل کنید:
T& operator[](const int index) { return item(index); }
که بسیار ساده است. همچنین یکی از عملگرها را برای append انتخاب کنید و بنویسید. سپس توضیح دهید که چرا این عملگر را انتخاب کردهاید. بنابراین به کلاسهای شما باید دو عملگر افزوده شود. زمان تحویل : شنبه ۱۰ اردیبهشت قبل از ساعت ۲۴تمرین دوم : کلاس بُردار
یک کلاس بردار کامل با نام Vector2D بنویسید. این کلاس باید شامل تمام عملگرهایی که یک بردار خواهد داشت باشد. همچنین به شیوه Setter/Getter به عناصر آن دسترسی داشته باشید. برای درک لیست کامل عملگرهایی که باید بنویسید، به برنامه Vector2D_test.h مراجعه کنید. پس از آنکه کلاس را به صورت کامل نوشتید (در قالب دو فایل جداگانه h و cpp) با برنامه تستی که ارائه شده است آنرا تست نمایید.
این کلاس اولین کلاس تقریبا کاملی خواهد بود که مینویسید، بنابراین احتمالا با اشکالات بسیار زیادی خصوصا در نحوه کار کردن و نوشتن عملگرها مواجه خواهید شد. پیش بینی میشود این کلاس حدود ۳ الی ۱۰ ساعت از شما زمان بگیرد، بنابراین برنامهریزی مناسبی را انجام دهید.
فایل هدر این کلاس در Vector2D.h قرار داده شده است. لطفا بدون نگاه انداختن به آن کلاس را بنویسید. اگر در جایی به مشکلی بر خوردید یا اعلان متد یا اپراتور خاصی را نمیدانستید، میتوانید به این فایل نگاهی بیاندازید ولی ترجیحا اینکار را نکنید تا خودتان با گرامرها بیشتر آشنا شوید. در نهایت اگر مشکلی وجود داشت که با کمک دوستان و فکر و تلاش و بررسی این فایل و جستجو در اینترنت به نتیجه نرسید، حتما سوال خود را از یکی از دوستان کمک تدریس بپرسید.
نکته مهم : این تمرین مهمترین تمرین ترم شما برای یادگیری شیء گرایی و بازنویسی اپراتورهاست، بنابراین حتما آنرا انجام دهید.
زمان تحویل : پنجشنبه ۱۵ اردیبهشت قبل از ساعت ۱۲تمرین سوم : رشتههای نامحدود
یکی از مشکلات اساسی رشتههای منتهی به صفر زبان سی، محدودیت آنها بود. این محدودیت تا جایی مهم است که یکی از اصلیترین روشهای نفوذ و شکستن یک برنامه، استفاده از حمله Buffer Overflow بود که با دادن ورودی بزرگتر از اندازه رشته، کاری میکنند که ورودی از رشته خارج شده و مابقی حافظه برنامه را اشغال نماید.
در انجام این تمرین میخواهیم کلاسی با نام String بنویسیم که مشکلات رشتههای زبان سی را نداشته باشد. برای راحتتر شدن کار مدیریت حافظه رشته را به یکی از دو کلاس DynamicArray یا LinkedArray میسپاریم (دلخواه) و آنها را درون کلاس خودمان ترکیب (Object Composition) میکنیم. بنابراین کافیست تنها متدها و اپراتورهای مربوط به رشته خودمان را بدون دغدغه زیادی برای مدیریت حافظه بنویسیم.
به مانند سوال قبل، برای این سوال نیز برنامههای تست و اعلان String.h String_test.h وجود دارند. باز هم توصیه میشود ابتدا با توجه به برنامه تست خودتان کلاس را بنویسید و تنها اگر لازم شد (و یا پس از اتمام کار) به فایل اعلان نگاهی بیاندازید.
توجه : قبل از اینکه این کلاس را بنویسید، به کلاس DynamicArray یا LinkedArray خود، متد زیر را بیافزایید تا بازنویسی read-only از متد دسترسی ایجاد گردد. در غیر این صورت برخی از توابع که read-only هستند قادر به استفاده از متد دسترسی نخواهند بود:
const T& operator [](const int index) const { return item(index); }
دو کلاس DynamicArray , LinkedArray به صورت صحیح و قابل استفاده در پیوست وجود دارند.نکته مهم : این تمرین جهت درک و یادگیری Object Composition و ترکیب اشیاء در محیطهای شیگراست. انجام آن برای درک این مفهوم و یادگیری بهتر مباحث وراثت لازم است.
توجه : بهتر است برای اطمینان از صحت کلاس خود، آنرا با هر دو نگهدارنده DynamicArray و LinkedArray تست کنید.
زمان تحویل : شنبه ۱۷ اردیبهشت قبل از ساعت ۲۴تمرین چهارم (اختیاری) : اعداد بزرگ
یکی از محدودیتهای زبانهای برنامهنویسی امروزی در این است که انواع متغیر ابتدایی آنها، اعداد بسیار بزرگ و محاسبات پیچیده را پوشش نمیدهند. به همین دلیل است که برای اینکارها معمولا به نرمافزارهایی مثل Matlab رجوع میکنیم.
امروز میخواهیم با تغییر کلاس String سوال قبل، کلاسی با نام BigInt بنویسیم که اعداد صحیح تا هر تعداد رقم را پشتیبانی کند. در واقع با استفاده از این نوع کلاس، میخواهیم C++ را قادر سازیم محاسباتی مانند 8756 را به سادگی انجام دهد.
برای نوشتن این کلاس، کافیست هر رقم عدد خود را در یک خانه از یک آرایه عددی نگهداری کنیم. بنابراین کافیست با اتکا و ترکیب کلاس DynamicArray یا LinkedArray ای که داشتیم، مدیریت حافظه و تعداد ارقام را کنار بگذاریم و تنها متدهایی برای دسترسی به ارقام و اپراتورهایی جهت انجام محاسبات بنویسیم. همچنین چون اعداد بسیار بزرگ را به صورت مستقیم نمیتوان در برنامه C وارد کرد، بهتر است اعداد را در قالب رشتهها، یعنی به صورت "123456789012345" با کلاس خود ارتباط دهیم.
نکته : برای این تمرین کد تست و اعلان ارائه نشده است. خودتان آنها را بنویسید. همچنین اگر احتیاجی به کمک بود حتما با ما تماس بگیرید.
توصیه اکید
این سری تمرینات مهمترین تمرینات برنامهسازی پیشرفته هستند. همچنین ممکن است جدید و دشوار باشند. اکیدا توصیه میشود در حل آنها از کمک تدریسها و دوستان خود کمک کافی بگیرید و حتما آنها را خودتان انجام دهید.
پیوستها
DynamicArray.hLinkedArray.h
Vector2D.h
Vector2D_test.h
String.h
String_test.h
فایل فشرده شامل ۶ فایل فوق : assg6_src.zip
پاسخها
توضیحات بیشتر در بدنه کد به صورت توضیحات قرار دارد. حتما مطالعه بفرمایید.
Vector2D.cpp
نحوه ارسال
پاسخ سوالاتی که حل کردهاید در قالب قبلی به آدرس [email protected] ارسال نمایید. به هیچ وجه فایلها را فشرده نکنید وگرنه پذیرفته نخواهد شد. به ازای هر ارسال خود یک شماره Revision در Subject ایمیل خود بیافزایید. همچنین برای هر بخش تمرین که ارسال میکنید، شماره آنرا ذکر کنید، مثلا HW6.1 یا HW6.3
بازگشت