Final Exam (Fall 2010).pdf

‫بسمه تعالی‬
‫ﺁﺯﻣﻮﻥ ﭘﺎﻳﺎﻥﺗﺮﻡ ﻣﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎﺯﯼ‬
‫گروه ‪۷‬‬
‫دانشگاه صنعتی شریف‬
‫دانشکده مهندسی کامپیوتر‬
‫‪ ۲‬بهمن ‪۸۹‬‬
‫مدت‪ ۱۵۰ :‬دقیقه‬
‫سؤال ‪:۱‬‬
‫توابع ‪ print1‬و ‪ print2‬را در نظر بگیرید‪ .‬توضیح دهید که این دو تابع چه کاری انجام میدهند‪ .‬شباهت)ها(‬
‫و تفاوت)های( آنها را بیان کنید و آنها را برای ورودیهای یکسان مقایسه نمائید‪ ۱۵) .‬نمره(‬
‫{)‪void print1(char * s[],int c‬‬
‫;"‪cout <<"print1\n‬‬
‫)‪for(int i=0;i<c;i++‬‬
‫;‪cout << *(s+i) << endl‬‬
‫}‬
‫{)‪void print2(char * s[],int c‬‬
‫;"‪cout <<"print2\n‬‬
‫)‪for(int i=c;i>0;i--‬‬
‫;‪cout << s[c-i] << endl‬‬
‫}‬
‫سؤال ‪:۲‬‬
‫تابع ‪ reverse‬با ‪ prototype‬داده شده در زیر را بگونهای بنویسید که رشتههای ورودی را معکوس کند‪.‬‬
‫)‪ ۱۵‬نمره(‬
‫)راهنمایی‪ :‬برای این کار‪ ،‬ابتدا طول آرایه را با هر روشی که ممکن است‪ ،‬بدست آورده و سپس درایههای‬
‫ال اگر آرایه دارای ‪ ۹‬عضو باشد‪ ،‬درایهی اول با درایهی نهم‪ ،‬درایهی دوم با‬
‫موجود در آن را معکوس کنید‪ .‬مث ً‬
‫درایهی هشتم و ‪ ...‬جایگزین خواهند شد‪(.‬‬
‫{)‪void reverse(char * s‬‬
‫"‪//reverse a string in place: "one" to "end‬‬
‫}‬
‫آزمون پایانترم‬
‫صفحهی ‪ ۱‬از ‪۴‬‬
‫گروه ‪۷‬‬
‫سؤال ‪:۳‬‬
‫خروجی تابع زیر را بدست آورده و علت آن را توضیح دهید‪ ۲۰) .‬نمره(‬
‫>‪#include<iostream‬‬
‫;‪using namespace std‬‬
‫{)‪void f(int *a,int &b‬‬
‫;‪a=&b‬‬
‫; ‪return‬‬
‫}‬
‫{)‪void f2(int *a,int *b‬‬
‫;‪a=b‬‬
‫}‬
‫{)(‪int main‬‬
‫;‪int b=14‬‬
‫;‪int c=13‬‬
‫;‪int *a‬‬
‫;‪a=&c‬‬
‫;)‪f(a,b‬‬
‫;‪cout<<2*(*a)<<endl‬‬
‫;)‪f2(a,&b‬‬
‫;‪cout<<2*(*a)<<endl‬‬
‫}‬
‫سؤال ‪:۴‬‬
‫برنامهای بنویسید که یک خط از یک متن را از ورودی گرفته‪ ،‬آنرا با استفاده از تابع ‪tokenize ،strtok‬‬
‫کرده و ‪token‬ها را به صورت معکوس در خروجی چاپ کند‪ .‬فرض کنید که تعداد ‪token‬های موجود در‬
‫یک سطر حداکثر برابر ‪ ۲۰‬عدد است‪ ۲۵) .‬نمره(‬
‫راهنمایی‪ :‬به عنوان مثال میتوانید ورودی و خروجی زیر را در نظر بگیرید‪:‬‬
‫‪Input: This is my final exam for Introduction to Programming course.‬‬
‫‪Output: course.‬‬
‫‪Programming‬‬
‫‪to‬‬
‫‪Introduction‬‬
‫‪for‬‬
‫‪exam‬‬
‫‪final‬‬
‫‪my‬‬
‫‪is‬‬
‫‪This‬‬
‫آزمون پایانترم‬
‫صفحهی ‪ ۲‬از ‪۴‬‬
‫گروه ‪۷‬‬
‫سؤال ‪:۵‬‬
‫به یکی از دو سؤال زیر پاسخ دهید‪ ۲۵) .‬نمره(‬
‫‪ .۱.۵‬فرض کنید یک ‪ bag‬مجموعهای از اعداد صحیح است که اعضاء موجود در آن بصورت تصادفی حذف‬
‫میشوند‪ .‬بصورت پیش فرض‪ bag ،‬در ابتدا خالی است و سپس یک عضو میتواند به آن اضافه شود‪ .‬پس یک‬
‫‪ bag‬فقط عملیات زیر را پشتیبانی میکند‪:‬‬
‫‪void add(int item); // add an item into the bag‬‬
‫‪int remove(); // remove a random item from the bag‬‬
‫حال بر اساس توضیحات باال‪ ،‬کالسی تعریف کنید که شامل تعدادی تابع و داده برای پیادهسازی ‪ bag‬باشد‪.‬‬
‫شما باید ساختار دادهی مناسب برای نگهداری اعضای ‪ bag‬را در قسمت دادههای کالس تعریف کرده و از‬
‫پنهانسازی اطالعات برای مخفی کردن دادهها استفاده نمائید )فرض کنید تابعی به صورت )‪rand(n‬‬
‫وجود دارد که یک عدد تصادفی در بازهی ‪ 0‬تا ‪ n-1‬برمیگرداند(‪.‬‬
‫‪ .۲.۵‬در زیر یک پیادهسازی بصورت ساختیافته از یک ساختمان دادهی پیچیده به نام ‪ complex‬ارائه شده‬
‫است‪.‬‬
‫{ ‪complex‬‬
‫;‪mod,angle‬‬
‫{ )‪real(complex& c‬‬
‫;)‪c.mod*cos(c.angle‬‬
‫{ )‪imag(complex& c‬‬
‫;)‪c.mod*sin(c.angle‬‬
‫‪struct‬‬
‫‪double‬‬
‫;}‬
‫‪double‬‬
‫‪return‬‬
‫}‬
‫‪double‬‬
‫‪return‬‬
‫}‬
‫کد ساختیافتهی فوق را به تعریف کالس در ‪ C++‬تبدیل کنید‪ .‬توجه داشته باشید که نام کالس‬
‫‪ complex‬بوده و تعریف آن باید به نحوی باشد که ضمن دربرگرفتن تمامی عملیات فوق‪ ،‬قادر باشد توسط‬
‫تابع ‪ main‬زیر قابل استفاده باشد‪ .‬همچنین باید از پنهان سازی اطالعات در تعریف دادههای عضو استفاده‬
‫شود‪.‬‬
‫آزمون پایانترم‬
‫صفحهی ‪ ۳‬از ‪۴‬‬
‫گروه ‪۷‬‬
void main() {
const double PI = 3.14159256;
complex a(5.0,PI/6); // angle in radians
cout << a.real() << endl; // 4.33
cout << a.imag() << endl; // 2.5
}
.‫موفق باشید‬
‫انتظاری‬
۷ ‫گروه‬
۴ ‫ از‬۴ ‫صفحهی‬
‫آزمون پایانترم‬