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

pascal_lections

.pdf
Скачиваний:
13
Добавлен:
02.04.2015
Размер:
1.43 Mб
Скачать

Операции отношения

Коперациям отношения в Турбо Паскаль относятся такие операции, как:

>- больше

< - меньше = - равно <> - не равно

>= - больше или равно <= - меньше или равно

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

Приоритет операций

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

унарная операция not, унарный минус -, взятие адреса @

 

операции типа умножения: * / div mod and

 

операции типа сложения: + - or xor

операции отношения: = <> < > <= >= in (входит в множ-во)

Порядок выполнения операций переопределить можно с помощью скобок. Например 2*5+10 равно 20, но

2*(5+10) равно 30.

Основные математические функции

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

Abs(X)

Возвращает абсолютное значение числа X.

Cos(X),

Возвращает косинус (синус) числа X, где X - угол в радианах.

Sin(X)

 

ArcTan(X)

Возвращает арктангенc числа X.

Exp(X)

Возвращает число, равное e в степени X.

Ln(x)

Возвращает число, равное натуральному логарифму от числа X.

Pi

Число Пи.

Sqr(X)

Возвращает число, равное квадрату числа X.

Sqrt(X)

Возвращает число, равное квадратному корню из числа X.

Trunc(X)

Возвращает число, равное целой части числа X. (Происходит отбрасывание дробной части

 

числа X. Результат выполнения имеет тип Longint).

Frac(X)

Возвращает число, равное дробной части числа X.

Int(X)

Возвращает число, равное целой части числа X. Результат выполнения функции - real.

Round(X)

Функция округляет число X. Возвращаемое значение имеет тип Longint.

Random(X)

Возвращает случайное целое число в диапазоне 0..X. Если аргумент опущен (Random), то

 

возвращается случайное вещественное число от 0 до 1. Перед использованием random в

 

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

 

процедурой Randomize. В противном случае при каждом запуске программы будет

 

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

Inc(X,Y)

Увеличивает значение числа X на Y. Если число Y не указано, то увеличение происходит

 

на 1.

Dec(X,Y)

Уменьшает значение числа X на Y. Если число Y не указано, то уменьшение происходит

 

на 1.

11

Структура программы на Турбо Паскаль

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

раздел подключаемых библиотек (модулей);

раздел описания меток;

раздел описания констант;

раздел описания типов;

раздел описания переменных;

раздел описания процедур и функций.

Заголовок программы содержит имя программы, например:

Program PRIM;

Раздел описания модулей определяется служебным словом USES и содержит имена подключаемых модулей (библиотек) как входящих в состав системы Turbo Pascal, так и написанных пользователем. Раздел описания модулей должен быть первым среди разделов описаний. Имена модулей отделяются друг от друга запятыми:

uses CRT, Graph;

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

label 3, 471, 29, Quit;

Описание констант позволяет использовать имена как синонимы констант, их необходимо определить в

разделе описания констант:

const K= 1024; MAX= 16384;

Описание типов (type), процедур (procedure) и функций (function) будет рассмотрено ниже. Отдельные разделы описаний могут отсутствовать, но следует помнить, что в Паскаль - программе должны быть обязательно описаны все компоненты программы.

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

Var

P, Q, R: Integer; A, B: Char;

F1, F2: Boolean;

Раздел операторов представляет собой составной оператор, который содержит между служебными словами

begin.......end.

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

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

12

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

Пример 1

program Primer1; {вычисление суммы двух чисел} var

x,y,s: integer; begin

WriteLn('Введите через пробел два целых числа ');

ReadLn(x,y); s := x + y;

WriteLn('Сумма чисел равна ',s); end.

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

Пример 2

program Primer2; {вычисление суммы двух чисел}

uses Crt; {подключение модуля, необходимого для процедур очистки экрана и задержки}

var

x,y,s: integer; begin

ClrScr; {очистка экрана} WriteLn('Введите первое число ');

ReadLn(x);

WriteLn('Введите второе число ');

ReadLn(y); s := x + y;

WriteLn('Сумма чисел равна ',s); ReadKey; {ожидание нажатия клавиши}

end.

13

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

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

В Турбо Паскале пять структуированных типов:

массивы

строки

множества

записи

файлы

Кроме того, к сложным типам данных относятся два составных порядковых типа:

Перечисляемый

интервальный.

Перечисляемый тип данных

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

Например, перечисляемый тип Rainbow (РАДУГА) объединяет скалярные значения RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET (КРАСНЫЙ, ОРАНЖЕВЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, СИНИЙ, ФИОЛЕТОВЫЙ).

Перечисляемый тип Traffic_Light (СВЕТОФОР) объединяет скалярные значения RED, YELLOW, GREEN (КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ).

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

Type

Rainbow = (RED, ORANGE, YELLOW,

GREEN, LIGHT_BLUE, BLUE, VIOLET);

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

Описание переменных, принадлежащих к скалярным типам, которые объявлены в разделе описания типов, производится с помощью имен типов. Например:

type Traffic_Light= (RED, YELLOW, GREEN); var Section: Traffic_Light;

Это означает, что переменная Section может принимать значения RED, YELLOW или GREEN.

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

var Section: (RED, YELLOW, GREEN);

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

К переменным перечисляемого типа может быть применим оператор присваивания:

Section:= YELLOW;

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

14

Интервальный тип данных

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

1..10 -15..25 'a'..'z'

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

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

Var

Z: 1..10; Alfa: ’A’..’Z’;

Множества

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

Множественный тип описывается с помощью служебных слов 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]

Константа вида [] означает пустое подмножество. Количество базовых элементов не должно превышать 256.

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

const Lit: Set of 'A'..'Z'= [];

Значение переменной множественного типа может быть задано конструкцией вида var T: Set of 1..3;

