Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Циклическая структура. Назначение и основные элементы



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

Определение. Цикл – это последовательность операторов, которая может выполняться более одного раза.

Определение. Циклический алгоритм – это алгоритм, содержащий один или несколько циклов.

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

Исходными данными в этом случае являются переменная N - количество чисел и сами эти числа. Значение очередного числа обозначим переменной Х. Результатом работы алгоритма станет сумма этих чисел, которую обозначим переменной S.

S=x1+x2+x3+...+xn

Допустимые значения переменной N должны удовлетворять условию n>0, так как количество слагаемых не может быть числом отрицательным.

Как же мы должны решать эту задачу? Сначала нужно запросить, сколько чисел нужно будет сложить и считать это число в переменную N. Затем нужно так организовать операторы, чтобы программа запрашивала очередное число и каждый раз складывала его с предыдущими; и повторяла эту группу операторов N раз.

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

Познакомимся с первым из них – оператором цикла с предусловием while.

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

При выполнении оператора while определенная группа операторов выполняется до тех пор, пока определенное в операторе while булево условие истинно. Если условие сразу ложно, то оператор не выполнится ни разу.

Общая форма записи следующая

while <булево выражение> do
begin
группа операторов
end;

На русском языке это звучит примерно так:

пока выполняется это условие делай

от начала
группа операторов
до конца;

Вполне понятно, что операторные скобки ставят, чтобы отделить от остальной программы ту группу операторов, которую нужно повторить в цикле. Если в цикле нужно выполнить только один оператор, то операторные скобки не ставят.

При использовании цикла с предусловием надо помнить следующее:

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

Вернемся к нашей задаче вычисления суммы чисел. При вычислении суммы используем следующий прием: вначале, когда еще не задано ни одно слагаемое, сумму полагают равной нулю (S:=0), а затем, получая очередное слагаемое, прибавляют его к сумме (S:=S+x) (см. программу ниже).

Очень важное значение в операторе цикла имеет так называемая переменная цикла. В нашей программе она называется i. С ее помощью мы обращаемся к пользователю за очередным числом (write (‘Введите ‘,i,’-ое число ’)) и считаем количество уже введенных чисел (i:=i+1), чтобы не запросить лишнее. Одновременно переменная цикла участвует в булевом выражении (i<=N).

Рассмотрите внимательно программу, решающую нашу задачу.

Program Summa;
Uses
Crt;
Var
i,
N: integer;
x, S: real;
Begin
ClrScr;
write (‘Сколько чисел для сложения? ‘);
readln (N);
S:=0;
i:=1;
while i<=N do
begin
write (‘Введите ‘,i,’-е число ’);
readln (x);
S:=S+x;
i:=i+1;
end;
write (‘Сумма введенных чисел равна ‘,s:5:2);
readln;
End.

Хотелось бы, чтобы Вы смогли представить работу этой программы. Давайте попробуем вместе.

Пусть нам требуется сложить следующие числа: 5, 7, -4, 0, 8, 20. Посчитаем, сколько их всего – шесть. Это число мы введем, когда программа задаст вопрос: Сколько чисел для сложения? Теперь наша программа запросит ввести 1-ое число, т. к. на первом шаге переменная i равна 1. Мы введем число 5. Программа считает его в переменную х. Теперь число 5 сложим с числом 0 и результат присвоим переменной S (оператор S:=S+x). В этот момент S становится равной 5. Чтобы перейти к следующему числу, увеличим значение переменной i на 1 (оператор i:=i+1). Выполнение операторов тела цикла закончено. Теперь программа переходит опять к анализу условия вхождения в цикл (i<=N). Переменная цикла i=2, переменная N=6, поэтому значение логического условия 2<=6 равно True. Значит снова выполняется тело цикла:

while i<=N do {2<=6}
begin
write (‘Введите ‘,i,’-ое число ’); {Введите 2-е число}
readln (x); {Считали число 7}
S:=S+x; {S:=5+7}
i:=i+1; {i:=2+1}
end;

Итак, мы сложили два числа и переходим опять к проверке условия. Ответим на вопрос: 3<=6? Да. Поэтому снова начинаю работать операторы тела цикла и мы переходим к третьему числу:

while i<=N do {3<=6}
begin
write (‘Введите ‘,i,’-ое число ’); {Введите 3-е число}
readln (x); {Считали число -4}
S:=S+x; {S:=12 + (-4)}
i:=i+1; {i:=3+1}
end;

Аналогично, мы сложим и остальные числа. Но когда же операторы цикла выполнятся последний раз и остановится работа цикла? Когда сложим последнее число. Проверим это.

