label: i++; //эти три оператора образуют бесконечный цикл
Как правило, появление в программе бесконечных циклов вызвано логическими ошибками, допущенными программистом при разработке алгоритма и кодировании (написании операторов программы) с использованием оператора безусловного перехода goto. Поэтому в современных алгоритмических языках этот оператор практически не используется, а заменяется циклами. Бесконечные циклы не выявляются транслятором при синтаксическом контроле и проявляются только после запуска программы на выполнение следующим образом:
1. длительное время (десятки секунд) программа не выводит на устройство вывода никакой информации – программа зависает,
2. на устройство вывода постоянно выводится одна и та же информация.
Таким образом, бесконечные циклы – это логические ошибки программиста. С ними сталкивается любой программист, и поэтому необходимо овладеть методами их поиска.
Как правило, некоторую цепочку операторов необходимо повторять не бесконечно, а до тех пор, пока выполняется некоторое условие:
Такой цикл называется циклом с предусловием (циклом ПОКА) и изображается следующей схемой:
Условие – это логическое выражение, зависящее от переменных, входящих в цепочку. Цикл повторяется до тех пор, пока условие истинно. Значит, данное условие является условиемпродолжения цикла. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным.
Цикл не выполняется ни разу, если условие было ложным с самого начала.
Цикл ПОКА превращается в бесконечный, если условие подобрано так, что оно всегда истинно.
В Си цикл с предусловием реализуется оператором цикла while:
или
{
. . . .
}
Операторы, находящиеся между фигурными скобками, называются телом цикла.
Внимание!Условие всегда заключается в скобки и после него точка с запятой не ставится!
Если поставить точку с запятой после условия, то этот цикл, как правило, превращается в бесконечный, потому что в этом случае условие изменяться не будет.
Фигурные скобки используются в том случае, если после условия должна следовать цепочка операторов.
Действия оператора while:
1. проверяется выполнение условия,
2. если оно истинно, то выполняется оператор (цепочка), стоящий после него,
3. после его выполнения снова проверяется условие, и если оно снова истинно, то цикл повторяется,
4. если условие становится ложным, то цикл заканчивает работу.
Примеры:
1. вычислить сумму ста первых натуральных чисел:
Пусть s – искомая сумма,
i – очередное число (изменяется от 1 до 100).
Тогда алгоритм решения задачи можно описать следующим образом:
a. обнуляем сумму s = 0,
b. берем первое число: i = 1,
c. добавляем в сумму это число: s = s + i,
d. увеличиваем очередное число на единицу: i = i+ 1,
e. если оно не больше 100, то снова добавляем его в сумму и повторяем цикл.
Представим этот алгоритм так:
ПОКА (i ≤ 100)
s = s + i;
i = i + 1;
Программа:
#include <stdio.h>
#include <conio.h>
#include <math.h>
{
int i=1, s=0;
while (i<=100)
{
}
printf(“/ns=%d i=%d”,s, i);
}
Результат решения задачи:
s=5050 i=101
Таким образом, выходим из этого цикла со значением i не 100, а 101.
Вместо цепочки:
можно использовать один оператор:
s+=i++;
Этот цикл можно превратить в бесконечный, если после условия поставить точку с запятой: int i=1, s = 0;
while (i<=100);
{
}
printf(“/ns=%d i=%d”,s, i);
Значение переменной i в этом случае меняться не будет – она останется равной единице.
2. вычислить сумму s всех цифр заданного натурального числа n
Пусть s – искомая сумма,
i – очередная цифра числа.
Тогда алгоритм решения задачи можно описать следующим образом:
1. обнуляем сумму s=0,
2. берем последнюю цифру числа, для чего определяем остаток от деления исходного числа на 10: i = n % 10,
3. добавляем в сумму найденную цифру: s = s + i,
4. уменьшаем число в 10 раз: n = n / 10,
5. повторяем цикл до тех пор, пока n > 0 – это и будет условием продолжения цикла.