Лекции по программированию на Паскале. Часть 3




25. П Р О Ц Е Д У Р ЫИ Ф У Н К Ц И И Алгоритм решения задачи проектируется путем декомпозиции всей за-дачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подп-рограмм. Подпрограмма - это последовательность операторов, которые опреде-лены и записаны только в одном месте программы, однако их можновызвать для выполнения из одной или нескольких точек программы. Каж-дая подпрограмма определяется уникальным именем. В языке ПАСКАЛЬ су-ществуют два типа подпрограмм - процедуры и функции. Процедура и функция - это именованная последовательность описанийи операторов. При использовании процедур или функций ПАСКАЛЬ - прог-рамма должна содержать текст процедуры или функции и обращение к про-цедуре или функции. Тексты процедур и функций помещаются в разделописаний процедур и функций.{} Процедура может содержать такие - же разделы описаний, что и ПАС-КАЛЬ - программа, а именно: разделы описания модулей, меток, конс-тант, типов, переменных, процедур и функций.{} ПЕРЕДАЧА ИМЕН ПРОЦЕДУР И ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ. Во многихзадачах, особенно в задачах вычислительной математики, необходимо пе-редавать имена процедур и функций в качестве параметров. Для этого вTURBO PASCAL введен новый тип данных - процедурный или функциональ-ный, в зависимости от того, что описывается. Описание процедурных и функциональных типов производится в разделеописания типов: type FuncType = Function(z: Real): Real; ProcType = Procedure (a,b: Real; var x,y: Real); Функциональный и процедурный тип определяется как заголовок проце-дуры и функции со списком формальных параметров, но без имени. Можноопределить функциональный или процедурный тип без параметров, напри-мер: type Proc = Procedure; После объявления процедурного или функционального типа его можноиспользовать для описания формальных параметров - имен процедур ифункций. Кроме того, необходимо написать те реальные процедуры или функции,имена которых будут передаваться как фактические параметры. Эти про-цедуры и функции должны компилироваться в режиме дальней адресации сключом {$F+}. Пример. Составить программу для вычисления определенного интеграла tk 2t I= S--------------- dt sqrt(1-sin2t) tnпо методу Симпсона. Вычисление подинтегральной функции реализовать спомощью функции, имя которой передается как параметр. Значение опре-деленного интеграла по формуле Симпсона вычисляется по формуле: ISimps=2*h/3*(0.5*F(A)+2*F(A+h)+F(A+2*h)+2*F(A+3*h)+... +2*F(B-h)+0.5*F(B)) где A и B - нижняя и верхняя границы интервала интегрирования, N - число разбиений интервала интегрирования, h=(B-A)/N, причем N должно быть четным. Program INTEGRAL; type Func= function(x: Real): Real; var I,TN,TK:Real; N:Integer;{$F+} Function Q(t: Real): Real; begin Q:=2*t/Sqrt(1-Sin(2*t)); end;{$F-} Procedure Simps(F:Func; a,b:Real; N:Integer; var INT:Real); var sum, h: Real; j:Integer; begin if Odd(N) then N:=N+1; h:=(b-a)/N; sum:=0.5*(F(a)+F(b)); for j:=1 to N-1 do sum:=sum+(j mod 2+1)*F(a+j*h); INT:=2*h*sum/3 end; begin WriteLn(' ВВЕДИ TN,TK,N'); Read(TN,TK,N); Simps(Q,TN,TK,N,I); WriteLn('I=',I:8:3) end. {}26. О П Е Р А Т О Р ЫВ ЫХ О Д А Для завершения работы программ, процедур и функций без предвари-тельного перехода по меткам к закрывающему end в TURBO PASCAL введеныпроцедуры Exit и Halt. Вызов Exit завершает работу своего программного блока и передаетуправление вызывающей программе. Если Exit выполняется в подпрограм-ме, то выполнение этой подпрограммы прекратится, и далее будет выпол-няться следующий за вызовом этой подпрограммы оператор. Если Exit вы-полняется в основной программе, выход из нее будет эквивалентен еенормальному завершению. Вызов процедуры Halt, где бы она не находилась, завершает работупрограммы и передает управление операционной системе. Процедура Halt имеет структуру Halt(n), где n - код возврата, ко-торый может быть проанализирован операционной системой с помощью ко-манды IF ERRORLEVEL. Значение n=0 соответствует нормальному заверше-нию работы программы. Вызов процедуры Halt без параметра эквивалентенвызову Halt(0). 27. М О Д У Л И Модуль (UNIT) в TURBO PASCAL - это особым образом оформленная биб-лиотека подпрограмм. Модуль в отличие от программы не может быть за-пущен на выполнение самостоятельно, он может только участвовать впостроении программ и других модулей. Модули позволяют создавать личные библиотеки процедур и функций истроить программы практически любого размера. Модуль в TURBO PASCAL представляет собой отдельно хранимую и неза-висимо компилируемую программную единицу. В общем случае модуль - это совокупность программных ресурсов,предназначенных для использования другими программами. Под программ-ными ресурсами понимаются любые элементы языка TURBO PASCAL: констан-ты, типы, переменные, подпрограммы. Модуль сам по себе не являетсявыполняемой программой, его элементы используются другими программны-ми единицами. Все программные элементы модуля можно разбить на две части: - программные элементы, предназначенные для использования другимипрограммами или модулями, такие элементы называют видимыми вне моду-ля; - программные элементы, необходимые только для работы самого моду-ля, их называют невидимыми или скрытыми. В соответствии с этим модуль, кроме заголовка, содержит две основ-ные части, называемые интерфейсом и реализацией. В общем случае модуль имеет следующую структуру: unit <имя модуля>; {заголовок модуля} interface { описание видимых программных элементов модуля } { описание скрытых программных элементов модуля } begin { операторы инициализации элементов модуля } end. В частном случае модуль может не содержать части реализации и час-ти инициализации, тогда структура модуля будет такой: unit <имя модуля>; {заголовок модуля} interface { описание видимых программных элементов модуля } implementation end. Использование в модулях процедур и функций имеет свои особенности.Заголовок подпрограммы содержит все сведения, необходимые для ее вы-зова: имя, перечень и тип параметров, тип результата для функций, этаинформация должна быть доступна для других программ и модулей. С дру-гой стороны, текст подпрограммы, реализующий ее алгоритм, другимипрограммами и модулями не может быть использован. Поэтому заголовокпроцедур и функций помещают в интерфейсную часть модуля, а текст - вчасть реализации. Интерфейсная часть модуля содержит только видимые (доступные длядругих программ и модулей) заголовки процедур и функций (без служеб-ного слова forward). Полный текст процедуры или функции помещают вчасть реализации, причем заголовок может не содержать список формаль-ных параметров. Исходный текст модуля должен быть откомпилирован с помощью дирек-тивы Make подменю Compile и записан на диск. Результатом компиляциимодуля является файл с расширением.TPU (Turbo Pascal Unit). Основноеимя модуля берется из заголовка модуля. Для подключения модуля к программе необходимо указать его имя вразделе описания модулей, например: uses CRT, Graph; В том случае, если имена переменных в интерфейсной части модуля ив программе, использующей этот модуль, совпадают, обращение будетпроисходить к переменной, описанной в программе. Для обращения к пе-ременной, описанной в модуле, необходимо применить составное имя,состоящее из имени модуля и имени переменной, разделенных точкой. Например, пусть имеется модуль, в котором описана переменная К: unit M; interface var K: Integer; implementation................. end. Пусть программа, использующая этот модуль, также содержит перемен-ную К: Program P; uses M; var K: Char; begin............. end. Для того, чтобы в программе P иметь доступ к переменной K из моду-ля M, необходимо задать составное имя M.K. Использование составных имен применяется не только к именам пере-менных, а ко всем именам, описанным в интерфейсной части модуля. Рекурсивное использование модулей запрещено. Если в модуле имеется раздел инициализации, то операторы из этогораздела будут выполнены перед началом выполнения программы, в которойиспользуется этот модуль. 28. М Н О Ж Е С Т В А Понятие множества в языке ПАСКАЛЬ основывается на математическомпредставлении о множествах: это ограниченная совокупность различныхэлементов. Для построения конкретного множественного типа использует-ся перечисляемый или интервальный тип данных. Тип элементов, состав-ляющих множество, называется базовым типом. Множественный тип описывается с помощью служебных слов Set of,например: type M= Set of B; Здесь М - множественный тип, В - базовый тип. Пример описания переменной множественного типа: type M= Set of 'A'..'D'; var MS: M; Принадлежность переменных к множественному типу может быть опреде-лена прямо в разделе описания переменных: var C: Set of 0..7; Константы множественного типа записываются в виде заключенной вквадратные скобки последовательности элементов или интервалов базово-го типа, разделенных запятыми, например: ['A', 'C'] [0, 2, 7] [3, 7, 11..14]. Константа вида [ ] означает пустое подмножество. Множество включает в себя набор элементов базового типа, все подм-ножества данного множества, а также пустое подмножество. Если базовыйтип, на котором строится множество, имеет К элементов, то число подм-ножеств, входящих в это множество, равно 2 в степени К. Пусть имеетсяпеременная Р интервального типа: var P: 1..3; Эта переменная может принимать три различных значения - либо 1,либо 2, либо 3. Переменная Т множественного типа var T: Set of 1..3; может принимать восемь различных значений: [ ] [1,2] [1] [1,3] [2] [2,3] [3] [1,2,3] Порядок перечисления элементов базового типа в константах безраз-личен. Значение переменной множественного типа может быть задано конс-трукцией вида [T], где T - переменная базового типа. К переменным и константам множественного типа применимы операцииприсваивания(:=), объединения(+), пересечения(*) и вычитания(-): ['A','B'] + ['A','D'] даст ['A','B','D'] ['A'] * ['A','B','C'] даст ['A'] ['A','B','C'] - ['A','B'] даст ['C']. Результат выполнения этих операций есть величина множественноготипа. К множественным величинам применимы операции: тождественность (=),нетождественность (<>), содержится в (<=), содержит (>=). Результатвыполнения этих операций имеет логический тип, например: ['A','B'] = ['A','C'] даст FALSE ['A','B'] <> ['A','C'] даст TRUE ['B'] <= ['B','C'] даст TRUE ['C','D'] >= ['A'] даст FALSE. Кроме этих операций для работы с величинами множественного типа вязыке ПАСКАЛЬ используется операция in проверяющая принадлежность элемента базового типа, стоящего слеваот знака операции, множеству, стоящему справа от знака операции. Ре-зультат выполнения этой операции - булевский. Операция проверки при-надлежности элемента множеству часто используется вместо операций от-ношения, например: A in ['A', 'B'] даст TRUE, 2 in [1, 3, 6] даст FALSE. При использовании в программах данных множественного типавыполнение операций происходит над битовыми строками данных. Каждомузначению множественного типа в памяти ЭВМ соответствует один двоичныйразряд. Например, множество ['A','B','C','D'] представлено в памяти ЭВМ битовой строкой 1 1 1 1. Подмножества этого множества представлены строками: ['A','B','D'] 1 1 0 1 ['B','C'] 0 1 1 0 ['D'] 0 0 0 1 Величины множественного типа не могут быть элементами списка вво-да - вывода. В каждой конкретной реализации транслятора с языка ПАСКАЛЬ коли-чество элементов базового типа, на котором строится множество, огра-ничено. В TURBO PASCAL количество базовых элементов не должно превы-шать 256. Инициализация величин множественного типа производится с помощьютипизированных констант: const seLit: Set of 'A'..'D'= []; Проиллюстрируем применение данных множественного типа на примере. Пример. Составить программу, которая вырабатывает и выводит на эк-ран дисплея наборы случайных чисел для игры в "Спортлото 5 из 36". Для заполнения каждой карточки спортлото необходимо получить набориз пяти псевдослучайных чисел. К этим числам предъявляются два требо-вания: -числа должны находиться в диапазоне 1..36; -числа не должны повторяться. Program Lotto; var nb, k: Set of 1..36; kol, l, i, n: Integer; begin Randomize; WriteLn('ВВЕДИ kol'); ReadLn(kol); nb:=[1..36]; for i:=1 to kol do begin k:=[]; for l:=1 to 5 do begin repeat n:=Random(36) until (n in nb) and not (n in k); k:=k+[n]; Write(n:4) end; WriteLn end end. 29. З А П И С И Запись представляет собой совокупность ограниченного числа логи-чески связанных компонент, принадлежащих к разным типам. Компонентызаписи называются полями, каждое из которых определяется именем. Полезаписи содержит имя поля, вслед за которым через двоеточие указывает-ся тип этого поля. Поля записи могут относиться к любому типу, допус-тимому в языке Паскаль, за исключением файлового типа. Описание записи в языке ПАСКАЛЬ осуществляется с помощьюслужебного слова RECORD, вслед за которым описываются компоненты за-писи. Завершается описание записи служебным словом END. Например, записная книжка содержит фамилии, инициалы и номера те-лефона, поэтому отдельную строку в записной книжке удобно представитьв виде следующей записи: type Row=Record FIO: String[20]; TEL: String[7] end; var str: Row; Описание записей возможно и без использования имени типа, напри-мер: var str: Record FIO: String[20]; TEL: String[7] end; Обращение к записи в целом допускается только в операторах присва-ивания, где слева и справа от знака присваивания используются именазаписей одинакового типа. Во всех остальных случаях оперируют отдель-ными полями записей. Чтобы обратиться к отдельной компоненте записи,необходимо задать имя записи и через точку указать имя нужного поля,например: str.FIO, str.TEL Такое имя называется составным. Компонентой записи может быть так-же запись, в таком случае составное имя будет содержать не два, абольшее количество имен. Обращение к компонентам записей можно упростить, если воспользо-ваться оператором присоединения with. Он позволяет заменить составные имена, характеризующие каждое по-ле, просто на имена полей, а имя записи определить в операторе присо-единения: with M do OP; Здесь М - имя записи, ОР - оператор, простой или составной.Оператор ОР представляет собой область действия оператора присоедине-ния, в пределах которой можно не использовать составные имена. Иногда содержимое отдельной записи зависит от значения одного изее полей. В языке ПАСКАЛЬ допускается описание записи, состоящей изобщей и вариантной частей. Вариантная часть задается с помощью конс-трукции case P of, где Р - имя поля из общей части записи. Возможные значения, прини-маемые этим полем, перечисляются так же, как и в операторе варианта.Однако вместо указания выполняемого действия, как это делается в опе-раторе варианта, указываются поля варианта, заключенные в круглыескобки. Описание вариантной части завершается служебным словом end. Тип поля Р можно указать в заголовке вариантной части, например: case P: Integer of Инициализация записей осуществляется с помощью типизированныхконстант: type RecType= Record x,y: Word; ch: Char; dim: Array[1..3] of Byte end; const Rec: RecType= (x: 127; y: 255; ch: 'A'; dim: (2, 4, 8));


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-10-25 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: