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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

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

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

Помогите дописать программу. Косяк такой что если я загадал 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2010, 19:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа угадывания числа (C++):

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

Программа угадывания случайно выбранных координат цели - C++
Составьте диалоговую программу угадывания случайно выбранных координат цели в квадрате: по оси х от 3 до 7, по оси у от -4 до 2 с пяти...

Подсчет попыток угадывания числа - C++
Доработал некоторые детали в коде. Осталось только добавить подсчет количества попыток, которые я вводил угадывая число cout &lt;&lt;...

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

Программа которая запрашивает 2 числа и выводит на стандартное устройство вывода все числа, которые находятся между ними - C++
вот мой код, только вот если вводишь 9 и 100, идёт сначала 9 и до 100, как сделать что бы сначало 10 и до 100) #include &lt;iostream&gt; ...

Напишите программа, которая вводит два целых числа и выводит на экран остаток от деления первого числа на втор - C++
1.Напишите программа, которая вводит два целых числа и выводит на экран остаток от деления первого числа на второе. Ввод 10 4 11...

15
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
08.04.2010, 19:45 #2
Что не так? Может нужно делить на "2.0" ?
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 19:54  [ТС] #3
всеравно идет округлеине и зависает на 47 а я загадал 48...
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
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
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
08.04.2010, 20:23  [ТС] #5
Чет я не вдуплил. расскажи на словах плз)
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
08.04.2010, 20:46 #6
А что? Проблема же была в том что (chislo - lastchislo) / 2 получалось равным 0.5 что в приведении к int равняется 0. Но нам же нужно выдать другое число - поэтому делается округление и получается единица
0
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.. а у меня такого небыло...
0
AnonymC
1162 / 444 / 23
Регистрация: 23.06.2009
Сообщений: 6,279
Завершенные тесты: 1
08.04.2010, 23:21 #8
что программка делает?

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

Цитата Сообщение от МедведЪ Посмотреть сообщение
что программка делает?
Загадываешь в уме число, программа делает предположение, потом говоришь больше или меньше и т.к. в цикле пока программа не угадает
0
AnonymC
1162 / 444 / 23
Регистрация: 23.06.2009
Сообщений: 6,279
Завершенные тесты: 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
0
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
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
09.04.2010, 15:04 #12
Krist_ALL,
C++
1
round((lastchislo - chislo) / 2.0)
0
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 а то невъехал((
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
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
AnonymC
1162 / 444 / 23
Регистрация: 23.06.2009
Сообщений: 6,279
Завершенные тесты: 1
09.04.2010, 17:40 #15
Krist_ALL, округление для чего??...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2010, 17:40
Привет! Вот еще темы с ответами:

Программа вычисления n -го числа, числа Пи - C++
Здравствуйте! Прочитал на хабре интересную статью про вычисление n-го знака числа Пи Ссылка на статью, к статье прилагается код на Си, но у...

Программа, печатающая числа от 1 до 4 - C++
Ps: Тема подразумевает собой не 1 вопрос а при постепенном изучении C++ - постановка нового вопроса - задачи, поетому и выбрал такое...

Программа на определение числа - C++
Добрго дня или ночи, помогите составить код программы, уже 5 день пошёл, ничего путного в голову не лезет? Последовательность т.н....

Программа перевода числа из 10 СС в 2 СС - C++
У Дейтлов есть задача: Они предлагают следующие инструкции по переводу чисел: 10 СС -&gt; 2 СС 10 СС -&gt; 8 СС


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
09.04.2010, 17:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru