Организация циклов
Цикл — это фрагмент программы, повторяемый многократно. В Паскале три оператора цикла — while, repeat и for. В принципе, без них можно обойтись, поскольку любой цикл можно реализовать с помощью условного оператора if и оператора перехода goto, но операторы цикла гораздо удобнее и нагляднее. У каждого из них есть предпочтительная область применения.
Все циклы имеют схожую структуру (рис. 2.1). Операторы, ради многократного выполнения которых организуется цикл, называются телом цикла. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла. Один проход цикла называется итерацией.
На этапе начальных установок (до входа в цикл) задаются значения переменных, которые в нем используются. Эти значения могут задаваться явно или неявно.
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации (для этого применяется процедура continue), так и цикла в целом (процедура break и оператор goto). Передавать управление извне внутрь цикла не рекомендуется, потому что при этом не выполнятся начальные установки. Иными словами, выйти из цикла можно в любой момент, а войти — только в начало (примерно как в самолете).
2.1 Цикл с предусловием while
В цикле с предусловием проверка условия продолжения цикла выполняется перед телом цикла (рис. 2.1,а). Если при входе в цикл условие не выполняется, он не будет выполнен ни разу.
Оператор цикла имеет вид
while выражение dо оператор
Рис. 2.1. Структурная схема операторов цикла:
а — цикл с предусловием; б — цикл с постусловием
2.2 Цикл с постусловием repeat
Оператор цикла с постусловием реализует структурную схему, приведенную на рис. 2.1,б, и имеет вид
В отличие от цикла while, этот цикл будет выполняться, пока ложно логическое выражение, указанное после слова until. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла. Тело цикла заключено между служебными словами repeat и until, поэтому дополнительно заключать его между ключевыми словами begin и end не требуется.
Цикл repeat применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз: например, если в нем вводятся данные и выполняется их проверка. Если же такой необходимости нет, предпочтительнее пользоваться циклом с предусловием.
2.3 Цикл с параметром for
Параметром цикла называется переменная, которая используется при проверке условия продолжения цикла и принудительно изменяется на одну и ту же величину на каждой итерации. Если параметр цикла целочисленный, он называется счетчиком цикла. В циклах for языка Паскаль используется счетчик, который автоматически либо увеличивается, либо уменьшается на единицу. Соответственно, есть две формы записей этого цикла:
for параметр := выражение_1 to выражение_2 do оператор
for параметр : = выражение_2 downto выражение_1 do оператор
Параметр цикла должен быть порядкового типа. Напомним, что к порядковым из стандартных типов относятся целые, символьный и логические типы.
Выражения должны быть совместимы по присваиванию с переменной цикла. Они вычисляются один раз до входа в цикл. Оператор for реализован в Паскале как цикл с предусловием. Таким образом, если в первой форме выражение_1 будет больше, чем выражение_2, а во второй — меньше, тело такого цикла не будет выполнено ни разу.
Дата добавления: 2015-08-08 ; просмотров: 2269 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Источник
Организация циклов
Цикл, как известно, представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются “вручную”. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр ecx/cx как счетчик цикла.
Дадим краткую характеристику этим командам:
§ loop метка_перехода (Loop, управление циклом по cx) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Выполнение команды не влияет на флаги . Работа команды заключается в выполнении следующих действий:
· декремента регистра ecx/cx (счетчик цикла);
· сравнения регистра ecx/cx с нулем:
o если (ecx/cx) > 0, то управление передается на метку перехода;
o если (ecx/cx) = 0, то управление передается на следующую после loop команду.
Применение:
Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла. Помните о двух важных моментах:
· для предотвращения выполнения цикла при нулевом ecx/cx используйте команду jecxz/jcxz. Если этого не сделать, то при изначально нулевом ecx/cx, инструкция loop вычтет из нуля единицу, и в результате получится число 0ffffffff/0ffff, а это значит, что вместо нуля цикл выполнится 4 294 967 295/65 535 раз;
· смещение метки, являющейся операндом loop, не должно выходить из диапазона -128. +127 байт. Это смещение, как и в командах условного перехода, является относительным от значения счетчика адреса следующей за loop команды.
§ loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0, управление циклом по cx c учетом значения флага ZF) — повторить цикл, пока cx <> 0 или zf = 0. Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. выполнение команды не влияет на флаги . Работа команд заключается в выполнении следующих действий:
· декремента регистра ecx/cx;
· сравнения регистра ecx/cx с нулем;
· анализа состояния флага нуля zf:
o если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;
o если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.
Применяется данная команда в случае, если нужно досрочно выйти из цикла, как только находится первый элемент, отличный от заданной величины.
§ loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1. Команды loopne и loopnz также абсолютные синонимы. выполнение команды не влияет на флаги. Работа команд заключается в выполнении следующих действий:
· декремента регистра ecx/cx;
· сравнения регистра ecx/cx с нулем;
· анализа состояния флага нуля zf:
o если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;
o если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.
Применяется данная команда в случае, если нужно досрочно выйти из цикла, как только находится первый элемент, равный заданной величине.
Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.
Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp.
Применение:
Команды loopxx удобно использовать вместе с командами, которыe в результате своей работы меняют значение флага zf. Типичный пример — команда сравнения cmp.
;найти первый пробел в строке символовstr db 'Найти первый пробел'str_size=$-str. cld mov cx,str_size lea si,strcycl: lodsb cmp al,' ' loopne cycl jcxz m1 ;переход, если пробелов нет dec si ;в si — адрес пробела в строке str. m1
Источник
Организация циклов
Циклом называется многократно повторяющаяся последовательность действий (операторов). Цикл – типичная структура, характерная для программ, реализуемых на компьютере. Средства языка C# для организации циклов приводятся в п. 1.7.2, 1.7.3, 1.7.4.
2.1.1. Циклы по счетчику
Рассмотрим вначале циклы по счетчику, т.е. когда количество повторений цикла известно до начала его выполнения.
При организации цикла по счетчику необходимо:
1) выделить повторяющиеся действия и записать их в общем виде;
2) выбрать управляющую переменную цикла. Это может быть какая-либо величина, имеющаяся в постановке задачи, либо используемая специально в качестве счетчика;
3) определить параметры цикла, т.е. начальное и конечное значения управляющей переменной и шаг ее изменения.
Пример 2.1. Пусть требуется вычислить сумму
S = 1 + 2 + 3 + … +100.
Организуем вычисления так, чтобы на каждом шаге выполнялись простые действия, в данном случае это прибавление к сумме очередного слагаемого. Вначале необходимо обнулить переменную, в которой будет накапливаться сумма (s = 0), а затем на каждом шаге добавлять к сумме очередной член, т.е. многократно выполнять операцию
s = s + i, где i = 1, 2, 3, . , 100.
Таким образом, в качестве управляющей переменной цикла в данном случае можно использовать сам член суммы, который изменяется в заданных пределах (от 1 до 100) с заданным шагом 1.
Тогда программа будет иметь следующий вид:
static void Main(string[] args)
for (i = 1; i 2 + 3 3 + … + 3 8 .
На каждом шаге алгоритма необходимо прибавлять к сумме очередное слагаемое (s = s + 3 i ), где i = 1, 2, 3, . , 8. Вспомним, что операция возведения в степень в языке C# отсутствует, поэтому следующий член суммы будем получать из предыдущего домножением его на 3. В качестве управляющей переменной цикла можно использовать показатель степени, изменяющийся в заданных пределах от 1 до 8 с заданным шагом, равным 1. Программа, таким образом, будет иметь следующий вид (здесь и далее приводится только алгоритмическая часть проекта):
2. Для вычисления использован метод Pow класса Math.
3. Наличие символа \t в строке формата обеспечивает табуляцию при выводе каждого значения y, что обеспечивает большую наглядность результата. (Этого эффекта можно добиться и другими способами. Предложите их самостоятельно.)
Второй вариант программы.Используется цикл do.
const double xh = -2.5, xk = 2.5, h = 0.5;
y = Math.Pow(x, 2) + 0.5 * x;
Console.WriteLine(«x = <0:f2>\ty = <1:f2>«, x, y);
while (x p, необходимо выйти из цикла.
Далее приводится программа для решения задачи при a = 2, h = 3, p = 41. В программе текущее значение номера члена суммы обозначено через n. Значение этой переменной, при котором впервые оказалась s > p, и будет результатом.
int s = 0, n = 0, m;
const int a = 2, h = 3, p = 41;
Console.WriteLine(«Сумма равна <0:f4>«, s);
Пример 2.10. Методом итераций найти корень уравнения на отрезке [-1, 0.3] с точностью ε = 0.0001, принимая за начальное приближение x0 = -0.4 и вычисляя последовательно
, i = 1, 2, 3, …, пока не будет выполнено условие
.
При программной реализации метода итераций нет необходимости в использовании переменных с индексами. Для организации вычислительного процесса необходимо одновременно иметь в памяти значения лишь двух последовательных приближений (обозначим их х0 и х1). Следующее приближение х1 получается из предыдущего х0. Если условие достижения точности аbs(х1–х0)£ не выполняется, то следует переслать значение х1 в переменную х0 (х0=х1) и получить в х1 следующее приближение.
При организации цикла проверку условия удобно осуществлять после первого прохождения цикла, т.е. использовать цикл do … while.
const double eps = 0.0001;
x1 = 0.5 * (Math.Sin(x0 * x0) — 1);
d = Math.Abs(x1 — x0);
Console.WriteLine(«Корень равен <0:f4>«, x1);
Пример 2.11. Вычислить частное p и остаток q от деления двух натуральных чисел r и t, не используя операцию деления. Число r можно представить в виде . Будем последовательно вычитать t из r и подсчитывать количество вычитаний в переменной p. Значение q — результат последнего вычитания, когда в первый раз будет выполнено условие
.
Console.WriteLine(«Частное <0:d>Остаток <1:d>«, p, q);
Здесь используется цикл с проверкой условия до первого выполнения тела цикла (что важно), так как возможен случай, когда r = eps);
y = Math.Cos(x) + x * Math.Sin(x);
Вопросы для самопроверки
1. Что такое цикл? Операторы цикла for, while, do … while. Различия между ними.
2. Какие данные необходимы для организации цикла for? Что такое управляющая переменная цикла?
3. Циклы по условию и их организация.
4. Операторы break и continue. В каких случаях они используются?
5. Типовые алгоритмы циклической структуры: вычисление суммы n слагаемых, вычисление произведения n сомножителей, вычисление факториала, табулирование функции.
6. Вычисление суммы с использованием рекуррентных соотношений.
Источник