دانشگاه شهید بهشتی دانشکده مهندسی برق و کامپیوتر ترم دوم ۹۰-۸۹ |
برنامهسازی پیشرفتهگروه درسی بر روی گوگلتارنامه ارسال تمرینات |
استاد : دکتر آزاده منصوری |
تمرینات سری هفتم
وراثت مقدماتی
میخواهیم چند برنامه بنویسیم و تا حدودی با وراثت در شیگرایی و انواع روابط آن آشنا شویم. دقت داشته باشید که به غیر از تمرین چهارم، مابقی تمارین برای ادامه درس شما لازم هستند. همچنین توجه داشته باشید که در تمرینات این سری، به مانند پروژهتان، حق نوشتن هیچ تابعی به غیر از main را ندارید و مابقی کد باید در قالب کلاسها باشد.
در صورتی که نکته گنگی یا سوالی در تمرینات داشتید، حتما به ما ایمیل بزنید.
تمرین اول : مرغها در مزرعه
حنا در مزرعه خود تعدادی مرغ دارد. این مرغها توانایی قد قد کردن و حرکت کردن را دارند. در صورتی که دو مرغ به یکدیگر برخورد کنند هردو قد قد خواهند کرد. حرکت مرغها نیز به صورت تصادفیست. با نوشتن کلاسها مربوط به مرغ و مزرعه و قرار دادن تعداد N مرغ (که از ورودی گرفته میشود) در محلهای مختلف از مزرعه، مشاهده کنید که در ۱۰۰۰ سیکل مرغها چندبار قد قد میکنند.
برای این تمرین کلاس Morgh و Farm در اختیار شما گذاشته شده است. برنامه main که تعداد مرغها را بگیرد، مرغها را بسازد، به مزرعه اضافه کند و سپس سیکلهای مزرعه را بپیماید و در نهایت تعداد قد قد را خروجی دهد، شما باید بنویسید.
DynamicArray.h
Morgh.h
Farm.h
Vector2D.h
Vector2D.cpp
تمرین دوم : مرغها هوشمند میشوند
قصد داریم دقیقا همان مسئله بالا را با هوشمندی بیشتر و تحلیل شیگراتری حل کنیم. در این تحلیل، به جای اینکه مزرعه مرغ ها را حرکت دهد، و به جای اینکه مزرعه بررسی کند که مرغها به یکدیگر برخورد کردهاند یا نه، هر مرغی خود اینکار را میکند. بدین منظور باید قطعه کد زیر تغییر کند :
void Cycle() { for (int i = 0; i < morgh.count(); ++i) morgh[i]->move(rand() % 5, rand() % 5); for (int j = 0; j < morgh.count(); ++j) for (int i = 0; i < morgh.count(); ++i) if (i != j && morgh[i]->collides(morgh[j])) { morgh[i]->ghodghod(); this->totalGhodghod++; } }
و قطعه کد زیر جایگزین گردد. در تحلیل جدید، با فراخوانی تابع move از هر مرغ، بدون دادن پارامتر، خود مرغ باید به صورت تصادفی حرکت کند. سپس بررسی کند که آیا با مرغ دیگری برخورد کرده یا خیر و اگر برخورد کرده بود، قد قد کرده تعداد برخوردهای مزرعه را افزایش دهد.
void Cycle() { for (int i = 0; i < morgh.count(); ++i) morgh[i]->move(); }
اعمال تغییرات لازم در کلاس مزرعه و کلاس مرغ توسط شما باید انجام گیرد. برنامه اصلی نیز تغییر کوچکی لازم خواهد داشت تا مرغها مزرعه را به عنوان پارامتر به هنگام ساخته شدن (يا پس از آن) بشناسند. در این روش، مرغهای ما مستقلتر عمل میکنند و از نوزاد به کارمند شبیهتر شدهاند. از طرفی از آنجایی که مرغها احتیاج دارند مابقی مرغها را نیز ببینند، باید به نوعی با مزرعه رابطه داشته باشند (مزرعه با مرغ ها رابطه داشت ولی مرغها با مزرعه نداشتند).
نکته : دقت داشته باشید در این تمرین چون هر دو کلاس به یکدیگر احتیاج دارند، باید کلاسها را در قالب فایلهای .h و .cpp بنویسید تا هردو یکدیگر را بشناسند.
نکته : اگر عدد حاصل از برنامه قبلی خیلی بزرگتر شد، احتمالا هنگام بررسی برخورد یک مرغ با دیگر مرغها، برخورد مرغ با خودش را هم حساب میکنید.
تمرین سوم : اردکها
حنا تعدادی اردک هم برای مزرعهاش تهیه کردهاست. اما میخواهد بدون ایجاد مشکل به نگهداری اردک ها نیز بپردازد. به مانند سوال اول، کلاسهای AbstractFarmBird, Duck, Morgh, Farm برای شما تعریف شدهاند. تنها باید یک تابع main بنویسید که پس از دریافت N ، نیمی از آنرا اردک بسازد به و به مزرعه اضافه کند و نیم دیگر را مرغ بسازد و به مزرعه اضافه کند. سپس همان ۱۰۰۰ سیکل را بر روی مزرعه تست کند و ببیند اردکها و مرغها چند بار صدا میکنند.
نکته : دقت داشته باشید که حتما به کد کلاسها نگاه کنید، زیرا نکات بسیار مهمی را در بر دارند.
DynamicArray.h
Morgh.h
Duck.h
FarmBird.h
Farm.h
Vector2D.h
Vector2D.cpp
تمرین چهارم : هندسه کامپیوتری
با داشتن یک کلاس محاسبات هندسه کامپیوتری و تعریف یک پروتکل، میخواهیم کلاسهای Rectangle, Triangle, Circle را طوری بنویسیم که کلاس محاسبات کامپیوتری بتواند چگالی انها را محاسبه نماید. استاندارد به شرح زیر است :
class ShapeInterface { public: virtual float area()=0; //masahat virtual float pyramid()=0; //mohit virtual float getWidth()=0; virtual float getHeight()=0; virtual void setWidth(int w)=0; virtual void setHeight(int h)=0; };
دقت داشته باشید که هر سه کلاس باید از این استاندارد تبعیت کنند (ارث ببرند). همچنین کلاس محاسبات هندسی به شرح زیر است :
class Geometry { static float density(ShapeInterface *shape) { return shape->area() / shape->pyramid(); } };
بدنه برنامه نیز به شکل زیر است :
int main() { Rectangle r; r.setWidth(4); r.setHeight(5); Triangle t; t.setWidth(4); t.setHeight(5); Circle c; c.setWidth(10); c.setHeight(10); float d1=Geometry::density(&r), d2=Geometry::density(&t), d3=Geometry::density(&c); printf("%.3f\n%.3f\n%.3f\n",d1,d2,d3); return 0; }
نکته : در صورتی که احساس کردید خیلی کد تکراری مینویسید، میتوانید از وراثت (سوال قبل) و کلاس انتزاعی استفاده کنید!
تمرین پنجم : باز هم رشتهها
کلاس رشتههای تمرینات سری قبل را، با استفاده از وراثت خصوصی (به جای عضو گرفتن از DynamicArray) بنویسید. تفاوتهایی که ایجاد میشود را ذکر کنید.
نحوه ارسال
پاسخ سوالاتی که حل کردهاید در قالب قبلی به آدرس [email protected] ارسال نمایید. به هیچ وجه فایلها را فشرده نکنید وگرنه پذیرفته نخواهد شد. به ازای هر ارسال خود یک شماره Revision در Subject ایمیل خود بیافزایید. همچنین برای هر بخش تمرین که ارسال میکنید، شماره آنرا ذکر کنید، مثلا HW6.1 یا HW6.3 .
در صورتی که اسم فایلها یکسان بود، یا در چند ایمیل جداگانه (با مشخص کردن شماره سوال) بفرستید یا نام فایلها را تغییر دهید. بنابراین به هیچ وجه فایلها را فشرده نکنید در غیر اینصورت پذیرفته نخواهد شد. آخرین فرصت ارسال تمرینات این سری شنبه ۷ خرداد ساعت ۲۴ خواهد بود.
بازگشت