Наконец то мы добрались до третьего кита программирования - оператора цикла, команды многократного выполнения группы команд. Оператор присваивания рассчитывает значение и записывает его в переменную, условный оператор выполняет ту или другую группу операторов в зависимости от условия, а оператор цикла многократно выполняет группу команд (в которую, в свою очередь, могут входить те же операторы присваивания, условные и цикла :). Напомню, что комбинируя эти три оператора, можно запрограммировать любой алгоритм (из теоретически поддающихся программированию).
Этот оператор уже проще для изучения, нежели предыдущие два. Записывается он так:
while условие do begin
группа-команд; end;
Условие - то же самое логическое выражение, что и в условном операторе используется. Группа команд внутри begin / end выполняется, пока это условие истинно (равно true). Как только оно стало ложным, выполняется следующий за end оператор.
Пример. Надо сосчитать сумму всех чисел от 1 до 10.
var i, sum: Integer; begin
sum := 0; // сумма чисел, исходно ноль
i := 1; // первое число из 1 .. 10 while i <= 10 do // суммировать будем, пока число i не превысит
верхний порог begin
sum := sum + i; // увеличили сумму на текущее число
i := i + 1; // в i записали следующее число end;
writeln( sum );
...
Команды
sum := sum + i;
и
i := i + 1;
будут последовательно выполняться, пока i меньше или равно 10.
Ну вот собственно и все по циклу :)
В Си также схожая запись:
while( условие ) {
группа операторов;
}
Только круглые скобки - это часть оператора, должны быть всегда.
Вот как программка суммирования запишется:
int i, sum;
sum = 0; // сумма чисел, исходно ноль
i = 1; // первое число из 1 .. 10 while( i <= 10 ) { // суммировать будем, пока число i не превысит
верхний порог
sum = sum + i; // увеличили сумму на текущее число
i = i + 1; // в i записали следующее число
}
cprintf( "%d", sum );
Кстати, в Си есть сокращения для часто используемых форм оператора присваивания. Так, если надо значение увеличить или уменьшить на единицу, достаточно записать:
i ++; // эквивалентно i = i + 1;
i --; // эквивалентно i = i - 1;
А если надо увеличить/уменьшить значение некоторой переменной на заданное выражение, то так:
sum += i ; // эквивалентно sum = sum + i;
sum -= i ; // эквивалентно sum = sum - i;
На Бейсике - вот так оператор цикла записывается:
While условие
группа-команд
End While
While переводится как "пока". Пока условие истинно, выполнять...
Вот программа суммирования:
Dim i, sum
i = 1
sum = 0
while i <= 10
sum = sum + i
i = i + 1
end while
Console.WriteLine(sum)
Для тех, кто понял идею цикла сразу :) - еще одна, очень популярная форма оператора цикла. Она не такая общая, как первая, но всеми любимая.
Паскаль:
for переменная := начальное значение to конечное-значение do begin
группа-команд; end;
Указанная в заголовке цикла переменная целого типа исходно получает начальное значение (может быть любым арифметическим выражением). Затем, после каждого выполнения группы команд, она автоматически увеличивается на единицу, и цикл повторяется, пока значение этой переменной (счетчик она еще называется) меньше или равно конечному (тоже может задаваться выражением).
Наш пример с суммированием тогда запишется так:
var i, sum: Integer; begin
sum := 0; // сумма чисел, исходно ноль
i := 1; // первое число из 1 .. 10 for i := 1 to 10 do // суммировать будем от 1 до 10 begin
sum := sum + i; // увеличили сумму на текущее число end;
writeln( sum );
...
Явно писать
i := 1 + 1;
теперь не надо!
В Си так данный оператор выглядит (он значительно более общий, чем в Паскале):
for( начальный оператор; условие; действие после каждой итерации ) {
группа-команд;
}
Перед выполнением группы команд один раз выполняется начальный оператор (присваивания).
Затем проверяется условие, и если оно истинно, выполняется группа команд. После этого выполняется после-действие, затем - снова условие проверяется, если истинно - группа, итд.
Понятнее будет на практике :)
sum = 0;
for( i = 1; i <= 10; i ++ ) {
sum += i;
}
Один раз перед началом цикла выполняется оператор
i = 1;
Затем проверяется условие
i <= 10
Истинно оно? Значит, выполняется далее
sum += i;
после чего - команда
i ++;
Далее - снова условие смотрится, затем снова sum рассчитывается и так далее, пока i не превзошло десяти.
В Бейсике запись схожа с паскалевской:
For переменная = начальное значение to конечное-значение
группа-команд;
Next
Вот так программу перепишем:
sum = 0 for i = 1 to 10
sum = sum + i
Next
Console.WriteLine(sum)
Теперь - задания. Пишите по каждому программу - исходный код высылаете мне. Алгоритм - по желанию. Если сразу представили, как решить, значит можете пропустить бумажный этап. Если не выходит, попробуйте сперва на листочке. И про отладчик не забывайте!
8. Найдите сумму первой тысячи нечетных положительных чисел.
9. Вычислите факториал числа - n! .
Вводится целое число n, в результате должно быть 1*2*3*...*n.
Если вводится неположительное значение, сообщите и ничего не делайте.
Проверочные значения:
10
0
69
10. Даны два числа x (дробное) и n (целое). Вычислите x в степени n, не пользуясь стандартными функциями.
n может быть как положительным, так и нулем и отрицательным. Число в нулевой степени равно 1, число в отрицательной степени - единице, деленной на это число в положительной степени.
Проверочные значения:
3.14 2
100 0
-2 16
-5.5 -7
11. Найдите сумму первых n членов последовательности
1/a + 1/a3 (3 - это значит в 3-й степени - рассылки к сожалению блокируют надстрочный индекс!) + 1/a5 (в пятой степени) + ...
12. Вычислите для заданного n (n раз знаменатели считаются):
1 / (2 - 1/(4 + 1/ (6 - 1/8 +... )))
Проверьте при n = 10, 1, 100.
На этом изучение базовой части - ключевых операторов программирования, закончено! Можно отметить :)
Дальше - изучение принципов создания программ с графическим интерфейсом, создание собственных функций, понятие объектов, и параллельно - совершенствование общих навыков программирования.