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

kulakov-prog-pascal

.pdf
Скачиваний:
29
Добавлен:
13.02.2015
Размер:
540.49 Кб
Скачать

readln(s1);

{Вычисление и вывод на экран длины введенной строки } k:= length(s1);

writeln(’Длина строки = ’, k, ’ символов’);

{Ввод второй строки }

write(’Введите слово: ’); readln(s2);

{ Объединение строк и вывод результата } s1:= s1 + ’ ’ + s2;

writeln(’Результат: ’, s1) end.

Инициализация строк может производиться с помощью типизированных констант:

const sName: String[9]= 'IBM PC/AT';

15. Процедуры и функции

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

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

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

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

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

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

В списке формальных параметров при объявлении подпрограммы должны быть указаны их имена и типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга – точкой с запятой. Имена параметров одного типа могут объединяться в подсписки, в которых имена отделяются друг от друга запятой.

21

В подпрограммах могут использоваться:

-параметры, передаваемые по значению;

-параметры, передаваемые по ссылке;

-параметры-процедуры;

-параметры-функции;

-нетипизированные параметры Параметры, передаваемые по значению, используются для передачи данных в

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

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

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

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

К стандартным относятся следующие модули:

System – модуль, обеспечивающий работу всей системы Турбо Паскаля (всегда подключается автоматически и в разделе uses не указывается).

Crt – модуль управления дисплеем и клавиатурой.

Dos – модуль, позволяющий использовать прерывания MS DOS.

Graph – модуль для работы с монитором в графическом режиме.

Printer – модуль для организации печати на принтере.

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

объявляются после объявления переменных перед первым оператором begin программы. Если процедура объявлена в отдельном модуле, для обращения к ней необходимо дать ссылку на модуль в разделе uses.

Для объявления процедуры используется следующая конструкция: procedure имя(параметры);

const объявления констант; type объявления типов;

var объявления переменных;

объявления других процедур и функций; begin

операторы

end;

22

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

Например, если объявлена процедура

procedure ShowMessage(s: string, len: integer); begin

writeln(s:len); {len – ширина поля вывода} end;

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

ShowMessage(’Hello’, 10);

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

Например, если объявлена процедура procedure ShowHello;

begin writeln(’Hello’);

end;

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

ShowHello;

Для объявления функции используется конструкция: function имя(параметры): тип результата;

const объявления констант; type объявления типов;

var объявления переменных;

объявления других процедур и функций; begin

операторы

end;

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

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

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

16. Стандартные математические функции

Рассмотрим часто используемые математические функции. Функция Abs возвращает абсолютное значение аргумента.

Описание: Abs(x);

Тип результата соответствует типу параметра. Функция ArcTan возвращает арктангенс аргумента.

23

Описание: function ArcTan(x: Real): Real;

Арктангенс используется для получения других обратных тригонометрических функций:

 

 

x

 

 

 

arcsin( x) arctg

 

 

 

 

,

 

 

 

 

 

1 x

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

x

2

arccos( x) arctg

 

 

 

 

 

 

 

 

 

 

 

,

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

arcctg (x) atctg

 

 

.

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

Функция Cos возвращает косинус аргумента.

Описание: function Cos(x: Real): Real;

Функция Exp возвращает экспоненциальное значение аргумента.

Описание: function Exp(x: Real): Real;

Функция Ln возвращает натуральный логарифм аргумента.

Описание: function Ln(x: Real): Real;

Пример:

PROGRAM LOG; var Q: real; begin

write('Введите Q: '); readln(Q); writeln('Логарифм Q: ',ln(Q):8:2)

end.

Функция Pi возвращает значение числа Pi.

Описание: function Pi: Real;

Функция Random возвращает случайное число.

Описание: function Random[(Range: Word)];

Примечания: Если параметр Range (диапазон) не задан, то результатом будет вещественное число x в диапазоне 0 <= х < 1. Если задан параметр Range, то он должен представлять собой выражение целого типа, а результатом будет случайное число длиной в слово в диапазоне 0 <= х < N, где N – значение, заданное параметром Range.

Процедура Randomize инициализирует встроенный генератор случайных чисел случайным значением.

Описание: procedure Randomize;

Пример:

PROGRAM RNDM; begin

Randomize;

Writeln(’Случайное число от 0 до 1: ’, Random)); Writeln(’Случайное число от 0 до 100: ’, Random(101));

end.

24

Функция Round округляет значение вещественного типа до ближайшего целого числа.

Описание: function Round(x: Real): Longint;

Функция Sin возвращает синус аргумента.

Описание: function Sin(x: Real): Real;

Функция Sqr возвращает квадрат аргумента.

Описание: function Sqr(x);

Тип результата соответствует типу параметра.

Функция Sqrt возвращает квадратный корень аргумента.

Описание: function Sqrt(x: Real): Real;

Функция Trunc усекает значение вещественного типа до значения целого типа.

Описание: function Trunc(x: Real): Longint;

17. Рекурсия

Рекурсия – это способность подпрограммы вызывать саму себя. Классическим примером является использование рекурсии для вычисления факториала:

program FactorEx; var Num: integer;

function Factorial(N: integer): longint; begin

if N=1 then Factorial:= 1

else Factorial:= N*Factorial(N-1); end;

begin

write(’Введите число:’); readln(Num);

writeln(’Факториал числа ’, Num, ’ = ’, Factorial(Num)); end.

18. Операторы выхода

Для завершения работы программ, процедур и функций без предварительного перехода по меткам к закрывающему end в Турбо Паскаль введены процедуры Exit

и Halt.

Вызов Exit завершает работу программного блока. Если Exit выполняется в подпрограмме, то выполнение подпрограммы прекращается и управление передается вызывающей программе. Если Exit выполняется в основной программе, ее работа завершается.

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

Процедура Halt имеет структуру Halt(n), где n – код возврата, который может быть проанализирован операционной системой. Значение n=0 соответствует нормальному завершению работы программы. Вызов процедуры Halt без параметра эквивалентен вызову Halt(0).

25

19. Модули

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

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

Модуль представляет собой отдельно хранимую и независимо компилируемую программную единицу.

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

Все программные элементы модуля можно разбить на две части:

-программные элементы, предназначенные для использования другими программами или модулями (их называют видимыми вне модуля);

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

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

Вобщем случае модуль имеет следующую структуру:

unit имя модуля;

{заголовок

модуля}

interface

 

 

{описание видимых программных

элементов модуля}

{описание скрытых программных

элементов модуля}

begin

{операторы инициализации элементов модуля} end.

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

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

Для подключения модуля к программе необходимо указать его имя в разделе описания модулей, например:

uses CRT, Graph;

26

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

Например, пусть имеется модуль, в котором описана переменная К: unit M;

interface

var K: Integer; implementation

.................

end.

Пусть программа, использующая этот модуль, также содержит переменную К:

Program P; uses M;

var K: Char; begin

............

end.

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

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

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

20. Множества

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

Множество описывается с помощью служебных слов Set of, например: type M= Set of B;

Здесь М – множество, В – базовый тип.

Пример описания переменной множественного типа: type M= Set of 'A'..'D';

var MS: M;

Принадлежность переменных к множеству может быть определена прямо в разделе описания переменных:

var C: Set of 0..7;

27

Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми, например:

['A', 'C'] [0, 2, 7]

[3, 7, 11..14]

Константа вида [ ] означает пустое подмножество.

21. Записи

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

Описание записи осуществляется с помощью служебного слова 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;

Здесь М – имя записи, ОР – оператор (задает область действия, в пределах которой можно не использовать составные имена).

28

Инициализация записей осуществляется с помощью типизированных констант: type RecType= Record

x,y: Word;

dim: Array[1..3] of Byte end;

const Rec: RecType= (x: 127; y: 255; dim: (2, 4, 8));

22. Файлы

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

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

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

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

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

'C:\ABC150\LAB1.DAT' или 'lab3.pas'.

Операционная система не делает особого различия между файлами на дисках и устройствами ЭВМ. В Турбо Паскале могут использоваться имена устройств и портов, определенные в MS-DOS, например: 'CON', 'LPT1', 'PRN', 'COM1'.

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

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

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

var tStory: Text;

Описание компонентных файлов имеет вид: var fComp: File of T;

где T – тип компоненты.

29

Пример описания файлов компонентного типа: var f1: File of Real;

f2: File of Integer;

Бестиповые файлы описываются с помощью служебного слова File: var f: File;

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

Турбо Паскаль вводит ряд процедур и функций, применимых для любых типов файлов: Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult.

Процедура Assign(var f; FileName: String) связывает логический файл f с физическим файлом, полное имя которого задано в строке FileName.

Процедура Reset(var f) открывает логический файл f для последующего чтения данных (открывает входной файл).

Процедура Rewrite(var f) открывает логический файл f для последующей записи данных (открывает выходной файл).

Процедура Close(var f) закрывает логический файл. Вызов процедуры Close необходим при завершении работы с выходным файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено. Для входных файлов использование оператора Close необязательно.

Логическая функция EOF(var f): Boolean возвращает значение TRUE, когда при чтении достигнут конец файла.

Процедура Rename(var f; NewName: String) позволяет переименовать физический файл, связанный с логическим файлом f. Переименование возможно после закрытия файла.

Процедура Erase(var f) уничтожает физический файл, который был связан с переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0.

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

Тext:

var TF1, TF2: Text;

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

С признаком конца строки связана функция EOLn(var T: Text): Boolean, где Т – имя текстового файла. Эта функция принимает значение TRUE, если достигнут конец строки, и значение FALSE, если конец строки не достигнут.

Для операций над текстовыми файлами определен также оператор ReadLn(T), который пропускает строку до начала следующей, и WriteLn(T), который завершает строку файла признаком конца строки.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]