- •15. Реализация циклических алгоритмов
- •15.4. Правила использования операторов цикла пока и цикла до
- •15.5. Алгоритм вычисления таблицы значений функции с одним аргументом Математическая модель
- •Метод решения
- •Обобщенная информационная модель
- •Программная модель с циклом повторять до
- •Формальное исполнение программы sin_while
- •15.6. Правила перебора всех значений переменной в заданном диапазоне с заданным шагом изменения
- •IV.2.10. Оператор цикла с параметром Назначение
- •Синтаксис
- •Семантика
- •Цикл с параметром в схемах алгоритма
- •15.8. Алгоритм вычисления таблицы умножения
- •Вариант с циклом пока Метод решения
- •Алгоритмическая модель
- •Программная модель
- •Вариант с циклом повторять
- •Задача вычисления суммы первых n натуральных чисел
- •Задача с использованием вывода большого количества значений Постановка задачи
- •Метод решения
- •Информационная модель
- •Программная модель
IV.2.10. Оператор цикла с параметром Назначение
Оператор используется в алгоритмах, когда для каждого значения переменной из диапазона значений необходимо выполнять одинаковые действия. Эта переменная называется параметром цикла.
Синтаксис
Рис. 15.9. – Оператор цикла с параметром
Синтаксическое ограничение:
результаты вычислений выражений 1 и 2 и параметр цикла должны быть одного простого порядкового типа.
Семантика
Условием выполнения оператора цикла с параметром является существование списка значений - для возрастающего списка значений с символом TO значение выражения 1 должно быть меньше или равно значения выражения 2; для убывающего списка значений с символом DOWNTO значение выражения 1 должно быть больше или равно значения выражения 2.
Порядок выполнения оператора:
вычисляются значения выражений 1 и 2, определяющих список значений параметра цикла;
вычисляется условие выполнения оператора цикла с параметром – для списка с символом TO результат выражения 1 меньше или равен результата выражения 2, для списка с символом DOWNTO результат выражения 1 больше или равен результата выражения 2 (возможен результат TRUE или FALSE);
если условие имеет значение FALSE, то выполнение оператора цикла прекращается (выполняется следующий оператор, расположенный за оператором цикла);
формируется полный список значений параметра цикла. Для списка с символом TO - это все значения подряд от результата выражения1 по результат выражения2. Для списка с символом DOWNTO – это все значения в обратном порядке от результата выражения1 по результат выражения2;
параметру цикла присваивается очередное значение из списка значений (первый раз - значение выражения1);
если список значений исчерпан (до этого уже было выбрано значение выражения2), то выполнение оператора цикла прекращается. Значение параметра цикла становится неопределенным и выполняется следующий оператор, стоящий за оператором цикла;
для выбранного значения параметра цикла выполняется оператор, расположенный после символа DO (тело цикла);
осуществляется переход к пункту 5.
Рис. 15.10. – Изображение оператора цикла с параметром на схемах алгоритма
Предупреждения:
по завершению оператора цикла (см. пункты 3 и 6) значение параметра цикла неопределенное (зависит от реализации языка) и выполняется следующий оператор, расположенный за оператором цикла с параметром;
значения выражений 1 и 2 вычисляются один раз (см. пункт 1), поэтому в теле цикла не имеет смысла изменять значения, определяющие эти выражения;
в теле цикла запрещается изменять значение параметра цикла, так как это приводит к непредсказуемым последствиям (значение параметра цикла изменяется автоматически в пункте 5)
Цикл с параметром в схемах алгоритма
По ГОСТ для обозначения цикла с параметром используется следующая структура изображенная на рис. 15.10.
Задача
Для заданного года G определить количество дней в каждом месяце.
Математическая модель
Современный календарь действует с 1600 года нашей эры.
i=(janvar, fevral, mart, aprel, maj, iun, iul, avgust, sentjabr, oktjabr, nojabr, dekabr) необходимо вычислять d - количество дней в i-oм месяце заданного года G.
Метод решения
Вне зависимости от года G (год должен быть >=1600 )
i:=janvar..dekabr :
выбор по i из вариантов
Год G считается високосным, если он кратен 4 и не кратен 100 или кратен 400 (каждый четвертый год - високосный, за исключением каждого сотого года; каждый четырехсотый год также високосный).
Условие високосности:
G mod 4 = 0 & G mod 100 <> 0 V G mod 400 = 0
Информационная модель
Таблица 15.2. Информационная модель
Статус |
Назначение |
Имя |
Тип |
Входная |
год |
G |
WORD |
Промежуточная |
текущий месяц |
i |
mes |
Промежуточная |
признак правильности ввода номера года (true - успешно, false – ошибка) |
vvod |
boolean |
Примечания:
1)выходные данные - текст с указанием названия месяца и количества дней;
2) type mes=(janvar, fevral, mart, aprel, maj, iun, iul,avgust, sentjabr, oktjabr, nojabr, dekabr)
Алгоритмическая модель
Схема алгоритма решения задачи приведена на рис. 15.11.
Программная модель (текст на языке Паскаль)
program kalend;
type mes=(janvar, fevral, mart, aprel, maj, iun, iul,avgust,
sentjabr, oktjabr, nojabr, dekabr);
var G:word;{заданный год}
i:mes;{текущее значение месяца}
vvod:Boolean; {признак правильности ввода номера года}
begin
{ввод исходных данных с контролем правильности ввода}
repeat
writeln('Введите год');
{$I-}
{$R-}
readln(G);
{$I+}
{$R+}
if (ioresult<>0) or(G<1600) then
begin
writeln('Ошибка в номере года');
vvod:=false
end
else vvod:=true
untilvvod;
{решение математической модели с выводом результата}
writeln('В ',G,' году:');
for i:=janvar to dekabr do begin
{вывод названия месяца}
case i of
janvar: write('январь - ');
fevral: write('февраль - ');
mart: write('март - ');
aprel: write('апрель - ');
maj: write('май - ');
iun: write('июнь - ');
iul: write('июль - ');
avgust: write('август - ');
sentjabr:write('сентябрь - ');
oktjabr:write('октябрь - ');
nojabr: write('ноябрь - ');
dekabr: write('декабрь - ')
end;
{вывод количества дней}
case i of
janvar, mart, maj, iul, avgust, oktjabr, dekabr: write('31 день');
aprel, iun, sentjabr, nojabr: write('30 дней');
Рис. 15.11. – Схема алгоритма
fevral: if (G mod 4 =0) and (G mod 100 <> 0)
or (G mod 400 =0) then write('29 дней')
else write ('28 дней');
end;
{вывод окончания фразы}
case i of
janvar..nojabr: writeln(';');
dekabr: writeln('.')
end
end {for i}
end.
Примечание: обратите внимание, что алгоритмическая и программная модели имеют незначительные различия в организации вывода результирующей фразы.