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

417-Информатика 1 Муравьев

.pdf
Скачиваний:
18
Добавлен:
11.05.2015
Размер:
1.04 Mб
Скачать

51

Например, результатом операции 55 > 31 будет True, а результатом операции 17.5 <= 9 будет False. Символьные типы сравниваются по своему порядковому номеру в таблице ASCII.

7.7. Логические операции

Результатом выполнения логических (булевских) операций является логическое значение (True или False). Операнды всегда логического типа (boolean). Действие логических операций приведены в таблице.

 

 

 

 

 

 

Таблица 8

Операция

Действие

 

Выражение

A

B

Результат

 

not

Логическое

 

not A

TRUE

 

FALSE

 

and

Отрицание

 

 

 

 

TRUE

 

Логическое И

 

A and B

TRUE

TRUE

TRUE

 

 

 

 

 

TRUE

FALSE

FALSE

 

 

 

 

 

FALSE

TRUE

FALSE

 

 

 

 

 

FALSE

FALSE

FALSE

 

or

Логическое

 

A or B

TRUE

TRUE

TRUE

 

 

ИЛИ

 

 

TRUE

FALSE

TRUE

 

 

 

 

 

FALSE

TRUE

TRUE

 

 

 

 

 

FALSE

FALSE

FALSE

 

xor

Исключающее

 

A xor B

TRUE

TRUE

FALSE

 

 

 

 

TRUE

FALSE

TRUE

 

 

ИЛИ

 

 

FALSE

TRUE

TRUE

 

 

 

 

 

FALSE

FALSE

FALSE

 

 

 

 

 

 

 

 

 

Пример:

L1:=True;

L2:=False;

 

 

 

 

Результатом L1 and L2 будет False, а L1 or L2 будет True.

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

Вначале выполняются операции с Высшим приоритетом, затем по убыванию.

52

 

 

 

 

 

 

Таблица 9

 

 

 

 

 

 

 

 

Операция

Приоритет

Вид операции

 

 

Not

 

 

Первый (высший)

Унарная операция

 

 

*

/

div

mod

Второй

Операции типа

 

 

and

shl

shr

 

умножения

 

 

+

- or xor

Третий

Операции сложения

 

 

=

<>

<

>

Четвертый (низший)

 

 

 

 

 

<=

>=

in

 

 

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

 

 

 

 

 

 

 

Пример:

5*3.14+6/77*45-5

 

 

Вначале произойдет умножение 5 на 3.14 (первый результат), затем деление 6 на 77 и умножение на 45 (второй результат), затем сложение первого и второго результатов и от этого результата вычитание 5.

7.8. Скалярные типы данных

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

7.9. Целочисленные типы данных

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

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

Таблица 10

53

Тип

Диапазон

Требуемая память (байт)

byte

0..255

1

word

0..65535

2

integer

-32768..+32767

2

shortint

-128..+127

1

longint

-2147483648..+2147483647

4

Пример:

 

VAR

:integer;

X1,X2

y1,y2,y3

:byte;

z1,z2

:word

7.10. Вещественные типы

Вещественные типы данных представляют собой вещественные (дробные) значения, которые используются в арифметических выражениях и занимают в памяти от 4 до 10 байт. PASCAL допускает представление вещественных значений в виде как с плавающей, так и с фиксированной точкой.

 

 

 

 

Таблица 11

Тип

Диапазон

Мантисса

Требуемая память

 

 

 

 

 

(байт)

 

real

2.9E-39

… 1.7E38

11-12

6

 

single

1.5E-45

… 3.4E38

7-8

4

 

double

5.0E-324

… 1.7E308

15-16

8

 

extended

3.4E-4932

… 1.1E4932

19-20

10

 

comp

9.2E-18

… 9.2E18

19-20

8

 

Все вещественные числа представляются в памяти компьютера с определенной точностью, поэтому в вычислениях, где требуется повышенная точность, желательно использовать подтипы, у которых мантисса имеет большее число разрядов. Однако нужно помнить, что эффективное использование подтипов single, extended, comp возможно только при наличии сопроцессора и при включенной директиве препроцессора {N+}, поскольку по умолчанию она находится в выключенном состоянии {$N-}.

7.11. Символьный тип

54

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

VAR

c1,c2,c3

:char;

 

 

...

c2:='Щ';

c3:='4';

 

c1:='D';

Здесь переменной с3 присвоено не число 4, а символ '4', который, конечно же нельзя использовать в арифметических операциях. Все символы имеют свой номер от 0 до 255, который определяется номером этого символа в кодовой таблице. К примеру, символ 'F' имеем номер 70, символ 'f' имеет номер 102, а символ '7' имеет номер 55.

7.12. Пользовательский тип

Кроме стандартных типов, TURBO PASCAL поддерживает скалярные типы, определенные самим пользователем. К ним относятся перечисляемый и интервальный типы. Данные этих типов занимают в памяти один байт, поэтому любой пользовательский тип не может содержать более 256 элементов. Ввод-вывод данных пользовательских типов должен организовывать собственными средствами программист.

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

TYPE

Animals=(Cat,Dog,Horse,Fox,Cow);

Birds =(Sparrow,Towtit,Pigeon,Crow,Pinguin);

VAR

: Animals;

 

animal

 

bird,ff1

: Birds;

 

......

Animal:=Cat;

Bird:=Pinguin;

ff1:=Bird;

 

 

......

 

 

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

55

должны принадлежать к одному из стандартных типов (тип REAL здесь недопустим).

Пример:

CONST Min=1; Max=100;

TYPE

Temperature=Min..Max; VAR t : Temperature;

..........

t:=45;

t:=125; (ошибка - выход из диапазона)

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

– только предыдущее).

