Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Ограниченный тип (диапазон, интервал)
Множество значений простых типов упорядоченно и конечно (разумеется, кроме вещественного типа). Если программисту необходимо сузить диапазон значений, принимаемых некоторым объектом скалярного типа, то он осуществляет это в явном виде наложением ограничения на стандартный или определенный ранее перечислимый тип, который в этом случае называется базовым. Если какая-то переменная принимает не все значения своего типа, а только значения, содержащиеся в некотором ограниченном диапазоне, то ее можно рассматривать как переменную ограниченного типа (иногда говорят интервальный тип или тип диапазон). Пример.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; просмотров: 190. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |