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

Основы алгоритмизации и программирования на языке Паскаль

..pdf
Скачиваний:
11
Добавлен:
15.11.2022
Размер:
2.96 Mб
Скачать

В качестве примера приведем три фрагмента програм­ мы, в которой используется описанная выше процедура Surface. Для вызова процедуры надо указать ее имя, а в скобках - фактические параметры.

1. Surface ( f 3.45, 3.56, S-face);

Фактические параметры

При таком обращении к процедуре входные параметры получают значения а = 1, b = 3,45, с = 3,56. При этих зна­ чениях процедура выполняется, т.е. вычисляется площадь треугольника. Выходной параметр S будет передан в ос­ новную программу переменной S-face, где ее можно ис­ пользовать для дальнейших расчетов.

3. Surface (alfa-1.3, х+у, 4.5, S1);

гетры

Механизм передачи параметров во втором и третьем случаях аналогичен первому.

Итак, входные параметры могут быть:

-константами (пример 1);

-переменными (пример 2);

-выражениями (пример 3).

Выходные параметры могут быть только пере­ менными.

Имена (идентификаторы), описанные в процедуре, называются локальными и действуют только в этой про­ цедуре. В нашем случае это переменная Р.

Имена, описанные в основной программе, называются глобальными и действуют во всей программе и в любой процедуре (если они не описаны там заново).

Пример

6.2.

Вычислить

В

площадь

выпуклого

четырех­

 

угольника,

заданного

длинами

 

сторон АВ, ВС, CD, DA и диаго­

 

налью DB (рис. 6.1).

 

 

Для

решения

этой задачи

Рис. 6.1

используем

подпрограмму Sur

face из примера 6.1, к которой обратимся дважды для вы числения площадей треугольников S1 и S2.

Блок-схема программы, содержащей подпрограмму:

Блок

процедуры

Блок вызова подпрограммы

Программа, содержащая процедуру, имеет вид

Program DProc;

Var AB,BC,CD,DA,DB,S,Sl,S2:real; {глобальные пар-ры} Procedure Surface(a,b,с: real; VarS: real); {локальные пар-ры} Var p: real;

Begin p:=(a+b+c)/2;

S:=sqrt(p*(p-a) *(p-b) *(p-c)); End;

{основная программа} Begin

Writeln('Beedu длины сторон и диагональ 4-хугольника-');

Readln(АВ,ВС,CD,DA,DB);

 

Surface(BC,CD,DB,S2);

{вызов процедуры}

Surface(AB,DB,DA,Sl);

{вызов процедуры}

S:=S1+S2;

 

Writeln(rS= ',S:6:2);

 

End.

 

Фактические параметры AB, ВС, CD, DA, DB, SI и S2, указанные при вызове процедуры (процедура вызывается дважды), подставляются вместо соответствующих фор­ мальных параметров, указанных в заголовке процедуры.

6.4. Функция пользователя

Другой вид подпрограммы пользователя - это функция (Function). Функция оформляется аналогично процедуре, за исключением заголовка.

Формат заголовка подпрограммы Function:

Function <имя>(<формальные параметры и их тип>): <тип>;

Пример 6.3. Используя подпрограмму Function, вычис­ лить значение функции у = у(х) для любого вводимого зна­ чения х.

 

 

У = 1

 

 

\х\ < 1;

 

 

 

 

 

 

 

 

^cos2 х ;

х >

1 ,

х < —1

Program D_Funct;

 

 

 

 

Var

х, у, z: real

{глобальные

параметры}

Function

F(t: real):

real;

 

 

 

Var

w:

real;

 

 

 

{локальный параметр}

Begin

 

 

 

 

 

 

I f Abs(t)<=l

then

w:=Sqrt(l-Sqr(t))

 

 

else

w:=Sqr(Cos(t));

F:=w;

End;

{основная программа} Begin

Write('eeedu x='); Readlnfx); y:=F(x);

Writeln(x:6:2, y:8:3); z:=x+1.5;

y:=F(z); Writeln(z:6:2,y:8:3);

End.

Отличительные особенности подпрограммы Function:

- имея несколько входных параметров, функция имеет один выходной параметр;

- этот параметр обозначается именем функции и пе­ редается в основную программу в качестве операнда в вы­ ражении;

-в разделе операторов подпрограммы должен нахо­ диться оператор, присваивающий имени функции какоелибо значение (F:=w;);

-вызывается функция по ее имени с указанием факти­ ческих параметров (со знаком «присвоить как стандартная функция»).

Обратите внимание, что в основной программе вызов подпрограммы Function происходит дважды: первый раз

для значения параметра х, вводимого с пульта, второй - для параметра z:=x+1.5.

6.5.Рекурсивные программы

Вматематике рекурсивным называется определение любого понятия через самого себя. Классическим приме­ ром является определение факториала целого числа:

гг! = 1 • 2 ■ ■п — п(п 1)!

Здесь функция «факториал» определена через факториал:

1, если п = О, п(п —1)!, если п > 0.

Рекурсия - это такой способ организации вычис­ лительного процесса, при котором подпрограмма обращается сама к себе.

Пример 6.4. Определить факториал целого числа п. Для вычисления приведенной выше рекурсивной формулы ис­ пользуем подпрограмму-функцию Fakt.

Program

D_Recurc;

Var п, f: nteger;

Function

Fakt(m: integer): integer;

Begin

 

 

I f m=l

then Fakt:=l

else

Fakt:= m*Fakt(m-l); {рекурсивное вычисление}

End;

 

 

Begin

 

{основная программа}

Write('введи n='); Readln(n); f:=Fakt(n);

WriteIn('n!= 'f:3); End.

Пусть в основной программе вычисляется 3!, для этого используется операторf:=Fakt(3).

При вычислении функции с параметром 3 произойдет повторное обращение к функции Fakt(2). Это обращение потребует вычисления Fakt(l). При вычислении Fakt(O) получим числовой результат - 1. Затем цепочка вычисле­ ний раскрутится в обратном порядке:

Fakt(l)-1 * Fakt(0)=l

Fakt(2)=2* Fakt(l)=2

Fakt(3)=3* Fakt(2)=6

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

Рассмотренную задачу вычисления п! можно решить и так:

F:=l;

For i:=l to n do F:=F *i;

Такой вариант программы будет работать быстрее, чем рекурсивный.

Контрольные вопросы и задания

1.Основные принципы структурного программирования.

2.Стандартные подпрограммы, примеры их использо­

вания.

3.Подпрограммы пользователя Procedure, Function, оформление, вызов, отличие между ними.

4.Формальные и фактические параметры.

5.Что такое локальные и глобальные параметры?

6.Что такое входные и выходные параметры?

Лекция 7

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

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

Если же в задаче имеется большое количество входных и выходных данных, то именовать каждое из них практиче­ ски невозможно. В этих случаях разработчики программ используют структурированные типы. При этом структу­ ра объединяет группу разных данных под одним именем.

Самым широко известным из структурированных ти­ пов данных является массив. Ограничимся описанием только этого типа данных.

Предварительно познакомимся с еще одним типом данных - интервальным (отрезком). Кроме того, рас­ смотрим типы данных, определяемые пользователем.

7.1. Интервальный тип данных (отрезок)

Интервальный тип позволяет задавать две кон­ станты, определяющие границы диапазона значений для данной переменной.

Например: Пусть переменная Number соответствует порядковому номеру студента в списке группы. Эта пере­

менная может принимать целые значения Number = 1,2 25. Если объявить эту переменную типом integer, то диапа­ зон допустимых значений этой переменной будет от -32 768 до +32 767. Нас же интересует диапазон от 1 до 25, поэтому для описания типа переменной Number целе­ сообразно выбрать интервальный тип данных (отрезок).

Формат отрезка:

Var <имя переменой>: <константа1>..<константа2>;

Обе константы принадлежат одному и тому же типу (чаще всего это integer). Значение <константа1> обяза­ тельно меньше значения <константа2>.

Для нашего примера: Var Number: 1...25;

При каждой операции с переменной интервального ти­ па компилятор производит проверку, остается ли значение переменной внутри установленного для нее диапазона.

7.2. Типы данных, определяемые пользователем

Кроме стандартных (базовых) типов данных Паскаль поддерживает типы, определяемые самим программистом, так называемые пользовательские типы.

Пользовательский тип задается в два этапа:

1.Объявляется образец нового типа данных в разделе описания типов Туре.

2.Этот новый тип используется для объявления

переменных в разделе Var, как если бы это был обыч­ ный стандартный тип, например real или integer.

Например:

Type

w = l.. 25;

Var

Number: w;

Переменная Number объявлена как переменная интер­ вального типа (отрезок).

7.3. Массивы - основные понятия

При решении многих задач часто используются не от­ дельные числа и величины, а множество связанных од­ нородных величин.

Например, последовательность чисел

вектор

А(аг, 0-2, -.On)

ИЛИ

 

Ьц

К г

Кп

матрица

K i

b22

Кп

В =

 

, или

 

Ап К г

К п-

Сидоров

Иванов

список строк Spisok =

Эти наборы данных имеют один и тот же тип. Для об­ работки таких данных вводится понятие «массив».

Массив - это совокупность конечного числа дан­ ных одного типа.

Любой массив имеет размер и размерность. Размер массива - это количество элементов в этом массиве.