Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.67
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
#1

Игра "Угадай число" - C++

29.04.2011, 23:40. Просмотров 4501. Ответов 31
Метки нет (Все метки)

Помогите написать программу!!!Вот задание: Игра «Угадай число»: составьте программу определения компьютером задуманного человеком числа от 1 до 1000 с помощью 10 вопросов. Ответы человека – да, нет.
http://www.cyberforum.ru/cpp-beginners/thread696779.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2011, 23:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Игра "Угадай число" (C++):

Игра "Угадай число"
#include <iostream> #include <ctime> using namespace std; int main(){...

Игра "Угадай число"
Написал программу угадывания числа. Программа работает, но есть проблема...

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

Игра "Угадай число"
#include <iostream> #include <cstdlib> #include <ctime> using namespace std;...

Игра "Угадай число"
Ребят крч сегодня начал учить c++, задача была сделать игру "Угадай число" с...

31
neske
1526 / 893 / 191
Регистрация: 26.03.2010
Сообщений: 3,073
29.04.2011, 23:49 #2
Двоичный поиск в помощь.
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
29.04.2011, 23:59  [ТС] #3
Цитата Сообщение от neske Посмотреть сообщение
Двоичный поиск в помощь.
Если можно, поподробнее и попонятнее??!!!

Добавлено через 6 минут
И еще забыл написать, что текст программы нужен для borland c++ 3.1
0
HeM01
36 / 24 / 3
Регистрация: 05.01.2010
Сообщений: 37
30.04.2011, 00:04 #4
0 шаг: число принадлежит интервалу [1, 1000], выбираем среднее - 500
1 шаг: спрашиваем: "число равно?", "число больше?".
2 шаг: если число равно, то все
3 шаг: если число больше, берем интервал [501, 1000] и среднее на нем, иначе берем интервал [1, 499], идем на шаг 1.

Примерно так построен бинарный поиск.
P.S. решение, кстати, может быть достигнуто меньше, чем за 10 шагов.
1
neske
1526 / 893 / 191
Регистрация: 26.03.2010
Сообщений: 3,073
30.04.2011, 00:16 #5
HeM01, ну 10 шагов - это худший случай) можно и за первый шаг угадать)
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.04.2011, 11:37  [ТС] #6
Цитата Сообщение от HeM01 Посмотреть сообщение
0 шаг: число принадлежит интервалу [1, 1000], выбираем среднее - 500
1 шаг: спрашиваем: "число равно?", "число больше?".
2 шаг: если число равно, то все
3 шаг: если число больше, берем интервал [501, 1000] и среднее на нем, иначе берем интервал [1, 499], идем на шаг 1.

Примерно так построен бинарный поиск.
P.S. решение, кстати, может быть достигнуто меньше, чем за 10 шагов.
Этот способ решения уже пробовал, сразу возникают проблемы: как задать числа от 1 до 1000 и как отсеивать только нужный интервал чисел после каждого вопроса??
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
30.04.2011, 11:46 #7
Pravdin, вас же уже натолкнули на мысль... Не уж то так сложно поискать материал самостоятельно?
Вот: http://ru.wikipedia.org/wiki/Двоичный_поиск
0
Nursik77
273 / 233 / 30
Регистрация: 05.04.2011
Сообщений: 645
30.04.2011, 11:49 #8
0 шаг:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define n 1
int main()
{
int a[n];
int i;
clrscr();
randomize();
printf("Randomnoe chislo v intervale ot 1 do 1000: \n");
for(i=0;i<n;i++)
 {a[i]=random(1000);
  printf(" %i",a[i]);
 }
0
neske
1526 / 893 / 191
Регистрация: 26.03.2010
Сообщений: 3,073
30.04.2011, 13:27 #9
Nursik77, а где логика в создании массива под один элемент?)
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.04.2011, 15:24  [ТС] #10
Как массивом задать числа от 1 до 1000???
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
30.04.2011, 15:42 #11
Pravdin, А смысл?
Для этой задачи хватит и двух переменных - нижняя граница и верхняя граница. Изначально нижняя граница = 1. Верхняя граница = 1000.
Очередной вопрос: задуманное число меньше (нижняя граница + верхняя граница)/2 ?
Если ответ да, то верхняя граница становится равной (нижняя граница + верхняя граница)/2. Если ответ нет, то нижняя граница становится равной (нижняя граница + верхняя граница)/2-1.
Главное во время остановится....
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.04.2011, 16:00  [ТС] #12
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Pravdin, А смысл?
Для этой задачи хватит и двух переменных - нижняя граница и верхняя граница. Изначально нижняя граница = 1. Верхняя граница = 1000.
Очередной вопрос: задуманное число меньше (нижняя граница + верхняя граница)/2 ?
Если ответ да, то верхняя граница становится равной (нижняя граница + верхняя граница)/2. Если ответ нет, то нижняя граница становится равной (нижняя граница + верхняя граница)/2-1.
Главное во время остановится....
Смысл в том что двоичный поиск ищит x элемент в массиве a[n], отсортированного в возрастающем порядке
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
30.04.2011, 16:04 #13
Цитата Сообщение от Pravdin Посмотреть сообщение
Вот задание: Игра «Угадай число»: составьте программу определения компьютером задуманного человеком числа от 1 до 1000 с помощью 10 вопросов. Ответы человека – да, нет.
Цитата Сообщение от Pravdin Посмотреть сообщение
Смысл в том что двоичный поиск ищит x элемент в массиве a[n], отсортированного в возрастающем порядке
А, ну тогда ладно!))))
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
30.04.2011, 16:09 #14
Pravdin, смысл в том, что если забить массив элементами от 1 до 1000 по возрастанию и делить этот массив на два, и если то же проделывать с числом 1000 - будет получаться одно и то же.
0
prazuber
110 / 110 / 13
Регистрация: 29.04.2010
Сообщений: 240
30.04.2011, 16:13 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int left = 1, right = 1000;
    while (right - left)
    {
        int middle = left + (right-left)/2;
        cout<<"Number > "<<middle<<" ?"<<endl;
        string ans; cin>>ans;
        if (ans == "yes")
            left = middle + 1;
        else
            if (ans == "no")
                right = middle;
    }
    cout<<"Your number is "<<left<<"!"<<endl;
    return 0;
}
Вроде больше 10 вопросов не получается.
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.04.2011, 16:20  [ТС] #16
Цитата Сообщение от PraZuBeR Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int left = 1, right = 1000;
    while (right - left)
    {
        int middle = left + (right-left)/2;
        cout<<"Number > "<<middle<<" ?"<<endl;
        string ans; cin>>ans;
        if (ans == "yes")
            left = middle + 1;
        else
            if (ans == "no")
                right = middle;
    }
    cout<<"Your number is "<<left<<"!"<<endl;
    return 0;
}
Вроде больше 10 вопросов не получается.
В ВС31 не хочет работать!что 3 строчка значит??
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
30.04.2011, 16:28 #17
Pravdin, снесите её, а расширения у хидеров поставьте .h
0
Pravdin
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.04.2011, 16:29  [ТС] #18
Цитата Сообщение от Pravdin Посмотреть сообщение
string ans
Он не понимает эту строчку!!((
0
SK01736
3 / 3 / 2
Регистрация: 21.01.2011
Сообщений: 29
30.04.2011, 16:34 #19
программа хр***вая, например загадал число 25, оно его не проверяло и под конец сказало что мое число это 1...
0
prZzZ
Программист
112 / 92 / 8
Регистрация: 22.03.2011
Сообщений: 236
30.04.2011, 17:01 #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main()
{
    char buf[10];    
    int left = 1, right = 1000;
    while (right - left)
    {
        int middle = left + (right-left)/2;
        printf("Number > %d ?", middle);
        if(gets(buf))
            if(!strcmp(buf,"yes"))
                left = middle + 1;
            else
                if (!strcmp(buf,"no"))
                    right = middle;
    }
        printf("Your number is %d!\n", left);
    return 0;
}
Добавлено через 4 минуты
SK01736,
Number > 500 ?no
Number > 250 ?no
Number > 125 ?no
Number > 63 ?no
Number > 32 ?no
Number > 16 ?yes
Number > 24 ?yes
Number > 28 ?no
Number > 26 ?no
Number > 25 ?no
Your number is 25!
Press any key to continue

0
30.04.2011, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2011, 17:01
Привет! Вот еще темы с решениями:

Игра "Угадай число"
Нужно доделать код программы... (Желательно до 24-го числа.. но можно и позже)...

Игра "Угадай число"
Здравствуйте,помогите у кого есть время и возможность вообщем задание такое: ...

Игра "Угадай число"
Пожайлуста, решите задачу на С++ с условием:написать программу, которая...

Игра "Угадай число"
2)Написать программу, которая &quot;задумывает&quot; число в диапазоне от 1 до 10 и...


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

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

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