Книга: Язык Си - руководство для начинающих

АЛГОРИТМЫ И ПСЕВДОКОД

АЛГОРИТМЫ И ПСЕВДОКОД

     А теперь вернемся к нашей "тупоумной" программе, угадывающей число. Недостаток этой программы кроется не в программировании самом по себе, а в "алгоритме", т.е. методе, используемом для отгадывания числа. Этот метод можно описать следующим образом: попросите пользователя задумать число компьютер начинает угадывание с 1 до тех пор пока догадка неверна, предлагаемое значение увеличивается на 1.

     Эта запись, между прочим, служит примером "псевдокода" представляющего собой способ выражения смысла программ на разговорном языке и являющегося некоторым аналогом языка машины. Псевдокод очень эффективен при разработке логики программы. После того как логика покажется вам правильной, вы можете обратить основное внимание на детали перевода псевдокода на реальный язык программирования. Преимущество использования псевдокода состоит в том, что он позволяет сконцентрироваться на логике и структуре программы, не заботясь пока о способе перевода этих идей на язык машины. Если мы хотим улучшить программу, нам в первую очередь необходимо улучшить алгоритм. Один из методов заключается в том, чтобы выбрать число где-нибудь посередине между 1 и 100 (50 нам вполне подходит) и попросить пользователя ответить больше ли это число задуманного, меньше его или равно ему. Если он сообщает, что данное число слишком велико, то тем самым из рассмотрения немедленно исключаются все числа между 50 и 100. Следующей догадкой программы является число, выбранное где-то посередине между 1 и 49. И снова ответ на вопрос, велико или мало это число, позволит исключить из рассмотрения половину оставшихся возможных чисел; программа продолжает указанный процесс, быстро сужая поле поиска до тех пор, пока задуманное число не будет угадано. Давайте запишем эти логические рассуждения на псевдокоде. Пусть highest - максимально возможная величина отгадываемого числа, a lowest - его минимально возможное значение. Вначале этими величинами будут соответственно 100 и 1, поэтому алгоритм запишется следующим образом:

установить highest равным 100

установить lowest равным 1

попросить пользователя задумать число

предложенное значение (guess) равно (highest + lowest)/2

пока догадка неверна, делать следующее:

     {если предложенное значение велико, установить highest равным этому предложенному значению минус 1

если предложенное значение мало, установить lowest равным этому предложенному значению плюс 1

новое предложенное значение равно (highest + lowest)/2 }

     Обратите внимание на логику алгоритма: если предложенное значение, равное 50, велико, то максимально возможная величина задуманного числа будет равна 49. Если же значение 50 мало, то минимально возможная величина числа будет равна 51.

     Сейчас мы переведем текст, указанный выше, на язык Си. Полученная программа представлена на рис. 8.2.

/* угадывание числа2 */

/* более эффективный способ угадывания*/

#include

 #define HIGH 100

#define LOW 1

main( )

{

int guess = (HIGH + LOW)/2;

int highest = HIGH;

int lowest = LOW;

char response;

printf(" Задумайте число от %d до %d. Я попробую", LOW, HIGH);

printf(" угадать eгo.n Отвечайте д, если моя догадка правильна,");

printf(" б, если n больше, и м, если");

printf(" меньше.n");

printf(" Итак ... ваше число %d?n" , guess);

while((response = getchar( )) != 'д')

{

 if( response != 'n')

{

if (response == 'б')

{

 /* уменьшение верхнего предела,

 eсли предложенное значение слишком велико */

highest = guess - 1;

guess = (highest + lowest)/2;

printf(" Гм ... слишком велико. Ваше число %d?n", guess);

 }

else if(response == 'м')

{

 /* увеличение нижнего предела,если

 предложенное значение слишком мало*/

lowest = guess + 1;

guess = (highest + lowest)/2;

printf(" Гм ... слишком мало. Ваше число %d?n" , guess);

 }

else

{

 /* подводите пользователя к правильному ответу */

printf(" Я не понимаю; введите, пожалуйста, д,б");

printf ("или м.n");

}

 }

printf("Я знала, что смогу сделать это!n");

 }

РИС. 8.2. Программа, угадывающая число.

     Наличие в программе завершающей части else предоставляет пользователю дополнительную возможность правильно ответить на стандартный "отклик" программы. Заметим также, что мы использовали символические константы, чтобы сделать процесс изменения диапазона чисел достаточно простым. Работает ли данная программа? Ниже приводятся результаты этого прогона. Задуманное число - 71.

Задумайте число от 1 до 100. Я попробую угадать eгo

Отвечайте д, если моя догадка правильна б, если

 больше, и м, если меньше.

Итак ..., ваше число 50? 

Я не понимаю: введите, пожалуйста, д,б или м.

м

Гм ... слишком мало. Ваше число 75?

б

Гм ... слишком велико. Ваше число 62?

м

Гм ... слишком мало. Ваше число 68?

м

Гм ... слишком мало. Ваше число 71?

д

Я знала, что смогу сделать это!

     Что может быть неправильного в этой программе? Мы реализовали в ней защиту от ошибок, вызванных тем, что пользователи могут указывать неверные символы, поэтому здесь не должно быть никаких проблем. Единственное, что может повлиять на правильность работы программы: если вы вместо м укажете б, или наоборот. К сожалению, не существует способа заставить пользователя говорить правду и не делать ошибок. Тем не менее, если вы заинтересованы в этом, можете предпринять некоторые шаги. (Например, если захотите поразить свою шестилетнюю племянницу.) Во-первых, обратите внимание на то, что наш способ требует самое большее семи попыток для угадывания любого числа. (Каждая попытка уменьшает число возможностей наполовину. За семь попыток можно угадать любое число в диапазоне от 1 до 27- 1, или 127, что вполне достаточно для работы в диапазоне или 1 до 100.) Вы можете модифицировать программу так, чтобы она подсчитывала число попыток, и если окажется, что оно превышает 7, то тогда можно вывести на печать сообщение с выражением недовольства, а затем восстановить первоначальные значения переменных highest, lowest и счетчика. Дополнительные изменения, которые можно внести в программу, заключаются в такой модификации операторов if, в результате которой допускался бы ввод как прописных, так и строчных букв.

Оглавление книги


Генерация: 1.418. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз