Скачиваний:
48
Добавлен:
10.02.2014
Размер:
175.1 Кб
Скачать

17

Министерство образования Российской Федерации

Саратовский государственный технический университет

ПРОГРАМИРОВАНИЕ

С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАМ ФУНКЦИЙ НА ЯЗЫКЕ ТУРБО ПАСКАЛЬ

Методическое указание

к выполнению лабораторной работы

по курсу «Программирование и основы алгоритмизации»

для студентов специальности 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 (а, Ь)).

ОБРАЩЕНИЕ К ФУНКЦИИ

После описания функции ее можно использовать в выра­жениях наряду со стандартными функциями. Аргументами при обращении могут быть любые выражения. Порядок сле­дования и типы аргументов должны быть такими же, как у параметров в заголовке функции.

Вычисление выражений, содержащих обращение к функ­ции, происходит по следующему алгоритму:

  1. вычисляются выражения для аргументов функции;

  2. значения аргументов присваиваются параметрам из за­ головка описания;

  3. выполняется тело функции и вычисляется ее значение;

  4. значение функции ставится в исходное выражение на место обращения к функции;

  5. вычисление исходного выражения продолжается.

Заметим, что если выражения для аргументов сами содер­жат обращения к функциям, то пункт выполняется по при­веденному алгоритму. В подобных случаях говорят, что ал­горитм — рекурсивный.

Давайте посмотрим, что дает нам описание функции. Вы правы, если думаете, что без него можно обойтись, заме­нив обращения к функции переменными нужного типа и за­ранее вычислив их значения. Но тогда придется запрограм­мировать одни и те же вычисления столько раз, сколько раз мы обращались к функции. Программа удлинится, по­теряет наглядность и утратит структуру, т.к. функция решает независимую от всего остального задачу, а мы «размажем» эту задачу по программе.

Такой образ действий повредит маленьким программам и катастрофически отразится на больших. Только разбивка задачи на множество относительно независимых под­задач позволяет программисту справляться со сложными программами.

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

Все формальные параметры можно разбить на четыре категории:

» параметры-значения (эти параметры в основной программе подпрограм­мой не меняются);

» параметры-переменные (эти параметры подпрограмма может изменить в основной программе); .

» параметры-константы (используются только в версии 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.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТ

Порядковый номер студента по списку группы соответствует номеру варианта. По проведенному заданию требуется:

  1. Определить порядок реализации вычислений.

  2. Составить графическую схему алгоритма.

  3. Записать программу на языке Turbo Pascal.

  4. Выполнить расчеты на ЭВМ.

  5. Написать отчет по лабораторной работе.

СОДЕРЖАНИЕ И ОФОРМЛЕНИЕ ОТЧЕТА

ПО ЛАБОРАТОРНОЙ РАБОТЕ

Отчет оформляется в текстовом редакторе Word и должен содержать:

  1. Название лабораторной работы.

  2. Формулировку цели работы.

  3. Задание.

  4. Графическую схему алгоритма с учетом требований ГОСТ 19.002 – 80 и ГОСТ 19.003 – 80.

  5. Программу на языке Turbo Pascal.

  6. Результаты выполнения работы, заверенные сотрудником лаборатории вычислительной техники (или представить дискету с данной программой).

ЛитЕратура

  1. Алексеев В.Е. и др. Вычислительная техника и программирование. Практикум по программированию: Практ. пособие/Под ред. А. В. Петрова.-М:Высш. шк., 1991.

  2. Зуев Е.А. Язык программирования Turbo Pascal 6.0, 7.0.- М.: Веста, Радио и Связь, 1993.

  3. Бородич Ю.С., А.Н. Вальвачев, А. И. Кузьмич. Паскаль для персональных компьютеров: Справ. Пособие/– Мн. : Высш. шк. : БФ РИТМП “НИКА”, 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.

Составила: Стельмах И.В.

Рецензент:

Редактор:

Соседние файлы в папке методические указания для лабораторных работ