методические указания для лабораторных работ / методичка 8
.doc
Министерство образования Российской Федерации
Саратовский государственный технический университет
ПРОГРАМИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАМ ФУНКЦИЙ НА ЯЗЫКЕ ТУРБО ПАСКАЛЬ
Методическое указание
к выполнению лабораторной работы
по курсу «Программирование и основы алгоритмизации»
для студентов специальности 2101
Одобрено
Редакционно-издательским советом
Саратовского государственного
технического университета
Балаково 2005
При решении задач возникает необходимость повторять одни и те же вычисления при различных значениях параметров. Для уменьшения размера программ целесообразно выделить эти вычисления в отдельную подпрограмму. В основной программе при необходимости осуществляется обращение к подпрограмме. В Турбо Паскале имеются две разновидности подпрограмм: процедуры и функции, позволяющие оформить независимые части большого алгоритма в виде отдельных подпрограмм.
ЦЕЛЬ РАБОТЫ: Овладение навыками алгоритмизацией и программирования задач с использованием функции пользователя, овладение навыками написания функции и обращения к ним, выбора параметров функции.
ОПИСАНИЕ ФУНКЦИИ.
Смысл функций заключается в первую очередь в том, чтобы определить алгоритм вычисления нового значения некоторого простого или ссылочного типа. В этом отношении функции подобны выражениям, которые также вычисляют значение. В соответствии с этим вызов функции является одним из допустимых операндов выражения, обозначая в нем то значение, которое вычисляет ("вырабатывает" или "возвращает") функция. Иногда функции называют алгоритмически определяемыми значениями.
Общая структура описания функций иллюстрируется следующими синтаксическими
Описание функции
Заголовок функции
Тело
функции
Function <имя> (<список формальных параметров со своими описаниями>) : <Тип возвращаемого значения>;
Label … {Разделы описаний-метокт,}
Const... {констант,}
Туре ... {типов,}
Var... {переменных}
Procedure ... (вложенная процедура} (дополнительных функций} Function... (вложенная функция} ( и процедур, являющихся}
(локальными по отношению} (к описываемой функции}
BEGIN
<операторы> (операторы тела функции}
END;
где <имя> - имя функции (заголовок функции);
<список формальных параметров со своими описаниями> - задается так же, как в процедуре.
<Тип возвращаемого значения> - тип результата, получаемого после выполнения данной функции. Окончательный результат присваивается имени функции в конце тела функции.
Label - раздел описания локальных меток, область действия которых ограничена данной функцией, за пределами которой указанные метки использовать нельзя.
Const - то же, для констант..
Туре - то же, для типов.
Var - то же для переменных.
Внутри описания функции обязательно должно быть присваивание имени функции какого-либо "возвращаемого значения": <имя>: = <выражение>.
Тип этого значения должен совпадать с типом указанным в заголовке функции.
Вызов функции или обращение к функции осуществляется в правой части оператора присваивания, при этом в выражении записываются имя функции со списком фактических параметров, совпадающих по количеству и по типам с формальными параметрами функции (В отличие от процедур, значения функций можно присваивать конкретным переменным).
После выполнения функции вычисленное значение присваивается имени функции и передается в выражение.
ПРИМЕР. Пример записи и вызова функции:
Var a, b, Sumab: Integer; {2}
Function Summa (x, y: integer): Integer ; {3}
Begin {4}
Summa:=x + y; {5}
end; {6}
BEGIN {7}
Read (a, b); {8}
Summab:=Summa (a, b); {9}
Write (' Cумма=', Summab); {10}
END. {11}
{2} - описание глобальных параметров-переменных основной программы.
{3}- заголовок функции, выполняющей суммирование двух чисел. Summa - имя функции.
х, у - формальные параметры-значения, через которые в функцию передаются числа для суммирования.
Integer - тип результата, получаемого после сложения двух целых чисел х и у.
{4} и {6} - начало и конец (соответственно) описания алгоритма.
{5} - тело функции (вычисление суммы двух чисел).
{7} и {11} - начало и конец (соответственно) основной программы.
{9} - вызов функции Summa для суммирования переменных а и Ь, Присваивание результата их суммирования переменной Summab.
{10}- вывод результата суммирования на экран.
Результат можно вывести и без предварительного вычисления переменной Sumrnab, а именно:
Write ('Сумма =', Summa (а, Ь)).
ОБРАЩЕНИЕ К ФУНКЦИИ
После описания функции ее можно использовать в выражениях наряду со стандартными функциями. Аргументами при обращении могут быть любые выражения. Порядок следования и типы аргументов должны быть такими же, как у параметров в заголовке функции.
Вычисление выражений, содержащих обращение к функции, происходит по следующему алгоритму:
-
вычисляются выражения для аргументов функции;
-
значения аргументов присваиваются параметрам из за головка описания;
-
выполняется тело функции и вычисляется ее значение;
-
значение функции ставится в исходное выражение на место обращения к функции;
-
вычисление исходного выражения продолжается.
Заметим, что если выражения для аргументов сами содержат обращения к функциям, то пункт выполняется по приведенному алгоритму. В подобных случаях говорят, что алгоритм — рекурсивный.
Давайте посмотрим, что дает нам описание функции. Вы правы, если думаете, что без него можно обойтись, заменив обращения к функции переменными нужного типа и заранее вычислив их значения. Но тогда придется запрограммировать одни и те же вычисления столько раз, сколько раз мы обращались к функции. Программа удлинится, потеряет наглядность и утратит структуру, т.к. функция решает независимую от всего остального задачу, а мы «размажем» эту задачу по программе.
Такой образ действий повредит маленьким программам и катастрофически отразится на больших. Только разбивка задачи на множество относительно независимых подзадач позволяет программисту справляться со сложными программами.
Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории.
Все формальные параметры можно разбить на четыре категории:
» параметры-значения (эти параметры в основной программе подпрограммой не меняются);
» параметры-переменные (эти параметры подпрограмма может изменить в основной программе); .
» параметры-константы (используются только в версии 7.0);
» параметры-процедуры и параметры-функции (т. е. процедурного типа).
Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы - его категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип.
Параметры-значения: параметры-значения передаются основной программой в подпрограмму - функцию через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой - функцией измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие - типом. Тип параметра-значения может быть любым за исключением файлового.
Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип. Как отмечалось выше, отдельные группы параметров отделяются друг от друга точкой с запятой.
Пример.
function Mult(X, Y: Integer): Real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы - функции может выступать любое выражение совместимого для присваивания типа, не содержащее файловую компоненту, например:
Inp(Abs(Z), -Abs(T), 2 * К);
M:= Mult(X + Y, X - Y);
MA:= Max (B, 5);
Пример. Функция вычисления максимального элемента в массиве.
Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа
type
tArr = array[1..100] of Integer;
var
Massiv: tArr;
Maxim: Integer;
Функция в этом случае может иметь вид:
function Max(Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[1 ] ;
for i := 2 to N do
if Ma < Mas[i] then
Ma := Mas[i];
Max := Ma;
end;
Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:
Maxim := Max(Massiv, 5);
Следует иметь в виду, что подпрограмма может работать только с массивами типа tArr. Для массивов другого типа придется создавать другую аналогичную подпрограмму- функцию. Кроме того, при работе подпрограммы в стеке будет создана копия исходного массива, что приводит к уменьшению быстродействия и заполнению стека излишней информацией.
Параметры-переменные: при передаче параметров-переменных в подпрограмму - функцию фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var. Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
При вызове подпрограммы - функции на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа. Так, если формальный параметр имеет тип, определенный следующим образом:
type tArr = array[l. . 100] of Integer;
то и фактический параметр должен быть переменной или типизированной константой типа tArr.
Пример 1. Функция вычисления максимального элемента в массиве.
function Max(var Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma:= Mas[l];
for i := 2 to N do
if Ma < Mas[i] then
Ma:= Mas[i];
Max:= Ma;
end;
Этот вариант лучше предыдущего тем, что в данном случае в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память. Однако при такой передаче параметра возможно его нежелательное изменение (такой вариант передачи параметра допустим только в таких небольших подпрограммах, как в данном примере, когда программист может проконтролировать отсутствие несанкционированного изменения параметра). Недостаток же, связанный с тем, что подпрограмма может работать только с одним типом массивов, остается.
Параметры-константы: часто в качестве параметра в подпрограмму – функцию следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, ни предусматривается защита от его изменения
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример 2.
function NewString (const S:string): string;
Тип параметра-значения может быть любым за исключением файлового.
При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра можно использовать любое выражение совместимого для присваивания типа , не содержащего файловую компоненту.
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.
Пример 3 . Функция вычисления максимального элемента в массиве.
Function Max(const Mas: tArr; N: Byte): Integer;
var Ma:Integer;
i: Byte;
begin
Ma:= Mas[1];
for i := 2 to N do
if Ma < Mas[i] then Ma := Mas[i];
Max := Ma;
end;
Параметры без типа: в Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.
Пример.
function Equa1(var Paraml, Раrаm2; Len: Word): Boolean;
Здесь Paraml, Param2 - параметры-переменные без типа (вместо них можно hi пользовать, например, любые переменные простого типа, типа-массив, типа-запись и т. д.); Len - параметр-значение.
Следует иметь в виду, что параметр без типа внутри подпрограммы - функции типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа, при этом полученный результат может быть любого размера.
Пример 4:: Вычислить
использовать оператор - функцию
Program lab7;
Var z, x, y, b: real;
Function L (a, c: real): real;
Begin
L:=ln(c)/ln(a);
end;
begin
read (x, y, b);
Write (‘z=’, z : 6 :3);
End.
Пример 5: Вычислить
Program lab 8;
Var
x, y, z: integer;
s: real;
Function f (a, b: integer): real;
Begin
F:=SQRT(a*a+b*b+SQR(sin(a*b)));
End;
Begin
Read (x, y, z);
S:=f (x, y)+f (z, x)+f (y, z);
Write (‘s=’, s : 6 : 3);
End.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТ
Порядковый номер студента по списку группы соответствует номеру варианта. По проведенному заданию требуется:
-
Определить порядок реализации вычислений.
-
Составить графическую схему алгоритма.
-
Записать программу на языке Turbo Pascal.
-
Выполнить расчеты на ЭВМ.
-
Написать отчет по лабораторной работе.
СОДЕРЖАНИЕ И ОФОРМЛЕНИЕ ОТЧЕТА
ПО ЛАБОРАТОРНОЙ РАБОТЕ
Отчет оформляется в текстовом редакторе Word и должен содержать:
-
Название лабораторной работы.
-
Формулировку цели работы.
-
Задание.
-
Графическую схему алгоритма с учетом требований ГОСТ 19.002 – 80 и ГОСТ 19.003 – 80.
-
Программу на языке Turbo Pascal.
-
Результаты выполнения работы, заверенные сотрудником лаборатории вычислительной техники (или представить дискету с данной программой).
ЛитЕратура
-
Алексеев В.Е. и др. Вычислительная техника и программирование. Практикум по программированию: Практ. пособие/Под ред. А. В. Петрова.-М:Высш. шк., 1991.
-
Зуев Е.А. Язык программирования Turbo Pascal 6.0, 7.0.- М.: Веста, Радио и Связь, 1993.
-
Бородич Ю.С., А.Н. Вальвачев, А. И. Кузьмич. Паскаль для персональных компьютеров: Справ. Пособие/– Мн. : Высш. шк. : БФ РИТМП “НИКА”, 1991.
ВАРИАНТЫ ЗАДАНИЙ
1. Вычислить:
x=1.01; x=1.51
2. Вычислить:
x=2.02; x=2.845
3. Вычислить:
x=6.03; x=2.502
4. Вычислить:
x=5.04; x=6.311
5. Вычислить:
x=4.05; x=0.251
6. Вычислить:
x=2.06; x=3.535
7. Вычислить:
x=3.07; x=4.358
8. Вычислить:
x=2.385; x=1.08
9. Вычислить:
x=2.09; x=0.811
10. Вычислить:
x=1.10; x=2.381
11. Вычислить:
x=0.873; x=1.11
12. Вычислить:
x=0.251; x=2.12
13. Вычислить:
x=0.581; x=2.13
14. Вычислить:
x=1.14; x=2.483
15. Вычислить:
x=1.15; x=2.11
16. Вычислить:
x=1.16; x=2.543
17. Вычислить:
x=1.17; x=2.183
18. Вычислить:
x=1.18; x=0.125
19. Вычислить:
x=2.19; x=1.117
20. Вычислить:
x=1.20; x=2.813
ВРЕМЯ., ОТВЕДЕННОЕ НА ЛАБОРАТОРНУЮ РАБОТУ
Подготовка к работе - 1 академ. ч.
Выполнение работы - 1 академ. ч.
Расчеты на ЭВМ - 1 академ. ч.
Оформление работы - 1 академ. ч.
ПРОГРАМИРОВАНИЕ
С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАМ ФУНКЦИЙ НА ЯЗЫКЕ ТУРБО ПАСКАЛЬ
Методические указания
к выполнению лабораторной работы
по курсу “Программирование и основы алгоритмизации”
для студентов специальности 210100.
Составила: Стельмах И.В.
Рецензент:
Редактор: