Тема 7. Организация подпрограмм.
Описание и использование процедур и функций.

Вариант 4.

ЗАДАНИЕ 1.

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

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

где h - шаг интегрирования, - середины отрезков интегрирования. Шаг интегрирования определяется следующим образом , где n - число отрезков интегрирования.

Реализацию численного метода прямоугольников оформите в виде процедуры, а вычисление значения подынтегральной функции - в виде "подпрограммы-функции". Пределы интегрирования и число отрезков интегрирования введите с клавиатуры.
Для проверки программы вычислите значение интеграла:
при разных значения n (1, 5, 10, 20). Сравните получающийся результат с точным значением интеграла. Выясните как зависит точность результата от числа отрезков интегрирования.

Ниже приведена примерная структура программы:
(имена  переменных, процедур и функций Вы можете изменить по своему усмотрению)

VAR
  a, b, I : real; { переменные для пределов интегрирования и значения интеграла }

         n : integer; { число отрезков интегрирования }

FUNCTION MyFunc( x : real ) : real;
BEGIN
   MyFunc := Подинтегральная_Функция
END;

PROCEDURE Integral( DownLimit, UpLimit : real; Num : integer; var Result : real );
VAR
   Описание локальных переменных;
BEGIN
   Вычисление интеграла методом прямоугольников (используя функцию MyFunc);
   Запись результата в переменную Result
END;

BEGIN
   readln(a,b); { Ввод пределов интегрирования }
   readln(n); { Ввод числа отрезков интегрирования }
   Integral(a,b,n,I); { Вычисление интеграла при заданном n }
   writeln(I); { Вывод результата на экран }
END.

Замечания.

Обратите внимание, что при описании процедуры Integral   используются различные способы передачи параметров. Формальный параметр Result описан как "параметр-переменная" (перед идентификатором стоит ключевое слова var). Это означает, что  любые изменения значения переменной Result (формального параметра) в теле процедуры приводят к соответствующим изменениям значений переменной I, которая выступает в качестве фактического параметра при вызове процедуры. Параметры DownLimitUpLimit и Num описаны как "параметры-значения"  (перед идентификатором ключевое слова var отсутствует). При этом,  если в теле процедуры значения этих переменных  будут изменены, то это не приведет к изменению значений фактических параметров (a, b и n).

При вызове процедуры Integral на место формальных "параметров-значений" (DownLimit, UpLimit и Num) можно подставить не только имена переменных (как это продемонстрировано выше), но и просто числовые константы или идентификаторы, являющиеся синонимами этих констант. Например, допустим следующий вызов процедуры Integral:

Integral( 0, 3.14, 100, I );

В тоже время, на место формального "параметра-переменной" (Result) можно поставить ТОЛЬКО имя переменной.

Дополнение.

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

В основе вычислений с заданной точностью лежит следующий алгоритм:

1. Задаем начальное число отрезков интегрирования  n (например, 5).
2. Вычисляем значения интеграла при данном n (обозначим его как I).
3. Удваиваем n и вычисляем  значение интеграла I2 при удвоенном числе отрезков интегрирования.
4. Вычисляем модуль разности двух значений интеграла | I2-I |. Если оказывается, что | I2 - I | <
e, то считаем, что заданная точность достигнута и в качестве результата берем I2. В противном случае повторяем шаги 2 - 4.

Для реализации этого алгоритма нужно добавить описание двух глобальных переменных I2 и eps:

var a, b, I, I2, eps : real;

и изменить основной блок программы:

BEGIN
   readln(a,b);
   readln(eps); { Ввод точности вычислений }
   n := 5;
   REPEAT
     Integral(a,b,n,I);  { Вычисление интеграла при данном n }
     n := 2*n;            { Удваиваем n }
     Integral(a,b,n,I2); { Вычисление интеграла при 2*n }
   UNTIL ( abs(I2-I) < eps );
   writeln(I2); { Вывод результата на экран }
END.

 

ЗАДАНИЕ 2.

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от xmin до xmax с шагом dx с точностью e.

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

Вопросы для защиты работ (6-7 темы):

1. Что называется подпрограммой?
2. Каковы основные принципы выделения подпрограмм?
3. Какие виды подпрограмм используются в языке Паскаль?
4. Что называется формальными и фактическими параметрами подпрограммы?
5. Чем отличается вызов функции от вызова процедуры?
6. Что такое локальные и глобальные переменные?
 

Назад к списку