Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Примеры решения задач

Задача: Игра "Угадай-ка". Написать программу, которая как можно быстрее (за меньшее число попыток) отгадывает число, задуманное пользователем в диапазоне от 1 до 100.

Существует множество алгоритмов решения этой задачи, как впрочем и любой другой.

Вариант 1. Например, можно угадывать число, используя метод полного перебора. В этом случае можно только посочувтсвовать пользователю, задумавшему число 100 :) (Конечно только в том случае, если начать перебор с единицы). Программа 1 реализует данный алгоритм. В цикле, начиная с единицы, последовательно задаем вопрос пользователю, является ли текущее число задуманным. Если на каком-то шаге пользователь подтверждает, что очередное предложенное пограммой число - его число, то выходим из цикла и выводим число на экран, иначе продолжаем цикл. Таким образом, выход из цикла происходит в двух случаях: 1. по окончании цикла, т.е., если ни одно из чисел от 1 до 99 не является числом, задуманным пользователем, тогда остается последний вариант - это число 100, о чем программа и сообщает. И второй случай, выход из цикла происходит по достижении оператора break; т.е., когда пользователь подтверждает, что число отгадано. Очевидно, что количество попыток при данном алгоритме в наихудшем случае равно 100.

Программа 1

/* Программа угадывает число, задуманное пользователем

в диапазоне от 0 до 100, используя метод полного перебора.

*/

#include <iostream.h>

void main()

{

int i;

char c;

/* в цикле, начиная с 1, программа последовательно опрашивает

пользователя, является ли текущее число задуманным */

for (i = 1; i < 100; i++)

{

cout << "Ваше число " << i << "?\n (Да - 'y' или 'Y') ";

cin >> c;

/* если программа нашла число, выходим из цикла */

if (c == 'y' || c == 'Y')

break;

}

// выводим задуманное число на экран

cout << "Задуманное число = " << i << "\n";

}

Вариант 2.Можно, например, пытаться случайным образом угадывать число. Т.е. программа будет генерировать случайное число в указанном диапазоне и спрашивать пользователя, угадала она или нет. По теории вероятности рано или поздно программа угадает число. Причем, это может произойти практически с первых попыток, но может быть и нет :) Следующая небольшая программа демонстрирует, что процесс угадывания при таком методе может затянуться очень надолго.

Программа 2

#include <iostream.h>

#include <stdlib.h>

#include <time.h>

void main()

{

int count = 0;

int num;

srand(time(NULL));

do

{

// в цикле генерируем случайное число

num = rand()%100 + 1;

// и увеличиваем переменную-счетчик на 1

count++;

}

while (num !=100); // выходим их цикла, когда num = 100

cout << "Число 100 получили за : " << count << " попыток \n";

}

Программа 2 в цикле генерирует случайные числа до тех пор, пока это не получит число 100, и выводит на экран, с какого раза ей это удалось. Попробуйте запустить ее и Вы убедитсь, что довольно часто число попыток превосходит 200, а то и 300 попыток!!!

Конечно можно модифицировать этот вариант, например добавив, чтобы программа спрашивала задуманное число больше или меньше текущего, предложенного ею варианта, и уже на основе ответа генерировала новое число. Программа 3 реализует эту идею.

Программа 3

/* Программа угадывает число, задуманное пользователем

в диапазоне от 0 до 100, используя генерацию случайных чисел

(улучшенный вариант).

*/

#include <iostream.h>

#include <stdlib.h>

#include <time.h>

void main()

{

int num;

int max = 100;

int min = 0;

char c;

srand(time(NULL));

do

{

// если max - min не равно 0, то генерируем случайное число

(max - min) ? num = rand()%(max-min) + min + 1 : num = max;

cout << "Ваше число больше, чем " << num

<< "\n Для подтверждения введите 'y' или 'Y', "

<< "'с' или 'С', если число угадано, "

<< "в противном случае любой другой символ \n";

cin >> c;

if(c == 'y' || c == 'Y') min = num;

else max = num;

// выходим из цикла, если число отгадано

if(c == 'c' || c == 'C') {min = max - 1; break;}

}

while (max!=min+1 && max != min);

cout << "Ваше число: " << max << "\n";

}

Вариант 3 (наилучший). Но можно воспользоваться приемом, известным, как метод деления отрезка пополам. Вы познакомились с этим методом в уроке 8 при рассмотрении алгоритма бинарного поиска. В этом случае максимальное число попыток, которое сделает программа, чтобы отгадать число равно 8! Давайте воспользуемся этим методом.

Программа 4

/* Программа угадывает число, задуманное пользователем

в диапазоне от 0 до 100, используя метод деления отрезка пополам.

*/

#include <iostream.h>

void main()

{

int min = 0, max = 100;

char c;

int num;

do

{

// выбираем число и предлагаем его пользователю

num = (max+min)/2;

cout << "Ваше число " << num

<< "\n Для подтверждения введите 'y' или 'Y', "

<< "'с' или 'С', если число угадано, "

<< " в противном случае любой другой символ \n";

cin >> c;

// переназначаем границы интервала

if(c == 'y' || c == 'Y') min = num;

else max = num;

// выходим из цикла, если число отгадано

if(c == 'c' || c == 'C') {min = max - 1; break;}

}

while (max!=min+1);

cout << "Ваше число: " << max << "\n";

}