- •Лабораторный практикум по информатике
- •Часть II программирование в системе турбо паскаль
- •Введение
- •Лабораторная работа №1 Создание простейшей программы
- •Начало работы с новой программой
- •Задание 1
- •Сохранение текстового файла программы на диске:
- •Задание 2
- •Задание 3
- •Задание 4
- •Лабораторная работа №2 Ввод данных и вывод результатов
- •Задания
- •Лабораторная работа №3 Программирование линейных алгоритмов
- •Задание
- •Лабораторная работа №4 Программирование разветвляющихся алгоритмов
- •Задание 1
- •Задание 2
- •Лабораторная работа № 5 Программирование циклических алгоритмов с известным числом повторений
- •Задание
- •Лабораторная работа №6 Программирование циклических алгоритмов с неизвестным числом повторений
- •Задания
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Лабораторная работа №7 Программирование алгоритмов итерационной циклической структуры
- •Задание
- •Лабораторная работа №8 Массивы
- •Лабораторная работа №9 Процедуры и функции пользователя в языке Паскаль
- •Задание
- •Лабораторная работа №10 Записи
- •Задания
- •Лабораторная работа №11 Работа с файлами
- •Лабораторная работа №12 Графический режим в языке Паскаль
- •Лабораторная работа №13 Построение графика функции
- •Задания
- •Лабораторная работа №14 Создание движущихся изображений
- •Задание 1
- •Задание 2
- •Лабораторная работа №15 Вычисление определённого интеграла численными методами
- •Метод прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Задания
- •Лабораторная работа №16 Решение нелинейных уравнений численными методами
- •Метод половинного деления
- •Метод Ньютона
- •Метод хорд
- •Задания
- •Лабораторная работа №17 Решение обыкновенных дифференциальных уравнений численными методами
- •Метод Эйлера
- •Модифицированный метод Эйлера
- •Метод Рунге-Кутта
- •Задание
- •Приложение
- •Список литературы
- •Оглавление
- •Лабораторный практикум по информатике
- •Часть II программирование в системе турбо паскаль
- •Архангельск
Лабораторная работа №9 Процедуры и функции пользователя в языке Паскаль
Для любых сложных программ, в которых существует много режимов работы (например, ввод исходных данных с клавиатуры или из файла, несколько вариантов расчетов, вывод результатов в виде различных расчетных форм на экран, принтер или в файл и пр.), используется разбиение программы на отдельные программные модули – процедуры и функции, что является одним из главных принципов структурного программирования. Такое построение программ является общепринятым для всех современных систем, имеющих иерархическое меню с большим количеством пунктов, экранные формы с элементами управления типа нажимаемых кнопок, раскрывающихся списков и т. п.
Использование процедур и функций с параметрами позволяет пользоваться ими многократно с заданием различных исходных данных, что имеет особенно большое значение в случае использования библиотек в виде отдельно скомпилированных модулей (*.tpu -файлов), для которых исходный текст программы может быть неизвестен.
Процедура вызывается по имени из любой позиции раздела операторов программы или процедуры и должна быть предварительно описана. Описание процедуры включает заголовок и тело процедуры.
Заголовок процедуры имеет следующий вид:
Procedure идентификатор [(параметры)];
где идентификатор – имя процедуры, уникальное в пределах программы; параметры – необязательный список формальных параметров (т.е. может отсутствовать).
Список параметров может состоять из нескольких групп параметров, разделенных точкой с запятой (;):
(группа параметров [; группа параметров [; …] ] ).
Группа параметров, которая содержит список параметров одного типа, может быть трех следующих видов:
идентификатор [, идентификатор [,…] ]: type (список параметров-значений - только передают значения в процедуру);
var идентификатор [, идентификатор [,…] ]: type (список параметров-переменных – возвращают значения в вызывающую программу из процедуры);
var идентификатор [, идентификатор [,…] ] (список нетипизированных параметров-переменных).
Тело процедуры представляет собой локальный блок, по структуре аналогичный программе. Для обращения к процедуре используется оператор вызова процедуры, который состоит из имени процедуры и списка фактических параметров, заключенных в круглые скобки и перечисленных через запятую.
Пример. Процедура для вывода текстовой строки в указанную позицию на экране. Описание процедуры:
Procedure WrStr(X, Y: integer; S: string); {Заголовок}
var {Описание локальных переменных}
SaveX, SaveY: Integer;
begin
SaveX := WhereX; {Запоминаем позицию курсора на экране по Х}
SaveY := WhereY; {То же по Y}
GotoXY(X,Y); {Перемещаем курсор в заданную позицию X,Y}
Write(S); {Выводим с заданной позиции строку текста}
GotoXY(SaveX, SaveY); {Перемещаем курсор в исходную позицию}
end;
Обращение к ней из головной программы или другой процедуры может выглядеть следующим образом: WrStr(40, 2, ’Расчет …’):
Процедура может использовать глобальные переменные и переменные вызывающей программы, параметры этой процедуры и свои локальные переменные.
В простейшем случае процедура может не иметь параметров, а пользоваться только переменными вызывающей программы.
Функция, в отличие от процедуры, имеет имя, которое принимает определенное значение после ее выполнения. Описание функции:
{функция, которая преобразует все символы строки в прописные}
Function UpCaseStr(S: string): string; {заголовок}
var i : integer; {раздел описаний локальных переменных}
begin {начало тела функции}
for i := 1 to Length(S) do
if (S[i] >= 'a') and (S[i] <= 'z') then Dec(S[i], 32);
UpCaseStr := S;
end; {конец описания функции}
Вызов этой функции из головной программы или другой процедуры может выглядеть следующим образом: Write(UpCaseStr(’Расчет …’)).
Использование подобных функций пользователя ничем не отличается от использования стандартных функций вроде sin(x), exp(a) и проч.
Ниже приведён пример построения программы с разбиением её на отдельные процедуры:
Program Prg_proc;
Uses Crt, Printer;
Var
xn, xk, h : real;
i, j, m, n : word;
x, y : array [1..50] of real;
mnu : array [1..6] of string[10];
vv : char;
Procedure my_mnu;
begin
Window(1, 1, 80, 1); TextColor(0); GoToXY(1,1);
for i:=1 to 5 do
if i=m then
begin
TextBackground(2);Write(' ',mnu[i],' ');
end
else
begin
TextBackground(7); Write(' ',mnu[i],' ');
end;
Window(1, 2, 80, 25);
GoToXY(1,1); TextColor(15);TextBackground(0);
end;
Procedure input_kl;
begin
ClrScr;
Write('x начальное = '); Readln(xn);
Write('x конечное = '); Readln(xk);
Write('количество точек графика (n<50) = '); Readln(n);
m:=2; my_mnu
end;
Procedure calc_dat;
begin
x[1]:=xn;
h:=(xk-xn)/(n-1);
for i:=1 to n do
begin
y[i]:=sin(x[i]); x[i+1]:=x[i]+h;
end;
ClrScr; Write('Расчет выполнен!')
end;
Procedure out_dat;
begin
ClrScr;
Writeln('------------------------------');
Writeln(' X Y ');
Writeln('------------------------------');
for i:=1 to n do Writeln(x[i]:15:5,Y[i]:15:5);
Writeln('------------------------------');
end;
Procedure out_gr;
begin
Write('здесь нужно описать вывод графика на экран')
end;
begin {Головная программа}
TextBackground(0); ClrScr;
mnu[1]:='Исх.данные';
mnu[2]:='Расчет' ;
mnu[3]:='Таблица';
mnu[4]:='График' ;
mnu[5]:='Выход' ;
m:=1;
my_mnu;
Repeat
vv:=Readkey;
if ord(vv)=0 then vv:=Readkey;
case ORD(VV) of
13:begin
Case m of
1:input_kl;
2:calc_dat;
3:out_dat ;
4:out_gr ;
end;
end;
77:begin if m<5 then m:=m+1 else m:=1; my_mnu end;
75:begin if m>1 then m:=m-1 else m:=5; my_mnu end;
end;
Until (vv=chr(13)) and (m=5);
end.