Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1601

.pdf
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
1.46 Mб
Скачать

Функции.

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

Заметим, что практически все вышеизложенные теоретические выкладки для процедуры применимы и для функции.

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

В качестве примера использования функции возьмем вышеприведенную процедуру step1 вместе с головной программой step4 и преобразуем ее путем замены процедуры на функцию.

Procedure Step;

Var

M:integer;

A,z:real;

Function Step1(n:integer;x:real):real;

Var

I:integer;

Y:real;

Begin

Y:=1;

For i:=1 to n do

Y:=y*x;

Step1:=y;

End;

Begin

Read(a,m)

If m=0

Then z:=1

Else if m>0

Then z:=Step1(m,a)

Else z:= step1(m,1/a);

Write(z);

End.

Недостатком предыдущей программы возведения в степень является то, что показатель степени должен быть целочисленным. При дробных величинах степени необходимо воспользоваться(см. выше) стандартными функциями exp и ln:

xa → exp(a*ln(x))

В качестве примера рассмотрим следующее выражение:

Y=axp + bxq + cxl,

где a, b, c – произвольные числа; p,q,l – как целые, так и дробные показатели степени.

Составим программу, в которой процедура возведения в степень оформлена в виде отдельной подпрограммы – функции.

Program Step; Var

a, b, c, x, y, p, q, l:real; Function St(a, b:real):real; Var

d:real; Begin

If a>0 then d:=exp(b*ln(a))

Else if a<0 then d:=exp(b*ln(abs(a))) Else if b=0 then d:=1

Else d:=0; St:=d;

End; Begin

Writeln( Введите x ); Read(x);

Writeln( Введите a,b,c ); Read(a,b,c);

Writeln( Введите p,q,l ); Read(p,q,l); Y:=a*St(x,p)+b*St(x,q)+c*St(x,l); Write( y= ,y);

End.

Здесь три пары параметров x и p, x и q и x и l – фактические параметры(в арифметическом операторе присваивания, выполняющем вычисление значения y). А параметры a и b в заголовке Function – формальные параметры. Переменная d – локальная, которая потом присваивается имени St подпрограммы – функции.

Сама подпрограмма – функция осуществляет

процедуру возведения в степень:

D=ab.

Рассмотрим пример программы, в которой из головной программы осуществляется перекачка массива в процедуру – функцию.

Для этого рассмотрим следующую задачу. Пусть требуется составить программу для вычисления функции:

Y=ax2+bx+c,

где

12

N

 

 

15

a

ti ,

b

ti ,

i 1

 

i

n 1

c ri

i 1

ti и ri – элементы двух массивов.

Для вычисления коэффициентов a, b и c используем подпрограмму – функцию, которая должна обеспечивать вычисление суммы элементов массива при заданных пределах суммирования. Тогда среди формальных параметров необходимо указать: имя массива, нижний предел суммирования, верхний предел суммирования.

В подпрограмме – функции будем вычислять: Тогда программа в целом будет иметь вид:

1

S zi

i 1

Program func; Type

mas=array[1..15] real;

Var

t,z:mas;

n,i:integer;

x,y:real;

Function sum(z:mas;k,l:integer):real; Var

s;real;

i:integer; Begin

s:=0;

for i:=k to l do s:=s+z[i]; sum:=s;

end;

Begin

Writeln( Введите n ); Read(n);

Writeln( Введите x ); Read(x);

Writeln( Введите массив t ); for i:=1 to 15 do Read(t[i]); Write( Введите массив z ); for i:=1 to 12 do Read(x[i]);

y:=sum(t,1,n)*x*x+sum(t,n+1,is)*x+sum(z,1,R); Write( y= ,y);

end.

4.3. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВА-НИЕМ

СТРУКТУИРОВАННЫХ ТИПОВ ДАННЫХ

Выше было отмечено, что любые данные в языке Turbo Pascal характеризуется своими типами данных. Turbo Pascal характеризуется разветвленной структурой членов данных, которая приведена на следующем рисунке:

ТИПЫ

 

 

 

 

 

 

 

 

 

 

Простые

 

 

Порядковые

 

Целый

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вещественные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Логический

 

Структуиро-

 

 

 

 

 

 

 

 

 

ванные

 

 

Массивы

 

 

 

Символь-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Записи

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Указатели

 

 

 

 

 

 

Перечис-

 

 

 

 

 

 

 

 

 

 

 

Множества

 

 

 

