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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задачка по С++ http://www.cyberforum.ru/cpp-beginners/thread400734.html
Программа вычисления стоимости покупки с учетом скидки.Скидка предоставляется, если сумма>1000(5%), более 5000(?%), а так же дополнит скидка 3%- в выходные дни. Информация о том является ли день...
C++ Нужна упращенная модель разделения текста по указательным символам Доброго времени суток. Нужна упращенная модель разделения текста (массива) по указательным символам, допустим у нас имеется комманда #run%text.txt - где # указатель что следующий символ что будет... http://www.cyberforum.ru/cpp-beginners/thread400732.html
Сформировать массив из элементов исходного массива, располагающихся по возрастанию C++
например из массива (3 2 4 5 1 3 7 3 4 9 2) должен получиться массив (3 4 5 7 9) т.е. из возрастающих элементов. не могу понять как делать=( Добавлено через 10 минут если можно то на языке...
С++ структура даных очередь C++
привет всем, помогите плиз з кодом С++ , необходимо написать программу на основе абстрактного типа даных очереди. В магазине стоит очередь из m покупателей. Время обслуживания покупателя из...
C++ Модули/двоичная система счисления http://www.cyberforum.ru/cpp-beginners/thread400705.html
Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над натуральными числами в двоичной системе счисления: сложения; вычитания; умножения; деления; перевода из двоичной...
C++ написать 2 программы на С++ Описать рекурсивную функцию Root(X, K, N) вещественного типа, находящую приближенное значение корня K-ой степени из числа X по формуле: Y(0)=1 y(n+1)=y(n)-(y(n)-x/(y(n))^k-1)/k Параметры... подробнее

Показать сообщение отдельно
Bers
Заблокирован
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru