دانشگاه شهید بهشتی
دانشکده مهندسی برق و کامپیوتر
ترم دوم ۹۰-۸۹

برنامه‌سازی پیشرفته

گروه درسی بر روی گوگل
تارنامه ارسال تمرینات
استاد : دکتر آزاده منصوری
برنامه‌سازی پیشرفته - دانشگاه شهید بهشتی - ترم دوم سال تحصیلی ۹۰-۸۹ | تمرینات سری دوم
آخرین به روز رسانی : ۵ اسفند ۸۹

تمرینات سری دوم


پاسخ تمرینات

اشاره‌گرها

از آنجایی که اشاره‌گرها در هر سیستم به نوعی پیاده شده‌اند، تمرینات این سری را حتما بر روی کامپایلر GCC انجام دهید. کامپایلر استاندارد لینوکس و مک و همچنین محیط DevC++ در ویندوز مناسب است.

  1. تمرین اول : تخصیص حافظه به متغیر توسط کامپایلر

    برنامه اول پیوست را بر روی سیستم خود کامپایل و اجرا نمایید.
    ابتدا مشخص کنید برنامه چه می‌کند.
    سپس بر اساس خروجی آن مشخص کنید کامپایلر بر چه اساسی حافظه به متغیرها اختصاص می دهد (متغیرهای با اندازه‌های مختلف).
    در صورت نیاز کد برنامه را تغییر دهید.

  2. تمرین دوم : اشاره‌گر به اشاره‌گر؟

    برنامه دوم پیوست را بر روی سیستم خود کامپایل و اجرا نمایید.
    ابتدا مشخص کنید برنامه چه می‌کند.
    سپس معین فرمایید که اشاره‌گر به یک اشاره‌گر، با اشاره‌گر به یک متغیر معمولی چه تفاوت‌هایی دارد؟

  3. تمرین سوم : حافظه پویا و نحوه استفاده صحیح

    برنامه سوم پیوست را بر روی سیستم خود کامپایل و اجرا نمایید.
    ابتدا مشخص کنید برنامه چه می‌کند. سپس معین کنید

    • حافظه پویا چگونه تخصیص می‌یابد؟ (معمولا)
    • حافظه پویا در چه هنگام تخصیص نمی‌یابد؟
    • روش صحیح مدیریت متغیر اشاره‌گر در استفاده از حافظه پویا، که در کد رعایت شده، چیست؟

  4. تمرین چهارم : اشاره‌گر معلق و خطای زمان اجرای حافظه

    برنامه چهارم پیوست را بر روی سیستم خود کامپایل و اجرا نمایید.
    ابتدا مشخص کنید برنامه چه می‌کند.
    سپس معین فرمایید

    • اشاره‌گر معلق به چه معناست؟
    • خطای زمان اجرای حافظه چه نام دارد؟
    • چه راه حل پیشنهادی برای جلوگیری از خطای زمان اجرای حافظه که معمولترین خطای زبان‌های دارای دسترسی مستقیم به حافظه (مثل سی پلاس پلاس) هستند، دارید؟

  5. تمرین پنجم : اتلاف حافظه و مدیریت تخلیه حافظه

    برنامه پنجم پیوست را بر روی سیستم خود کامپایل و اجرا نمایید.
    ابتدا مشخص کنید برنامه چه می‌کند.
    سپس معین فرمایید

    • حافظه زباله (Garbage) چیست و چرا به وجود می‌اید؟
    • راه حل این برنامه برای هدر ندادن حافظه چیست؟ (راهنمایی: توابع رشته‌ها در سی)
    • راه حل کلی مقابله با مسئله مهم هدر رفتن حافظه چیست؟

  6. تمرین ششم : آرایه پویا

    برنامه ششم پیوست پیوست را دریافت نمایید و توضیحات زیر را بر اساس آن مطالعه کنید.

    این سیستم قصد دارد ساختاری به نام آرایه پویا (Dynamic Array) را پیاده نماید. آرایه پویا آرایه‌ایست که هیچوقت پر نمی‌شود. برای نیل به این مقصود دو تابع برای دسترسی به آرایه وجود دارد، تابع append که یک عدد را در انتهای آرایه (اولین فضای خالی) قرار می‌دهد و تابع removeLast که آخرین عنصر پر آرایه را حذف می‌کند.

    همچنین از دو متغیر کمکی dataCount که تعداد خانه‌های استفاده شده آرایه (خانه‌های پر) را نگهداری می‌کند و متغیر dataSize که اندازه آرایه (تعداد خانه‌های حافظه) را نگهداری می‌کند بهره گرفته‌ایم.

    برای اینکه ماهیت پویایی به حافظه بدهیم، در کد تابع append شرطی قرار داده‌ایم که اگر آرایه کاملا پر شد (یعنی تعداد کل خانه‌ها و تعداد خانه‌های پر برابر شد) تابع expand فراخوانی شود، بنابراین این تابع وظیفه دارد با حفظ داده‌های موجود در حافظه اندازه آنرا دوبرابر کند. با این رفتار، هر تعداد بار هم که تابع append برای افزودن عنصری به تابع استفاده شود، هیچگاه پر نخواهد شد.

    از آنجایی که ممکن است تعدادی عنصر در آرایه اضافه کنیم ولی بعدا آنها را حذف کنیم، می‌خواهیم حافظه زیادی خالی نیز تخلیه گردد. بدین منظور در تابع removeLast که در صورتی که تعداد خانه‌های پر از نصف کل خانه‌ها کمتر شد، نیمه آخر حافظه را با حفظ داده‌های موجود آزاد سازد. تابع shrink برای اینکار فراخوانی می‌شود.

    شما باید :
    • رفتار قسمتی از کد که موجود است بر اساس توضیحات بالا مطالعه کنید و به آن مسلط شوید
    • بدنه مناسب برای دو تابع shrink و expand بنویسید. جهت راحتی شما بدنه اصلی برنامه کارکرد سیستم را تست می‌کند و اگر دو تابع را صحیح نوشته باشد صحت کار را به شما اعلان می‌کند.
    • توضیح دهید کد این دو تابع چه تفاوتی با هم دارند؟
    • مزایا و معایب آرایه پویا چیست؟

پیوست‌ها

پیوست اول
پیوست دوم
پیوست سوم
پیوست چهارم
پیوست پنجم
پیوست ششم

نکته برای سیستم‌های ۶۴ بیتی : در ابتدای چند تمرین اول دو خط برنامه قرار دارد که اندازه متغیرهای int و اندازه اشاره‌گرها را بر روی سیستم شما نمایان می‌کند. این دو عدد بر روی سیستم‌های ۳۲ بیتی معادل ۴ هستند در صورتی که هرکدام از آنها معادل ۴ نبودند برنامه‌های این سری تمرینات یا کامپایل نشده یا به درستی کار نخواهند کرد زیرا سیستم شما ۶۴ بیتیست. برای رفع این مشکل کافیست برای کامپایل به جای دستور

g++ code.cpp
از دستور
g++ code.cpp -m32
استفاده کنید. عزیزانی که از محیط Eclipse برای توسعه استفاده می‌کنند، از بخش
Project Properties -> C/C++ Build -> Settings -> Linker, Compiler -> Miscellaneous -> flags
عبارت -m32 را اضافه کنند تا هم برنامه به صورت ۳۲ بیتی کامپایل شود و هم لینک. در صورتی که مشکل رفع نشد با من تماس بگیرید.

نحوه ارسال

در این سری، تنها یک تمرین باید به صورت فایل برنامه باشد (تمرین ششم) و مابقی تمرینات به صورت توضیحات روان و خوانای فارسی با هر فرمت استاندارد. کلیه تمرینات را با قالب مشخص (که در سری قبل معین شد) برای ای‌میل [email protected] ارسال نمایید. آخرین فرصت ارسال تمرینات این سری دوشنبه ۹ اسفند خواهد بود.

بازگشت

Site Footer

Sliding Sidebar