Операторы цикла

Задачи целочисленной арифметики


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


Для организации цикла необходимо выполнить следующие действия:


перед началом цикла задать начальное значение параметра;


внутри цикла изменять параметр цикла с помощью оператора присваивания;


проверять условие повторения или окончания цикла;


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


Различают циклы с известным числом повторений (цикл с параметром) и итерационные (с пред- и постусловием).


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


Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла.


Для организации цикла с известным числом повторений в 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.


Предлагаем читателю самостоятельно разобраться с представленным решением.

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Операторы цикла

Слов:1435
Символов:10686
Размер:20.87 Кб.