Лабораторная работа N 6. Процедуры, функции, модули.
1. Процедуры и функции.
Процедуры и функции реализуют в Паскале так называемую процедурно-ориентированную парадигму программирования. Ее еще называют – структурное программирование. Этот способ написания программ основывается на теореме структурного программирования:
любой алгоритм можно представить в одном из трех видов :
Алгоритм =
1. либо Алгоритм следования :
начало Алгоритм_А; Алгоритм_Б конец;
2. либо Алгоритм ветвления:
начало если Условие_истинно то Алгоритм_С иначе Алгоритм_Д конец;
3. либо Алгоритм цикла:
начало пока Условие_истинно делать Алгоритм_Ф конец;
Здесь под словами Алгоритм_А; Алгоритм_Б … понимается опять один из трех возможных алгоритмов.
Для написания программы нужно вначале понять, какой из трех алгоритмов Ваша задача содержит. Для примера рассмотрим задачу вычисления суммы ряда
1 + {cos[sin(x)]+ 1 + ln(p*x)}^1 + {cos[sin(x)]+ 1 + ln(p*x)}^2 + ... (1)
с заданным числом членов ряда и вывода результата на экран. Сразу видим, что алгоритм состоит из двух линейно следующих друг за другом алгоритмов:
Ø вычислить сумму ряда
Ø вывести результат.
Начинаем писать программу на Паскале, учитывая обнаруженный линейный алгоритм:
Program My1;
Var ...
Begin
SumCalc() ; // вычислить
Output() ; // вывести на экран
End.
Ясно, что не хватает того, “что” вычисляем и куда результат записать. Объявим переменную для суммы и передадим в процедуру величины для вычислений:
Program My1;
Var sum : real;
Begin
SumCalc( 2.3, 3.1, sum, 25 ) ; // вычислить сумму с 25-ю слагаемыми в точке x = 2.3, p = 3.1
Output(“Задача состоит в том, что …”, “Сумма ряда = ”, sum ) ; // вывести на экран с
// комментарием
End.
Теперь не хватает собственно алгоритмов SumCalc и Output. Объявляем эти алгоритмы:
Program My1;
Var sum : real;
Procedure SumCalc(x, p : real; var s : real; N : integer ) ;
// из этой процедуры значение s выходит – поэтому var
Begin
… после детализируем это место …
End;
Procedure Output (s1, s2: string; res : real ) ;
Begin
Writeln(s1) ;
Writeln(s2, res) ;
End;
Begin
SumCalc( 2.3, 3.1, sum, 25 ) ; // вычислить
Output(“Задача состоит в том, что …”, “Сумма ряда =”, sum ) ;
End.
Далее детализируем SumCalc. Напоминаем себе задачу:
1 + {cos[sin(x)]+ 1 + ln(p*x)}^1 + {cos[sin(x)]+ 1 + ln(p*x)}^2 + ... (1)
Procedure SumCalc(x : real; p : real; var s : real; N : integer ) ;
Var a : real ;
i : integer ;
Begin
a := termFunc(x, p) ;
s := 0 ;
for i:=1 to N do s:= s + a ;
End;
Далее детилизируем termFunc.
Function termFunc(x : real; p : real ) : real;
Begin
termFunc := cos( sin(x) ) + 1 + log(p*x) ;
End;
Procedure SumCalc(x, p : real; var s : real; N : integer ) ;
Var a : real ;
i : integer ;
Begin
a := termFunc(x, p) ;
s := 0 ;
for i:=1 to N do s:= s + a ;
End;
Итак, вся программа имеет вид:
Program My1;
Function termFunc( x : real; p : real ) : real;
Begin
termFunc := cos( sin(x) ) + 1 + ln(p*x) ;
End;
Procedure SumCalc( x , p : real; var s : real; N : integer ) ;
Var a : real ;
i : integer ;
Begin
a := termFunc(x, p) ;
s := 1 ;
for i:=1 to N do
s:= s + exp(n*ln(a) );
End;
Procedure Output (s1, s2: string; res : real ) ; // s1, s2 и res назад не возвращаются (без слова var)
Begin
Writeln(s1) ;
Writeln(s2, res) ;
End;
Var sum : real;
Begin
SumCalc( 2.3, 3.1, sum, 25 ) ; // вычислить
Output(“Задача состоит в том, что …”, “Сумма ряда =”, sum ) ; // вывести на экран с комментарием
End.
Было бы хорошо, если бы не слишком много строк в одном файле. Эстетически самое лучшее, если в одном файле расположено 1-2 страницы кода. Чтобы этого добиться, можно независимые части кода вынести в так называемые программные единицы – Unit (Модуль). Проделаем это с нашей программой – сделаем отдельный модуль (файл) с подпрограммами.
2. Структура модуля:
Создаем модуль для нашей программы в DELPHI:
Если Вы сохраните Unit с другим именем, то имя Unit изменится:
Одновременно изменится и заголовок Вашего проекта:
DELPHI знает, что Вы создали Unit для текущего проекта и, не спрашивая Вас, вставил в главный файл проекта строку Uses AuxProc in ...
Нам остается заполнить шаблон Unit AuxProc. Проделаем это.
И конечно теперь можно удалить все подпрограммы из главного модуля:
Запускаем на выполнение F9:
3. Задания
1. Написать программу с подпрограммами, которая описана в первой части этого руководства. (10 мин)
2. Написать программу с модулем, которая описана во второй части этого руководства. (10 мин)
3. Написать программу, которая в главной программе содержит меню следующего содержания:
Выполненные в 1-м семестре лабораторные работы
Ст-та гр. Ф-ХХ по ПММ
Ø Лабораторная работа 1. Консольное приложение в DELPHI
Ø Лабораторная работа 2. Линейные вычисления.
Ø Лабораторная работа 3. …
Ø …
Требования к программе:
· Каждую лабораторную работу оформить в виде подпрограмм в отдельном модуле.
· Для вывода результатов с задержкой консоли во всех лабораторных работах использовать одну процедуру, помещенную в модуль “Utils” (утилиты) с именем Output(...) – см. тело этой процедуры выше в этом руководстве. Для ввода данных с экрана напишите процедуры:
Input1( s:string; Var x: real );
Input2( s:string; Var x: integer );
И поместите эти процедуры в тот же модуль утилит “Utils”.
Модуль “Utils” подключить в каждой из лабораторных работ.
Для главной программы использовать цикл вида:
Program MyLabs;
Var Stop : Boolean ;
NL : integer ;
Begin
Stop := false ;
repeat
Output( ‘Лабораторная работа 1. Консольное приложение в DELPHI’ ) ;
Output( ‘Лабораторная работа 2. Линейные вычисления’ ) ;
...
Input2( ‘ Введите номер лабораторной работы (0 - выход): ’, NL );
Case NL of
1 : Lab1 ; // вызов процедуры из первого модуля
2 : Lab2 ;
...
0 : Stop := true ;
Else
Output( ‘Повторите ввод – нет такой работы : ’, NL ) ;
End ;
Until Stop ;
End ;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.