View Full Version : برنامه حدس عدد با سی پلاس پلاس
majid_i68
دوشنبه 15 آبان 1391, 21:26 عصر
سلام دوستان:چشمک:
میخواهم برنامه ای بنوسیم که با 8سوال عددی بین 1تا256 راحدس بزنه؟ جواب سوالا بله یاخیره باشه..
میخواستم در الگوریتمش کمکم کنید که باید از چه روشی استفاده کنیم ..
یکی از دوستانم گفت که باید از تقسیم استفاده کنیم... اما من متوجه نشدم:لبخند:
omidshaman
دوشنبه 15 آبان 1391, 22:27 عصر
یک الگوریتم که به ذهنم رسید اینه که برای بله و خیر هر سوال یک مقدار تعیین کنی حواستم باشه در بدترین حالت مجموعشون بیشتر از 255 نشه در اخر هم باهم جمعشون بزنی!
یک الگوریتم دیگه که یکم بهتره اینه که مثلا اگر اولی بله بود 255 رو بر 4/3 تقسیم کنی اگر دومی نه بود در 5/4 مثلا ضرب کنه و برای هر بار عددای متفاوت بزاری ...
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 10:29 صبح
سلام دوستان:چشمک:
میخواهم برنامه ای بنوسیم که با 8سوال عددی بین 1تا256 راحدس بزنه؟ جواب سوالا بله یاخیره باشه..
میخواستم در الگوریتمش کمکم کنید که باید از چه روشی استفاده کنیم ..
یکی از دوستانم گفت که باید از تقسیم استفاده کنیم... اما من متوجه نشدم:لبخند:
اینکه گفتید با هشت سوال یعنی جواب فقط بعله یا خیر نیست. بعله یا خیر و بعد اینکه بزرگتره یا کوچیکتره. مثلا آیا ۱۲۷؟ نه خیر، بزرگتره.
این هم همون روش جستجوی دودویی جواب شماست. با هر سوال بازه نصف میشه و با حداکثر ۸ سوال به عدد مذکور میرسید. چرا که لگاریتم در مبنای دو عدد ۲۵۶ همون هشت میشه - مرتبه اجرایی جستجوی دودویی ;) -
hoseinnn
سه شنبه 16 آبان 1391, 11:51 صبح
سلام
اینو خیلی راحت میشه مثل جستجوی دودویی نوشت( همون کد رو کمی تغییر میدیم )
اگه عدد حدسی اشتباه بود میپرسه که آیا عدد شما بزرگتر است؟!! جوابش بله( y ) خیر ( n )
که حداکثر با 8 سوال به جواب میرسه
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main()
{
printf("Consider a number between 1 to 256");
int binarySearch(int len);
binarySearch(256);
getch();
}
int binarySearch(int len)
{
int mid, low=0, high=len-1;
char a;
while(low<=high)
{
mid=(low+high)/2;
printf("\n your number is %d ....( if is higher enter y else enter n)? ",mid);
a=getch();
while(a!='y'&&a!='n')
a=getch();
if(a=='n')
high=mid-1;
else if(a=='y')
low=mid+1;
else
return mid;
}
return -1;
}
FastCode
سه شنبه 16 آبان 1391, 14:40 عصر
هیچ جا نتیجه رو print نکردین.
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 14:56 عصر
سلام
اینو خیلی راحت میشه مثل جستجوی دودویی نوشت( همون کد رو کمی تغییر میدیم )
اگه عدد حدسی اشتباه بود میپرسه که آیا عدد شما بزرگتر است؟!! جوابش بله( y ) خیر ( n )
که حداکثر با 8 سوال به جواب میرسه
}
سوای این مساله که کدتون اشتباهه و نه تنها چاپی وجود نداره که اصلا درستی عدد رو چک نکرده (!) توجه داشته باشید که ایشون راه حل خواستن، نه تکه کد. وگرنه این میشه درخواست برنامه آماده که شما لطف کردید براشون نوشتید.
FastCode
سه شنبه 16 آبان 1391, 15:09 عصر
اگر سوال های من رو هم اینطوری جواب میدادن خیلی خوب بود.
به نظر شما OP کجاست؟
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 16:37 عصر
متوجه منظورتون نشدم. OP؟
hoseinnn
سه شنبه 16 آبان 1391, 17:45 عصر
سوای این مساله که کدتون اشتباهه و نه تنها چاپی وجود نداره که اصلا درستی عدد رو چک نکرده (!) توجه داشته باشید که ایشون راه حل خواستن، نه تکه کد. وگرنه این میشه درخواست برنامه آماده که شما لطف کردید براشون نوشتید.
راه حل که همون دودویی هست که گفته شد.... کد اشتباهه؟ اگه منظورتون اینه که خطا داره که نداره...و اگه این کد جواب این سوال نیست این هم یک نظره
درستی عدد رو چک نکرده؟!!:متفکر: این طور که من از سوال دوستمون فهمیدم درستی عدد رو ما باید چک کنیم ( کاربر!) و برنامه فقط حدس میزنه!
دستور چاپ که داره توی تابع binarySearch فایل اجرایی رو ضمیمه کردم.
majid_i68
سه شنبه 16 آبان 1391, 18:59 عصر
این برنامه عددی که کاربر حدس زده.. چاپ نمیکنه...
hoseinnn
سه شنبه 16 آبان 1391, 19:25 عصر
این برنامه عددی که کاربر حدس زده.. چاپ نمیکنه...
میتونید یه مثال بزنید..؟
مثلا من عدد 50 رو در نظر میگیرم...با 8 سوال 50 رو چاپ میکنه!
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 19:27 عصر
مثال نمیخواد. شما اون خطی رو که نتیجه رو چاپ کرده به ما نشون بدید. :)
البته منظور من کد اوله. این کد رو دانلود نکردم که ببینم. ولی اینطور که مجید خان گفتن ظاهرا همون کد اوله.
شما جستجوی دودویی رو نوشتید. اما نتیجه رو کجا چاپ کردید؟
بماند که خود جستجوی دودویی هم اشتباهه. فقط اجازه میدید کاربر n یا y بزنه. n بزنه میره یه بازه، y بزنه میره یه بازه. پس چطوری بگه جواب درسته؟! (کد اول)
hoseinnn
سه شنبه 16 آبان 1391, 19:33 عصر
دستور چاپ که مشخصه :
printf("\n your number is %d ....( if is higher enter y else enter n)? ",mid);
برنامه نمیگه جواب درسته..ما تشخیص میدیم حدسش درسته یا نه....این که اجازه میدیم کاربر y یا n بزنه به این دلیله که دوستمون گفتن جواب سوالا بله یاخیره باشه..
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 19:36 عصر
دستور چاپ که مشخصه :
printf("\n your number is %d ....( if is higher enter y else enter n)? ",mid);
خب اونجا نوشتید اگه درسته y رو بزن. طرف y رو بزنه چی میشه؟ جواب رو ول میکنه میره بازه بالا رو دوباره میگرده. ;)
کاربر تا به جواب نرسیده n میزنه. پس هی میره پایین و پایینتر.
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 19:40 عصر
کاربر باید سه تا گزینه داشته باشه. درسته، بیشتره، کمتره. بر اساس گزینه باید تصمیمگیری بشه که چاپ کنه، بره بالا یا پایین.
hoseinnn
سه شنبه 16 آبان 1391, 19:48 عصر
نه نه...تو پرانتز اینو نوشته: اگه عدد شما از چیزی که چاپ شده بزرگتره y تایپ کنید...
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 20:15 عصر
نه نه...تو پرانتز اینو نوشته: اگه عدد شما از چیزی که چاپ شده بزرگتره y تایپ کنید...
واقعا نمیدونم چطور باید توضیح بدم. منم همین رو میگم دیگه. اگه y بود میره بالا. اگه n بود میره پایین. غیر این دو تا هم که اجازه ندادید چیزی بزنه. پس این زبون بسته چطوری بگه عددی که حدس زدید درسته؟؟؟
اصلا برنامه رو اجرا کردی تا الان؟ فک کن عددی که من مد نظره 123 هستش. برام پیداش کن و چاپ کن 123 پیدا شد. یعنی وقتی 123 ظاهر شد بتونم بهش بگم آره درسته. و دیگه برنامه ادامه پیدا نکنه.
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 20:33 عصر
من باب آموزش دو دوست عزیز. وگرنه دوست ندارم کد آماده رو سایت بذارم.
البته تلاش حسین عزیز جای تقدیر داره که تلاش کرده و کد نوشته و میخواد اصلاح کنه. خیلی بهتر از اینه که کپی کنی و نفهمی چی به چیه.
void main()
{
printf("Consider a number between 1 to 256");
void Guess( int );
Guess(256);
getch();
}
void Guess(int len)
{
int mid, low = 0, high = len - 1;
char a;
while( low <= high )
{
mid = ( low + high ) / 2;
printf( "\n Your number is %d. (Y, L, H)? ", mid );
a = getch();
while( a != 'Y' && a != 'L' && a != 'H' )
{
a = getch();
}
putch(a);
if( a == 'L' )
{
high = mid - 1;
}
else if( a == 'H' )
{
low = mid + 1;
}
else // a == 'Y'
{
printf("\nI won!");
return;
}
}
printf("\nYou are not honest!");
}
hoseinnn
سه شنبه 16 آبان 1391, 22:11 عصر
حالت اول: کاربر یه عدد در نظر میگیره و برنامه حدس میزنه
حالت دوم: برنامه یه عدد در نظر میگیره( random) و کاربر حدس میزنه
امیدوارم منظور اقا مجید حالت اول بوده باشه!!
اگه عددمون 123 باشه وقتی برنامه بعد از چند سوال اینو چاپ میکنه your number is 123 اگه درست بود که هست..دیگه ادامه نمیدیم یعنی y و n تایپ نمیکنیم...برنامه رو میبندیم.
این که شد همون کد آقا مسعود،فقط شما اصرار داشتی وقتی که تابع حدسش درست بود بفهمه و با return بیاد بیرون!
خلاصه الگوریتم همین بود.....موفق باشید.
مسعود اقدسی فام
سه شنبه 16 آبان 1391, 22:30 عصر
"اگه درست بود که هست..دیگه ادامه نمیدیم یعنی y و n تایپ نمیکنیم...برنامه رو میبندیم."!
جالب بود.
مرسی. شما هم موفق باشید.
--------------------------
بعدا یادم افتاد بگم: یکی از مباحثی که در تعریف الگوریتم هم درس مبانی کامپیوتر هم طراحی الگوریتم و هم اول هر کتاب برنامهنویسی نوشته میشه، ابنه که الگوریتم پایان میپذیرد.
یعنی وقتی یه الگوریتم طراحی میکنی، یه طوری باید طراحی کنی که خودش تموم بشه، نه اینکه کاربر خودش برنامه رو ببنده که تموم شه. کدی که شما نوشتید نه تنها بر اساس جوابهای کاربر نمیتونه تشخیص بده که حدسش درست بوده یا نه (و کاربر باید خودش ببنده)، که اگه کاربر اطلاعات اشتباه بده و الکی داده وارد کنه هم نمیتونه تشخیص بده. هنگ میکنه. مثلا 9 تا y پشت سر هم وارد برنامه کنید تا متوجه منظورم بشید.
در مفاهیم پیشرفتهتر مثل هوش مصنوعی همچین الگوریتمی اصلا جایگاهی نداره. سیستمی که نه بتونه درستی حدسش رو از ارتباطش با محیط درک کنه، و نه اطلاعات اشتباه رو.
FastCode
چهارشنبه 17 آبان 1391, 01:51 صبح
متوجه منظورتون نشدم. OP؟
OP=Original Poster= ایجاد کننده تاپیک
majid_i68
چهارشنبه 17 آبان 1391, 02:36 صبح
از همه شما متشکرم..منظور من هم حالت اول: کاربر یه عدد در نظر میگیره و برنامه حدس میزنه بود..........:لبخند:
مسعود اقدسی فام
چهارشنبه 17 آبان 1391, 16:00 عصر
اگر سوال های من رو هم اینطوری جواب میدادن خیلی خوب بود.
به نظر شما OP کجاست؟
کجاست؟ شما میدونی؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.