Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Ограниченный тип (диапазон, интервал)




 

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

Пример.Type Day = (Mo , Tu , We , Th , Fr , Sa , Su);

Mom = 10...25

Sss = ` C`...`X`;

Wd = SA...SU;

Для ограниченного типа Mom базовым является целый тип, для SSS - символьный, для Wd - определённый ранее перечислимый тип Day.

Попытка присвоить переменной ограниченного типа значение \, не входящее в заданный диапазон, приведёт к возникновению ошибки при счёте.

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

Пусть, например, в разделе описания указан перечислимый тип Год:

Type Year = ( Jan, Febr, Mart, Apr, May, Jun, Jul, Aug, Sent, Okt, Nov, Dec);

А нам предстоит решать задачи, связанные только с весенним временем года. Тогда можно ввести ограниченный тип: Spring Sum = Маy .. Aug; который является частью перечислимого типа.

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

Общий вид описания ограниченного типа:

Type имя типа = константа 1 .. константа N;

Общий вид описания переменных ограниченного типа:

Var имя переменной: имя типа;

Пример.

Type T = 1... 100;

Var A, B: T;

Переменные А и В могут принимать любые значения из диапазона 1..100.

При использовании ограниченного типа должно выполняться следующее

Правила:

1) обе граничные константы должны быть одинакового типа;

2) начальное значение не должно быть больше конечного;

3) тип констант может быть любой простой, кроме действительного (целый, символьный, логический, перечислимый).

Пример. К= 15 ... 70; - целый

Lit = ‘A’ ... ‘ z’ ; - символьный

Summer = Jun ... Aug ; - переменный

Если константы имеют стандартный типа можно делать непосредственно в разделе переменных.

Пример. Var S1, S2: 1..100;

Sim : ‘A’..’R’;

Тип констант называется базовым. Над переменными ограниченного типа разрешается выполнять все операции, которые допустимы для данных его базового типа.

Пример. Если переменная К принимает только целые значения 4,5,6,7,8,9, то лучше дать описание: Var K: 4..9; чем Var K: Integer; И вот почему. В случае выхода ‘K’ за диапазон 4..9 в первом варианте (ограниченный тип) будет выдано диагностическое сообщение об ошибке. Во втором варианте (целый тип) может быть выдан неверный результат.

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

ПРОЦЕДУРЫ И ФУНКЦИИ

 

Как записывается текст песни? Припев даётся один раз. Если нужно повторять его, то указывается одно слово – припев. Зачем же повторять несколько раз одно и тоже? Этот же принцип действует и в программировании. Если какая-нибудь часть программы многократно повторяется, то её оформляют отдельно от основной программы и называют подпрограммой. К ней обращаются при необходимости ее использования.

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

Подпрограммы располагаются в разделе описания основной программы. Выполнение программы начинается с выполнения операторов основной программы. При необходимости выполнения программы, она вызывается по имени. Данные из основной программы передаются в подпрограмму (входные данные), которая начинает выполняться. Затем результаты подпрограммы (входные данные) передаются в основную программу в то место, откуда был сделан вызов подпрограммы, и продолжает выполняться основная программа.

Подпрограмма оформляется подобно основной программе, то есть состоит из заголовка, раздел описаний и раздел операторов. Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме.

Имена, представленные в разделе описаний подпрограммы, называются локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы.

В языке программирования Паскаль есть два вида подпрограмм:

Procedure – процедура и

Function - функция.

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

Описание процедур

 

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

Procedure имя (список формальных параметров);

Раздел описаний

Begin

Раздел операторов

End;

Раздел описаний процедуры подобен разделу описаний программы и состоит из разделов меток, констант, типов, переменных, процедур и функций. Он может отсутствовать вообще. Раздел операторов заключён в операторные скобки Begin End;

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

параметры – значений

параметры - переменных (перед ними должно стоять слово var),

параметры – процедуры (перед ними должно стоять служебное слово Procedure),

параметры – функции (перед ними должно стоять служебное слово Function)

Выполнение процедуры происходит при её вызове по имени:

Имя (фактические параметры).

Между формальными и фактическими параметрами должно быть полное соответствие:

- количество формальных и фактических параметров должно быть одинаково,

- порядок следования формалтных и фактических параметров должен быть один и тот же,

- тип каждого фактического параметра жлдэен совпадать с типом соответствующего ему формального параметра.

