Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
1

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

08.04.2010, 19:42. Показов 4826. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите дописать программу. Косяк такой что если я загадал 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2010, 19:42
Ответы с готовыми решениями:

Программа угадывания числа=))
Как можно модифицировать операторы if в программе угадывание числа, чтобы был возможен ввод как...

Программа угадывания случайно выбранных координат цели
Составьте диалоговую программу угадывания случайно выбранных координат цели в квадрате: по оси х от...

Подсчет попыток угадывания числа
Доработал некоторые детали в коде. Осталось только добавить подсчет количества попыток, которые я...

Программа угадывания числа все время выдает "меньше", независимо от значения в TextBox
Как сделать, чтобы при запуске программы сразу же запускался Sub форм. Public Class Form1 ...

15
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
08.04.2010, 19:45 2
Что не так? Может нужно делить на "2.0" ?
0
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 19:54  [ТС] 3
всеравно идет округлеине и зависает на 47 а я загадал 48...
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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 я добился))
1
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 20:23  [ТС] 5
Чет я не вдуплил. расскажи на словах плз)
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
08.04.2010, 20:46 6
А что? Проблема же была в том что (chislo - lastchislo) / 2 получалось равным 0.5 что в приведении к int равняется 0. Но нам же нужно выдать другое число - поэтому делается округление и получается единица
0
10 / 10 / 2
Регистрация: 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.. а у меня такого небыло...
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
08.04.2010, 23:21 8
что программка делает?

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

Цитата Сообщение от МедведЪ Посмотреть сообщение
что программка делает?
Загадываешь в уме число, программа делает предположение, потом говоришь больше или меньше и т.к. в цикле пока программа не угадает
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
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
0
10 / 10 / 2
Регистрация: 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
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.04.2010, 15:04 12
Krist_ALL,
C++
1
round((lastchislo - chislo) / 2.0)
0
10 / 10 / 2
Регистрация: 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 а то невъехал((
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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);

Что нам и требовалось
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
09.04.2010, 17:40 15
Krist_ALL, округление для чего??...
0
10 / 10 / 2
Регистрация: 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;
}
0
09.04.2010, 19:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2010, 19:50
Помогаю со студенческими работами здесь

Программа угадывания чисел
Пожалуйста напишите программу или ее основную часть, которая выбирает число из интервала от 1 до...

Программа угадывания букв
Написать программу игры в угадывание букв. Пользователь должен угадать загаданную программой...

Программа для угадывания чисел
Помогите пожалуйста написать программу, которая «задумывает число» в диапазоне от 1 до 10 и...

Угадывания числа
Здравствуйте. Надо написать программу которая будет загадывать число от 1 до 10, а у пользователя...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru