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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
#1

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

08.11.2011, 19:26. Просмотров 3945. Ответов 5
Метки нет (Все метки)

Здравствуйте. Решаю задачку из книги Страуструпа:

"Напишите программу, угадывающую число. Пользователь должен задумать число от 1 до 100, a программа должна задавать вопросы, чтобы выяснить, какое число он задумал (например, 'Задуманное число меньше 50'). Ваша программа должна уметь идентифицировать число после не более семи попыток. Подсказка: используйте операторы < и =, a также конструкцию if-else."

Немного подвис над ней, не пойму каким боком использовать здесь операторы сравнения? Написал прогу без их использования, но с вводом ответов пользователем:

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
#include <iostream>
 
int main()
{
    int lower = 1; // нижняя граница диапазона
    int upper = 100; // верхняя граница 
    int middle; // середина
 
    char answer;
 
    while(lower != upper)
    {
        middle = (upper + lower) / 2;
        std::cout << "Задуманное число меньше " << middle << "? (y/n)";
        std::cin >> answer;
 
        if(answer == 'y')
            upper = middle;
        else
            lower = middle;
 
        std::cout << "[" << lower << " : " << upper << "]\n";
    }
 
    std::cout << "Ваше число =  " << lower << "\n";
    
    system("pause");
    return 0;
}
Работает мягко говоря через раз... например, если я загадываю число 46, то диапазон становится неизменным и равным [46 : 47], и до истины дело так и не доходит. Может условие выхода из цикла у меня неверное? Или вообще условие задачи я не так понял. Буду благодарен, если что-нибудь посоветуете.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 19:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа, угадывающая число (C++):

Дано 2-ух-значное число. Сделать так, чтоб программа преобразовала это число в новое число кол-во десятков - C++
Тоесть, для примера, мы вводим число 23, а программа выводит нам 32 (числа наоборот).

Программа задумывает число от 1 до 10, и предлагает пользователю отгадать число за 5 попыток - C++
В общем нужна помощь по C++: задали задачку на цикл For, программа должна выдавать таблицу значений функции y= (модуль x) x начинается...

Программа, которая вводит число из пяти цифр, разделяет число на отдельные цифры - C++
Напишите программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга с тремя...

Вывести N-е полупростое число (программа постоянно выводит число 4; не могу понять в чем ошибка) - C++
ПОМОГИТЕ ПОЖАЛУЙСТА НАЙТИ ОШИБКУ! #include &lt;stdio.h&gt; #include &quot;fstream&quot; #include &lt;iostream&gt; #include &lt;vector&gt; using...

Пол-ль вводит число от 50 до 100. Программа раскладывает число на сумму 4-х квадратов, всеми возможными способами - C++
Пример: 39 = 1^2+2^2+3^2+5^2. Не получается написать код для этой задачи Помогите пож разобраться

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

5
talis
793 / 545 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.11.2011, 21:38 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
 
int main()
{
    int lower = 1; // нижняя граница диапазона
    int upper = 100; // верхняя граница
    int middle; // середина
 
    char answer;
 
    while( lower < upper )
    {
        middle = (upper + lower) / 2;
 
        do
        {
            std::cout << "Is it less or equal then " << middle << "? (y/n)";
            std::cin >> answer;
        }
        while( answer != 'y' && answer != 'n' );
 
        if( answer == 'y' )
            upper = middle;
        else
            lower = middle + 1;
 
        std::cout << "[" << lower << " : " << upper << "]\n";
    }
 
    std::cout << "Your number is  " << upper << "\n";
 
 
    return 0;
}
Вот так. Это классический бинарный поиск.
4
JustAndEasy
0 / 0 / 0
Регистрация: 08.04.2017
Сообщений: 1
09.04.2017, 01:54 #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
#include "iostream"
 
using namespace std;
 
