Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 9
ДОНСКОЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра Колледж экономики, управления и права
Программирование в Delphi:
циклические структуры
Методические указания к практической работе № 4
по курсу: «Основы алгоритмизации и программирования»
Ростов-на-Дону
2011
Составитель: С.В.Шинакова
Методические указания и задания к выполнению лабораторной работы по теме " Основы алгоритмизации и программирования " / ДГТУ, Ростов-на-Дону, 2011. ** с.
Излагаются теоретические и технологические сведения, необходимые для создания программ в среде PascalABC. Целью работы ставится выработка навыков программирования при помощи современных визуальных средств.
Рецензент:
Печать оперативная. Формат 60х84/16. Бумага офсетная.
Объем 0,7 усл.-п.л., 0,7 уч.-изд.л.
Тираж ** экз.
_____________________________________________________________
ДГТУ, 2011
Цели работы сводится к освоению циклических структур. Рассматриваются различные операторы цикла, включая for, while и repeat. Обсуждаются главные отличия между операторами цикла и ситуации, в которых они используются.
Иногда некоторую группу операторов согласно алгоритму нужно выполнить многократно. Для этого в программе используются операторы цикла. В языке Object Pascal программисту предоставлены три вида операторов цикла: for, while и repeat.
Цикл for называется детерминированным. Это означает, что он может быть использован, только если количество итераций цикла можно определить до начала его выполнения. Синтаксис инкрементного цикла for имеет вид
for счетчик : = начало to конец do
begin
[операторы;]
end;
Переменная счетчик называется счетчиком цикла. Она должна быть локальной переменной любого порядкового типа. Выражения начало и конец определяют первое и последнее значение переменной счетчик. Тип выражений начало и конец должен быть совместимым по присвоению с типом переменной счетчик. Значение выражения начало должно быть меньше, или равно значению выражения конец, в противном случае операторы внутри цикла (в теле цикла) не будут выполнены ни разу. После выполнения цикла (после очередной итерации) инкрементный цикл for автоматически увеличивает значение переменной счетчик на единицу (или на одну порядковую позицию). Затем управление передается в заголовок цикла и счетчик сравнивается с выражением конец. Если счетчик меньше или равен выражению конец, то тело цикла выполняется повторно, в противном случае управление передается на оператор, следующий за оператором for, т.е. происходит выход из цикла.
Для целых числовых выражений начало и конец количество итераций оператора for равно
(конец - начало) + 1, если начало конец;
0, если начало > конец.
В следующем фрагменте кода инкрементный цикл for используется для вычисления суммы целых чисел от 1 до 100:
var
counter: Integer;
sum: Integer;
begin
sum := 0;
for counter := 1 to 100 do begin
sum := sum + counter;
end;
end;
Иногда счетчик цикла удобнее не увеличивать, а уменьшать. В этих случаях используется декрементный цикл for, синтаксис которого имеет вид
for счетчик : = начало downto конец do begin
[операторы;]
end;
Как и раньше, переменная счетчик является счетчиком цикла, а выражения начало и конец определяют первое и последнее значения переменной счетчик. Однако есть и существенное отличие: в декрементном цикле значение начало должно быть больше или равно значению конец, иначе тело цикла не выполнится ни разу. После выполнения тела цикла счетчик автоматически уменьшается на единицу (или до предыдущей порядковой позиции). Если при этом счетчик больше или равен значению выражения конец, то выполняется тело цикла, в противном случае происходит выход из цикла.
Для целых числовых выражений начало и конец количество итераций декрементного цикла for равно
{начало - конец) + 1, если начало конец;
0, если начало < конец;
Значение переменной счетчик увеличивается или уменьшается автоматически. Попытка изменить значение счетчик в теле цикла for вызовет сообщение об ошибке компиляции. Еще более опасная ошибка попытка изменить в теле цикла значения выражений начало или конец. В этом случае компилятор не сообщит об ошибке, однако изменение на цикл не подействует, так как эти выражения были вычислены один раз в начале цикла и больше не вычисляются. Заметить такую ошибку очень трудно.
Цикл for, не содержащий в своем теле ни одного оператора, называется пустым циклом. В прошлом пустые циклы часто использовались для искусственной задержки выполнения программы, однако сейчас так делать нельзя. Современные компиляторы (в частности, компилятор Delphi) оптимизируют выполнимый код. В режиме оптимизации компилятор увидит, что в цикле ничего не выполняется, и может пропустить цикл вообще. Как и операторы if, циклы for могут быть вложенными. Счетчик каждого вложенного цикла должен иметь уникальное имя.
Циклы while и repeat являются недетерминированными. Это означает, что количество итераций не обязательно должно быть известно до начала выполнения цикла. Циклы while и repeat можно также использовать вместо for в качестве детерминированных. Таким образом, каждый цикл for можно заменить эквивалентным ему циклом while или repeat, но не наоборот. Используемые в Object Pascal циклы while и repeat имеют аналоги почти во всех языках высокого уровня.
Синтаксис цикла while имеет вид
while условие do begin
[операторы;]
end;
Синтаксис цикла repeat имеет вид
repeat
[операторы; ]
until условие;
Выражение условие должно быть булева типа. Тело цикла while выполняется, если значение условия равно True. В то же время тело цикла repeat выполняется, если значение условия равно False. В этих циклах (в отличие от for) в теле цикла могут явно изменяться переменные, входящие в выражение условие, которое в этом случае называется управляющим выражением. Если условие в теле цикла не изменяется, то while или repeat превращается в бесконечный цикл.
Обратите внимание: в приведенном выше синтаксисе ключевые слова begin и end oгpaничивают тело цикла while, но не цикла repeat. Тело цикла repeat составляют все операторы, расположенные между ключевыми словами repeat и until.
Существует еще одно важное отличие между циклами while и repeat: тело цикла repeat всегда выполняется, как минимум, один раз, в то время как тело цикла while может не выполняться не разу.
Поэтому цикл repeat легко преобразовать в цикл while, однако обратное преобразование более сложная задача. Тот фактор, что тело цикла whilе может оказаться не выполненным ни разу, придется учитывать с помощью дополнительного условия if, проверяющего условие в начале цикла. Естественно, такая проверка избыточна: программист вынужден дважды вводить один и тот же код условия. Поэтому данный фактор является основным условием выбора между циклами while и repeat: если тело цикла всегда должно быть выполнено хотя бы один раз, то предпочтителен цикл repeat, в противном случае более удобен цикл whilе.
В качестве примера использования циклов while и repeat запишем с их помощью код вычисления суммы целых чисел от 1 до 100:
{Использование цикла while}
sum := 0;
count := 1;
while (count <= 100) do begin
sum := sum + count;
count := count + 1;
end;
{Использование цикла repeat}
sum := 0;
count : = 1 ;
repeat
sum := sum + count;
count := count +1;
until (count > 100);
В этих примерах переменная sum является накопителем. В ней суммируются (накапливаются) значения, образующие окончательный ответ. Обратите внимание: эти два кода очень похожи. Фактически они отличаются только условиями прерывания циклов. Для решения данной задачи одинаково пригоден любой цикл for, while или repeat. В общем случае выбор вида цикла определяется потребностями оптимизации кода и стиля программирования.
Как вы помните, счетчик цикла for должен быть переменной любого порядкового типа. Допустим, нужно преобразовать цикл for с нецелочисленным счетчиком в эквивалентный ему цикл while или repeat. Тогда в коде необходимо предусмотреть увеличение или уменьшение значения счетчика до следующего или предыдущего порядкового значения. Эта задача решается с помощью встроенных порядковых подпрограмм, перечисленных в табл. 1.
Таблица 1
Встроенные порядковые подпрограммы Pascal
Функция |
Назначение |
Odd(X: Integer): Boolean; |
Возвращает True, если аргумент является нечетным числом |
Ord(X: Char): Byte; |
Возвращает порядковое значение выражения порядкового типа |
Pred(X: Integer): Integer; |
Возвращает предыдущее порядковое значение аргумента |
Succ(X: Integer): Integer; |
Возвращает следующее порядковое значение аргумента |
Процедура |
Назначение |
Dec(var X: Integer); Dec(var X: Integer; N: Integer); |
Уменьшает порядковую переменную на 1 или на n |
Inc(var X: Integer); Inc(var X: Integer; N: Integer); |
Увеличивает порядковую переменную на 1 или на n |
Как показано в табл. 1, процедура Inc() увеличивает порядковое значение на заданную целую величину. По умолчанию, если эта величина не указана, то порядковая переменная увеличивается на 1. Таким образом, вызов Inc(x) эквивалентен оператору х := х +1, а Inc (х, n) оператору х : = х + n. Аналогично этому работает и процедура Dec(). Она уменьшает порядковое значение на указанную целую величину. Характерной особенностью процедур Inc() и Dec() является то, что они генерируют оптимизированный код, поэтому они особенно полезны в циклах.
Следующий фрагмент кода записывает в строку alphabet буквы английского алфавита в нижнем регистре. В приведенном фрагменте используется цикл while. В качестве упражнения напишите эквивалентный код с циклом repeat.
var
letter: Char;
alphabet: String;
begin
alphabet := ' ';
letter := 'a';
while (letter <= 'z') do begin
alphabet := alphabet + letter;
letter := Succ(letter);
end;
end;
В языке Pascal в циклах можно использовать стандартные процедуры BREAK и CONTINUE. Процедура BREAK позволяет выйти из цикла, не дожидаясь выполнения условия выхода. Процедура CONTINUE позволяет начать новую итерацию цикла, даже если предыдущая еще не завершена.
1. Фаронов В.В. Delphi 3. Учебный курс. М.: «Нолидж», 1998. 400 с.
2. Галисеев Г.В. Программирование в среде Delphi 8 for .NET. М.: Издательский дом «Вильямс», 2004. 304 с.
3. Павловска Т.А. Паскаль. Программирование на языке высокого уровня. СПб.: Питер, 2003. 393 с.
4. Абрамов С.А. и др. Задачи по программированию. М.: Наука, 1988. 224 с.