Nuckelavee

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

06.12.2011, 23:06. Показов 941. Ответов 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;
}
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2011, 23:06
Ответы с готовыми решениями:

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

Помогите понять ошибку
Не могу понять, что ему не нравится? Обычный вектор векторов: template &lt;class typeData&gt; class Ttest { typedef...

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

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

Есть ещё техники "ведения логов", и тп. Но старая добрая пошаговая отладка, имхо - самый простой способ понять, что делает код.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
07.12.2011, 18:23
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2011, 18:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru