- •Основы программирования на языке Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскале 44
- •От автора
- •Часть 1. Основы языка Паскаль
- •1. Алгоритм и программа
- •1.1. Алгоритм
- •1.2. Свойства алгоритма
- •1.3. Формы записи алгоритма
- •1.4. Программа и программное обеспечение
- •1.5. Этапы разработки программы
- •2. Данные в языке Паскаль
- •2.1 Константы
- •2.2 Переменные и типы переменных
- •3. Арифметические выражения
- •4. Линейный вычислительный процесс
- •4.1 Оператор присваивания
- •4.2 Оператор ввода
- •4.3 Оператор вывода
- •4.4 Управление выводом данных
- •4.5 Вывод на печать
- •5. Структура простой программы на Паскале
- •6. Компилятор и оболочка Turbo Pascal
- •7. Разветвляющийся вычислительный процесс и условный оператор
- •7.4. Короткий условный оператор
- •If логическое_выражение then оператор1;
- •7.5. Полный условный оператор
- •If логическое_выражение then оператор1
- •7.7. Вложенные условные операторы
- •7.9. Примеры программ с условным оператором
- •8. Директивы компилятора и обработка ошибок ввода
- •9. Оператор цикла. Циклы с предусловием и постусловием
- •10. Цикл со счетчиком и досрочное завершение циклов
- •11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
- •11.1 Алгоритм табулирования
- •11.2 Алгоритм организации счетчика
- •11.3 Алгоритмы накопления суммы и произведения
- •12. Типовые алгоритмы поиска максимума и минимума
- •13. Решение учебных задач на циклы
- •14. Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале
- •15. Решение типовых задач на массивы
- •Часть 2. Элементы профессионального программирования на Паскале
- •16. Кратные циклы
- •16.1 Двойной цикл и типовые задачи на двойной цикл
- •16.2 Оператор безусловного перехода
- •17. Матрицы и типовые алгоритмы обработки матриц
- •18. Подпрограммы
- •18.1 Процедуры
- •18.2 Функции
- •18.3 Массивы в качестве параметров подпрограммы
- •18.4 Открытые массивы
- •19. Множества и перечислимые типы
- •20. Обработка символьных и строковых данных
- •20.1. Работа с символами
- •20.2 Работа со строками
- •21. Текстовые файлы
- •21.1 Общие операции
- •21.2 Примеры работы с файлами
- •21.3 Работа с параметрами командной строки
- •22. Записи. Бинарные файлы
- •23. Модули. Создание модулей
- •23.1. Назначение и структура модулей
- •23.2. Стандартные модули Паскаля
- •24. Модуль crt и создание простых интерфейсов
- •25. Модуль Graph и создание графики на Паскале
- •Приложение 1. Таблицы ascii-кодов символов для операционных систем dos и Windows
- •Приложение 2. Основные директивы компилятора Паскаля
- •Приложение 3. Основные сообщения об ошибках Паскаля
- •Приложение 4. Дополнительные листинги программ
- •Приложение 5. Расширенные коды клавиатуры
- •Ascii‑коды
- •Расширенные коды
- •Приложение 6. Правила хорошего кода
- •Приложение 7. Рекомендуемая литература
11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
Итак, основное назначение циклов – обработка большого объема данных. Математически эта обработка зачастую сводится к поиску, выбору и статистической обработке нужных величин. Практически в любой реальной задаче мы ищем максимальные и минимальные значения в наборе данных, суммируем или перемножаем требуемые данные, определяем арифметическое среднее или количество элементов, отвечающих условию. Для решения всех этих распространенных задач существуют типовые алгоритмы, задающие правила выполнения соответствующих расчетов. Изучением этих алгоритмов мы займемся в главах 11 и 12.
Разумеется, настоящие задачи, встающие перед программистами, значительно сложнее, чем приведенные ниже примеры, но из типовых алгоритмов, как из кирпичиков, строится здание любой сложной программы.
11.1 Алгоритм табулирования
Применяется для составления всевозможных таблиц, которыми могут быть как абстрактная таблица значений математической функции, так и конкретная таблица стоимости товара или платежей, совершенных абонентом сотового оператора.
В общем виде алгоритм можно описать так:
-
до цикла задается начальное значение управляющей переменной, условием выхода из цикла служит достижение управляющей переменной конечного значения;
-
в теле цикла на каждом шаге вычисляется очередное значение функции, зависящее от управляющей переменной, затем формируется строка таблицы:
-
в конце шага цикла значение управляющей переменной (обозначим ее 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 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 ('Введите начальное значение, шаг и конечное значение:');
{$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 можно выводить не только значения переменных, но и выражения, основной цикл программы состоит из одного оператора и не нуждается в операторных скобках.