Цикл с постусловием на языке Паскаль

Автор работы: Пользователь скрыл имя, 09 Декабря 2010 в 22:52, практическая работа

Описание работы

Паскаль - один из самых простых и в то же время самых ёмких языков программирования. Главное, знать, как его использовать. Он будет полезным Вам настолько, насколько вы сможете его применить – от решения простых уравнений до сложнейших статистических проектов, от бегущих точек на экране до полноценных оконных программ.

Содержание работы

Введение
Паскаль сегодня
Основные понятия. Основная структура программы
Цикл
Оператор цикла с постусловием
Практическая часть
Заключение
Список литературы

Файлы: 1 файл

МОУ лицей 27.doc

— 277.00 Кб (Скачать файл)

4.Цикл  с выходом из середины

Цикл  с выходом из середины — наиболее общая форма условного цикла. Синтаксически такой цикл оформляется  с помощью трёх конструкций: начала цикла, конца цикла и команды  выхода из цикла. Конструкция начала маркирует точку программы, в которой начинается тело цикла, конструкция конца — точку, где тело заканчивается. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся на оператор, следующий за конструкцией конца цикла. Естественно, чтобы цикл выполнился более одного раза, команда выхода должна вызываться не безусловно, а только при выполнении условия выхода из цикла. 

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

Легко видеть, что с помощью цикла  с выходом из середины можно легко  смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце  тела цикла). 

Часть языков программирования содержат специальные конструкции для организации цикла с выходом из середины. Так, в языке Ада для этого используется конструкция LOOP…END LOOP и команда выхода EXIT или EXIT WHEN:

LOOP

  ... Часть тела цикла

  EXIT WHEN <условие выхода>;

  ... Часть тела цикла

  IF <условие  выхода> THEN

    EXIT;

  END;

  ... Часть тела цикла

END LOOP: 

Здесь внутри цикла может быть любое  количество команд выхода обоих типов. Сами команды выхода принципиально  не различаются, обычно EXIT WHEN применяют, когда проверяется только условие выхода, а просто EXIT — когда выход из цикла производится в одном из вариантов сложного условного оператора. 

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

5.Цикл cо счётчиком

Цикл  со счётчиком — цикл, в котором  некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик. Например, в языке Оберон-2 такой цикл имеет вид:

FOR v := b TO e BY s DO

   ... тело цикла

END 

(здесь  v — счётчик, b — начальное значение счётчика, e — граничное значение счётчика, s — шаг). 

Неоднозначен  вопрос о значении переменной по завершении цикла, в котором эта переменная использовалась как счётчик. Например, если в программе на языке Паскаль  встретится конструкция вида:

i := 100;

for i := 0 to 9 do begin

  ... тело цикла

end;

k := i; 

возникает вопрос: какое значение будет в  итоге присвоено переменной k: 9, 10, 100, может быть, какое-то другое? А  если цикл завершится досрочно? Ответы зависят от того, увеличивается ли значение счётчика после последней итерации и не изменяет ли транслятор это значение дополнительно. Ещё один вопрос: что будет, если внутри цикла счётчику будет явно присвоено новое значение? Различные языки программирования решают данные вопросы по-разному. В некоторых поведение счётчика чётко регламентировано. В других, например, в том же Паскале, стандарт языка не определяет ни конечного значения счётчика, ни последствий его явного изменения в цикле, но не рекомендует изменять счётчик явно и использовать его по завершении цикла без повторной инициализации. Программа на Паскале, игнорирующая эту рекомендацию, может давать разные результаты при выполнении на разных системах и использовании разных трансляторов. 

Радикально  решён вопрос в языке Ада: счётчик считается описанным в заголовке цикла, и вне его просто не существует. Даже если имя счётчика в программе уже используется, внутри цикла в качестве счётчика используется отдельная переменная. Счётчику запрещено явно присваивать какие бы то ни было значения, он может меняться только внутренним механизмом оператора цикла. В результате конструкция

i := 100;

for i in (0..9) loop

  ... тело цикла

end loop;

k := i; 