ляемый

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Строки

 

 

 

 

 

 

 

 

 

 

 

 

Файлы

 

 

 

 

 

 

Процедурные

 

 

 

 

 

 

Тип-

 

 

 

 

 

 

 

диапазон

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Объекты

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 4. 2. 9. Структура типов данных.

Кроме того, как было отмечено, в языке Turbo Pascal предусмотрен механизм создания новых типов данных, благодаря чему общее количество типов, используемых в программах (описатель Type) может быть сколь угодно большим.

Следует иметь в виду, что в Turbo Pascal имеются дополнительные членовые типы для целочисленных и вещественных типов. Так для целочисленных типов, помимо типа Integer имеются и ряд других (см. табл. 4. 2.1), где имеется, например, тип Long Int , который допускает значения в диапазоне от –2147483648 до 2147483647.

Для содержания переменной типа LongInt в памяти выделяется 32 бита, в отличие от 16 битов, выделяемых для переменных типа Integer.

Таким образом, в таблице 4.2.1 указан диапазон допустимых значений для каждого из типов. Два целочисленных типа, Byte и ShortInt, используют только по 8 битов для каждого из своих значений (отличаются только диапазоном). Тип данных Word допускает только положительные целочисленные значение, поэтому его наибольшее допустимое значение вдвое превышает такое же значение для типа Integer. Все операции Turbo Pascal, применяемые к данным типа Integer, могут использоваться и с данными типов, перечисляемых в таблице

4.2.1.

Целые типы данных

Таблица 4.2.1.

 

 

 

Тип

 

Диапазон значений

Integer

 

-32768.. 32767

ShotInt

 

-128.. 127

LongInt

 

-2147483648.. 2147483647

Byte

 

0.. 255

Word

 

0.. 65535

Turbo Pascal также предоставляет несколько дополнительных типов данных для вещественных чисел. Эти типы перечислены в таблице 4.2.2, вместе с диапазоном допустимых значений, а также числом значащих разрядов для каждого из типов. Все операторы Turbo Pascal, применяемые к данным типа Real, могут использоваться и с данными, перечисленными в таблице

4.2.2.

Таблица 4.2.2

Вещественные типы данных

Тип

Диапазон значений

Число значащих

 

 

 

цифр мантиссы

Real

2.9Е39..

1.7Е38

11

- 12

Single

1.5Е45..

3.4Е38

7

- 8

Double

5.0Е324..

1.7Е308

15

- 16

Extended

1.9Е4951..1.1Е4932

19

- 23

 

 

 

 

 

Простые типы данных вместе со строковыми были рассмотрены выше. В данном разделе будут рассмотрены

структуированные типы данных и составление программ с их использованием.

Структуированные типы данных

Любой из структуированных типов (в языке Turbo Pascal их четыре: массивы, записи, множества и файлы) характеризуется множественностью образующих этот тип элементов, т. е. переменная …. Структуированного типа всегда имеет несколько компонентов. Каждый компонент, в свою очередь, может принадлежать структуированному типу, что позволяет говорить о возможной вложенности типов. В языке Turbo Pascal допускается произвольная глубина вложенности, однако суммарная длина любого из них во внутреннем представлении не должна превышать 65520 байт.

В целях совместимости со стандартным языком Pascal в Turbo Pascal разрешается перед описанием структуированного типа ставить служебное (зарезервированное) слов PACKED, предписывающее компилятору, по возможности, экономить память, отводимую под объекты структуированного типа; но компилятор фактически игнорирует его указание: «упаковка» данных в языке Turbo Pascal осуществляется автоматически везде, где это возможно.

Массивы

Массивы в языке Turbo Pascal во многом схожи с аналогичными видами данных в других языках программирования, отличительная особенность массивов заключается в том, их компоненты суть данные одного типа (возможно структуированного), эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием порядкового номера его индекса, например:

dig tipe = array [19] of char; Var

a: dig; Begin

A[3] = exp(3+5)/2; end

Следует иметь в виду, что если массив не передаѐтся в процедуру или функцию, то можно просто (в отличие от данного примера):

Var

a: array [19] of char;

Выше было приведено множество примеров программ с использованием одномерных и двумерных массивов.

Записи

Запись, как и массив - сложная переменная с несколькими фиксированными компонентами, являющиеся

родственными данными.

Однако, запись в отличие от массива, может содержать элементы, относящиеся к различным типам. Мы можем использовать запись для хранения разнотиповой (разнородной)