Выбери задачи в которых оправдано применение операторов цикла
Перейти к содержимому

Выбери задачи в которых оправдано применение операторов цикла

  • автор:

Please verify you are a human

Access to this page has been denied because we believe you are using automation tools to browse the website.

This may happen as a result of the following:

  • Javascript is disabled or blocked by an extension (ad blockers for example)
  • Your browser does not support cookies

Please make sure that Javascript and cookies are enabled on your browser and that you are not blocking them from loading.

Reference ID: #d5eda42a-95b2-11ee-9d9c-9f69b45fe146

Powered by PerimeterX , Inc.

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

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

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

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

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

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

Для организации цикла с известным числом повторений в 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 (для отрицательного шага условие I>=B ) и при его выполнении цикл повторяется. Выход из цикла осуществляется, если I>B ( IB (или A

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

Задача 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) конец.
 Program Summa; Var S, X, Pr : Real; N, I : Integer; Begin Write('Введите число слагаемых и x: '); ReadLn(N, X); Pr := 1; S := 0; For I := 1 To N Do Begin Pr := Pr * 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. Найти наименьший номер члена последовательности, для которого выполняется условие | a n — a n -1 | < e , где a n =arctg a n -1 +1, a 1=0. Вывести на экран этот номер и все элементы ai ( i = 1, 2, . n ).

Поскольку по ходу решения задачи необходимо знать a n и a n -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 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; 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) End; If Priznak Then WriteLn(N) End.

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

Контрольные вопросы и задания

  1. Назовите отличия итерационных циклов и цикла с параметром.
  2. Какова структура оператора цикла с параметром? Каков алгоритм выполнения цикла с параметром?
  3. Какого типа должны быть параметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal?
  4. Могут ли параметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal быть разных типов? Обоснуйте ответ.
  5. Может ли один цикл быть вложен внутрь другого? Если да, то какова глубина этой вложенности?
  6. Какова структура циклов с пред- и постусловием? как выполняются эти циклы?
  7. Каково минимальное и максимальное количество исполнений циклов с пред- и постусловием? С чем это связано?
  8. Сколько раз исполнится тело цикла во фрагменте программы?

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;

Циклы в программировании. Цикл while

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

Цикл while

«While» переводится с английского как «пока». Но не в смысле «до свидания», а в смысле «пока имеем это, делаем то».

Можно сказать, while является универсальным циклом. Он присутствует во всех языках, поддерживающих структурное программирование, в том числе в Python. Его синтаксис обобщенно для всех языков можно выразить так:

while логическое_выражение

Это похоже на условный оператор if . Однако в случае циклических операторов их тела могут выполняться далеко не один раз. В случае if , если логическое выражение в заголовке возвращает истину, то тело выполняется единожды. После этого поток выполнения программы возвращается в основную ветку и выполняет следующие выражения, расположенные ниже всей конструкции условного оператора.

В случае while , после того как его тело выполнено, поток возвращается к заголовку цикла и снова проверяет условие. Если логическое выражение возвращает истину, то тело снова выполняется. Потом снова возвращаемся к заголовку и так далее.

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

Рассмотрите блок-схему цикла while .

Блок-схема цикла while

На ней ярко-голубыми прямоугольниками обозначена основная ветка программы, ромбом – заголовок цикла с логическим выражением, бирюзовым прямоугольником – тело цикла.

С циклом while возможны две исключительные ситуации:

  • Если при первом заходе в цикл логическое выражение возвращает False , то тело цикла не выполняется ни разу. Эту ситуацию можно считать нормальной, так как при определенных условиях логика программы может предполагать отсутствие необходимости в выполнении выражений тела цикла.
  • Если логическое выражение в заголовке while никогда не возвращает False , а всегда остается равным True , то цикл никогда не завершится, если только в его теле нет оператора принудительного выхода из цикла ( break ) или вызовов функций выхода из программы – quit() , exit() в случае Python. Если цикл повторяется и повторяется бесконечное количество раз, то в программе происходит зацикливание. В это время она зависает и самостоятельно завершиться не может.

Вспомним наш пример из урока про исключения. Пользователь должен ввести целое число. Поскольку функция input() возвращает строку, то программный код должен преобразовать введенное к целочисленному типу с помощью функции int() . Однако, если были введены символы, не являющиеся цифрами, то возникает исключение ValueError , которое обрабатывается веткой except . На этом программа завершается.

Другими словами, если бы программа предполагала дальнейшие действия с числом (например, проверку на четность), а она его не получила, то единственное, что программа могла сделать, это закончить свою работу досрочно.

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

n = input("Введите целое число: ") while type(n) != int: try: n = int(n) except ValueError: print("Неправильно ввели!") n = input("Введите целое число: ") if n % 2 == 0: print("Четное") else: print("Нечетное")

Примечание 1. Не забываем, в языке программирования Python в конце заголовков сложных инструкций ставится двоеточие.

Примечание 2. В выражении type(n) != int с помощью функции type() проверяется тип переменной n . Если он не равен int , то есть значение n не является целым числом, а является в данном случае строкой, то выражение возвращает истину. Если же тип n равен int , то данное логическое выражение возвращает ложь.

Примечание 3. Оператор % в языке Python используется для нахождения остатка от деления. Так, если число четное, то оно без остатка делится на 2, то есть остаток будет равен нулю. Если число нечетное, то остаток будет равен единице.

Проследим алгоритм выполнения этого кода. Пользователь вводит данные, они имеют строковый тип и присваиваются переменной n . В заголовке while проверяется тип n . При первом входе в цикл тип n всегда строковый, то есть он не равен int . Следовательно, логическое выражение возвращает истину, что позволяет зайти в тело цикла.

Здесь в ветке try совершается попытка преобразования строки к целочисленному типу. Если она была удачной, то ветка except пропускается, и поток выполнения снова возвращается к заголовку while .

Теперь n связана с целым числом, следовательно, ее тип int , который не может быть не равен int . Он ему равен. Таким образом логическое выражение type(n) != int возвращает False , и весь цикл завершает свою работу. Далее поток выполнения переходит к оператору if-else, находящемуся в основной ветке программы. Здесь могло бы находиться что угодно, не обязательно условный оператор.

Вернемся назад. Если в теле try попытка преобразования к числу была неудачной, и было выброшено исключение ValueError , то поток выполнения программы отправляется в ветку except и выполняет находящиеся здесь выражения, последнее из которых просит пользователя снова ввести данные. Переменная n теперь имеет новое значение.

После завершения except снова проверяется логическое выражение в заголовке цикла. Оно даст True , так как значение n по-прежнему строка.

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

Рассмотрим следующий пример:

total = 100 i = 0 while i  5: n = int(input()) total = total - n i = i + 1 print("Осталось", total)

Сколько раз «прокрутится» цикл в этой программе, то есть сколько итераций он сделает? Ответ: 5.

  1. Сначала переменная i равна 0. В заголовке цикла проверяется условие i < 5 , и оно истинно. Тело цикла выполняется. В нем меняется значение i , путем добавления к нему единицы.
  2. Теперь переменная i равна 1. Это меньше пяти, и тело цикла выполняется второй раз. В нем i меняется, ее новое значение 2.
  3. Два меньше пяти. Тело цикла выполняется третий раз. Значение i становится равным трем.
  4. Три меньше пяти. На этой итерации i присваивается 4.
  5. Четыре по прежнему меньше пяти. К i добавляется единица, и теперь ее значение равно пяти.

«Смысловая нагрузка» данного цикла – это последовательное вычитание из переменной total вводимых чисел. Переменная i в данном случае играет только роль счетчика итераций цикла. В других языках программирования для таких случаев предусмотрен цикл for , который так и называется: «цикл со счетчиком». Его преимущество заключается в том, что в теле цикла не надо изменять переменную-счетчик, ее значение меняется автоматически в заголовке for .

В языке Python тоже есть цикл for . Но это не цикл со счетчиком. В Питоне он предназначен для перебора элементов последовательностей и других сложных объектов. Данный цикл и последовательности будут изучены в последующих уроках.

Для while наличие счетчика не обязательно. Представим, что надо вводить числа, пока переменная total больше нуля. Тогда код будет выглядеть так:

total = 100 while total > 0: n = int(input()) total = total - n print("Ресурс исчерпан")

Сколько раз здесь выполнится цикл? Неизвестно, все зависит от вводимых значений. Поэтому у цикла со счетчиком известно количество итераций, а у цикла без счетчика – нет.

Самое главное для цикла while – чтобы в его теле происходили изменения значений переменных, которые проверяются в его заголовке, и чтобы хоть когда-нибудь наступил случай, когда логическое выражение в заголовке возвращает False . Иначе произойдет зацикливание.

