tamrin2-2.pdf

‫به نام خدا‬
‫تمرین سری اول مبانی برنامه نویسی‬
‫زمان تحویل‪ ۱۶/۹/۸۸ :‬ساعت ‪ ۱۰‬صبح‬
‫توضیحات‪:‬‬
‫قبل از شروع موارد زير را به دقت بخوانید‪:‬‬
‫‪o‬‬
‫در خط اول هر يک از برنامهها شماره دانشجويي خود را به صورت زير بنويسید‪:‬‬
‫‪// ID: your Student ID‬‬
‫مثال‪:‬‬
‫‪//ID: 87654321‬‬
‫‪o‬‬
‫بعد از نوشتن همه برنامهها‪ ،‬فايلهای ‪ cpp.‬همه آنها را در يک پوشه با نام ‪ assignment2_stdID‬قييرار دهیييد‬
‫ل‪ assignment2_87654321 :‬و سپس اييين پوشييه را‬
‫)که در آن ‪ stdID‬شماره دانشجويي شما است‪ (.‬مث ً‬
‫فشرده کنید‪ .‬فايل فشرده شده را به آدرس ‪ [email protected]‬ارسال نمايید‪.‬‬
‫‪.‬شماره دانشجويي شما است ‪ stdID‬باشد ‪ ،‬که در آن ‪ assignment2_stdID‬عنوان ايمیل بايد به صورت ‪o‬‬
‫‪o‬‬
‫اشتباه در نامگذاري فايل برنامهها و فايل فشرده شده و يا عنوان ايمیل فرستاده شده ‪ ،‬موجب عدم تصحیح تمريين شيما‬
‫میشود‪.‬‬
‫‪o‬‬
‫نحوه ورودي گرفتن و خروجي دادن برنامههاي شما بايد دقیقًا به صورت گفته شده در مسئله باشد‪ .‬در غیر اييين صييورت‬
‫چون برنامههاي شما به صورت خودکار تصحیح میشود‪ ،‬خروجي برنامهي شما با خروجي برنامهي مصحح منطبق نخواهد‬
‫بود‪.‬‬
‫‪o‬‬
‫به هر يک از برنامههاي شما تعدادي تست داده خواهد شد‪ .‬توصيیه میشيود کيه حتميًا ييک بيار تسيتهاي نميونه را بيه‬
‫برنامههايتان بدهید‪.‬‬
‫‪o‬‬
‫استفاده از توابع در برنامهها الزامی است‪ .‬از نوشتن برنامه در تابع ‪ main‬اکید‌ًاخودداری کنید‪.‬‬
‫‪o‬‬
‫برای هر تابع توضیحاتی را در مورد چگونگی عملکرد آن در خطوط قبل از آغاز تابع بنويسید‪.‬‬
‫‪o‬‬
‫انتخاب متغیرهای با معنی الزامی و رعايت نکردن آن موجب کسر نمره خواهد شد‪.‬‬
‫‪o‬‬
‫توجه کنید که ممکن است که در تمرينهای سری بعدی از شما خواسته شود که امکانيياتی را بييه تمرينهييای اييين سييری‬
‫اضافه کنید‪ .‬بنابراين سعی کنید تمرينها را طوری پیاده سازی کنید که قابلیت استفاده مجدد داشته باشند و برای خييود‬
‫‪ document‬تهیه کنید‪.‬‬
‫‪o‬‬
‫در صورت مشاهدهی تخلف آکادمیک نمرهی تمرين ‪ -۱۰۰‬در نظر گرفته خواهد شد ‪.‬‬
‫موفق باشید‪.‬‬
‫مسئله اول‪ :‬نام فایل برنامه ‪Queue.cpp‬‬
‫داده ساختار صف را با اشارهگرها پیادهسازی کنید‪ .‬داده ساختار صف به صورت اولین عنصر ورودی‪ ،‬اولین عنصر خروجی اسييت‪ .‬توابييع زييير را‬
‫برای آن پیادهسازی کنید‪.‬‬
‫در اين برنامه شما بايد يک تابع ‪ main‬داشته باشید که در آن آراي‌های به عنوان صف با طول ‪ size‬تعريف شود‪ .‬اين تعريف بايد به صييورت‬
‫پويا انجام شود و سايز صف را از ورودی بخوانید‪.‬‬
‫هدف از اين برنامه اين است که توانايی شما برای ذخیره سازی داد‌هها در يک داده ساختار سنجیده شود‪ .‬لذا تست اين برنامه به اييين صييورت‬
‫یشود که داده ساختار شما بايد به درستی کار کند‬
‫یشود و يا از آن خوانده م ‌‬
‫‪.‬خواهد بود که داد‌ههايی برای ذخیره شدن به صف شما وارد م ‌‬
‫صف ممکن است پر باشد و بخواهیم داد‌های را به آن وارد کنیم‪ .‬در اين صورت بايد به کاربر پیغام دهید که صف پر اسييت امييا نبايييد از برنييامه‬
‫خارج شويد‪.‬‬
‫صف ممکن است خالی باشد و بخواهیم داد‌های را از آن خارج کنیم در اين صورت بايد به کاربر پیغام دهید که صف خالی اسييت امييا نبايييد از‬
‫برنامه خارج شويد‪.‬‬
‫یکند کييه پيير اسييت و‬
‫برای پیاد‌هسازی صف علوه بر آرايه بايد دو اشار‌هگر داشته باشید‪ .‬يکی به عنوان ‪ head‬که به خان‌های از آرايه اشاره م ‌‬
‫یکنييد‪ .‬د‌ر‬
‫چنانچه کاربر بخواهد به عنصری دسترسی پیدا کند ) با تابع ‪ (dequeue‬به عنصری که در اين خانه قرار دارد دسترسی پیييدا م ‌‬
‫یکند و ‪ NULL‬است‪.‬‬
‫واقع اين عنصر زودتر از ساير عناصر موجود وارد صف شده است‪ .‬در ابتدای کار اين اشار‌هگر به خان‌های از آرايه اشاره نم ‌‬
‫یتواند معیاری برای سنجش خالی بودن صف قرار بگیرد‪ .‬اما صف تنها در صورت ‪ NULL‬بودن‬
‫بديهی است که ‪ NULL‬بودن اين اشار‌هگر م ‌‬
‫یتوان اين اشار‌هگر را به آخرين خان‌هی پيير و يييا‬
‫یکند‪ .‬م ‌‬
‫اين اشار‌هگر خالی نیست‪ .‬اشار‌هگر دوم اشار‌هگر ‪ tail‬است که به انتهای صف اشاره م ‌‬
‫یرود‪ .‬برای‬
‫اولین خان‌هی خالی در انتهای آراي‌هی صف اشاره داد‪ .‬اين اشار‌هگر برای وارد کردن داده به صف )صدا زدن تابع ‪ (queue‬به کار م ‌‬
‫یتوان به اين اشار‌هگرها مراجعه کرد‪.‬‬
‫چک کردن خالی يا پر بودن صف م ‌‬
‫یشييود‪ .‬بييا هيير بييار اسييتفاده از‬
‫هر بار استفاده از تابع ‪ queue‬و يا ‪ dequeue‬موجب حرکت کردن اين اشيار‌هگرها روی آراي‌هی صييف م ‌‬
‫یشييود‪ .‬د‌ر واقييع‬
‫یشود و اين خارج شدن با حرکت دادن اشييار‌هگر روی آرايييه نشييان داده م ‌‬
‫‪ dequeue‬عنصر خوانده شده از صف خارج م ‌‬
‫ل ذخیييره شييده ولييی بييا ‪ dequeue‬از صييف خييارج شييد‌هاند( و‬
‫نها ذخیره نشييده )قب ً‬
‫ممکن است خان‌ههايی از صف باشند که داد‌های در آ ‌‬
‫یکه‬
‫نها عنصری ذخیره کرد که بعد از اشييار‌هگر ‪ tail‬باشييند در حييال ‌‬
‫یتوان در آ ‌‬
‫نها ذخیره کرد )چون خان‌ههايی م ‌‬
‫یتوان در آ ‌‬
‫عنصری هم نم ‌‬
‫ی کييه قصييد‬
‫اين خان‌هها قبل از اشار‌هگر ‪ head‬هستند( نباید در هر بار استفاده از تابع ‪ dequeue‬عناصر شیفت داده شوند‪ .‬بلکييه زمييان ‌‬
‫یرسد صف پر شد‌هاست ابتدا بايد چک کرد که آيا خان‌هی خالی در ابتدای صف وجود دارد يييا نييه؟‬
‫داريم عنصری را وارد صف کنیم و به نظر م ‌‬
‫یکنند که اشار‌هگر ‪ head‬به ابتدای آرايه برسد‪ .‬در غیر اينصييورت پیغييام پيير بييودن‬
‫اگر وجود داشت عناصر موجود به انداز‌های شیفت پیدا م ‌‬
‫یشود‪.‬‬
‫صف به کاربر داده م ‌‬
‫;)‪void queue(int *q, int size, int data‬‬
‫;)‪int dequeue(int *q, int size‬‬
Exchange.cpp ‫نام فایل برنامه‬:‌‫مسئله دوم‬
A group of students are members of a club that travels annually to different locations. Their destinations in the past have included Indianapolis, Phoenix, Nashville, Philadelphia, San Jose, and Atlanta. This spring they are planning a trip to Eindhoven. The group agrees in advance to share expenses equally, but it is not practical to share every expense as it occurs. Thus individuals in the group pay for particular things, such as meals, hotels, taxi rides, and plane tickets. After the trip, each student’s expenses are tallied and money is exchanged so that the net cost to each is the same, to within one cent. In the past, this money exchange has been tedious and time consuming. Your job is to compute, from a list of expenses, the minimum amount of money that must change hands in order to equalize (within one cent) all the students’ costs
Standard input will contain the information for several trips. Each trip consists of a line containing a positive integer n denoting the number of students on the trip. This is followed by n lines of input, each containing the amount spent by a student in dollars and cents. There are no more than 1000 students and no student spent more than $10,000.00. A single line containing 0 follows the information for the last trip.
Output
For each trip, output a line stating the total amount of money, in dollars and cents, that must be exchanged to equalize the students’ costs.
Sample Input
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
0
Sample Output
$10.00
$11.99
۶ ‫ دلر و نفر دوم‬۵.۹۹ ‫ دلر است نفر اول‬۰.۰۱ ‫ سنت يعنی‬۱ ‫یتوانند تبادل کنند‬
‌ ‫در مثال دوم با توجه به اينکه حداقل پولی که م‬
.‫ دلر مبادله شده است‬۱۱.۹۹ ‫یپردازند و در کل‬
‌ ‫دلر م‬
‫مسئله سوم‪ :‬نام فایل برنامه ‪Bucket_sort.cpp‬‬
‫مرتب کردن پیمانه ای به وسیله يک آرايه دو انديسی از اعداد صحیح شامل رديف های با انديس های ‪ 0‬تا ‪ 9‬و ستون های با انديس های ‪ 0‬تا‬
‫‪) n-1‬که ‪ n‬تعداد اعدادی است که بايد مرتب شوند( يک آرايه تک انديسی از اعداد صحیح مثبت را مرتب می کند‪ .‬به هر يک از سطرهای‬
‫اين آرايه يک پیمانه گفته میشود‪ .‬تابعی به نام ‪ bucketSort‬بنويسید که يک آرايه صحیح و اندازه آن را به عنوان آرگومان بگیييرد و بييه‬
‫صورت زير عمل کند‪:‬‬
‫•‬
‫ل عدد ‪ 97‬در رديف ‪ ،7‬عدد ‪3‬‬
‫هر يک از مقادير آرايه تک انديسی را بر اساس رقم يکان آن در رديفی از آرايه پیمانه قرار دهید ‪ .‬مث ً‬
‫در رديف ‪ 3‬و عدد ‪ 100‬در رديف ‪ 0‬قرار داده میشوند‪ .‬به اين کار »عبور توزيع« می گويند‪.‬‬
‫•‬
‫•‬
‫آرايه پیمانه را رديف به رديف بپیمايید و مقادير فوق را به ترتیب به آرايه اولیه برگردانید‪ .‬ترتیب جديد مقادير مثييال بييال در آرايييه‬
‫تک انديسی به صورت ‪ 3 ،100‬و ‪ 97‬خواهد بود‪ .‬به اين کار »عبور گردآوری« می گويند‪.‬‬
‫اين عملیات را برای ارقام بعدی)دهگان‪ ،‬صدگان‪ ،‬هزارگان و ‪ (...‬نیز تکرار کنید‪ .‬در عبور دوم‪ 100 ،‬در رديف ‪ 3 ،0‬در رديف ‪)0‬چون‬
‫‪ 3‬رقم دهگان ندارد( و ‪ 97‬در رديف ‪ 9‬قرار می گیرد‪ .‬پس از عبور گردآوری‪ ،‬ترتیب مقادير اولیه آرايه تک انديسی به صورت ‪،100‬‬
‫‪ 97 ،3‬خواهد بود‪ .‬در عبور سوم ‪ 100‬در رديف ‪ 3 ،1‬در رديف ‪ 0‬و ‪ 97‬در رديف ‪)0‬پس از ‪ (3‬قرار میگیرد و پس از عبور گردآوری‪،‬‬
‫آرايه به صورت مرتب شده خواهد بود‪).‬چون بزرگترين عدد ‪ 3‬رقمی است به ‪ 3‬بار تکرار عملیات ياز داريم‪(.‬‬
‫‪Sample Input‬‬
‫‪7‬‬
‫‪5 12 43 234 76443 234 1221‬‬
‫‪Sample Output‬‬
‫‪5 12 43 234 234 1221 76443‬‬
‫مسئله چهارم‌‪:‬نام فایل برنامه ‪BigNumber.cpp‬‬
‫ل نمیتوان اعداد صد رقمی را در آنها ذخیره کرد‪ .‬میخواهیم عملیييات‬
‫همانطور که میدانید تايپهای زبان سی پلس پلس محدوديت دارند و مث ‌ً‬
‫رياضی را برای اعداد بسیار بزرگ پیاده سازی کنیم‪ .‬اعداد حداکثر صد رقمی هستند‪.‬‬
‫توابعی برای جمع‪ ،‬تفريق‪ ،‬ضرب‪ ،‬تقسیم و توان پیاده سازی کنید‪) .‬توان عدد در محدودهی اعداد صحیح است‪(.‬‬
‫یباشد‪ .‬ورودی ممکن است شييامل‬
‫ورودی برنامه شامل يک خط از اعداد‪ ،‬عملگر و فاصل‌ههای سفید است‪ .‬حداکثر سايز ورودی ‪ ۳۰۰‬کاراکتر م ‌‬
‫یها باشييد‪ .‬اعييداد ورودی بييدون علمييت هسييتند ولييی‬
‫فاصل‌ههای سفید اضافه در ابتدا‪ ،‬میان عدد اول و عملگر‪ ،‬عملگر و عدد دوم و آخر ورود ‌‬
‫یآزمايی ورودی نیست‪ .‬بايد بييا اسييتفاده از توابييع سييی )پلس پلس( يييک خييط از ورودی‬
‫تدار باشد‪ .‬نیازی به درست ‌‬
‫ممکن است حاصل علم ‌‬
‫بخوانید و دو عدد و عملگر را از آن استخراج کنید‪ .‬بدون استفاده از اين روش ممکن است در ورودی خواندن دچار مشکل شويد‪ .‬بييرای نشييان‬
‫یکنیم و برای نشان دادن توان از ~ استفاده خواهد شد‪.‬‬
‫دادن عملگرها از همان عملگرهای رياضی آشنا استفاده م ‌‬
‫;)‪char* add(char *num1, char *num2‬‬
‫;)‪char* sub(char *num1, char *num2‬‬
char* mul(char *num1, char *num2);
char* div (char *num1, char *num2);
char* pow(char *num1, short num2);
Sample Input
9999999999
100*
+2
123456789
2~ 100
20 – 100
Sample Output
10000000001
12345678900
1267650600228229401496703205376
-80