внешне  аналогичная вышеприведённому циклу  на Паскале, трактуется однозначно: переменной k будет присвоено значение 100, поскольку переменная i, используемая вне данного цикла, не имеет никакого отношения к счётчику i, который создаётся и изменяется внутри цикла. Считается, что подобное обособление счётчика наиболее удобно и безопасно: не требуется отдельное описание для него и минимальна вероятность случайных ошибок, связанных со случайным разрушением внешних по отношению к циклу переменных. Если программисту требуется включить в готовый код цикл со счётчиком, то он может не проверять, существует ли переменная с именем, которое он выбрал в качестве счётчика, не добавлять описание нового счётчика в заголовок соответствующей процедуры, не пытаться использовать один из имеющихся, но в данный момент «свободных» счётчиков. Он просто пишет цикл с переменной-счётчиком, имя которой ему удобно, и может быть уверен, что никакой коллизии имён не произойдёт. 

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

В некоторых  языках, например, Си и других, произошедших от него, цикл for, несмотря на синтаксическую форму цикла со счётчиком, в действительности является циклом с предусловием. То есть в Си конструкция цикла:

for (i = 0; i < 10; ++i)

{

  ... тело цикла 

} 

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

i = 0;

while (i < 10)

{

  ... тело цикла

  ++i;

} 

То есть в конструкции for сначала пишется  произвольное предложение инициализации цикла, затем — условие продолжения и, наконец, выполняемая после каждого тела цикла некоторая операция (это не обязательно должно быть изменение счётчика; это может быть правка указателя или какая-нибудь совершенно посторонняя операция). Для языков такого вида вышеописанная проблема решается очень просто: переменная-счётчик ведёт себя совершенно предсказуемо и по завершении цикла сохраняет своё последнее значение. 

Вложенные циклы

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

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

Одна  из проблем, связанных с вложенными циклами — организация досрочного выхода из них. Во многих языках программирования есть оператор досрочного завершения цикла (break в Си, exit в Турбо Паскале, last в Perl и т. п.), но он, как правило, обеспечивает выход только из цикла того уровня, откуда вызван. Вызов его из вложенного цикла приведёт к завершению только этого внутреннего цикла, объемлющий же цикл продолжит выполняться. Проблема может показаться надуманной, но она действительно иногда возникает при программировании сложной обработки данных, когда алгоритм требует немедленного прерывания в определённых условиях, наличие которых можно проверить только в глубоко вложенном цикле. 

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

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

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

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

Repeat <тело_цикла> Until <условие>; 

Здесь: Repeat, Until - зарезервированные слова (повторять до тех пор, пока не будет выполнено условие); 

          <тело_цикла> - произвольная последовательность  операторов Turbo Pascal; 

          <условие> - выражение логического  типа. 

Оператор Repeat ... Until работает следующим образом. В начале выполняется тело цикла, после чего вычисляется логическое выражение следующее за словом Until, если результатом вычисления выражения является ЛОЖЬ, то операторы в теле цикла будут выполнены повторно. в противном случае, если логическое выражение имеет значение ИСТИНА, оператор цикла с постусловием прекратит свою работу. 

Пример 1. 

Дана  последовательность целых чисел, последним  элементом которой является число 100. Вычислить среднее арифметическое элементов этой последовательности. 

Program primer1; 

Var i, a, s, x : integer; 

Begin 

  s := 0; 

  x := 0; 

  Repeat 

    Read (a); 

    s := s + a; 

    x := x + 1; 

  Until a = 100; 

  s := s / x; 

  Write ('среднее арифметическое: ', s); 

End. 
 

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

Практическая  часть 

Задача.

Составить программу планирования закупки  товара в магазине на сумму, не превышающую  максимально заданную стоимость. 

Решение.

Обозначим через x, k – соответствующую цену и количество товара, через p – заданную предельную сумму, через s – общую стоимость покупки. Начальное значение общей стоимости покупки (s) равно нулю. Значение предельной суммы считывается с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока она не превысит предельную сумму p. В этом случае на экран нужно вывести сообщение о превышении. 

program prim1;

var c, k, p, s: integer;

begin

writeln(‘максимальная сумма-‘);

readln(p);

s:=0;

repeat;

writeln(‘цена и количество ‘);

readln(c,k);

s:=s+c*k;

writeln(‘стоимость покупки= ‘, s);

Информация о работе Цикл с постусловием на языке Паскаль