comp-science.narod.ru ==> Дидактические материалы по информатике ==> Операторы цикла
Командой повторения или циклом называется такая форма организации действий, при которой одна и та же последовательность действий (тело цикла) повторяется до тех пор, пока сохраняется значение некоторого логического выражения. При изменении значения логического выражения на противоположное повторения прекращаются (цикл завершается).
Для организации цикла необходимо выполнить следующие действия:
Различают циклы с известным числом повторений (цикл с параметром) и итерационные (с пред- и постусловием).
В цикле с известным числом повторений параметр изменяется в заданном диапазоне.
Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла.
Для организации цикла с известным числом повторений в Pascal используется оператор for.
Структура цикла, организованного с помощью этого оператора, имеет вид:
For I := A To B Do Begin <операторы> End;или
For I := A DownTo B Do Begin <операторы> End;Здесь I параметр, изменяющийся в цикле; A, B выражения порядкового типа, обозначающие начальное, конечное значение параметра цикла. Шаг изменения порядкового номера параметра цикла равен 1, если в заголовке цикла стоит To (т.е. реально следующее значение параметра цикла вычисляется с помощью функции succ); и -1 при DownTo (вычисление производится с помощью функции pred).
Порядок выполнения цикла с шагом 1 следующий: вычисляются значения начального и конечного значений параметра цикла; параметр если I принимает начальное значение; если I меньше или равно конечному значению, исполняется тело цикла; значение параметра цикла увеличивается, т.е. I := succ(I); проверяется условие I<=B (для отрицательного шага условие I>=B) и при его выполнении цикл повторяется. Выход из цикла осуществляется, если I>B (I<B для H=-1), и выполняется оператор, следующий за оператором цикла. Если A>B (или A<B для H=-1), то цикл не исполняется ни разу.
Если в операторе цикла с параметром начальное или конечное значение параметра заданы переменными или выражениями, то значения этих переменных должны быть определены в программе до оператора цикла. Не следует внутри цикла изменять параметр цикла, его начальное и конечное значения с помощью операторов присваивания или ввода.
Задача 1. Дано натуральное n, действительное x. Вычислить
Разработаем алгоритм решения задачи:
1) ввести данные - количество слагаемых n и число x; 2) присвоить переменной, в которой будем хранить степени sin x, значение 1; S := 0; 3) присвоить параметру цикла значение 1; 4) если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9; 5) вычислить очередную степень sin x; 6) добавить вычисленное значение к сумме; 7) увеличить параметр цикла на 1; 8) перейти к п.4; 9) вывести на печать сумму S; 10) конец.
{Программа вычисления суммы степеней sin x} Program Summa; Var S, X, Pr : Real; N, I : Integer; Begin Write('Введите число слагаемых и x: '); ReadLn(N, X); Pr := 1; {в этой переменной хранятся последовательные степени sin x} S := 0; For I := 1 To N Do Begin Pr := Pr * Sin(X); {Очередная степень Sin(x)} S := S + Pr End; WriteLn('Сумма равна ', S : 7 : 4) End.
Достаточно часто цикл с параметром используется при разработке программ обработки массивов.
Примечание. Как видно из рассказа, приведённого выше, область применения цикла с параметром в языке Pascal значительно ограничена: ограничения связаны с шагом изменения параметра цикла, с типом параметра цикла, его начального и конечного значения. В некоторых языках, например, в Basic, таких ограничений не существует.
По сравнению с циклом с параметром итерационные циклы являются универсальными. Для организации итерационных циклов используются операторы цикла с предусловием while и цикла с постусловием repeat..until.
Эти операторы не задают закон изменения параметра цикла, поэтому необходимо перед циклом задавать начальное значение параметра с помощью оператора присваивания, а внутри цикла изменять текущее значение этого параметра.
Соответствующие структуры циклов:
while B Do Begin <операторы> End; Repeat <операторы> Until C;
Здесь B, C логические выражения.
Для оператора цикла с предусловием проверяется значение логического выражения, если оно имеет значение True, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выполнение оператора, следующего за циклом.
Цикл с постусловием выполняется хотя бы один раз. Затем проверяется значение логического выражения, если оно False, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выход из цикла.
Входить в цикл можно только через его начало, т.е. нельзя входить внутрь цикла с помощью управляющего оператора, т.к. в этом случае параметр цикла не определен.
Задача 2. Найти наименьший номер члена последовательности, для которого выполняется условие |an-an-1|<e, где an=arctg an-1+1, a1=0. Вывести на экран этот номер и все элементы ai (i = 1, 2, ..., n).
Поскольку по ходу решения задачи необходимо знать an и an-1, будем запоминать их соответственно в переменных ANew и AOld.
Program Posled; Var Eps, AOld, ANew : Real; N : Integer; Begin Write('Введите число Epsilon '); ReadLn(Eps); AOld := 0; ANew := ArcTan(AOld) + 1; N := 2; WriteLn(AOld : 8 :5); WriteLn(ANew : 8 :5); While Abs(ANew - AOld) >= Eps Do Begin AOld := ANew; ANew := ArcTan(AOld) + 1; WriteLn(ANew : 8 :5); N := N + 1 End; WriteLn('Искомый номер ', N) End.
Внутрь одного цикла может входить один или несколько других. При этом охватывающий цикл называется внешним, а вложенные циклы внутренними. Правила организации как внешнего, так и внутренних циклов такие же, как и простого цикла.
Задача 3. На интервале [2; n] найти натуральное число с максимальной суммой делителей.
Предлагаемая задача может быть отнесена к классу «задачи целочисленной арифметики», где аргументы, результаты и промежуточные величины относятся к целому типу. Следует заметить, что в такого рода задачах довольно часто используются операции DIV и MOD; наиболее типичной подзадачей является определение количества цифр в записи числа.
Алгоритм решения задачи:
1) ввести число n; 2) переменной для хранения максимальной суммы делителей присвоить значение 1 (это сумма делителей числа 1); 3) запомнить число с максимальной суммой делителей; 4) параметру цикла I присвоить значение 2; 5) если I больше n, перейти к п. 13, иначе - к следующему пункту; 6) переменной для хранения очередной суммы делителей присвоить значение 0; 7) параметру цикла K присвоить значение 1; 8) если K больше I/2, перейти к п. 11, иначе - к следующему пункту; 9) если I делится на K без остатка, добавить K к текущей сумме делителей; 10) увеличить K на 1 и перейти к п. 8; 11) сравнить текущую сумму делителей с максимальной, если максимальная меньше, запомнить новое значение и число, соответствующее этой сумме; 12) увеличить I на 1 и перейти к п. 5; 13) вывести число с максимальной суммой делителей и эту сумму; 14) конец.
Program Sum_Del; Var N, I, Sum_Max, Sum, K, Ch : Integer; Begin Write('Введите число N: '); ReadLn(N); Sum_Max := 1; {Максимальная сумма делителей} Ch := 1; {Число с максимальной суммой делителей} For I := 2 To N Do {Это цикл по количеству чисел} Begin Sum := 0; For K := 1 To I Div 2 + 1 Do {В этом цикле находим сумму делителей} If I Mod K = 0 Then {Если I нацело делится на K, то K - делитель I} Sum := Sum + K; Sum := Sum + I; If Sum > Sum_Max Then Begin Sum_Max := Sum; Ch := I End; End; WriteLn('Максимальную сумму делителей ', Sum_Max, ' имеет число ',Ch) End.
Задача 4. Дано натуральное число n. Получить все простые делители этого числа.
{Программа отыскания простых делителей данного числа} Program Pr_Del; Var N, I, Vsp : Integer; Log_Per, Priznak : Boolean; Begin Write('Введите натуральное число: '); ReadLn(N); Priznak := True; {Признак того, не является ли введенное число простым} {Пока параметр цикла не превысил квадратного корня из данного числа, продолжаем поиск простых делителей} For I := 2 To Round(Sqrt(N)) Do If N Mod I = 0 Then Begin Priznak := False; {Введенное число не является простым} Log_Per := False; {Логическая переменная, принимающая значение True, если нашлись делители I, отличные от 1 и I} Vsp := 2; Repeat If (I Mod Vsp = 0) And (I <> Vsp) Then Log_Per := True; Vsp := Vsp + 1 Until (Vsp > I Div 2 + 1) Or Log_Per; If Not(Log_Per) Then WriteLn(I) {Если число I простое, печатаем его} End; If Priznak Then WriteLn(N) End.
Предлагаем читателю самостоятельно разобраться с представленным решением.
For i := 1 to -1 Do k:=k*i;
For i := -1 to 1 Do k:=k*i;
For i := 1 downto -1 Do k:=k*i;
M := 123; While M <> 0 Do M := M Mod 10;
© А.П. Шестаков, 2001