while i<=N do {6<=6}
begin
write (‘Введите ‘,i,’-ое число ’); {Введите 6-е число}
readln (x); {Считали число 20}
S:=S+x; {S:=16+20}
i:=i+1; {i:=6+1}
end;

Проверяется опять условие 7<=6. Значение этого условия равно False, а значит тело цикла выполняться не будет. Цикл закончил свою работу. А мы получили результат: посчитали сумму всех шести чисел S=32.

В этом примере известно заранее количество повторений - N раз. Но чаще всего этот вид цикла используется тогда, когда количество повторений заранее не известно и зависит от выполнения какого-либо условия. Рассмотрим еще один пример.

Отвлечемся от цифр и вспомним окружающую жизнь. Сколько циклических алгоритмов можно увидеть вокруг, если внимательно посмотреть на события: чередование времен года, посещения магазинов, школы или секции, получение за контрольные оценок и др. Попробуем записать их.

Например, рассмотрите следующие циклические алгоритмы

а) Пока не сдал выпускные экзамены делай
начало
готовь уроки;
посещай школу;
конец;

б) Пока есть желание, возможность и здоровье делай
посещай занятия спортом

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

ЦИКЛ С ПАРАМЕТРОМ --- for...to...do... и for...downto...do...

Третий вариант оператора цикла - цикл со счётчиком. (с параметром). Можно считать, что есть две очень похожиг друг на друга разновидности цикла со счётчиком. Первый из этих операторов имеет вид

for j:= expression1 to expression2 do statement;

Здесь переменная j, называемая управляющей перменной цикла for, является произвольным идентификатором, который объявляется как перменная любого скалярного типа (к скалярным относятмя целый символьный, булев и перечисляемый типы).
При выполнении оператора for сначала вычисляется значение выражения expression1, затем вычислятся значение выражения expression2, далее управляющая перменная цикла последовательно пробегает все значниея от expression1 до expression2. В том случае, когда значине expression1 оказывается больше значения expression2, тело цикла не будет выполняться вовсе. Эти значения остаются неизменными в ходе выполнения всего цикла for. Рассматриваемый вариант цикла for эквивалентен следующей последовательности операторов:

j:= expression1;

k:= expression2;

while j <= k do

begin

statement;

inc(j);

end;

в предположении, что при каждом выполнении оператора statement не изменяются значения j и k.
Оператор for вида for j:= expression1 to expression2 do statement; неэквивалентен последовательности операторов

begin

j:= expression1;

while j <= expression2 do

begin

statement;

j:= j + 1;

end;

end;

потому что выражение expression2 может изменяться при каждом выполнении оператора statement в цикле while.
В теле цикла for следует избегать операторов, изменяющих значние управляющей переменной j. Несмотря на то, что использование подобных конструкций не приводит к ошибкам компиляции, они потенциально опасны и могут приводит к неприятным последствиям. Рассмотрим пример:

sum:= 0;

for k:= 1 to 100 do

begin

sum:= sum + SQR(k); k:= k + 2;

end;

Этот фрагмент программы явялется попыткой просуммировать n2 по всем целым значениям вида n = (3*k+1), лежащим в диапазоне от 1 до 100. Здесь допущена обшибка реализации алгоритма, так как управляющая переменная k изменяется в сставном операторе, управляемой той же переменной kю Правильной будет конструкция следующего вида:

sum:=0;

for k:= to 33 do sum:= sum + Sqr(3*k+1);

или

sum:= 0; k:= 1;

repeat

sum:= sum + Sqr(k); k:= k + 3;

until k > 100;

После выполнения цикла for значения управляющей переменной становиться неопределённым.
Вариант for...downto...do... цикла for аналогичен циклу for...to...do... за исключением того, что в нём управляющая переменная на каждом шаге выполнения не увеличивается, а уменьшается на единицу:

for j:= expression1 downto expression2 do statement;

Используейте цикл for в том случае, когда точно знаете, сколько раз должно быть выполнено тело цикла. В противном случае обратитесь к циклам repeat или while.

Операторы цикла с параметром (for)
Операторы цикла с параметром (которые начинаются со слова for) вызывает повторяющееся выполнение оператора (который может быть составным оператором) пока управляющей переменной присваива ется возрастающая последовательность значений.

В качестве управляющей переменной должен использоваться идентификатор переменой (без какого-либо квалификатора), который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for. Управляющая переменная должна иметь пе речислимый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с перечислимым типом.

Когда начинает выполняться оператор for, начальное и конеч ное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for.