Для включения и отключения контроля диапазона используется директива {$R+} и {$R-}. Директива вставляется в фигурных скобках в текст программы и предназначена для управления процессом выполнения программы.

7.13. Строки

Строка - это последовательность символов кодовой таблицы компьютера, в том числе и символ пробела. При использовании в выражениях строка заключается в апострофы, и длина строки может динамически изменяться от 0 до 255. Для определения данных строкового типа используется слово STRING, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки. Если значение не указывается, то по умолчанию максимальная длина строки равна 255.

Выражения, в которых операндами выступают строковые данные, называются строковыми. Над строковыми данными допустимы операции сцепления (конкатенации) +. Пример:

VAR st1,st2 :string;

........

st1:='Мария'; st2:='Николаевна';

...........

56

Результатом операции сцепления st1+st2 будет значение

'МарияНиколаевна', а операции st1+' '+st2 - 'Мария Николаевна'.

7.14. Массивы

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

VAR

Mass1:ARRAY[1..15] of integer; (одномерный массив типа integer) Mass2:ARRAY[1..5,1..10] of real; (двумерный массив типа real) Mass3:ARRAY[1..5,1..10,1..6] of char;(трехмерный массив типа char)

Массив Mass1 состоит из 15 элементов целочисленного типа, Mass2 состоит из 50 элементов вещественного типа, а массив Mass3 из 300 элементов символьного типа.

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

Примеры задания индекса массива Mass1 и Mass2:

Mass1[8] Mass1[vp] Mass1[vp*2+4] mass2[3,6] Mass2[vp,vr] Mass2[vp*3-2,vr+4],

где vp и vr - целочисленные переменные

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

Mass1[22] - индекс не должен превосходить число 15 (в нашем примере)

Mass1[vp/3] - индекс должен быть целочисленным.

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

57

элементов. Контроль правильности диапазона индексов осуществляется с помощью директивы {$R+}.

7.15. Процедуры ввода-вывода

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

Read(X1,X2,X3,...Xn);

где X1,X2... - список идентификаторов вводимых переменных с экрана. Вводимые значения набираются на клавиатуре минимум через один пробел и высвечиваются на экране. После набора данных для одной процедуры Read нажимается ENTER.

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

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

Write(Y1,Y2,Y3...Yn); где Y1,Y2,Y3...Yn - список выражений, переменных, констант или значений.

Процедура Writeln аналогична процедуре Write, но после ее выполнения происходит переход на начало следующей строки.

Writeln(rt,'rt ',tr,' aaa12345');

здесь в списке переменная rt, символьное выражение 'rt ',переменная tr и символьное выражение ' aaa12345'. Если переменная rt=23, а tr=231, на экране будут выведены следующие значения в строке:

23rt 231 aaa12345

Процедура Write и Writeln выводит вещественные числа в виде *.*****E**, где *-числа. Для вывода в более привычном виде (в виде

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

58

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

writeln(a1:8:5,' ',a2:8:5,' ',a3:10:4);

7.16. Структура программы

В общем случае структура программы имеет следующий вид:

[PROGRAM <имя программы>;] [CONST

описания констант] [TYPE

описание пользовательских типов] [VAR

описания переменных] begin

тело программы ( или раздел исполняемых операторов )

end.

Здесь в квадратных скобках указаны описания, которые могут отсутствовать. Слова begin и end. определяют начало и конец программы (слово end. в конце программы всегда пишется с точкой). В самом минимальном виде программа имеет вид

begin end.

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

begin writeln('произвольное сообщение'); end.

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

Vr1:=Vr2; T1:=34*Vr2-5.56; FF:=False; Cm:='A';

59

Переменным вещественного типа можно присваивать значения переменных или выражения целочисленного типа, наоборот же нельзя. Так же переменным строкового типа можно присваивать значения переменных символьного типа. Присваивания среди подтипов можно также производить, но при этом необходимо учитывать, что если значение переменной в правой части выходит за диапазон переменной в левой части, то получится некорректное присваивание. К примеру, если значение переменной Vr1 типа INTEGER равно 33, и, если мы значение этой переменной присваиваем переменной Vr2 типа BYTE, такое присваивание выполнится правильно. Если же значение переменной Vr1 равно 456, тогда при присваивании переменной Vr2 произойдет переполнение разрядов Vr2, в итоге переменной Vr2 будет присвоено неправильное значение.

Заметим также, что в правой части выражения какая-либо переменная может встречаться несколько раз:

Vr2:= Vr1*5+Vr1*Vr1;

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

Vr1:=Vr1+1;

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

Vr1:=Vr1*Vr1;

Теперь рассмотрим несколько операторов.

7.17. Составной оператор

Представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой, и ограниченную словами BEGIN и END (не путать с BEGIN и END, ограничивающими программу):

BEGIN

Группа операторов

END;

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

60

IF,FOR, WHILE и др.). Для облегчения чтения программы рекомендуется располагать BEGIN и END на одной позиции в программе.

7.18. Условный оператор IF

Оператор изменяет естественный порядок выполнения операторов программы:

IF <условие> THEN <оператор 1> ELSE <оператор 2>

либо

IF <условие> THEN <оператор 1>

Алгоритм работы условного оператора имеет вид:

Условие - это выражение или переменная булевского типа. Если <условие> имеет значение TRUE (т.е. истинно), тогда выполняется оператор 1, если FALSE (т.е. ложно) - оператор 2. Во втором случае если <условие> имеет значение TRUE (т.е. истинно), тогда выполняется оператор 1, если FALSE (т.е. ложно) - тогда выполняется оператор, следующий за оператором IF. Заметим, что точка с запятой у оператора перед словом ELSE не ставится. Операторы могут быть вложенными, т.е. в качестве оператора 1 или оператора 2 может стоять еще один оператор IF.

Пример: