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

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

Войти
Регистрация
Восстановить пароль
 
Nuckelavee
Сообщений: n/a
#1

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

06.12.2011, 23:06. Просмотров 544. Ответов 6
Метки нет (Все метки)

помогите, пожалуйста, разобраться:
С++ начал изучать буквально неделю назад, решил применить все полученные на данный момент знания на практике и написал программку, которая сама загадывает себе число от 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++
Не могу понять, что ему не нравится? Обычный вектор векторов: template &lt;class typeData&gt; class Ttest { typedef...

Помогите понять формулировку - C++
Объясните пожалуйста суть задания. С языком С не знаком. Только не не большие знания С++ Строки данного класса строятся по правилам...

помогите понять смысл задания - C++
(*3.5) Реализуйте версии istream и ostream для чтения и записи чисел в двоич- двоичном виде без преобразования их в символы. Рассмотрите...

Помогите понять и исправить ошибку... - C++
#include &lt;iostream&gt; using namespace std; int LC ; char C = &quot;Фраза&quot;; void WW (void) { LC = sizeof(C); } void Prin (void) ...

Помогите понять и исправить ошибку... - C++
#include &lt;iostream&gt; using namespace std; int main () { char cc = &quot;Число&quot;; // Массив автоматической памяти float...

Помогите понять задачу в теории - C++
Не могу понять как должна и что считать задача,помогите. Дана квадратная матрица порядка n. Получить вектор Аb, где b - вектор, элементы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
06.12.2011, 23:14 #2
Я не понимаю зачем вам
C++
1
int generator(int &UN);
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.12.2011, 23:25 #3
Поиск ошибок методом пристального взгляда - это круто, но для такого рода проблем дебагер придумали. Научитесь им пользоваться. С ним они находятся и фиксятся очень быстро. Хотя бы попробуйте.
0
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, то компьютерный игрок будит больше заниматься соплежуйством, нежели реальным отгадыванием)
0
Nuckelavee
Сообщений: n/a
07.12.2011, 10:32 #5
Спасибо за помощь, кажется разобрался. По поводу дебаггера - пока с ним не дружу, но попробовал свой вариант через него прогнать, однако ошибок дебаггер не обнаружил, возможно я не совсем понимаю его назначение. Но все равно всем спасибо за ответы, буду изучать дальше.
Bers
Заблокирован
07.12.2011, 17:25 #6
Nuckelavee, Дебаггер над знать хотя бы на уровне пошаговой отладки.
Без него практически нереально найти ошибку в более менее сложной логике.

Есть ещё техники "ведения логов", и тп. Но старая добрая пошаговая отладка, имхо - самый простой способ понять, что делает код.
0
alkagolik
Заблокирован
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 18:23
Привет! Вот еще темы с ответами:

Помогите понять принцип составления проги - C++
Пытаюсь обучиться работать с формами в Visual Studio, перед этим имевши небольшой опыт работы под Builder'ом. Вызывает недоумение,...

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

Помогите перевести и понять условие задачи, пожалуйста - C++
Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen prayed: ``If my child was a son and if only he was a...

Уважаемые форумчане, помогите понять что требуется.. - C++
задали лабу по информатике.. что требуется?? просто я 0 в математике..помогите пожалуйста с кодом или разъясните пожалуйста


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

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

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