Главная страница

Алгоритмизации


Скачать 1.15 Mb.
НазваниеАлгоритмизации
Дата27.09.2022
Размер1.15 Mb.
Формат файлаdocx
Имя файла12_100229_1_124427 (1).docx
ТипДокументы
#700459
страница10 из 67
1   ...   6   7   8   9   10   11   12   13   ...   67

ГЛАВА 7. Составление циклических алгоритмов




    1. Понятиециклическогокода


Практически все алгоритмы решения задач содержат циклически повторяемые участки. Цикл – это одно из фундаментальных понятий программирования. Под циклом понимается организованное повторение некоторой последовательности операторов.

Любой цикл состоит из кода цикла, т.е. тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла.

Один проход цикла называется шагом или итерацией. Проверка условия продолжения цикла происходит на каждой итерации либо до выполнения кода цикла (с предусловием), либо после выполнения постусловием).

Для организации циклов используются специальные операторы.

Перечень разновидностей операторов цикла языка Си следующий:

  • оператор цикла с предусловием;

  • оператор цикла с постусловием;

  • оператор цикла с предусловием и коррекцией.



    1. Операторспредусловиемwhile


Цикл с предусловием реализует структурную схему, приведенную на рис. 7.1, а, и имеет вид

while(выражение)

кодцикла;

Выражение определяет условие повторения кода цикла, представленного простым или составным оператором.

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

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

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

Начальные установки могут явно не присутствовать в программе, их смысл состоит в том, чтобы до входа в цикл задать значения переменным, которые в этом цикле используются.



б
Рис. 7.1. Схемы операторов цикла:

а цикл с предусловием; б цикл с постусловием
Цикл завершается, если условие его продолжения не выполняется.

Возможно принудительное завершение как текущей итерации, так и цикла в целом.

Для этого используют оператор continue переход к следующей итерации цикла и break – выход из цикла (см. разд. 9.2, 9.3).

Передавать управление извне внутрь цикла не рекомендуется, так как получите непредсказуемый результат.

Например, необходимо сосчитать количество символов в строке. Предполагается, что входной поток настроен на начало строки. Тогда подсчет символов выполняется следующим образом:

int count = 0;

char ch = getchar(); while ( ch != \n') {

count++;

ch = getchar();

}

В языке Си в выражение, управляющее циклом, можно включить и оператор присваивания переменной ch, например:

char ch;

int count = 0;

while (( ch=getchar()) != '\n') count++;

Как видим, переменная chприменяется только в выражении, управляющем циклом, поэтому от ch можно отказаться:

int count = 0;

while ( getchar() !='\n') count ++;

Полезныепримеры


  1. Организация выхода из бесконечного цикла по нажатии клавиши Esc

while (1) { // Бесконечный цикл

...

if (kbhit() && getch()==27 ) break;

...

}

Функция kbhit() возвращает значение > 0, если нажата любая клавиша, а функция getch() возвращает код нажатой клавиши (код клавиши Escравен 27). В результате выполнения оператора if, если будет нажата клавиша Esc, выполнится оператор break и произойдет выход из цикла.

Приведенный пример распространенный прием программирования.

  1. Организации паузы в работе программы с помощью цикла, выполняющегося до тех пор, пока не нажата любая клавиша

...

while (!kbhit());

...


    1. Операторцикласпостусловиемdowhile


Цикл с постусловием реализует структурную схему, приведенную на рис. 7.1, б.

Общий вид записи такой конструкции

do


кодцикла;

while(выражение);

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

Здесь сначала выполняется код цикла, после чего проверяется, надо ли его выполнять еще раз.

Следующая программа будет «вас приветствовать» до тех пор, пока будем вводить символ Yили y(Yes). После введения любого другого символа цикл завершит свою работу.

#include void main(void)

{

char answer; do {

puts(" Hello! => "); scanf(" %c ", &answer);

}

while ((answer=='y')||(answer=='Y'));

}

Результат выполнения программы:

Hello!=>Y Hello!=>y Hello!=>d


    1. Операторцикласпредусловиемикоррекциейfor



Общий вид оператора:

