FinalProject-C.pdf

‫دانشگاه صنعتی شریف‬
‫دانشکده مهندسی کامپیوتر‬
‫مبانی برنامهسازی‬
‫امید غیبی‬
‫پروژه دوم‪ :‬نوشتن کتابخانهی محاسباتی و ساختن یک نرمافزار محاسبهگر گرافیکی‬
‫طراح پروژه‬
‫پیمان فخاریان‬
‫‪0‬‬
‫مقدمه‬
‫توابع محاسباتی‪ ،‬آماری و ریاضیاتی در اکثر پروژههای مهندسی امروز‪ ،‬بسیار مورد استفاده قرار میگیرند‪ .‬متلب‪ 1‬به عنوانِ‬
‫ی آماده در آن‪ ،‬در چنین پروژههایی استفاده میشود‪ .‬پاشنهی‬
‫یک ابزار مهندسی قوی‪ ،‬به دلیلِ وجودِ توابعِ ریاضیات ِ‬
‫ل‪2‬‬
‫آشی ِ‬
‫متلب‪ ،‬سرعت بسیار کم آن است‪ .‬در مقابل‪ ،‬زبان برنامهنویسی ‪ C‬و ‪ C++‬به دلیل سرعت باالی آن‪ ،‬میتواند در کارهای‬
‫ی بسیار بهتری نسبت به متلب داشته باشد‪ .‬مشکل بزرگ این زبان‪ ،‬عد ِم وجود کتابخانههای مناسبِ‬
‫مهندسی‪ ،‬کارآی ِ‬
‫ریاضیاتی است‪ .‬هدف این پروژه‪ ،‬نوشتن یک کتابخانهی ریاضی‪-‬مهندسی است که بتوان آن را به یک محیط‬
‫کدزنی‪3‬‬
‫افزود‪ ،‬از آن استفاده کرد و ازین طریق‪ ،‬در راه توسعهی علم قدم برداریم و کا ِر سایر مهندسان را آسان کنیم!‬
‫هدف‬
‫ن ‪ C‬یا ‪ C++‬مینویسید که بتوان آن را به راحتی در اختیار دیگر مهندسان‬
‫شما در این پروژه‪ ،‬یک کتابخانهی استاندار ِد زبا ِ‬
‫قرار داد‪ .‬این کتابخانه‪ ،‬مجموعهای از تواب عِ ریاضیاتی‪ ،‬محاسباتی و آماری است‪ .‬همچنین در این پروژه‪ ،‬شما توانایی استفاده‬
‫از دیگر کتابخانهها و کار با رابطهای کاربریِ گرافیکی‪ 4‬را کسب میکنید‪ .‬از اهدافِ دیگر این پروژه‪ ،‬تواناییِ انجامِ یک‬
‫ی طراحی‬
‫پروژهی گروهی برای شما و آشنایی با مفاهی ِم گزارشنویسی‪ ،‬زمانبندی و مدیریت پروژه و آشنایی با روند اصل ِ‬
‫نرمافزار است‪.‬‬
‫ریز پروژه‬
‫پروژه شاملِ نوشتن یک کتابخانهی ریاضی‪ ،‬محاسباتی و آماری است‪ .‬کتابخانهی شما از چند فایلِ سرآمد‪ 5‬تشکیل میشود‬
‫ل جداگانه با فرمت ‪ .c‬یا ‪ .cpp‬نوشته میشود‪.‬‬
‫که هر فایل‪ ،‬شامل چندین تابع‪ 6‬است‪ .‬هرکدام از توابعِ شما‪ ،‬در یک فای ِ‬
‫فهرستِ این توابع در ادامه آمده است‪ .‬تمامیِ توابعِ خواسته شده‪ ،‬باید توسط خود شما نوشته شده باشد و استفاده از ک ِد‬
‫سایرین قابلِ قبول نیست؛ با این وجود‪ ،‬میتوانید از توابع نوشته شده در اینترنت کمک بگیرید‪ .‬بدیهتا استفاده ازین کدها‬
‫به صورت «بگیر و بنداز»‪ 7‬قابلِ قبول نیست و باید تسلطِ کاملی روی آنها و الگوریتمشان داشته باشید و در صورتی که در‬
‫تحویل حضوری از شما خواسته شد‪ ،‬آنها را بازنویسی کنید؛ بنابراین کدزنی‪ ،‬تنها از سویِ شخصِ شما قابل قبول است‪.‬‬
‫همچنین شما میتوانید از تمامیِ اطالعات خود از هر آنچه در زبان ‪ C‬و ‪ C++‬وجود دارد‪ ،‬استفاده کنید و در این زمینه‪،‬‬
‫محدودیتی نخواهید داشت‪.‬‬
‫‪1‬‬
‫‪MATLAB‬‬
‫ی آن‪ ،‬چشم اسفندیار!‬
‫یا معادلِ ایران ِ‬
‫‪3‬‬
‫)‪Integrated Development Environment (IDE‬‬
‫‪4‬‬
‫)‪Graphical User Interface (GUI‬‬
‫‪5‬‬
‫‪Header file‬‬
‫‪6‬‬
‫‪function‬‬
‫‪7‬‬
‫‪Copy & Paste‬‬
‫‪2‬‬
‫‪1‬‬
‫همچنین میتوانید از هر نرمافزارِ کدزنیِ دلخواهِ خود استفاده کنید؛ با این وجود استفاده از نرمافزار ‪ Dev‬عمال محکوم به‬
‫شکست است(!)؛ زیرا اکثر کتابخانههای گرافیکی بر روی آن نصب نمیشوند‪ .‬برای استفادهی بهتر از محیط گرافیکی‪،‬‬
‫ن محیط کدزنی استفاده کنید؛ هرچند که هیچ محیطی وجود ندارد که‬
‫میتوانید از ‪ Eclipse‬و یا ‪ Visual Studio‬به عنوا ِ‬
‫ی رابطهای کاربری گرافیکی با آن تطبیق داشته باشند‪.‬‬
‫تمام ِ‬
‫برای نوشتن توابع‪ ،‬به استفاده از کتابخانههای دیگری نیاز پیدا میکنید‪ .‬برای نوشتنِ توابعِ محاسباتیِ خود‪ ،‬نمیتوانید از‬
‫توابعِ آمادهی هیچ کتابخانهی دیگری‪ 8‬استفاده کنید ولی برای رسم نمودارهای خود و یا استفاده از توابعِ ساده‬
‫ریاضیاتی‪9‬‬
‫و موارد مشابه‪ ،‬میتوانید از کتابخانههای دیگر استفاده کنید‪.‬‬
‫در نهایت‪ ،‬با استفاده از کتابخانهای که نوشتهاید‪ ،‬یک نرمافزا ِر محاسبهگر میسازید! این محاسبهگر باید به صورت گرافیکی‬
‫باشد‪ .‬برای این کار میتوانید از کتابخانههای رایگان استفاده کنید‪.‬‬
‫پروژه در سه فاز اجرا میشود‪ .‬در فاز نخست‪ ،‬باید صورت پروژه را مورد تحلیلِ اولیه قرار دهید‪ ،‬درک کلی از صورت پروژه‬
‫پیدا کنید‪ ،‬سواالتی که برایتان پیش میآید و پاسخهای احتمالی آنها را بنویسید و ورودیها و خروجیهای خود را آماده‬
‫کنید‪ .‬همچنین در این فاز باید تمامی سندهای الزم را ایجاد کنید‪ .‬فهرست این موارد در ادامه آمده است‪.‬‬
‫در فاز دوم‪ ،‬اسکلتِ توابع نوشته میشود‪ .‬منظور از اسکلت توابع‪ ،‬نام و ورودیها و خروجیهای توابع و ارتباط بین آنهاست؛‬
‫ی سرآمدها‪ ،‬توابع و واحد گرافیکی در این بخش صورت میگیرد‪.‬‬
‫بنابراین تحلیل درست صورت پروژه و طراحیِ کل ِ‬
‫ی توابعِ این فاز‪ ،‬باید بر اساسِ‬
‫فاز سوم‪ ،‬پیادهسازیِ پروژه‪ ،‬نوشتن کتابخانهها و ایجادِ واحد محاسبهگرِ گرافیکی است‪ .‬تمام ِ‬
‫طراحیِ فاز قبلی باشد‪.‬‬
‫فهرست توابع‬
‫‪ -1‬توابع ریاضیاتی‬
‫‪ ‬توابع مثلثاتی و معکوس آن (به عنوان مثال‪ sin(x) ،‬و )‪)arcsine(x‬‬
‫‪ ‬توابع نمایی و لگاریتمی‬
‫‪ ‬توابع چندجملهای با توانهای گویا‬
‫‪ ‬محاسبه ب‪.‬م‪.‬م‪ ،‬ک‪.‬م‪.‬م و محاسبات مبنایی اعداد (مبنای ‪ 16‬نیز پیادهسازی شود)‬
‫‪ ‬محاسبه اعداد اول کوچکتر از مقداری معین‬
‫‪ ‬تابع تولید عوامل اولِ یک عدد‬
‫به عنوان مثال ‪gsl‬‬
‫به عنوان مثال ‪math.h‬‬
‫‪2‬‬
‫‪8‬‬
‫‪9‬‬
‫توابع باال و ترکیبِ آنها میتواند به عنوان توابع ریاضیاتی مطرح شود‪ .‬محاسبه مقدار این توابع و بهکارگیری آنها در‬
‫توابع بعدی (محا سباتی و آماری) بر عهده شماست‪ .‬به عنوان نمونه‪ ،‬تابعی مانند‬
‫‪1‬‬
‫)))‪ln(𝑠𝑖𝑛(𝑐𝑜𝑠(√𝑥+𝑥^2‬‬
‫توسط‬
‫کتابخانههای شما پشتیبانی میشود! برای این کار میتوانید از ‪ cmath‬کمک بگیرید‪.‬‬
‫‪ -2‬توابع محاسباتی‬
‫‪-‬‬
‫‪10‬‬
‫انتگرال‪ 11‬معین‬
‫‪ ‬در روش‬
‫‪ ‬روش‬
‫سیمپسون‪13‬‬
‫‪-‬‬
‫مشتق‪14‬‬
‫‪-‬‬
‫یافتن ریشهها‬
‫‪ ‬روش‬
‫ذوزنقه‪12‬‬
‫نیوتن‪-‬رافسون‪15‬‬
‫‪ ‬روش تقسیم به‬
‫‪-‬‬
‫‪-‬‬
‫درونیابی‪ 17‬و‬
‫نصف‪16‬‬
‫برونیابی‪18‬‬
‫‪ ‬روش‬
‫نیوتون‪19‬‬
‫‪ ‬روش‬
‫الگرانژ‪20‬‬
‫برازش منحنی‪ 21‬به توابع معروف‬
‫فهرستی ازین توابع در فایلهای پیوست وجود دارد‪ .‬از پیادهسازی توابع دیگر نیز استقبال میشود‪.‬‬
‫‪-‬‬
‫روشهای کنترل نقطهای ‪ Spline ،Bezier‬و ‪B-Spline‬‬
‫این سه مورد در طراحیِ هواپیما بیشترین کاربرد را دارد!‬
‫‪-‬‬
‫محاسبه جمع‪ ،‬ضرب و عملیاتهای ریاضی دیگر روی یک یا چند ماتریس‬
‫‪-‬‬
‫یافتن دترمینان ماتریس‬
‫‪10‬‬
‫‪Numerical methods‬‬
‫‪Integration‬‬
‫‪12‬‬
‫‪Trapezoidal method‬‬
‫‪13‬‬
‫‪Simpson 1/3 or 3/8 method‬‬
‫‪14‬‬
‫‪Differentiation‬‬
‫‪15‬‬
‫‪Newton-Raphson method‬‬
‫‪16‬‬
‫‪Bisection method‬‬
‫‪17‬‬
‫‪Interpolation‬‬
‫‪18‬‬
‫‪Extrapolation‬‬
‫‪19‬‬
‫‪Newton Backward/Forward‬‬
‫‪20‬‬
‫‪Lagrange‬‬
‫‪21‬‬
‫‪Curve fitting‬‬
‫‪11‬‬
‫‪3‬‬
‫‪-‬‬
‫حل چند معادله‪ ،‬چند مجهول خطی‬
‫‪ ‬روش‬
‫کرامر‪22‬‬
‫‪ ‬روش‬
‫گاوس‪23‬‬
‫‪-‬‬
‫حل چند معادله‪ ،‬چند مجهول غیر خطی‬
‫‪-‬‬
‫محاسبات برداری (ضرب داخلی‪ ،‬خارجی و ‪)...‬‬
‫‪-‬‬
‫محاسبات حجم ‪ n‬بعدی‬
‫برای این مورد‪ ،‬میتوانید به کتاب ریاضی‪ 2‬مراجعه کنید!‬
‫‪-‬‬
‫یافتن معادلهی مشخصه‪ ،‬بردار ویژه و مقادیر ویژه‬
‫‬‫کلیه محاسبات باید با دقتِ دلخواهِ کاربر (حداکثر در یک متغیر ‪ )double‬انجام شود‪ .‬به عنوان مثال‪ ،‬چنانچه بخواهیم‬
‫))‪ log(sin(x‬را با دقت دو رقم اعشار انجام دهیم‪ ،‬باید )‪ sin(x‬را با دو رقم اعشار دقت انجام دهیم و سپس خروجی ِ با‬
‫دقت دو رقم اعشا ِر آن را به )‪ log(y‬بدهیم تا یک خروجی با دقت دو رقم اعشار تولید کند‪.‬‬
‫برای هرکدام از موارد باال‪ ،‬در صورت نیاز منحنی مربوط به آن را رسم کنید‪ .‬برای رسم منحنی‪ ،‬نمودار و هیستوگرام‬
‫میتوانید از کتابخانههایی مانن ِد ‪ wxmathplot ،plplot ،gnuplot‬و دیگر کتابخانههای مشابه استفاده کنید‪.‬‬
‫‪ -3‬توابع آماری و احتمالی‬
‫‪-‬‬
‫تولید اعداد تصادفی در بازههای مختلف‬
‫‪-‬‬
‫توزیع‬
‫برنولی‪24‬‬
‫‪-‬‬
‫توزیع‬
‫نرمال‪25‬‬
‫‪-‬‬
‫محاسبات میانگین‪ ،‬واریانس‪ ،‬مُد و توابعِ احتمالی و آماری مشابه‬
‫مشخصا یکی از اهدافِ توابع آماری‪ ،‬تولید نمونههای تصادفی‪ 26‬از توزیعها و تعدادِ مختلف‪ ،‬رسم نمودار و تحلیل‬
‫آنهاست؛ بنابراین رسمِ نمودارهای مختلف برای تمامی این توزیعها برعهده شماست‪ .‬برای رسم نمودار میتوانید‬
‫از کتابخانههای آماده استفاده کنید که تعدادی از آنها در باال نام برده شد‪.‬‬
‫‪22‬‬
‫‪Cramer‬‬
‫‪Gaussian Elimination‬‬
‫‪24‬‬
‫‪Bernoulli distribution‬‬
‫‪25‬‬
‫‪Normal distribution‬‬
‫‪26‬‬
‫‪Random‬‬
‫‪23‬‬
‫‪4‬‬
‫نرمافزار محاسبهگر‬
‫حال با استفاده از کتابخانهای که ساختهاید‪ ،‬یک نرمافزار محاسبهگر مینویسید‪ .‬در عمل‪ ،‬نرمافزار محاسبهگ ِر شما شبی ِه‬
‫یک ماشین حسابِ پیشرفته خواهد شد! برای این نرمافزار‪ ،‬وجو ِد یک محیط گرافیکی الزم است که برای ایجاد آن‪ ،‬میتوانید‬
‫از کتابخانههایی مانندِ ‪ wxwidgets ،GTKmm ،GTK ،QT‬و دیگر کتابخانههای مشابه استفاده کنید‪ .‬نمونهی یک محیط‬
‫گرافیکی (البته در زبان متلب!) در شکل زیر آمده است‪.‬‬
‫با توجه به اینکه آشنایی با کتابخانههای گرافیکی‪ ،‬نصب آنها و یادگیری طرز کار آنها فرآیندی نسبتا پیچیده است(!)‪،‬‬
‫بهتر است از اکنون به دنبال یادگیری آن باشید‪.‬‬
‫فاز اول‬
‫فاز اول‪ ،‬تشکیل تیم پروژه و آشنایی با صورت پروژه و درک خواستههای آن است‪ .‬مواردی که در این فاز باید اجرا کنید‪،‬‬
‫به شرح زیر است‪.‬‬
‫‪5‬‬
‫‪ -1‬تشکیل تیم پروژه‬
‫ی دیگر وجود ندارد‪ .‬بهتر است که در‬
‫تیم پروژه‪ ،‬گروههای سه نفره هستند و امکان وجودِ گروههای با تعداد اعضا ِ‬
‫انتخابِ اعضای تیم و انتخاب سرگروه دقت کنید! امکان تعویض گروه پس از تشکیل تیم پروژه وجود ندارد‪.‬‬
‫‪ -2‬نوشتن یک گزارش درباره تیم پروژه‪ ،‬هدفِ تیم و صورت پروژه‪ ،‬سواالت پیشآمده و پاسخهای آنها‪ ،‬درک صورت‬
‫پروژه و رفع ابهامات‪ ،‬انتخاب محیطهای کدزنی و گرافیکی و موارد مشابه‪ .‬همچنین در این فاز‪ ،‬تقسیمبندی‬
‫وظایف هر عضو گروه باید مشخص شود‪.‬‬
‫این گزارش به عنوان قرارداد بینِ کارفرما (ما!) و شما است! تعداد صفحات آن بین ‪ 5-3‬صفحه باشد و نکات‬
‫نگارشی و گزارشنویسی در آن رعایت شده باشد‪.‬‬
‫ک آن با‬
‫ن یک ‪ Spread sheet‬در گوگل درایو از سوی سرگروه‪ ،‬استفاده از آن به عنوان تقویمِ گروه و اشترا ِ‬
‫‪ -3‬ساخت ِ‬
‫اعضای گروه و جیمیل ‪peyman.f.peyman‬‬
‫نام فایل خود را مجموعهی نامِ خانوادگیِ اعضای گروه بگذارید (به عنوان مثال‪ :‬خاتمی‪ -‬احمدینژاد‪ -‬روحانی)‪.‬‬
‫ی اعضای گروه و اشتراک آن با جیمیل ‪peyman.f.peyman‬‬
‫‪ -4‬ساختن یک سند‪ 27‬در گوگل درایو از سوی تمام ِ‬
‫در این سند‪ ،‬در صورت نیاز گزارشهای خود را مینویسید‪ .‬نام این سند را شماره دانشجویی خود بگذارید‪.‬‬
‫‪ -5‬تشکیل یک حساب‪ 28‬کاربری در ‪ codeanywhere‬از سوی تمامیِ اعضای گروه و اشتراکِ آن با دیگر اعضا و‬
‫جیمیل ‪maloosjaan‬‬
‫ش آن را در تقویم گوگل درایو‬
‫کدهایی که به مرور مینویسید‪ ،‬در این سایت قرار می دهید و عالوه بر آن‪ ،‬گزار ِ‬
‫(شماره ‪ )3‬ثبت میکنید‪.‬‬
‫ی پنج مورد باال تا ساعت ‪ 23:59‬یازدهم خرداد باید صورت گرفته باشد‪.‬‬
‫ی فاز اول‪ ،‬یازده ِم خرداد است و تمام ِ‬
‫مهلت خروج ِ‬
‫گزارش خود را در قالبِ یک فایلِ ‪ PDF‬در جاج ثبت کنید‪ .‬نیازی به ثبت گزارش از سویِ تمامیِ اعضای گروه نیست؛ کافی‬
‫است که یکی از اعضای تیم این کار را انجام داده باشد‪.‬‬
‫فاز دوم‬
‫در این فاز‪ ،‬طراحی سرآمدها‪ ،‬توابع و نوشتن اسکلتِ آنها انجام میشود‪ .‬پیادهسازی شما در فاز بعدی باید بر اساسِ طراحی‬
‫ل نامِ توابع‪ ،‬ورودیها و خروجیهای آنها‪ ،‬کامنتگذاری آنها و موارد مشابه است‪ .‬نمونهای از‬
‫شما باشد‪ .‬اسکلت توابع شام ِ‬
‫اسکلت یک کتابخانه پیوست شده است‪.‬‬
‫مهلتِ خروجیِ فاز دوم‪ ،‬نهم تیر است‪ .‬تمامیِ فایلهای خود را (سرآمدها و توابع) در یک فایل زیپ قرار داده و تا ساعت‬
‫‪ 23:59‬نهم تیر در جاج ثبت کنید‪ .‬کا فی است که این کار توسط یکی از اعضای گروه انجام شود‪ .‬همچنین در صورتی که‬
‫‪Doc‬‬
‫‪Account‬‬
‫‪6‬‬
‫‪27‬‬
‫‪28‬‬
‫در این فاز می خواهید قراردادِ خود را تغییر دهید (همان گزارشِ فاز اول!)‪ ،‬گزارش خود را بازنویسی کنید و همراه با سای ِر‬
‫فایلها در جاج ثبت کنید‪.‬‬
‫فاز سوم‬
‫فاز سوم‪ ،‬پیادهسازیِ کامل پروژه بر اساسِ طراحیِ فاز قبلی است‪ .‬در انتهای این فاز‪ ،‬کتابخانه و نرمافزار گرافیکی شما باید‬
‫آماده باشد‪ .‬تمامیِ فایل های خود را در قالبِ یک فایل زیپ آماده کنید و تا تاریخ معین در جاج ثبت کنید‪ .‬تحویل حضوری‬
‫احتماال در تاریخ ‪ 17-16‬تیرماه خواهد بود و قبل از تحویل حضوری‪ ،‬باید فایل خود را در جاج ثبت کرده باشید‪ .‬همچنین‬
‫در این فاز‪ ،‬یک گزارش نهایی سه صفحهای از مشکالتِ خود در طول اجرای پروژه بنویسید‪.‬‬
‫سخن آخر‬
‫پروژهی طرح شده‪ ،‬به حجم وسیعی از جستوجو نیاز دارد! برای این کار میتوانید از گوگل استفاده کنید! احتماال با بعضی‬
‫از الگوریتمهای گفته شده تاکنون روبرو نشدهاید‪ .‬برای آشنایی با آنها میتوانید از اسالیدها و کتاب پیوست شده و همچنین‬
‫گوگل استفاده کنید‪ .‬همچنین در کار با کتابخانه های دیگر و مخصوصا کار با محیط گرافیکی و نصب آن‪ ،‬با مشکالت‬
‫زیادی روبرو میشوید‪ .‬تمامیِ این مراحل به عهده شماست! می توانید از دانشجویان دانشکده کامپیوتر کمک بگیرید؛ هرچند‬
‫که بهترین راه‪ ،‬جستوجو در اینترنت است‪ .‬در طراحی کتابخانهی خود‪ ،‬به هیچ عنوان از گوگل کمک نگیرید! طراحی‬
‫نرم افزار‪ ،‬بخشی است که کامال باید بر خودتان متکی باشید و آن را بدون کمکِ بیرونی انجام دهید؛ هرچند که در یافتن‬
‫الگوریتمها‪ ،‬کدها و ‪ ...‬میتوانید از اینترنت کمک بگیرید!‬
‫تمامی تاریخهای تحویل فازها به صورت نهایی‪ 29‬است و با بسته شدن جاج‪ ،‬امکان بارگذاری با تاخیرِ آن وجود ندارد‪.‬‬
‫گزارشنویسی در فایلهای گوگل درایو‪ codeanywhere ،‬و ثبت در تقویم روزانه باید انجام شود‪ .‬تمامیِ این موارد با یکدیگر‬
‫تطبیق داده میشود؛ بنابراین فکر کنید که با یک پروژه ی واقعی روبرو هستید و ما به عنوان کارفرما و مدیرِ کل پروژه دائما‪،‬‬
‫کار شما را بررسی میکنیم‪.‬‬
‫سواالت خود را در گروه درس مطرح کنید‪.‬‬
‫موفق باشید‬
‫‪Hard deadline‬‬
‫‪7‬‬
‫‪29‬‬