Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ_ПО_ПРОГРАММИРОВАНИЮ_ПРЕПОД_3403_220301.doc
Скачиваний:
27
Добавлен:
06.11.2018
Размер:
845.31 Кб
Скачать

11. Циклы.

11.1 Цикл пока (while).

Цикл while (пока) – условный цикл с предусловием (условием на входе).

В общем виде цикл while имеет формат:

while(выражение) оператор

Выражение может быть произвольного типа.

В качестве оператора могут использоваться:

  • простой оператор (в том числе пустой оператор) с символом "точка с запятой" в конце;

  • составной опeратор, заключенный в фигурные скобки.

Если выражение при входе в цикл (предусловие) истинно (не равно нулю), то оператор, входящий в цикл while выполняется один раз. Если предусловие ложно (равно нулю), то оператор, входящий в цикл while, не выполняется ни разу.

В цикл while должны быть включены конструкции, изменяющие величину проверяемого выражения при каждом выполнении цикла так чтобы, в конце концов, оно стало ложным (равным нулю). В противном случае выполнение цикла никогда не завершится (бесконечный цикл).

Измененное выражение проверяется снова, и выполнение оператора периодически повторяется до тех пор, пока выражение не станет ложным (равным нулю). При этом программа выходит из цикла и выполняется следующий за циклом оператор. Такой процесс называется «итерация».

Структура оператора while аналогична структуре оператора if. Основное отличие заключается в том, что в операторе if проверка условия и (возможное) выполнение оператора осуществляется только один раз, а в цикле while эти действия производятся, вообще говоря, неоднократно.

****************

Пример 1:

index = 6;

while(index < 5)

printf("Доброе утро!\n");

В этом фрагменте предусловие ложно (т.к. логическое выражение 6<5 равно нулю), поэтому оператор printf("Доброе утро!\n");, входящий в цикл while, не выполняется ни разу.

****************

Пример 2:

index = 1;

while(index < 5)

printf("Доброе утро!\n");

В этом фрагменте оператор printf("Доброе утро!\n"); выполняется бесконечное число раз, поскольку в цикле отсутствуют конструкции, изменяющие величину переменной index, которой было присвоено значение 1.

****************

Пример 3:

index = 1;

while(--index < 5)

printf("Доброе утро!\n");

Этот фрагмент программы работает не правильно. Значение переменной index в нем изменяется, но в "неправильном" направлении! Выполнение этого фрагмента в конце концов завершится. Это произойдет, когда величина переменной index станет меньше наименьшего отрицательного числа, допустимого в системе.

****************

index = 4;

while(index++ < 5)

printf("Доброе утро!\n");

В этом фрагменте оператор printf("Доброе утро!\n");, входящий в цикл while, выполняется два раза.

****************

/* ПРОГРАММА:

guessing.c - угадывание числа, находящегося в интервале чисел, путем деления интервалов пополам. */

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= define */

#define HIGH 100 /* максимально возможное отгадываемое число */

#define LOW 1 /* минимально возможное отгадываемое число */

/*============================= main() */

main()

{/*.---------------------------.begin 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()) != 'д')

{/*.---------------------------.begin while */

if( response != '\n')

{/* begin if если нажата клавиша [Enter] */

if (response == 'б')

{ /* уменьшение верхнего предела, если предложенное значение слишком велико */

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");

}

}/* end if если нажата клавиша [Enter] */

}/*.---------------------------.end while */

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

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

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

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

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

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

а

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

м

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

б

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

м

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

м

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

д

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

ПОЯСНЕНИЯ К ПРОГРАММЕ.

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

Запишем эти логические рассуждения на «псевдокоде», представляющего собой способ выражения смысла программ на разговорном языке и являющегося некоторым аналогом языка машины. Псевдокод очень эффективен при разработке логики программы. После того как логика покажется вам правильной, вы можете обратить основное внимание на детали перевода псевдокода на реальный язык программирования. Преимущество использования псевдокода состоит в том, что он позволяет сконцентрироваться на логике и структуре программы, не заботясь пока о способе перевода этих идей на язык машины.

Пусть highest - максимально возможная величина отгадываемого числа, a lowest - его минимально возможное значение. Вначале этими величинами будут соответственно 100 и 1, и алгоритм запишется следующим образом:

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

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

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

  4. спросить пользователя, равно ли предложенное значение (guess) величине (highest + lowest)/2;

  5. если догадка верна, выйти из цикла;

  6. если догадка неверна, делать следующее: если предложенное значение велико, установить highest равным этому предложенному значению минус 1; если предложенное значение мало, установить lowest равным этому предложенному значению плюс 1

  7. вернуться к пункту 4.

Если предложенное значение, равное 50, велико, то максимально возможная величина задуманного числа будет равна 49. Если же значение 50 мало, то минимально возможная величина числа будет равна 51. способ требует самое большее семи попыток для угадывания любого числа. Каждая попытка уменьшает число возможностей наполовину. За семь попыток можно угадать любое число в диапазоне от 1 до 27- 1, или 127, что вполне достаточно для работы в диапазоне или 1 до 100.