Оператор, который содержится в теле оператора for, выполня ется один раз для каждого значения в диапазоне между начальным и конечным значением. Управляющая переменная всегда инициализирует ся начальным значением. Когда работает оператор for, значение уп равляющей переменной (счетчика циклов) увеличивается при каждом повторении на единицу. Если начальное значение превышает конечное значение, то содержащийся в теле оператора for оператор не выпол нятся. Когда в операторе цикла используется ключевое слово downto, значение управляющей переменной уменьшается при каждом повторении на единицу. Если начальное значение в таком операторе меньше, чем конечное значение, то содержащийся в теле оператора цикла оператор не выполнятся.

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

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

ЦИКЛ С ПРЕДУСЛОВИЕМ --- while...do...

Оператор цикла явялется важнейшим оператором и имеется в большинстве современных языков программирования (а сама идея цикла возникла ещё в XIX веке!). Цикл позволяет многократно выполнить некоторое множество действий, задаваемых операторами составляющими его тело. В Паскале имеется несколько разновидностей оператора цикла. Начнём с оператора цикла с предуслвоием. Данный оператор имеет вид

while expression do statement;

При выполнении этого оператора вначале вычисляется значение логического выражения expression. Усли это значение истинно, выполняется оператора statement, затем значине выражения проверяется вновь и т.д., до тех пор, пока выражение не примет значение "ложь". Если выражение принимает значение "ложь" при первой же проверке, то оператор statement не выполняется вообще. Особо отмечу частный случай:

while True do statement;

Здесь оператор statement будет выполняться бесконечно. Пример оператора цикла с предусловием:

while Counter<10 do begin

Write('Значение счётчика равно '.Counter);

Writeln;

Counter:= Counter + 2;

end;

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

ЦИКЛ С ПОСТУЛОВИЕМ --- repeat...until...

Оператор цикла с постуслвоием имеет вид

repeat statement until expression;

Здесь вначале выполняет оператор statement, а затем вычислется значине логического выражения expression. Процесс повторяется, пока выражение expression принимает значение "ложь". Как только это значине станет истинным, выполнение цикла прекращается. Оператор statement может быть любм, в том числе и составным оператором:

begin

statement_1;

statement_2;

...;

statement_n;

end;

В цикле repeat...until... операторные скобки begin...end могут быть опущены. Таким образом, в общем случае оператор repeat...until... имеет следующий вид:

repeat

statement_1;

statement_2;

...;

statement_n;

until expression;

Точка с запятой перед зарезервированным словом until необязательно. В приведённом ниже частном случае.

repeat

statement_1;

statement_2;

...;

statement_n;

until FALSE;

цикл выполняется бесконечно. Ещё раз обращаю ваше внимание на то, что если в операторе while...do... проверка выполняется в начале цикла, то в цикле repeat...until... проверка выполняется в последнюю очередь, и тело цикла в любом случае выполняется хотя бы один раз. Вот пример цикла с постусловием:

repeat

Write ('Значение счётчика равно ',Count);

Writeln;

Count:= Count + 2'

until Count = 10;

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

------------

Оператор цикла с постусловием (repeat)
В операторе цикла с постусловием (начинающимся со слова repeat) выражение, которое управляет повторным выполнением после довательности операторов содержится внутри оператора repeat.

Результат выражения должен быть булевского типа. Операторы, заключенные между ключевыми словами repeat и until, выполняются последовательно до тех пор, пока результат выражения не примет значение True. Последовательность операторов выполнится по край ней мере один раз, поскольку вычисление выражения производится после каждого выполнения последовательности операторов.

Операторы цикла с предусловием (while)
Оператор цикла с предусловием (начинающийся с ключевого сло ва while) содержит в себе выражение, которое управляет повторным выполнением оператора (который может быть составным оператором).

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

Типовая структура-разветвление. Основные элементы и варианты реализации.

Условные операторы
Условные операторы позволяют выбрать для выполнения один из составных операторов (или не выбрать ни одного).

Оператор условия (if)
Синтаксис оператора if можно представить следующим образом:

В выражении должен получаться результат, имеющий стандартный булевский тип. Если результатом выражения является истинное зна чение (True), то выполняется оператор, следующий за ключевым сло вом then.

Если результатом выражения является значение False и при сутствует ключевое слово else, то выполнятся оператор, следующий за ключевым словом else. Если ключевое слово else отсутствует, то никакой оператор не выполняется.

Синтаксическая неоднозначность, возникающая в конструкции:

if e1 then e2 else e3

разрешается путем следующей интерпретации этой конструкции:

if e1 then
begin
if e2 then
s1
else
s2
end

Примечание: В предшествующем операторе else двоеточие не указывается.

В общем случае ключевое слово else связывается с ближайшим ключевым словом if, которое еще не связано с ключевым словом else.

Оператор варианта (case)
Оператор варианта (casе) состоит из выражения (переключате ля) и списка операторов, каждому из которых предшествует одна или более констант (они называются константами выбора) или ключевое слово else. Переключатель (селектор) должен иметь порядковый тип (размером в байт или слово). Таким образом, строковый тип и длин ный целый тип являются недопустимыми типами переключателя. Все константы выбора должны быть уникальными и иметь порядковый тип, совместимый с типом переключателя.

Оператор варианта case приводит к выполнению оператора, ко торому предшествует константа выбора, равная значению переключа теля или диапазону выбора, в котором находится значение переклю чателя. Если такой константы выбора или такого диапазона выбора не существует и присутствует ветвь else, то выполнятся оператор, следующий за ключевым словом else. Если же ветвь else отсутству ет, то никакой оператор не выполняется.

Процедуры. Назначение, варианты реализации.

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

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

В языке Паскаль имеется два вида подпрограмм - процедуры и функции.

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

Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове - фактическими.

Описание и вызов процедур и функций

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

Формат описания процедуры имеет вид:

procedure имя процедуры (формальные параметры); раздел описаний процедуры begin исполняемая часть процедуры end;

Формат описания функции:

function имя функции (формальные параметры): тип результата; раздел описаний функции begin исполняемая часть функции end;

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

var имя праметра: имя типа

и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

Вызов процедуры производится оператором, имеющим следующий формат:

имя процедуры (список фактических параметров);

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

Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.

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

имя функции:= результат;

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

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

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

var x,y,m,n: integer; procedure MaxNumber(a,b: integer; var max: integer);begin if a>b then max:=a else max:=b;end; begin write('Введите x,y '); readln(x,y); MaxNumber(x,y,m); MaxNumber(2,x+y,n); writeln('m=',m,'n=',n);end.

Аналогичную задачу, но уже с использованием функций, можно решить так:

var x,y,m,n: integer; function MaxNumber(a,b: integer): integer; var max: integer;begin if a>b then max:=a else max:=b; MaxNumber:= max;end; begin write('Введите x,y '); readln(x,y); m:= MaxNumber(x,y); n:= MaxNumber(2,x+y); writeln('m=',m,'n=',n);end.

/////////////////

Структура процедуры имеет следующий вид:

Procedure <имя процедуры> (формальные параметры: их тип);
Var
(локальные переменные)
begin
...
end;

Процедура вызывается по имени:

<имя процедуры> (фактические параметры);

Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Временно управление передаётся процедуре. После завершения работы процедуры управление возвращается в основную программу.

Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования.

Заголовок процедуры может выглядеть так:

PROCEDURE GG(a,b,c:integer); вызываться так: GG(3,n,m)

Здесь a,b,c-формальные параметры, а 3, n, m-фактические параметры

Таким образом в процедуру передаются значения: a=3, b=n, c=m

Переменные описанные в процедуре после слова Var, являются внутренними переменными процедуры или промежуточными, они не являются данными для операций внутри процедуры и не являются результатом её выполнения, а нужны лишь для промежуточных действий. Данные и результаты описываются в круглых скобках после имени процедуры. Перед описанием переменных-результатов пишут служебное слово var.

Например:

Procedure express(a,b,c: real; var x,y:real);
Var
z: real;
begin
z:=a+ b+ c;
x:=sqr(z);
y:=sqrt(z);
end;

Эту процедуру можно вызвать следующим образом:

express(7.6, 6.8, 9.5, x1, x2);

Формальные входные параметры a, b, c принимают значения соответствующих фактических параметров a=7.6; b=6.8; c=9.5.

При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом в основной программе будем иметь x1=20, y1=22.

В качестве фактических параметров могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут быть только переменные(константы и выражения недопустимы).

16.Функции. Назначение, варианты реализации.!

Другой вид подпрограммы-функция-оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу.

Функция оформляется в следующем виде:

Function <имя функции>(формальные параметры: тип): тип значения функции;
Var
...
Begin
...
End;

Вызывается функция по её имени с указанием фактических параметров.

Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.

Пример. Пусть требуется найти (x!-y!)*d!.

Напомним, что х! представляет собой произведение n чисел натурального ряда: х! = 1*2*3*......*х

Function fac(n:integer): integer;
Var
p,i: integer;
Begin
p:=1;
for i:=2 to n do
p:=p*i;
fac:=p;
End;

Вызвать можно так: f:=(fac(x)-fac(y))*fac(d).

Внимание! В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой - ее значение. Иначе, значение не будет определено.





Дата публикования: 2015-02-03; Прочитано: 2415 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.024 с)...