и может принимать восемь различных значений:

[] [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]

То есть Множество включает в себя:

-весь набор элементов базового типа,

-все свои подмножества,

-пустое подмножество.

Кпеременным и константам множественного типа применимы операции присваивание (:=), объединение (+), пересечение (*) и вычитание (-). Результат выполнения этих операций - величина множественного типа.

['A','B']

+

['A','D']

даст

['A','B','D']

['A','D']

*

['A','B','C']

даст

['A']

15

['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.

Массивы

Массив – это структурированная совокупность однотипных элементов.

-каждый компонент массива может быть явно обозначен и к нему имеется прямой доступ;

-число компонент массива определяется при его описании и в дальнейшем не меняется.

Для обозначения компонент массива используется имя массива и индекс, который указывает на конкретный элемент. Тип индекса может быть только порядковым (кроме longint). Чаще всего используется интервальный тип (диапазон).

Описание типа массива задается следующим образом: type

имя_типа = array[ список индексов ] of тип;

Здесь имя_типа - правильный идентификатор; список индексов - список одного или нескольких индексных типов, разделенных запятыми; тип - любой тип данных.

Type

Tmas = array [1..10] of integer; Var a: Tmas;

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

var a: array[1..10] of integer;

Если массивы a и b описаны как: var

a : array[1..5] of integer; b : array[1..5] of integer;

то переменные a и b считаются разных типов. Для обеспечения совместимости применяйте описание переменных через предварительное описание типа.

type

aaa = array[1..5] of integer; var

a, b : aaa;

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

Вместе с тем, над массивами не определены операции отношения. Сравнивать два массива можно только поэлементно.

16

Так как тип, идущий за ключевым словом of в описании массива, - любой тип, то он может быть и другим массивом

type

mas = array[1..5] of array[1..10] of integer;

Такую запись можно заменить более компактной: type

mas = array[1..5, 1..10] of integer;

Таким образом возникает понятие многомерного массива. Глубина вложенности массивов произвольная, т.е. размерность массива не ограничена. Но массив не может быть более 65520 байт.

Подпрограммы. Процедуры и функции.

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

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

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

Turbo Pascal имеет средства для деления программы на части. На верхнем уровне деления (больших задач) – это модули. На нижнем уровне (элементарных подзадач) – это процедуры и функции.

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

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

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

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

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

label

описание локальных меток,

const

констант, типов и переменных

type

 

var

 

procedure

описание внутренних

function

процедур и функций

begin

 

...

 

end;

 

17

function Имя (список_формальных_параметров): тип_результата;

label

описание локальных меток,

const

констант, типов и переменных

type

 

var

 

procedure

описание внутренних

function

процедур и функций

begin

 

...

 

end;

 

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

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

Список формальных параметров в общем случае может включать:

-Парметры значения,

-Параметры переменные,

-Параметры константы,

-Параметры подпрограммных типов.

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

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

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

Пример отличия глобальных и локальных параметров.

Впрограмме описана одна глобальная переменная А. В момент выполнения процедуры В1 значение глобальной переменной изменится на 5 и будет напечатано.

Var A:integer; Procedure B1; Begin

A:=5;

End; BEGIN

A:=0;

B1;

Writeln(A); {результат 5}

END.

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

Var A:integer;

Procedure B2;

Var A:integer;

Begin

A:=5;

End;

BEGIN

A:=0;

B2;

Writeln(A); {результат 0}

END.

18

Параметры-значения и параметры-переменные

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

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

Параметры-значения могут быть только входными параметрами процедуры (функции).

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

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

Параметры-переменные могут быть и входными, и выходными параметрами процедуры (функции).

То есть при вызове процедуры под формальные параметры-значения временно выделяется область памяти, а под параметры-переменные новая область памяти не выделяется!

Бытует мнение, что если в процедуру передается массив, то лучше его передавать как параметр-переменную, для экономии памяти. Но этот вопрос точно могут осветить только создатели компилятора Pascal.

Пример. Демонстрация разницы между параметрами-значениями и параметрами-переменными.

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

Var A:integer;

Procedure B1(B:integer); Begin

B:=5;

End; BEGIN

A:=10;

B1(A);

Writeln(A); {результат 10}

END.

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

Var A:integer;

Procedure B2(var B:integer); Begin

B:=5;

End; BEGIN

A:=10;

B2(A);

Writeln(A); {результат 5}

END.

19

Пример. В двумерном массиве (матрице) поменять местами последнюю строку и строку, содержащую минимальный элемент.

PROGRAM OBMEN; uses crt;

Const RAZ=10;

{описание типов}

Type TInd=1..RAZ;

Tmas=array[TInd,TInd] of integer;

{процедура перемены мест строк}

Procedure Smena(m,n:TInd; var A:Tmas; Imin:TInd); Var j:TInd; z:integer;

Begin

For j:=1 to n do Begin

z:=A[Imin,j];

A[imin,j]:=A[m,j];

A[m,j]:=z;

End;

End; {procedure}

Procedure PoiskMin(m,n:Tind; A:Tmas; var Imin:TInd); Var min:integer; i,j:TInd;

begin min:=A[1,1]; Imin:=1;

For i:=1 to m do For j:=1 to n do

if A[i,j]<min then begin

min:=A[i,j];

Imin:=i;

End;{if}

End;{procedure}

Procedure MasInput(var m,n:Tind; var A:TMas); Var i,j:Tind;

Begin clrscr; randomize;

writeln('введите размерность массива <= [10,10] :'); readln(m);

readln(n);

clrscr;

writeln('исходный массив :'); for I:=1 to m do

begin

for j:=1 to n do begin

A[I,j]:=random(100);

Write(A[I,j]:3); End;{for j} WriteLn;

End;{for i} End;{procedure}

20

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