Алгоритм табулирования
Применяется для составления всевозможных таблиц, которыми могут быть как абстрактная таблица значений математической функции, так и конкретная таблица стоимости товара или платежей, совершенных абонентом сотового оператора. В общем виде алгоритм можно описать так: 1. до цикла задается начальное значение управляющей переменной, условием выхода из цикла служит достижение управляющей переменной конечного значения; 2. в теле цикла на каждом шаге вычисляется очередное значение функции, зависящее от управляющей переменной, затем формируется строка таблицы; 3. в конце шага цикла значение управляющей переменной (обозначим ее x) изменяется оператором вида x:=x+d;, где d -- заданный шаг по управляющей переменной. В качестве примера составим таблицу синусов в пределах от 0 до π с шагом по аргументу 0.25. Обозначим аргумент как x, значение синуса от x обозначим как y. В простейшем случае программа табулирования может выглядеть так: var x,y:real; begin writeln('x':10,'sin(x)':10); {печать заголовка таблицы до цикла} x:=0; {начальное значение аргумента} while x<=pi+1e-6 do begin y:=sin(x); {вычисление функции} writeln (x:10:2, y:10:2); {печать строки таблицы} x:=x+0.25; {шаг по x} end; end. "Расширим" задачу за счет использования произвольных границ изменения аргумента и произвольного шага, а также выполнения всех необходимых проверок корректности. Пусть, например, требуется составить таблицу значений следующей функции: , значения a, b вводятся пользователем. Напишем текст программы, сопроводив его соответствующими комментариями. var x,f,a,b,dx:real; n:integer; {счетчик выведенных строк} begin repeat {Цикл ввода с контролем правильности значений: a,dx,b должны быть числами, dx>0, a+dx должно быть меньше b} writeln ('Введите a,dx,b:'); {$I-}read (a,dx,b);{$I+} if IoResult <> 0 then begin writeln ('Вы не ввели 3 числовых ', 'значения, попробуем еще раз'); continue; end; if (dx<=0) or (a+dx>=b) then begin writeln ('Вы не ввели допустимые ', 'данные, попробуем еще раз'); continue; end else break; until false; {Печать заголовка таблицы} writeln; writeln ('x':10,'f(x)':10); x:=a; n:=2; {2 строки уже использованы} while x<=b+1e-6 do begin {в условии цикла учитываем возможную погрешность работы с real!} if x<=0 then f:=sqr(x)*x else f:=exp(1/3*ln(abs(x))); {корень 3 степени взяли через exp и ln} writeln (x:10:2,f:10:2); n:=n+1; if n=24 then begin {На экране консоли по умолчанию 25 строк} write ('Нажмите Enter...'); reset (input); readln; n:=1; end; x:=x+dx; end; writeln ('Таблица выведена'); reset (input); readln; end. Как видно из примера, основной порядок действий -- такой же, как в предыдущей задаче. Так как экран консоли по умолчанию содержит всего 25 строк, с помощью переменной n мы дополнительно контролируем число уже выведенных строк и делаем по заполнении экрана паузу до нажатия пользователем клавиши Enter. Разумеется, другие изученные нами виды циклов также могут применяться при табулировании. Рассмотрим в качестве примера следующую задачу. Известна стоимость единицы товара. Составить таблицу стоимости 1, 2,..., K единиц товара, значение K вводится. Так как число единиц товара -- заведомо целое, при программировании задачи будет удобен цикл for: var t:real; i,k:integer; begin writeln; writeln ('Стоимость единицы товара:'); read (t); writeln ('Количество единиц товара:'); read (k); writeln ('Единиц':10,'Стоимость':10); for i:=1 to k do writeln (i:10,(i*t):10:2); end. Здесь для простоты мы исключили сделанные в предыдущем примере проверки. Стоимость единицы товара обозначена t, переменная i необходима для перебора возможных значений единиц товара в цикле for. Поскольку счетчик цикла for автоматически меняется с шагом 1, а оператором writeln можно выводить не только значения переменных, но и выражения, основной цикл программы состоит из одного оператора и не нуждается в операторных скобках.
|