for(выражение1; выражение2; выражение3)

кодцикла;

где выражение1 инициализация счетчика (параметр цикла);

выражение2 условие продолжения счета;

выражение3 коррекция счетчика.

На рис. 7.2, апредставлена схема работы цикла for, а на рис. 7.2, б

символ блок-схемы, использующийся для его обозначения.





В1, В2, В3 выражения1, 2 и 3

б
Рис. 7.2. Схемы оператора цикла for:

асхема работы; бблок-схема

Инициализация используется для присвоения счетчику (параметру цикла) начального значения.

Выражение2 определяет условие выполнения цикла. Как и в предыдущих случаях, если его результат не нулевой («истина»), то цикл выполняется, иначе– происходит выход из цикла.

Коррекция выполняется после каждой итерации цикла и служит для изменения параметра цикла.

Выражения1, 2 и 3 могут отсутствовать (пустые выражения), но символы «;» опускать нельзя.

Например, для суммирования первых Nнатуральных чисел можно записать такой код:

sum = 0;

for ( i = 1; i<=N; i++) sum+=i;

Заметим, что в выражении1 переменную-счетчик можно декларировать. Например:

for (int i = 1; i<=N; i++)

Областью действия такой переменной будет код цикла.

Но в старых версиях компиляторов такие действия могут интерпретироваться иначе.

Цикл forэквивалентен последовательности инструкций:

выражение 1;

while (выражение 2) {

...

выражение 3;

}

а оператор for (; выражение 2; )

код цикла;

эквивалентен оператору while (выражение 2)

код цикла;

Если пропущено выражение 2, то цикл будет выполняться бесконечно, поскольку пустое условие всегда остается истинным. Бесконечный оператор:

for ( ; ; ) код цикла; эквивалентен оператору while (1) код цикла;

В заголовке оператора forможет использоваться операция «запятая».

Она позволяет включать в его выражения несколько операторов. Тогда рассмотренный пример суммирования первых Nнатуральных чисел можно записать в следующем виде:

for ( sum = 0 , i = 1; i<=N; sum+= i , i++) ;

Оператор forимеет следующие возможности:

можно вести подсчет с помощью символов, а не только чисел: for (ch = 'a'; ch <= 'z'; ch++) ... ;



или

можно проверить выполнение некоторого произвольного условия: for (n = 0; s[i] >= '0' && s[i] < '9'; i++) ... ;
for (n = 1; n*n*n <= 216; n++) ... ;

Первое выражение необязательно должно инициализировать

переменную. Необходимо только помнить, что первое выражение вычисляется только один раз, перед тем как остальные части начнут выполняться.

for (printf(" вводить числа по порядку! \n"); num!=6;) scanf("%d", & num);

printf(" последнее число это то, что нужно. \n");

В этом фрагменте первое сообщение выводится на печать один раз, а затем осуществляется прием вводимых чисел, пока не поступит число 6.

Переменные, входящие в выражения2 и 3, можно изменять при выполнении кода цикла, например, значения k и delta:

for (n = 1; n < 10*k; n += delta) ... ;

Использование условных выражений позволяет во многих случаях значительно упростить программу, например:

for (i = 0; i i++)

printf("%6d%c", a[i],( (i%10==0) || (i==n–1) ) ? '\n' : ′);

В этом цикле печатаются n элементов массива а по 10 в строке, разделяя каждый столбец одним пробелом и заканчивая каждую строку (включая последнюю) одним символом перевода строки. Символ перевода строки записывается после каждого десятого и n-го элементов. За всеми остальными – пробел.

Наиболее часто встречающиеся ошибки при создании циклов – это использование в коде цикла неинициализированных переменных и неверная запись условия выхода из цикла.

Чтобы избежать ошибок, нужно стараться:

  • проверить, всем ли переменным, встречающимся в правой части операторов присваивания в коде цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);

  • проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;

  • предусмотреть аварийный выход из цикла по достижении некоторого количества итераций;

  • если в состав цикла входит не один, а несколько операторов, нужно заключать их в фигурные скобки.
1   ...   6   7   8   9   10   11   12   13   ...   67


написать администратору сайта