Примечание 1. Не обязательно в выражениях total = total — n и i = i + 1 повторять одну и ту же переменную. В Python допустим сокращенный способ записи подобных выражений: total -= n и i += 1 .

Примечание 2. При использовании счетчика он не обязательно должен увеличиваться на единицу, а может изменяться в любую сторону на любое значение. Например, если надо вывести числа кратные пяти от 100 до 0, то изменение счетчика будет таким i = i — 5 , или i -= 5 .

Примечание 3. Для счетчика не обязательно использовать переменную с идентификатором i . Можно назвать переменную-счетчик как угодно. Однако так принято в программировании, что счетчики обозначают именами i и j (иногда одновременно требуются два счетчика).

Практическая работа

  1. Измените последний код из урока так, чтобы переменная total не могла уйти в минус. Например, после предыдущих вычитаний ее значение стало равным 25. Пользователь вводит число 30. Однако программа не выполняет вычитание, а выводит сообщение о недопустимости операции, после чего осуществляет выход из цикла.
  2. Используя цикл while , выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как ** . Фрагмент вывода:
. 32 64 128 256 512 1024 .

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Выбери задачи в которых оправдано применение операторов цикла

Ввести значения $$ x$$ и $$ n$$. Вычислить сумму ряда $$ 1+x+^+^+\dots +^$$.

Сумма вычисляется накопительным путём: сначала вычисляется каждое слагаемое, а потом оно добавляется в сумму. Каждое слагаемое также вычисляется накопительным путём.
var x,n,i,s,a:integer;
begin
write(‘введите значения x и n’);
readln(x,n);
S:=1; a:=1
for i:=1 to n do
begin
a:=a*x; s:=s+a
end;
writeln(s);
readln
end.
Заметим, что эту задачу можно решить, воспользовавшись формулой суммы первых `n` членов геометрической прогрессии, но наша цель не решить конкретную задачу, а понять принцип накапливания (суммы). Ибо далеко не любая последовательность чисел является геометрической или арифметической прогрессией.

Вводится последовательность натуральных чисел. Признак конца ввода – число `0`. Вывести среднее арифметическое чисел из последовательности (`0` не учитывается).

Эта задача относится к очень важному классу задач – обработка последовательностей с признаком конца и заранее неизвестным количеством элементов. В таких задачах нужно пользоваться операторами while и repeat . Причём, если оговаривается, что последовательность непустая, можно использовать repeat , а если этого не оговаривается, как в данной задаче, то нужно обязательно пользоваться циклом while , так как цикл repeat всегда выполняется, по крайней мере, один раз. Приведём полный текст решения. Переменная `s` подсчитывает сумму элементов последовательности, а переменная `k` – их количество.

var a,s,k:integer;
begin
s:=0; k:=0;
writeln(‘Введите последовательность натуральных чисел. Ноль – признак конца’);
read(a);
while a<>0 do
begin s:=s+a; k:=k+1; read(a) end;

Writeln(‘среднее арифметическое=’,s/k:0:4)
end.
Обратите внимание, что для ввода данных используется оператор read . Это позволяет набивать элементы в строчку через пробел. Если же использовать readln , то набивать значения придётся в столбик, что неудобно. Ещё одно важное замечание в этой задаче – оператор ввода внутри цикла должен быть последним, чтобы сразу попадать на проверку признака конца. Эти замечания относятся ко ВСЕМ задачам на обработку последовательностей с признаком конца.

Ввести целое число `n`. Вывести YES, если оно простое, и NO, если оно составное.

Эта задача демонстрирует сразу две важные вещи. Во-первых, как проверять делимость целых чисел, а во-вторых, технику флажков. Флажком называется переменная, которая имеет некоторое начальное значение и меняет его, если происходит определённое событие. Как правило, флажок имеет тип boolean .

В нашей задаче мы будем перебирать числа от `2` до квадратного корня из `n` и проверять, делится ли `n` на каждое из них. Изначально предположим, что `n` – простое, и присвоим флажку значение true , но если `n` поделится на какое-нибудь число, это будет значить, что оно составное, и, соответственно, флажок «упадёт» на значение false . Проверять на делимость нужно, сравнивая остаток от деления с нулём.
var n,i:integer;
f:boolean;
begin
Write(‘Введите значение n ‘);
Readln(n);
f:=true;
for i:=2 to round(sqrt(n)) do
if n mod i = 0 then f:=false else;
if f=true
then writeln(‘YES’)
else writeln(‘NO’);
Readln
end.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *