Форум программистов, компьютерный форум CyberForum.ru

Программа угадывания числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 19:42     Программа угадывания числа #1
Помогите дописать программу. Косяк такой что если я загадал 48 то она не может спросить это число т.к. с делением траблы... Вообщем все по коду видно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
int main() {
using namespace std;
 
 
bool flag = false;
char answer ;
int chislo = 50;
int lastchislo = 100;
int temp = 0;
 
 
 
cout <<"ZAGADAYTE CHISLO OT 1 DO 100"<<endl<<
          "OTVETY: DA - y; NET - n"<<endl;
      
while(answer != 'D') {
 
    
if((lastchislo - chislo) <=3) 
cout <<"NNNN";
    
 
 
 
cout <<endl<<"chislo "<<chislo<<endl<<
             "lastchislo"<<lastchislo<<endl<<
             "tmp "<<temp<<endl;
cout <<"chislo bolshe chem "<<chislo<<" ";
cin >>answer;
 
if(answer == 'y') {     
    temp = chislo;  
        if(chislo > lastchislo) chislo += (chislo - lastchislo) / 2;  
    else  chislo += (lastchislo - chislo) / 2; 
 lastchislo = temp;
  }
else {      
    
    temp = chislo;   
    if(chislo > lastchislo) chislo -= (chislo - lastchislo) / 2;  
    else chislo -= (lastchislo - chislo) / 2;   }
    lastchislo = temp;
 
 
 
}
cout <<"END";
 
 
 
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
08.04.2010, 19:45     Программа угадывания числа #2
Что не так? Может нужно делить на "2.0" ?
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 19:54  [ТС]     Программа угадывания числа #3
всеравно идет округлеине и зависает на 47 а я загадал 48...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
08.04.2010, 20:10     Программа угадывания числа #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include "math.h"
 
double round (double x) {return x < 0 ? ceil (x - 0.5) : floor (x + 0.5);}
 
int main() {
    using namespace std;
 
    bool flag = false;
    char answer = 0;
    int chislo = 50;
    int lastchislo = 100;
    int temp = 0;
  
    cout <<"ZAGADAYTE CHISLO OT 1 DO 100"<<endl<<
              "OTVETY: DA - y; NET - n"<<endl;
 
    while(answer != 'D') {
        if((lastchislo - chislo) <=3) 
            cout <<"NNNN";
 
        cout <<endl<<"chislo "<<chislo<<endl<<
                 "lastchislo"<<lastchislo<<endl<<
                             "tmp "<<temp<<endl;
        cout <<"chislo bolshe chem "<<chislo<<" ";
        cin >>answer;
     
        if(answer == 'y') answer = 1; else answer = -1;
        temp = chislo;  
        if(chislo > lastchislo)
            chislo = chislo + answer * round((chislo - lastchislo) / 2.0) ;
        else
            chislo = chislo + answer * round((lastchislo - chislo) / 2.0); 
        lastchislo = temp;
    }
    cout <<"END";
return 0;
}
Кажется так заработало... По крайне мере 48 я добился))
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 20:23  [ТС]     Программа угадывания числа #5
Чет я не вдуплил. расскажи на словах плз)
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
08.04.2010, 20:46     Программа угадывания числа #6
А что? Проблема же была в том что (chislo - lastchislo) / 2 получалось равным 0.5 что в приведении к int равняется 0. Но нам же нужно выдать другое число - поэтому делается округление и получается единица
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 21:50  [ТС]     Программа угадывания числа #7
C++
1
2
3
4
if(chislo > lastchislo)
                        chislo = chislo + answer * round((chislo - lastchislo) / 2.0) ;
                else
                        chislo = chislo + answer * round((lastchislo - chislo) / 2.0);
Вот непойму этот кусок.

у тебя всегда chislo +=
а у меня было и chislo -=

а также answer быввет 1 и -1 видимо этим ты балансируешь...
в проге твоей есть баг.если сначала сказать что число меньше 50 а потм всегда говорить больше то она будет предлагать опять больше 50.. а у меня такого небыло...
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
08.04.2010, 23:21     Программа угадывания числа #8
что программка делает?

Добавлено через 11 секунд
точнее пытается
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
08.04.2010, 23:51     Программа угадывания числа #9
Цитата Сообщение от Krist_ALL Посмотреть сообщение
в проге твоей есть баг.если сначала сказать что число меньше 50 а потм всегда говорить больше то она будет предлагать опять больше 50.. а у меня такого небыло...
А как она должна реагировать на ложь?) Форматнуть винт?) Если текущее число 49 а пользователь говорит "больше" то деваться ей не куда. Используйте свой старый код просто оберните (chislo - lastchislo) / 2.0 в функцию round и все будет так же А answer 1 и -1 это просто для сокращения кода, не люблю когда почти одинаковый код идет, такая мания... все сокращать

Цитата Сообщение от МедведЪ Посмотреть сообщение
что программка делает?
Загадываешь в уме число, программа делает предположение, потом говоришь больше или меньше и т.к. в цикле пока программа не угадает
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
09.04.2010, 12:06     Программа угадывания числа #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int c,answer,i;
c=answer=0;
i=10;
loop:cout<<"0-20 число-";
cin>>c;
if(c>20||c<0){cout<<"неверно"<<endl; goto loop;}
while(answer!=c)
{
 
answer=rand()%20;
cout<<"программа угадала число "<<answer<<endl;
if(answer!=c){i--;cout<<"осталось попыток:"<<i<<endl;}
else{cout<<"Программа угадала "<<answer<<" и это число =<<c<<endl<<"программа победила!"<<endl;break;}
if(i=0){break;cout<<"Программа проиграла"<<endl;}
 
}
вроде без косяков...как я понял это нужно,загадываете число в дапозоне 0-20,программа с 10 раз должна загадывать число...вот,не проверял

Добавлено через 33 секунды
хотя щас попробую на работоспособность

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
srand(time(NULL));
    int c,answer,i;
c=answer=0;
i=10;
loop:cout<<"0-20 число-";
cin>>c;
if(c>20||c<0){cout<<"неверно"<<endl; goto loop;}
while(answer!=c)
{
    
answer=rand()%20;
cout<<"программа угадала число "<<answer<<endl;
if(answer!=c){
    
    i--;cout<<"осталось попыток:"<<i<<endl;
 
}
else{cout<<"Программа угадала "<<answer<<" и это число ="<<c<<endl<<"программа победила!"<<endl;break;}
 
 
}if(i==0){break;cout<<"Программа проиграла"<<endl;}
исправил,но почему то не пишет что программа проиграла при условии что попыток=0
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
09.04.2010, 14:42  [ТС]     Программа угадывания числа #11
МедведЪ, чилсо от 1 до 100


Загадал 32 а программа угадать не может...
chislo -= round((lastchislo - chislo) / 2);
33 -= round((34 - 33) / 2);
//Идет округление
round(0.5) {
return 0;
}
получается
33 -= 0
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
09.04.2010, 15:04     Программа угадывания числа #12
Krist_ALL,
C++
1
round((lastchislo - chislo) / 2.0)
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
09.04.2010, 15:07  [ТС]     Программа угадывания числа #13
C++
1
2
3
4
double round (double x) {int a =  x < 0 ? ceil (x - 0.5) : floor (x + 0.5);
                         if(a ==0) return 1;
                         else return a;
}
седал 2.0 все ок.

а расскажи теперь еще раз про -1 а то невъехал((
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
09.04.2010, 16:15     Программа угадывания числа #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(answer == 'y') {     
        temp = chislo;  
        if(chislo > lastchislo)
                chislo += round((chislo - lastchislo) / 2.0);  
        else
                chislo += round((lastchislo - chislo) / 2.0); 
        lastchislo = temp;
}
else
{          
        temp = chislo;   
        if(chislo > lastchislo)
                chislo -= round((chislo - lastchislo) / 2.0);  
        else
                chislo -= round((lastchislo - chislo) / 2.0);
        lastchislo = temp;
}
Смысл же в том чтобы отнять или прибавить к угадываемому числу разность предыдущего и текущего деленного на 2 Поэтому все это можно сократить до
chislo = chislo знак round(abs(lastchislo - chislo) / 2.0);
Если ответ answer == 'y' мы должны сделать больше => прибавить. Знак должен быть "+"
chislo = chislo + round(abs(lastchislo - chislo) / 2.0);
Если ответ не 'y' мы должны сделать меньше => отнять. Знак должен быть "-"
chislo = chislo - round(abs(lastchislo - chislo) / 2.0);

Вместо if и двух формул можно добавить переменную в формулу и сделать две в одном
chislo = chislo + answer * round(abs(lastchislo - chislo) / 2.0);
Если answer у нас +1 то формула будет
chislo = chislo + 1 * round(abs(lastchislo - chislo) / 2.0);
=> chislo = chislo + round(abs(lastchislo - chislo) / 2.0);

Если answer у нас -1 то формула будет
chislo = chislo + (-1) * round(abs(lastchislo - chislo) / 2.0);
=> chislo = chislo - round(abs(lastchislo - chislo) / 2.0);

Что нам и требовалось
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
09.04.2010, 17:40     Программа угадывания числа #15
Krist_ALL, округление для чего??...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2010, 19:50     Программа угадывания числа
Еще ссылки по теме:

Программа вычисления n -го числа, числа Пи C++
Программа которая запрашивает 2 числа и выводит на стандартное устройство вывода все числа, которые находятся между ними C++
C++ Программа которая складывает 2 числа.Числа вбиты в программу заранее. Не получается. Плохо знаю этот язык

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
09.04.2010, 19:50  [ТС]     Программа угадывания числа #16
Округление если например пердыдущее число было 7 и программе надо сгенерировать число 3

ПОлный код исправленый
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cmath>
 
 
 
double round (double x) {return  x < 0 ? ceil (x - 0.5) : floor (x + 0.5);}
 
 
int main() {
using namespace std;
 
start:cout <<"ZAGADAYTE CHISLO OT 1 DO 100\nOTVETY: DA - y; \nNET - n\nUGADANO - D\n";
bool flag = false;
char answer;
int chislo = 50;
int lastchislo = 100;
int temp = 0;
 
 
 
 
      
while(answer != 'D') {
 
     if(chislo < 1) { cout <<"ERROR!"; break; }
        
 
 
cout <<"chislo bolshe chem "<<chislo<<" ";
cin >>answer;
 
if(answer == 'y') answer = 1;
else if(answer == 'n') answer = -1;
else goto end;
 
     
        temp = chislo;  
        if(chislo > lastchislo)
                        chislo = chislo + answer * round((chislo - lastchislo) / 2.0) ;
                else
                        chislo = chislo + answer * round((lastchislo - chislo) / 2.0); 
        lastchislo = temp;
 
 
 
}
end: cout <<"IGRAEM SNOVA?";
     cin >>answer;
     if(answer == 'y') goto start;
 
return 0;
}
Yandex
Объявления
09.04.2010, 19:50     Программа угадывания числа
Ответ Создать тему
Опции темы

Текущее время: 16:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru