بازی معکوس کردن اعداد (number reversal) در ++C
سلام خدمت همه ی دوستان و علاقه مندان zero to hero
در این مقاله قصد داریم یکی از مسائل ساده ی برنامه نویسی، به نام بازی معکوس کردن اعداد را حل کنیم. در ابتدای این بازی یک جایگشت نامرتب ازاعداد ۱ تا ۹ به شما داده می شود. شما در هر مرحله می توانید یک عدد از ۲ تا ۹ انتخاب کنید. فرض کنید این عدد n باشد. طبق قوانین بازی n عدد اول (از سمت چپ) دنباله، به ترتیب معکوس سر جای خود قرار می گیرند. هدف مرتب کردن اعداد با کمترین تعداد جا به جایی است.
برای مثال فرض کنید دنباله اولیه به صورت <6 ،۵ ،۳ ،۸ ،۹ ،۴ ،۷ ،۱ ،۲> باشد. بنابراین با انتخاب دنباله اعداد ۶، ۳، ۷، ۶، ۹ و ۶، طبق تصویر زیر می توانید به دنباله مرتب صعودی برسید.
حال می خواهیم برنامه ای برای حل این مساله بنویسیم. فرض کنید از تابع shuffle_list برای وارد کردن اعداد تصادفی در دنباله استفاده می کنیم. (نحوه ی تولید اعداد تصادفی در آینده مورد بررسی قرار می گیرد.)
با استفاده از دستور:
int list[9] = {1,2,3,4,5,6,7,8,9};
آرایه ی دنباله را تعریف می کنیم. سپس با استفاده از دستور:
do { shuffle_list(list,9); } while(check_array(list, 9));
دنباله ی تصادفی اولیه را ایجاد می کنیم. سپس با استفاده از تابع check_array ترتیب دنباله اعداد را بررسی می کنیم. این تابع را می توان به این صورت نوشت:
check_array(int[] list, int n){ int flag = 1; for(int i = 0;i<9;i++) if(list[i] != i + 1) flag = 0; return flag; }
در ادامه از متغیر tries برای شمردن مراحل، از متغیر i برای شمارنده حلقه و از متغیر input برای دریافت ورودی از کاربر استفاده می کنیم.
int tries=0; unsigned int i; int input;
برای اجرای مراحل بازی از یک حلقه ی تکرار نامعین استفاده می کنیم. ابتدا وضعیت دنباله اعداد در این مرحله را نمایش می دهیم. سپس عدد مورد نظر را از کاربر دریافت می کنیم. و تا زمانی که کاربر عددی بین ۲ تا ۹ وارد کند این کار را تکرار می کنیم. سپس یک واحد به تعداد مراحل (متغیر tries) اضافه می کنیم و با استفاده از تابع do_flip اعداد دنباله را معکوس می کنیم. در انتها و بعد از حلقه ی while (پایان بازی) پیام برنده شدن بازیکن را چاپ می کنیم.
while(!check_array(list, 9)) { cout << "Round " << tries << ((tries<10) ? " : " : " : "); for(i=0;i<9;i++)cout << list[i] << " "; cout << "Enter that number:"; while(1) { cin >> input; if(input>1&&input<10) break; cout << "\nPlease enter a number between 2 and 9:"; } tries++; do_flip(list, 9, input); } cout << "Hurray! You solved it in " << tries << " moves!\n";
و در انتها می توانیم تابع do_flip را به این صورت بنویسیم:
void do_flip(int[] list,int n, int input){ int temp; for(int i = 0;i<(input+1)/2;i++){ temp = list[i]; list[i] = list[input - i]; list[input - i] = temp; } }
منتظر مثال های کاربردی تر از ++C در مقاله های بعدی باشید.
قهرمان دنیای خودت باش.
مطالب زیر را حتما مطالعه کنید
حسگرها و فناوریهای پوشیدنی و کاربردهای آنها در پزشکی
آشنایی با نمودار رابطهای (ER)
درخت دودویی
ساختمان داده درخت
مدار منطقی – گیت های منطقی
مدار منطقی-جبر بول
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام
دو نکته در مورد این برنامه میخواستم بگم که فکر کنم نیاز به تغییر داره
اولن:
تو تعریف تابع check_array نوع داده قرار نگرفته. (باید int باشه)
دومن:
تو تابع do_flip چون (i=0) هست تو جابجایی آرایه دستور خط پنج (list[i] = list[input – i]) درست اجرا نمیشه
موقع وارد کردن input یک عدد بیشتر برنامه جا به جا میکنه
خیلی برنامه جالبی بود
حتمن سایتتون رو دنبال میکنم
c++ رو حتمن ادامه بدید تو سایت ♥
سلام. با تشکر از همراهی شما با مجموعه صفر تا قهرمان. هر دو مورد بررسی شد و هیچ مشکلی در برنامه نوشته شده وجود ندارد.