Язык Си - руководство для начинающих
Шрифт:
В общем виде цикл while записывается так:
while(выражение) оператор
В наших примерах в качестве выражений использовались условные выражения, но, вообще говоря, это могут быть выражения произвольного типа. В качестве оператора можно использовать простой оператор с символом "точка с запятой" в конце или составной oпeратор, заключенный в фигурные скобки. Если выражение истинно (т.е. в общем случае не равно нулю), то оператор, входящий в цикл while выполняется один раз, а затем выражение проверяется снова, а последовательность действий, состоящая из проверки и выполнения оператора, периодически повторяется до тех пор, пока выражение не станет
РИС. 8.1. Структура цикла while.
Завершение цикла while
Мы подошли к самому существенному моменту рассмотрения циклов while. При построении цикла while вы должны включить в него какие-то конструкции, изменяющие величину проверяемого выражения так, чтобы в конце концов оно стало ложным. В противном случае выполнение цикла никогда не завершится. Рассмотрим следующий пример:
index = 1;
while(index < 5)
printf("Доброе утро!\n");
Данный фрагмент программы печатает это радостное сообщение бесконечное число раз, поскольку в цикле отсутствуют конструкции, изменяющие величину переменной index, которой было присвоено значение 1.
index = 1;
while(--index < 5)
printf("Как колеблются старые атомы!\n");
И этот фрагмент программы работает ненамного лучше. Значение переменной index в нем изменяется, но в "неправильном" направлении! Единственным утешением здесь служит тот факт, что выполнение данного куска программы в конце концов завершится. Это произойдет, когда величина переменной index станет меньше наименьшего отрицательного числа, допустимого в системе.
Цикл while является "условным" циклом, использующим предусловие (т.е. условие на входе). Он называется условным, потому что выполнение оператора зависит от истинности условия, описываемого с помощью выражения. Действительно ли значение переменной index меньше 5? Является ли последний введенный символ признаком EOF? Подобное выражение задает предусловие, поскольку выполнение этого условия должно быть проверено перед началом выполнения тела цикла. В ситуации, аналогичной приведенной ниже, тело цикла не выполнится ни разу, потому что используемое условие с самого начала является ложным.
index = 10;
while(index++ < 5)
printf(" Желаю хорошо провести день.\n");
Измените первую строку на
index = 3;
и вы получите работающую программу.
АЛГОРИТМЫ И ПСЕВДОКОД
А теперь вернемся к нашей "тупоумной" программе, угадывающей число. Недостаток этой программы кроется не в программировании самом по себе, а в "алгоритме", т.е. методе, используемом для отгадывания числа. Этот метод можно описать следующим образом: попросите пользователя задумать число компьютер начинает угадывание с 1 до тех пор пока догадка неверна, предлагаемое значение увеличивается на 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 == 'б')
{
/* уменьшение верхнего предела,