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

помогите понять (генератор чисел) - C++

Восстановить пароль Регистрация
 
Nuckelavee
Сообщений: n/a
06.12.2011, 23:06     помогите понять (генератор чисел) #1
помогите, пожалуйста, разобраться:
С++ начал изучать буквально неделю назад, решил применить все полученные на данный момент знания на практике и написал программку, которая сама загадывает себе число от 0 до 100 и сама же его отгадывает в зависимости от сообщений "заданное число больше/меньше вашего". Вроде работает, угадывает (делал и вариант когда сам вводил число для угадывания), однако часто проскакивают ошибки типа - подставляет число, пишет что оно больше/меньше загадоного, сужает рамки поиска, а потом подставляет то же самое число и оно оказывается правильным.
вот код:
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>             //для exit(1) || doid exit(int exitstatus) 1 - выход
#include <conio.h>              //для getch()
#include <ctime>                //библиотека с генератором чисел
#include <windows.h>            //для Sleep()
using namespace std;
void menshe(int &UN, int &min, int &max);
void bolshe(int &UN, int &min, int &max);
void gotcha(int &UN);
int generator(int &UN);
int raschet(int &UN, int &min, int &max);
int CompNumber;
int main()
{
    int UN;
    int min = 0;
    int max = 100;
    srand( time(NULL)|clock());         //генератор случайных чисел!
    CompNumber = rand()%100;    //переменная - случайное число от 0 до 100 || (rand()%(max - min + 1) + min)
    //cout<<"Enter a number from 0 to 100:";
    //cin>>CompNumber;
    generator(UN);
    raschet(UN, min, max);
    return 0;
}
 
void menshe(int &rUN, int &rmin, int &rmax)
{
    cout<<rUN<<"\nToo small!"<<endl;
    Sleep(100);
    rUN =  rand()%(rmax - rmin + 1) + rmin;
    raschet(rUN, rmin, rmax);
    //return rUN;
}
void bolshe(int &rUN, int &rmin, int &rmax)
{
    cout<<rUN<<"\nToo big!"<<endl;
    Sleep(100);
    rUN = rand()%(rmax - rmin + 1) + rmin;
    raschet(rUN, rmin, rmax);
    //return rUN;
}
void gotcha(int &rUN)
{
    cout<<rUN<<"\nGotcha!!"<<endl;
    getch();
    exit(1);
 
}
int generator(int &rUN)
{
    rUN = rand()%100;
    return rUN;
}
int raschet(int &rUN, int &rmin, int &rmax)
{   
              cout<<"Enter a number: ";
            if (rUN < CompNumber)
            {
                rmin = ++rUN;
                //rmax = rmax;
                menshe(rUN, rmin, rmax);
            }
            if (rUN > CompNumber)
            {
                 //rmin = rmin;
                 rmax = --rUN;
                bolshe(rUN, rmin, rmax);
            }
            if (rUN == CompNumber)
            {
                gotcha(rUN);
            }             
return rUN;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 23:06     помогите понять (генератор чисел)
Посмотрите здесь:

C++ Помогите понять задачу в теории
C++ Помогите понять принцип составления проги
C++ Помогите понять формулировку
Помогите понять ошибку C++
помогите понять смысл задания C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
06.12.2011, 23:14     помогите понять (генератор чисел) #2
Я не понимаю зачем вам
C++
1
int generator(int &UN);
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.12.2011, 23:25     помогите понять (генератор чисел) #3
Поиск ошибок методом пристального взгляда - это круто, но для такого рода проблем дебагер придумали. Научитесь им пользоваться. С ним они находятся и фиксятся очень быстро. Хотя бы попробуйте.
Bers
Заблокирован
07.12.2011, 01:00     помогите понять (генератор чисел) #4
Nuckelavee, проверил.
Ты не правильно проверяешь условия выиграша:
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
int raschet(int &rUN, int &rmin, int &rmax)
{ * 
* * * * * * * cout<<"Enter a number: ";
* * * * * * if (rUN < CompNumber)
* * * * * * {
* * * * * * * * rmin = ++rUN;
* * * * * * * * //rmax = rmax;
 
               //В этой точке программы игрок уже
              // может иметь правильный ответ на загадку
* * * * * * * * menshe(rUN, rmin, rmax);
* * * * * * }
* * * * * * if (rUN > CompNumber)
* * * * * * {
* * * * * * * * *//rmin = rmin;
* * * * * * * * *rmax = --rUN;
 
               //В этой точке программы игрок уже
              // может иметь правильный ответ на загадку
 
* * * * * * * * bolshe(rUN, rmin, rmax);
* * * * * * }
* * * * * * if (rUN == CompNumber)
* * * * * * {
* * * * * * * * gotcha(rUN);
* * * * * * }
Добавлено через 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
53
54
55
56
57
58
#include <iostream>
#include <stdio.h>
#include <stdlib.h>             //для exit(1) || doid exit(int exitstatus) 1 - выход
#include <conio.h>              //для getch()
#include <ctime>                //библиотека с генератором чисел
#include <windows.h>            //для Sleep()
using namespace std;
 
int CompNumber;
int rnd(int rmin,int rmax)   {    return (rand()%(rmax - rmin + 1) + rmin);      }
void gotcha(int &rUN)        { cout<<"Загадка: Ты угадал!!!\n"<<endl;  exit(1); }
void CheckVictory(int rUN) {  if (rUN == CompNumber)  {   gotcha(rUN);  }       }
 
void GenerateNewNumber(int &rUN, int &rmin, int &rmax);
void CheckVictory(int rUN);
 
void menshe(int &UN, int &min, int &max);
void bolshe(int &UN, int &min, int &max);
int raschet(int &UN, int &min, int &max);
int main()
{
    srand( time(NULL)|clock());         //генератор случайных чисел!
    console<<"привет";
    
    int min = 0; int max = 100; int UN;
    CompNumber= rnd(min,max);  
    std::cout<< "Загадка: Я загадала число..."<< CompNumber<<endl;
    GenerateNewNumber(UN, min, max);
    return 0;
}
 
void menshe(int &rUN, int &rmin, int &rmax)
{
    cout<<"Загадка: твоё число слишком маленькое!\n"<<endl;
    GenerateNewNumber(rUN, rmin, rmax);
}
void bolshe(int &rUN, int &rmin, int &rmax)
{
    cout<<"Загадка: твоё число слишком большое!\n"<<endl;
    GenerateNewNumber(rUN, rmin, rmax);
}
 
int raschet(int &rUN, int &rmin, int &rmax)
{   
    if (rUN < CompNumber)  { rmin = ++rUN;  menshe(rUN, rmin, rmax); }
    if (rUN > CompNumber)  { rmax = --rUN;  bolshe(rUN, rmin, rmax);  }
    CheckVictory(rUN);
    return rUN;
}
 
void GenerateNewNumber(int &rUN, int &rmin, int &rmax)
{
    rUN =  rnd(rmin, rmax);  
    std::cout << "Эрудит: Ты загадала число...: "<<rUN<<std::endl;
    CheckVictory(rUN);
 
    raschet(rUN, rmin, rmax);
}
Добавлено через 5 минут
да и ещё. Твой код написан таким образом... у тебя функция вызывает другую функцию, и эта другая - опять первую же функцию.

То есть, у тебя рекурсия через посредника.
А это значит, что если задать слишком большой диапазон значений, то стек может и не выдержать. И программа покрошится в рантайме.

Добавлено через 39 минут
Да, вот ещё на заметку:

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

2. Если загадать число, которое весит больше 16 бит, то твой алгоритм отгадывания станет крайне не эффективным. Это связанно с тем, что сам по себе рандом выдает числа из диапазона signed short

Поэтому, сужение диапазона поиска чисел будит не больше чем 32 767
Таким образом, если загадать 1000000, то компьютерный игрок будит больше заниматься соплежуйством, нежели реальным отгадыванием)
Nuckelavee
Сообщений: n/a
07.12.2011, 10:32     помогите понять (генератор чисел) #5
Спасибо за помощь, кажется разобрался. По поводу дебаггера - пока с ним не дружу, но попробовал свой вариант через него прогнать, однако ошибок дебаггер не обнаружил, возможно я не совсем понимаю его назначение. Но все равно всем спасибо за ответы, буду изучать дальше.
Bers
Заблокирован
07.12.2011, 17:25     помогите понять (генератор чисел) #6
Nuckelavee, Дебаггер над знать хотя бы на уровне пошаговой отладки.
Без него практически нереально найти ошибку в более менее сложной логике.

Есть ещё техники "ведения логов", и тп. Но старая добрая пошаговая отладка, имхо - самый простой способ понять, что делает код.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 18:23     помогите понять (генератор чисел)
Еще ссылки по теме:

C++ Помогите понять и исправить ошибку...
Помогите понять и исправить ошибку... C++
Генератор чисел! C++

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
07.12.2011, 18:23     помогите понять (генератор чисел) #7
Цитата Сообщение от Nuckelavee Посмотреть сообщение
подставляет число, пишет что оно больше/меньше загадоного, сужает рамки поиска, а потом подставляет то же самое число и оно оказывается правильным.
по большому счеты это вас не должно волновать, главное что алгоритм дает результат - значит он верный. Лучше подумать над оптимизацией алгоритма, так сказать доведения его до ума. Начнем сначала:
1. цель: программа должна отгадать число, загаданное пользователем.
2. детали: диапазон чисел задается программой или пользователем (на ваше усмотрение)
3. средства: память для хранения начального и конечного границ диапазона, память для хранения найденного числа, память для хранения и сравнения ответа на заданный вопрос, память для промежуточных значений функция поиска числа, т.е. всего 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
#include <stdio.h>
#include <string.h>
 
int search(int beg, int end)
{
    //unsigned char ch;
    unsigned char ch[2];
    int tmp;
 
    tmp = ( end - beg ) / 2;
 
    while ( 1 )
    {
        printf("число равно %i?\n", tmp);
        puts("если да, то нажмите enter, если ваше число больше - нажмите 1, если меньше - 0");
        //ch = getchar();
        gets(ch);
        if ( ch[ 0 ] == '1' )
        {
            beg = tmp;
            tmp = beg + ( (end - beg) / 2 );
        }
        else if( ch[ 0 ] == '0' )
        {
            end = tmp;
            tmp = end - ( (end - beg) / 2 );
        }
        else
            return tmp;
    }
}
 
int main( void )
{
    int x;
    int beg = 0;
    int end = 500;
 
    puts("загадайте число от 0 до 500 включительно");
 
    x = search(beg - 1, end + 1);
 
    printf("ваше число %i\n", x);
    return 0;
}
Yandex
Объявления
07.12.2011, 18:23     помогите понять (генератор чисел)
Ответ Создать тему
Опции темы

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