int main() {
    system("chcp 1251 > text");     // Устанавливаем ввод/вывод консоли на русский язык.
 
    int lower = 1;      // Нижняя граница диапазона чисел.
    int upper = 100;    // Нижняя граница диапазона чисел.
    int middle;         // Середина диапазона чисел.
    int trueNum = 100;  // Правильный ответ.
 
    char answer = ' ';  // Ответ пользователя.
 
    cout << "Загадайте в уме любое целое число от 1 до 100, а я узнаю его всего за 7 простых вопросов :)" << endl;
    cout << "Готовы? (y/n) ";
    cin >> answer;
    cout << endl;
 
    // Высчитываем правильное число.
    for (int i = 1; i <= 7; i++) {
 
        middle = (lower + upper) / 2;                   // Определение середины диапазона чисел.
 
        cout << "Ваше число больше " << middle << "? (y/n) ";
        cin >> answer;
 
        if (answer == 'y') {
            lower = middle;                             // Присваиваем новую нижнею границу диапазона чисел.
        } 
        else if (answer == 'n') {
            upper = middle;                             // Присваиваем новую верхнею границу диапазона чисел.
            if (middle < trueNum) trueNum = middle;     // Определяем правильное число.
        }
    }
 
    // Вывод в консоль правильного числа.
    cout << endl << "Ваше число " << trueNum << " верно? (y/n) ";
    cin >> answer;
 
    if (answer == 'y') {
        cout << endl << "Ура!!!  Я красавчик )))" << endl;
    }
    else if (answer == 'y') {
        cout << endl << "Ну нееет, как такое ВООБЩЕ возможно :(" << endl;
    }
    cout << endl << "Введите любой символ, чтобы выйти... ";
    cin >> answer;
 
    return 0;
}
Мне стало интересно, взглянуть на решения задачек из книги Страуструпа другими читателями и сравнить их со своими.
Поэтому вот мой вариант решения одной из них, может кому-то также интересно по сравнивать.

PS. Вариант решения от talis не верно угадывает число. Есть доля сомнения что это не так и я просто, что то не понял, потому-что я только начал изучать С++ и могу в чем то ошибаться, но мои числа он не отгадывает :)
0
xstf
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 6
13.04.2017, 15:53 #4
получится правильно хоть там в условии (upper + middle ) /2 дает ответ типа : double , переменная middle объявлена как int - целое, что приведет к ответу 101:2 = 50 , а не 50.5 сужение типов , что - то в этом духе в общем XD
0
MasteRX
2 / 2 / 0
Регистрация: 29.04.2014
Сообщений: 32
26.06.2017, 15:20 #5
Еще один варик с векторами
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "C:\Users\kip\Documents\Visual Studio 2012\Projects\std_lib_facilities.h"
 
using namespace std;
 
void OutputV(vector<int>);
void FindNumber(vector<int>&);
 
int main()
{
    setlocale(LC_ALL,"Russian");
 
    cout<<"___Программа для чисел от 1 до 100___\n\n"<<endl;
 
    vector<int> v;
    int numbers;
    for(int i=0;i<100;i++)
    {
        v.push_back(i+1);
    }
 
    int attempts=1;
    while(true)
    {
        FindNumber(v);
        cout<<"Attempt№ = "<<attempts++<<endl;
    }
 
    keep_window_open();
    
    system("cls");
 
    return 0;
}
 
void FindNumber(vector<int>& v)
{
    string answer;
    if((v.size()==1)||(v.size()==2))
    {
        if(v.size()==2)
        {
            cout<<"Число больше "<<v[(v.size()-1)-v.size()/2]<<"?:";
            cin>>answer;
            if(answer=="y"||answer=="Y")
            {cout<<"Это число: "<<v[1];}
            else
            {cout<<"Это число: "<<v[0];}
        }
        if(v.size()==1)
        {
            cout<<"Это число: "<<v[0];
        }
        keep_window_open();
    }
 
    if((v.size()%2==0)&&(v.size()!=2))
    {
        cout<<"Число больше "<<v[(v.size()-1)-v.size()/2]<<"?:";
        cin>>answer;
        if(answer=="y"||answer=="Y")
        {
            int num_for_findv=v[(v.size()-1)-v.size()/2+1];
            int current_number=v[0];
            while(current_number!=num_for_findv)
            {
                v.erase(v.begin());
                current_number=v[0];
            }
            //OutputV(v);
        }
        else
        {
            if(v.size()!=2)
            {
                int num_for_findv=v[(v.size()-1)-v.size()/2];
                int current_number=v[0];
                while(current_number!=num_for_findv)
                {
                    v.erase(v.end()-1);
                    current_number=v[v.size()-1];
                }
                //OutputV(v);
            }
        }
    }
    else
    {
        if(v.size()!=2)
        {
            cout<<"Число больше "<<v[v.size()/2]<<"?:";
            cin>>answer;
            if(answer=="y"||answer=="Y")
            {
                int num_for_findv=v[v.size()/2+1];
                int current_number=v[0];
                while(current_number!=num_for_findv)
                {
                    v.erase(v.begin());
                    current_number=v[0];
                }
                //OutputV(v);
            }
            else
            {
                int num_for_findv=v[v.size()/2];
                int current_number=v[0];
                while(current_number!=num_for_findv)
                {
                    v.erase(v.end()-1);
                    current_number=v[v.size()-1];
                }
                //OutputV(v);
            }
        }
    }
 
}
 
void OutputV(vector<int> vctr)
{
    cout<<"Текущее состояние вектора:"<<endl;
    for(int i=0;i<vctr.size();i++)
    {
        cout<<"v["<<i<<"] = "<<vctr[i]<<"; "<<endl;
    }
}
0
Миниатюры
Программа, угадывающая число  
Krekcer
2 / 2 / 0
Регистрация: 06.09.2014
Сообщений: 12
16.08.2017, 16:46 #6
Вот моё решение. Здесь создана рекурсивная функция для отгадывания числа. Может быть не самый лучший вариант, но почему-то рекурсия мне первой пришла в голову. Ну, и здесь зато используются if-else-if конструкция
Если за 7 вопросов число так и не отгадано, то программа возвращает промежуток, в котором лежит загаданное число

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//программа, угадывающая задуманное пользователем число
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
void guess_number(char ans, unsigned int low, unsigned int high, unsigned int middle, unsigned int count);
 
int main()
{
    cout << "Please create new number from 1 to 100."
        << "\nAnd let me guess it!";
    unsigned int middle = 100;  //для правильной работы начальное значение должно быть = 100
    unsigned int count = 0; //колличество заданных вопросов
    guess_number('Y', 1, 100, middle, count);
    system("pause");
    return 0;
}
 
void guess_number(char ans, unsigned int low, unsigned int high, unsigned int middle, unsigned int count)
{
    //1 аргумент - ответ пользователя: Y (y) или N (n),
    //2 и 3 аргументы - между какими числами находится задуманное число,
    //4 аргумер - для вычисления середины промежутка между low и high
    //5 аргумент - колличество заданных вопросов
    if (ans == 'y' || ans == 'Y')
    {
        if (count <= 7) //максимальное колличество вопросов = 7
        {
            high = middle;
            if (low == (high - 1))
                cout << "\nYour number is " << low << '\n';
            else
            {
                middle = (low + high) / 2;
                cout << "\nIs your number less than " << middle << "? ";
                count++;
                if (high > 2)
                {
                    cin >> ans;
                    guess_number(ans, low, high, middle, count);
                }
                else
                    cout << "Your number is 1!" << '\n';
            }
        }
        else
        {
            if (low == high)
                cout << "\nYour number is " << low << '\n';
            else
                cout << "\nYour number is between " << low << " and " << high << '\n';
        }
    }
    else
        if (ans == 'n' || ans == 'N')
        {
            if (count < 7)
            {
                low = middle;
                if (low == high)
                    cout << "\nYour number is " << low << '\n';
                middle = (low + high) / 2;
                cout << "\nIs your number less than " << middle << "? ";
                count++;
                if (low < 100)
                {
                    cin >> ans;
                    guess_number(ans, low, high, middle, count);
                }
                else
                    cout << "\nYour number is 100!" << '\n';
            }
            else
            {
                if (low == high)
                    cout << "\nYour number is " << low << '\n';
                else
                    cout << "\nYour number is between " << low << " and " << high << '\n';
            }
        }
        else
        {
            cout << "Please enter only Y or N: ";
            cin >> ans;
            count--;
            guess_number(ans, low, high, middle, count);
        }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2017, 16:46
Привет! Вот еще темы с ответами:

Программа на С, которая вводит число типа int с клавиатуры, преобразует ее в строку (str), выводит на дисплей число и строку. - C++
Задача направленная на усвоение следующих понятий: прототип функции; заголовок функции; тело функции; параметры, принимаемые функцией...

Ведется набор цифр и надо чтобы программа из него сама сообразило число. То есть что бы программа сама раскидывала их по разрядам. - C++
Люди добрые, только начинаю программировать, пытаюсь освоить не очень простой язык С++. Есть такая задачка... Ведется набор цифр и надо...

программа четырехзначное число - C++
Программу в C++ Дано четырехзначное число х. Нужно вывести на экран сообщение о том, сколько в этом числе одинаковых цифр и каково их...

Программа угадай число - C++
Игра «Угадай число». Программа загадывает число в диапазоне от 1 до 500 через random. Пользователь пытается его угадать. После каждой...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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