С помощью формальных и фактических параметров данные передаются из программы в процедуру и наоборот. В качестве формальных параметров могут использоваться только переменные с указанием их типа. В качестве фактических параметров могут использоваться константы, переменные, выраженные без указания их типа. При вызове процедуре сначала передаются параметры, при этом параметры-значения передаются по значению, а параметры-переменные – по ссылке. Основное отличие этих способов передачи заключается в том, что присвоение значений параметру переменной внутри процедуры одновременно выполняются и для соответствующего аргумента. То есть параметры, в которые записываются результаты работы процедуры, должны передаваться только по ссылке. Параметры, через которые в процедуру передаются исходные данные, передаются по значению.

Хотя параметры процедуры делятся на отдельные виды, но в простых программах чаще всего используются параметры-значения и параметры-переменные. Данные этих параметров передаются в обоих направлениях, из программы в процедуру и наоборот.

Параметры–значения (перед ними не стоит слово var) можно передавать только в одном направлении: из программы в процедуру. То есть, параметры-значения могут быть только входным для процедуры, а параметры-переменные как входными, так и выходными.

Процедура может содержать несколько операторов и несколько результатов выполнения. Каждый результат обозначается своим именем. В основной программе после вызова процедуры мы можем использовать эти результаты, сохраняя те же имена или давая другие.

Пример: Пусть в программе необходимо многократно вычислять площадь квадрата sк=а^2 и площадь прямоугольника sp=a*b при различных значениях сторон а и b.

Procedure Place (x, y: real);

Begin

Sk:=x*x

Sp:=x*y

End;

Вызвать эту процедуру можно, используя фактические переменные:

Place (A, B); где значения параметра А и В передаются в процедуру параметром X, Y.

Другой вариант:

Procedure Place (x, y: real; Var Sk, Sp: real);

Тогда обращение к ней: Place (A, B, S1, S2);

При вызове процедуры вместо переменных А, В можно указать конкретные значения: Place (2.5, 4, S1, S2).

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

Процедуры возвращают результат в основную программу не только при помощи параметров – переменных, но непосредственно изменяя глобальные переменные. Переменные, описанные в основной программе, являются глобальными по отношению к внутренним процедурам и функциям. Переменные, описанные внутри процедур и функций, являются локальными. Локальные переменные существуют только при выполнении процедуры и недоступны в основной программе. Переменная с символьного типа, описанная в процедуре Podschet, является локальной, а переменная s целого типа, описанная в основной программе, является глобальной.

Стандартные процедуры

 

Это, в первую очередь, процедуры ввода и вывода Read, readln, write, writeln. С ними вы знакомы.

В циклах Repeat, While и For можно использовать еще две процедуры – Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условий выхода.

Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена.

Пример: В массиве целых чисел найти первое отрицательное число и вывести его на экран.

Фрагмент программы

For I:=1 to N do {поиск отрицательного числа}

Begin

If A[i]>=0 then

Continiue; {не отр.=> на след. число}

Writeln (‘1-ое отриц. число=’, A[i]);

Break

End;

Процедура Exit служит для досрочного выхода из программы. Дело в том, что безусловный переход с использованием оператора goto можно осуществлять далеко не из каждого места программы и не в любое место программы. Так, например, нельзя с его помощью перейти из основной программы в подпрограмму или выйти из подпрограммы. Для этой цели используется процедура Exit.

Описание функций

 

Описание функции в основном аналогично описанию процедуры, однако есть и отличия. Результатом работы функции является одно значение. Тип результата задается в заголовке.

Общий вид заголовка функции:

Function имя функции (список формальных параметров):тип результата.

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

Применение функции с побочным эффектом нарушает структурированность программы, поэтому их использование нежелательно.

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

Пример: Найти разность двух факториалов: F=m!-k!

Program P1;

Var F,M,K:Integer;

Function Fact (N:Integer):Integer;

Var P,I:Integer;

Begin

P:=1

For I:=2 to N do

P:=P*I;

Fact:=P

End;

Begin

Writeln (‘Ввод М,К’);

Readln (M,K);

F:=Fact (M) – Fact (K);

Writeln (‘F=’,F:5);

End.

 

Внутри функции имена N,P,I являются локальными. Результат вычисления факториала обозначается именем функции Fact. В основной программе переменные F,M,K являются глобальными. При вычислении значения F дважды происходит обращение к функции Fact(M) и Fact(k) прямо в правой части оператора присваивания. При этом вызов функции м. делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например Sin(x).

Стандартные функции

 

Они вам известны: это арифметические, алгебраические и тригонометрические функции. Кроме того, есть функция конца строки: Eoln - end of line.

Итерация и рекурсия

 

Итерация (от лат. повторение) - повторение, применение какой – либо математической.

 

Пример: Вычислить сумму ряда:

S=a1+a2+….+an

S1=a1

S2=a1+a2

S3=a1+a2+a3

S4=a1+a2+a3+a4

…………………

S=a1+a2+…+an

 

Рекурсия (от лат. возвращение) - вычисление последующего значения ряда через предыдущее. Последовательность, в которой соседние значения связаны формулой, называется рекурсивной.

 

Пример: Арифметическая прогрессия: a1, a2=a1+d, a3=a2+d, an=an-1+d

Пример.

Begin

If (n=0) or (n=1) then Factorial:=1

Else begin F:=1

For i:=2 to n do

F:=f*i;

Factorial:=f;

End;

End;

Begin Writeln (‘Введите N’);

Readln (N);

Writeln (‘факториал=’,Fact);

End.

 

Пример.

Program Rekursion;

Var fact:real;

N:integer;

Function Factorial (N:integer):real;

Begin

If (n=0) or (N=1) then factorial:=1

Else factorial:=factorial (N-1)*n;

End;

Begin

writeln (‘Введите N’);

Readln (N);

Fact:=factorial (N);

Writeln (‘факториал=’,fact);

End.

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

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

Вычисление факториала можно представить опять через факториал.

N!=n(n-1)!-рекурсивная формула.

Представление факториала в виде последовательности операций умножения – это итерационный процесс. n!= 1*2*3…n-итерационная формула. Итерация программируется с помощью циклов.

Пример: Вычисление факториала.

Program Iteracion ;

Var fact: real;

N:integer;

Function factorial (n: integer):real;

Var f:real;

I: integer;

Пример. В 13 веке итальянский математик Фибоначчи сформулировал задачу: ”Некто поместил пару кроликов в некое место, огороженное со всех сторон стеной, чтобы узнать, сколько пар кроликов родится в течение года, если через месяц пара кроликов производит на свет другую пару, а рожают со второго месяца после своего рождения.

 

Program Krolik;

Var kr:integer; (*число кроликов*)

N:Integer; (*число месяцев*)

Function fib(n:integer):integer;

Begin

If (n=1) or (n=2) then fib:=1

Else fib:=fib(n-1)+fib(n-2)

End;

Begin

Writeln(‘ввести N’);

Readln (N);

Kr:=fib (N); (*вызов ф-и*)

Writeln (kr:5);

End.

Побочный эффект рекурсии

 

В теле подпрограммы известны, то есть доступны все объекты, описанные в объемлющем блоке, в том числе и имя самой подпрограммы. Внутри тела подпрограммы возможен вызов самой подпрограммы. Параметры и функции использующие вызовы “самих себя“, называются рекурсивными. Допустима также косвенная рекурсия, при которой параметр А вызывает параметр В, а тот, в свою очередь, вызывает С, который вызывает первоначальный параметр А.

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

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

Если в некоторой функции имеются конструкции, например, операторы присваивания, изменяющие значения переменных, описанных в объемлющих блоках, то может возникнуть ситуация, при которой значения выражения, использующего вызов такой функции, зависит от порядка следования операторов, что является потенциальным источником ошибок и поэтому крайне нежелательно. Описанная ситуация называется побочным эффектом рекурсии.

Пример:

Program Side Effect;

Var a,z :integer;

Function change (x: integer): integer;

Begin

Z:=z-x; {изменяем значение нелокальной переменной}

Change:= sqr (x)

End;

Begin

Z:=10; a:=change (z); writeln(a,z);

Z:=10; a:=change (10)*change (z);

Writeln(a,z);

Z:=10; a:=change (z) * change(10);

Writeln (a,z)

End.

Выполнение этой программы приводит к следующему результату на дисплее:

100          0

10000    -10

0             0

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

Следует всячески избегать такой зависимости функции от глобальных по отношению к ней переменных. Заметим, что современные языки, например, Ada содержит прямые запреты на подобные действия.










Последнее изменение этой страницы: 2018-05-27; просмотров: 158.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...