Язык Паскаль для Орион-128

Программируем на паскале, пишем программы на языке Pascal

Продаю платы и наборы микросхем, куплю микросхемы Платы и комплектующие на ПК Орион-128

Подборку программ и документацию готовит Виталий Астрахань.

08/04/2023  Дошли руки до паскаля.

Скачать документацию Пушкова Турбопаскаль V3.0 Орион Софт 1996  (формат DOCX - данное руководство) - Турбо Паскаль работает только под Z80

Скачать турбопаскаль для Ориона ПРО,  формат ODI

Скачать турбопаскаль для Ориона-128,   формат ODI

Как сделать запускаемый файл на паскале для Ориона ПРО

Скачать книгу по паскалю

Руководство не практически редактирую, если кому нужно скачиваем по ссылке оригинал.

ТУРБО-ПАСКАЛЬ СПРАВОЧНОЕ РУКОВОДСТВО ВЕРСИЯ 3.0

Orionsoft (C) 1996В. Пушков

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ

8

Язык Паскаль

8

Турбо-Паскаль

8

ГЛАВА 1 КАК ПОЛЬЗОВАТЬСЯ ТУРБО-СИСТЕМОЙ

10

Приступая к работе

10

Важное замечание

10

Файлы Турбо-системы

10

Как запустить Турбо-Паскаль

11

Инсталляция

12

Инсталляция экрана

13

Инсталляция команд встроенного редактора

13

Меню турбо-системы

13

Выбор текущего дисковода

14

Выбор рабочего файла

14

Выбор главного файла

15

Команда запуска редактора

16

Команда запуска компилятора

16

Команда запуска на выполнение

16

Команда сохранения рабочего файла

16

Команда "Выполнить"

16

Команда вывода оглавления

17

Команда окончания работы

17

Опции компилятора

17

Команды M, C, H

17

Начальный адрес

18

Конечный адрес

18

Поиск ошибок периода выполнения

18

Выход из меню опций

19

Редактор системы Турбо

19

Строка состояния

19

Команды редактирования

20

Заметка об управляющих символах

21

Начиная работу, нужно знать, как ее закончить

22

Основные команды перемещения курсора

22

Расширенные команды перемещения курсора

23

Команды вставки и удаления

24

Блочные команды

26

Прочие команды редактирования

27

Сравнение редакторов Турбо и WordStar

31

Перемещение курсора

31

Пометить одиночное слово

31

Закончить редактирование

31

Восстановить строку

31

Табуляция

31

Автоматический отступ

31

ГЛАВА 2 ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА

32

Основные символы

32

Зарезервированные слова

32

Стандартные идентификаторы

32

Разделители

33

Строки программы

33

ГЛАВА 3 СТАНДАРТНЫЕ ПРОСТЫЕ ТИПЫ

34

INTEGER - целый

34

BYTE - байт

34

REAL - вещественный

34

BOOLEAN - логический

35

CHAR - символьный

35

ГЛАВА 4 ЭЛЕМЕНТЫ ЯЗЫКА, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ

36

Идентификаторы

36

Числа

36

Строки

36

Управляющие символы

38

Комментарии

38

Директивы компилятора

39

ГЛАВА 5 ЗАГОЛОВОК ПРОГРАММЫ И ПРОГРАММНЫЙ БЛОК

40

Заголовок программы

40

Разделы описаний

40

Раздел описаний меток

40

Раздел определений констант

41

Раздел определений типов

41

Раздел описаний переменных

42

Абсолютные переменные

42

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

43

Операторная часть

43

ГЛАВА 6 ВЫРАЖЕНИЯ

44

Операции

44

Унарный минус

44

Операция NOT

44

Операции группы умножения

45

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

45

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

46

Вызовы функций

46

ГЛАВА 7 ОПЕРАТОРЫ

47

Простые операторы

47

Оператор присваивания

47

Вызов процедуры

47

Оператор перехода

48

Пустой оператор

48

Структурные операторы

48

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

48

Условные операторы

49

Оператор IF

49

Оператор CASE

50

Операторы цикла

51

Оператор FOR

51

Оператор WHILE

52

Оператор REPEAT

52

ГЛАВА 8 ПРОСТЫЕ И ОГРАНИЧЕННЫЕ ТИПЫ

53

Простой тип

53

Ограниченный тип

54

Преобразование типов

54

Проверка границ

55

ГЛАВА 9 СТРОКОВЫЙ ТИП

56

Определение строкового типа

56

Строковые выражения

56

Строковое присваивание

57

Процедуры обработки строк

57

Процедура DELETE

57

Процедура INSERT

57

Процедура STR

58

Процедура VAL

58

Функции обработки строк

59

Функция COPY

59

Функция CONCAT

59

Функция LENGTH

59

Функция POS

59

ГЛАВА 10 МАССИВЫ

61

Определение массива

61

Многомерные массивы

62

Массивы символов

63

Стандартные массивы

63

Массив MEM

63

Массив PORT

64

Оптимизация индексов массивов

64

ГЛАВА 11 ЗАПИСИ

65

Определение записи

65

Оператор WITH

67

Записи с вариантами

68

ГЛАВА 12 МНОЖЕСТВА

70

Определение типа множества

70

Выражения с множествами

71

Множественные конструкции

71

Операции над множествами

71

Присваивание значений множествам

72

ГЛАВА 13 КОНСТАНТЫ С ЗАДАННЫМ ТИПОМ

73

Неструктурные константы с заданным типом

73

Структурные константы с заданным типом

74

Константы-массивы

74

Многомерные константы-массивы

75

Константы-записи

75

Константы-множества

76

ГЛАВА 14 ФАЙЛЫ

77

Определение типа файла

77

Операции над файлами

78

Процедура ASSIGN

78

Процедура REWRITE

78

Процедура RESET

78

Процедура READ

78

Процедура WRITE

78

Процедура SEEK

79

Процедура FLUSH

79

Процедура CLOSE

79

Процедура ERASE

79

Процедура RENAME

79

Файловые стандартные функции

80

Функция EOF

80

Функция FILEPOS

80

Функция FILESIZE

81

Использование файлов

81

Текстовые файлы

84

Операции над текстовыми файлами

84

Процедура READLN

84

Процедура WRITELN

84

Функция EOLN

84

Функция SEEKEOLN

85

Функция SEEKEOF

85

Логические устройства

86

Пользовательские драйверы ввода/вывода

88

Стандартные файлы

89

Ввод и вывод текста

91

Процедура READ

91

Процедура READLN

93

Процедура WRITE

93

Процедура WRITELN

95

Файлы, не имеющие типа

95

Процедуры BLOCKREAD и BLOCKWRITE

96

Контроль ввода/вывода

97

ГЛАВА 15 УКАЗАТЕЛИ

99

Определение переменной-указателя

99

Размещение переменных (процедура NEW)

99

Процедуры MARK и RELEASE

100

Функция MEMAVAIL

101

Использование указателей

101

Процедура DISPOSE

103

Процедура GETMEM

103

Процедура FREEMEM

104

Функция MAXAVAIL

104

Указатели и целые

104

Полезные советы

104

ГЛАВА 16 ПРОЦЕДУРЫ И ФУНКЦИИ

105

Параметры

105

 Ослабление ограничений на типы параметров

106

 Параметры-переменные, не имеющие типа

107

Процедуры

108

Описание процедуры

108

Стандартные процедуры

110

Экранные процедуры

110

Процедура CLREOL

110

Процедура CLRSCR

110

Процедура CRTINIT

111

Процедура CRTEXIT

111

Процедура DELLINE

111

Процедура INSLINE

111

Процедура GOTOXY

111

Процедура LOWVIDEO

111

Процедура NORMVIDEO

111

Специальные процедуры

112

Процедура DELAY

112

Процедура EXIT

112

Процедура HALT

112

Процедура MOVE

112

Процедура FILLCHAR

112

Процедура RANDOMIZE

113

Функции

113

Описание функции

113

Стандартные функции

114

Арифметические функции

115

Функция ABS

115

Функция ARCTAN

115

Функция COS

115

Функция EXP

115

Функция FRAC

115

Функция INT

115

Функция LN

116

Функция SIN

116

Функция SQR

116

Функция SQRT

116

Функции для работы с простыми типами

116

Функция PRED

116

Функция SUCC

116

Функция ODD

117

Функции преобразования типов

117

Функция CHR

117

Функция ORD

117

Функция ROUND

117

Функция TRUNC

117

Прочие стандартные функции

118

Функция ADDR

118

Функция HI

118

Функция KEYPRESSED

118

Функция LO

118

Функция RANDOM

118

Функция PARAMCOUNT

118

Функция PARAMSTR

119

Функция SIZEOF

119

Функция SWAP

119

Функция UPCASE

119

Вызовы функций операционной системы

119

Процедура и функция BDOS

119

Функция BDOSHL

120

Процедура и функция BIOS

120

Функция BIOSHL

120

Предварительные объявления

120

Внешние подпрограммы

122

ГЛАВА 17 ВКЛЮЧЕНИЕ ФАЙЛОВ В КОМПИЛЯЦИЮ

123

ГЛАВА 18 ОВЕРЛЕЙНЫЕ СТРУКТУРЫ

125

Создание оверлеев

126

Вложенные оверлейные структуры

128

Автоматическое управление оверлеями

130

Размещение оверлейных файлов

130

Эффективное использование оверлеев

131

Ограничения на оверлейные структуры

132

Область данных

132

Предварительные объявления

132

Рекурсия

132

Ошибки периода выполнения

132

ГЛАВА 19 ПРОЦЕДУРЫ CHAIN И EXECUTE

133

ГЛАВА 20 ВКЛЮЧЕНИЕ МАШИННОГО КОДА В ИСХОДНЫЙ ТЕКСТ

135

ГЛАВА 21 ОБРАБОТКА ПРЕРЫВАНИЙ

137

ГЛАВА 22 ВНУТРЕННИЕ ФОРМАТЫ ДАННЫХ

138

Базовые типы данных

138

Простые типы

138

Данные типа REAL

138

Строки

139

Множества

139

Интерфейсные блоки файлов

140

Указатели

141

Структуры данных

141

Массивы

141

Записи

142

Дисковые файлы

142

Файлы произвольного доступа

142

Текстовые файлы

142

Параметры

142

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

143

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

143

Простые типы

143

Данные типа REAL

143

Строки - данные типа STRING

143

Множества

144

Указатели

144

Массивы и записи

144

Результаты функций

144

Хип и стеки

145

ГЛАВА 23 РАСПРЕДЕЛЕНИЕ ПАМЯТИ

147

Компиляция в памяти

147

Компиляция на диск

148

Выполнение программы, хранимой в памяти

148

Выполнение программы, хранимой на диске

149

ПРИЛОЖЕНИЕ A СТАНДАРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

151

ПРИЛОЖЕНИЕ B ОПЕРАЦИИ

156

ПРИЛОЖЕНИЕ C ДИРЕКТИВЫ КОМПИЛЯТОРА

157

ПРИЛОЖЕНИЕ D СРАВНЕНИЕ ТУРБО-ПАСКАЛЯ СО СТАНДАРТНЫМ

161

ПРИЛОЖЕНИЕ E СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ

163

ПРИЛОЖЕНИЕ F СООБЩЕНИЯ ОБ ОШИБКАХ ПЕРИОДА ВЫПОЛНЕНИЯ

167

ПРИЛОЖЕНИЕ G СООБЩЕНИЯ ОБ ОШИБКАХ ВВОДА/ВЫВОДА

169

ПРИЛОЖЕНИЕ H ПЕРЕВОД СООБЩЕНИЙ ОБ ОШИБКАХ КОМПИЛЯЦИИ

171

ПРИЛОЖЕНИЕ I ТАБЛИЦА КОДА ASCII

175

ПРИЛОЖЕНИЕ J ИНСТАЛЛЯЦИЯ

176

ПРИЛОЖЕНИЕ K СОВЕТЫ И ОТВЕТЫ НА ВОПРОСЫ

183

 

 ВВЕДЕНИЕ

              Эта книга представляет собой справочное руководство по работе с системой Турбо Паскаль в среде операционной системы CP/M-80 (OSDOS). Несмотря на широкое использование примеров, эта книга не является учебником по Паскалю, и для работы с ней требуется знание по крайней мере основ этого языка.

              За основу руководства взят перевод "TURBO PASCAL. REFERENCE MANUAL. VERSION 3.0", Всесоюзный центр переводов, 1986.

Язык Паскаль

              Паскаль - это язык программирования высокого уровня, не имеющий узкой специализации, т.е. язык общего назначения. Создателем этого языка был профессор Цюрихского технического университета (Швейцария) Никлаус Вирт, который назвал свой язык в честь Блеза Паскаля, выдающегося французского философа и математика 17-го столетия.

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

Турбо-Паскаль

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

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

 - переменные, имеющие абсолютные адреса,

 - манипуляции с битами и байтами,

 - прямой доступ к памяти и портам ввода/вывода,

 - динамические строки,

 - свободный порядок разделов описаний,

 - полная поддержка средств операционной системы,

 - включение машинного кода в исходный текст программы,

 - включение файлов в компиляцию,

 - логические операции над целыми,

 - оверлейная система,

 - связывание программ в цепочку с общими переменными,

 - произвольный доступ к файлам данных,

 - структурные константы,

 - функции преобразования типов.

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

 

 ГЛАВА 1.

КАК ПОЛЬЗОВАТЬСЯ ТУРБО-СИСТЕМОЙ

                 В этой главе рассказано о том, как настроить систему Турбо-Паскаль и о том, как с этой системой работать; в частности, описана работа встроенного редактора.

 

Приступая к работе

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

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

 

Важное замечание

              Турбо-Паскаль позволяет задавать ряд директив компилятора для управления специальными средствами, работающими во время выполнения программы, такими как контроль границ индексов массивов, рекурсия и т.д. СЛЕДУЕТ УЧИТЫВАТЬ, что подразумеваемые по умолчанию установки этих директив оптимизируют время выполнения и минимизируют объем занимаемой памяти. Поэтому ряд таких средств остается выключенным до явной установки их программистом в ТЕКСТЕ ПРОГРАММЫ. Все директивы компилятора и их значения по умолчанию приведены в приложении С.

 

Файлы Турбо-системы

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

              TURBO.OVR - Оверлейный файл для TURBO.COM. Должен присутствовать на рабочей дискете, если Вы хотите исполнять. COM-файлы из TURBO.

              TURBO.MSG - Текстовый файл, содержащий сообщения об ошибках. Нет необходимости в его присутствии на рабочей дискете, если Вас устраивает отсутствие диагностических сообщений об ошибках времени компиляции. В этом случае ошибки будут печататься только в виде номеров ошибок, но Вы можете узнать в приложении E их смысл. Это не только сохраняет пространство на диске, но, что более важно, дает дополнительно порядка 1.5 Кбайт оперативной памяти. В любом случае система отмечает все ошибки. Существует возможность отредактировать этот файл сообщений, если Вам понадобится перевести сообщения на другой язык или представить в другой кодировке; эта процедура описана в приложении H.

              TINST.COM - программа инсталляции (настройки) Турбо-системы. Достаточно ввести с клавиатуры TINST, и эта программа проведет Вас через процедуру настройки, которая полностью управляется с помощью меню. Этот и следующие файлы не обязаны присутствовать на рабочем диске.

              TINST.DTA - Данные инсталляции.

              TINST.MSG - Сообщения для программы инсталляции. Этот файл также можно перевести на любой необходимый Вам язык.

              TLIST.COM - Программа распечатки исходных текстов программ

              Файлы.PAS - примеры Паскаль-программ.

              READ.ME - Если этот файл присутствует, то в нем содержатся последние исправления, внесенные в систему, или предложения по использованию системы.

              Только файл TURBO.COM обязательно должен находиться на Вашем рабочем диске. Таким образом, полностью работоспособный Турбо-Паскаль требует всего лишь 30 Кбайт дискового пространства. Файл TURBO.OVR нужен только в том случае, если Вы собираетесь исполнять программы непосредственно из меню Турбо-системы.

              TURBO.MSG нужен только при необходимости формирования текстовых

сообщений об ошибках периода компиляции. Файлы TINST используются только при инсталляции (настройке).

 

Как запустить Турбо-Паскаль

              Когда Вы скопируете систему на Ваш рабочий диск, введите с клавиатуры команду:

              TURBO

              После нажатия клавиши RETURN система начнет работу с вывода на экран следующего сообщения:

 

 ----------------------------------------

 TURBO Pascal System Version 3.02A

    CP/M-80, Z80

 

 Copyright (C) 1983,84,85 BORLAND Inc.

 ----------------------------------------

 No terminal selected

 Include error messages (Y/N)?

 

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

              Если Вы введете "Y" в ответ на вопрос, файл сообщений об ошибках будет загружен в память (если он есть на диске), и появится сообщение:

 Loading TURBO.MSG

              Вы можете, однако, ответить "N" и сохранить тем самым около 1.5 Кбайт оперативной памяти. После этого появится главное меню Турбо-системы:

 

 Logged drive: A    

      

 Work file:    

 Main file:    

 

 Edit Compile Run Save  

 eXecute Dir Quit compiler Options 

 

 Text: 0 bytes (82A6-82A6)  

 Free: 17759 bytes (82A7-C806)  

      

 >_     

 

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

              Если Ваша Турбо-система не инсталлирована (процедура начальной установки не производилась), и Вы собираетесь использовать встроенный текстовый редактор, введите "Q", чтобы выйти из TURBO, и выполните инсталляцию.

 

Инсталляция

              Наберите на клавиатуре TINST для запуска программы инсталляции. При этом все файлы TINST, а также файл TURBO.COM должны находиться в текущем дисководе. На экране появится основное меню программы TINST:

 

  Turbo Pascal installation menu 

 Choose installation item from the following:  

       

 [S]creen installation | [C]ommand installation | [Q]uit

       

   Enter S,C, or Q: _  

       

Инсталляция экрана

              Нажмите "S" для запуска инсталляции экрана. Вы увидите меню, содержащее названия наиболее часто используемых терминалов, и сможете выбрать тот, который Вам подходит, введя соответствующий номер. Если Ваш терминал отсутствует в меню и не является совместимым ни с одним из указанных, то Вам придется выполнить инсталляцию самостоятельно. Это довольно прямолинейная процедура, но Вам придется обратиться к руководству по Вашему терминалу для ответа на вопросы инсталляции. Подробности смотрите в приложении J.

              После выбора терминала Вам нужно решить, не хотите ли Вы модифицировать его перед инсталляцией. Это может быть нужно, если Вы имеете такой же терминал, но с некоторыми дополнительными возможностями. В этом случае добавьте требуемые команды для активизации Ваших дополнительных возможностей. Ответив "Y", Вы получите ряд дополнительных вопросов, которые описаны в приложении J.

              Обычно на этот вопрос дается ответ "N" (нет), что означает Вашу удовлетворенность тем, как стандартно инсталлирован терминал. Далее Вам нужно ответить на вопрос о рабочей частоте Вашего микропроцессора, введя соответствующее значение в МГц (допустимыми являются 2,4,6 и 8).

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

 

Инсталляция команд встроенного редактора

              Встроенный редактор системы Турбо-Паскаль реагирует на ряд команд, которые перемещают курсор по экрану, вставляют, удаляют и перемещают текст и т.д. Команды настроены фирмой BORLAND под "стандарт", установленный редактором WordStar. С помощью программы инсталляции их можно легко переопределить в соответствии с Вашими вкусами и клавиатурой.

              Подробное описание процесса инсталляции команд встроенного редактора Вы можете найти в приложении J.

 

Меню Турбо-системы

              После инсталляции вновь вызовите систему Турбо-Паскаль, набрав на клавиатуре команду TURBO. Экран очистится, и на нем появится главное меню уже с подсвеченными буквами команд. Если это не так, то Вам следует проверить данные инсталляции.

 

 (L)ogged drive: A     

      

 (W)ork file:    

 (M)ain file:    

      

 (E)dit (C)ompile (R)un (S)ave 

 e(X)ecute (D)ir (Q)uit compiler (O)ptions

      

 Text: 0 bytes (82A6-82A6)  

 Free: 17759 bytes (82A7-C806)  

      

 >_     

 (здесь для обозначения подсветки букв использованы скобки)

 

              Заметим кстати, что всякий раз, когда упоминается "подсвечивание", подразумевается, что Ваш дисплей может оперировать различными видео атрибутами для вывода текста различной интенсивностью, в инверсном изображении, с подчеркиванием или с каким-либо другим выделением. Если это не так, то Вам следует просто игнорировать всякое упоминание о "подсвечивании".

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

любой "недопустимой" команды, т.е. нажатием любой клавиши, которой не соответствует ни одна команда (например, RETURN или ПРОБЕЛ).

              Последующие разделы посвящены подробному описанию всех команд.

 

Выбор текущего дисковода

              Команда "L" используется для смены текущего дисковода. Если Вы нажмете "L", появится запрос:

 New drive: _

приглашающий ввести имя нового устройства от A до P, за которым может следовать двоеточие. После этого нажмите RETURN. Если Вы не хотите менять текущий дисковод, просто нажмите RETURN.

              Команда L выполняет программный сброс дисковой системы, даже если Вы не изменяли дисковод, и должна использоваться всегда, когда Вы меняете дискету во избежание фатальных ошибок записи. Новое выбранное устройство не сразу показывается в меню (меню автоматически не обновляется). Нажмите, например, ПРОБЕЛ для вывода меню, где будет показан новый текущий дисковод.

 

Выбор рабочего файла

              Команда "W" используется для выбора рабочего файла, т.е. файла, с которым работают команды "E", "C", "R", "X" и "S" (редактировать, компилировать, выполнить и сохранить). После ввода команды "W" на экране появится:

 Work file name: _

              Здесь Вы можете ввести любое допустимое название файла, состоящее из имени (1..8 знаков), необязательной точки и необязательного типа файла (1..3 знака): FILENAME.TYP .

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

Примеры:

--------

 PROGRAM станет PROGRAM.PAS

 PROGRAM. не изменится

 PROGRAM.FIL не изменится

              Следует избегать употребления типов файлов BAK, CHN, COM, поскольку TURBO использует их для специальных целей.

              Когда рабочий файл определен, он считывается с дискеты, если он там имеется. Если он отсутствует на дискете, появляется сообщение:

 New file

              Если Вы редактировали другой файл, но не сохранили его (не записали на диск), то появится сообщение:

               Workfile X:FILENAME.TYP not saved. Save (Y/N)? _

              Оно предупредит Вас о том, что Вы собираетесь загрузить новый файл на место старого и уничтожить его. Ответьте "Y" для сохранения старого файла или "N", если запись не нужна.

              Новый рабочий файл будет показан в меню, когда оно будет обновлено, например, нажатием клавиши ПРОБЕЛ.

 

Выбор главного файла

              Команда "M" может быть использована для определения главного файла при работе с программами, содержащими директиву компилятора $I для включения файлов в исходный текст. Главным файлом должен быть файл, с которого начинается компиляция, то есть файл, содержащий директивы включения $I. Рабочий файл Вы можете определить отличным от главного файла и таким образом редактировать включаемые файлы, оставляя главный файл неизменным.

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

 Имя главного файла вводится так же, как и имя рабочего файла.

 

 

Команда запуска редактора

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

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

 

Команда запуска компилятора

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

              Результатом компиляции может быть либо программа, расположенная в оперативной памяти, либо программа в COM-файле, либо программа в CHN-файле. Соответствующий выбор делается в меню "Опции компилятора" (см. Рис.1-5 ниже). По умолчанию программа будет размещена в памяти.

 

Команда запуска на выполнение

              Команда запуска "R" используется для запуска программ, размещенных в памяти или в COM-файле (если действует ключ "C" из меню опций компилятора). Если скомпилированная программа уже находится в памяти, она сразу начнет выполняться, если нет, сначала автоматически начнется компиляция.

 

Команда сохранения рабочего файла

              Команда "S" используется для сохранения текущего рабочего файла на диске. Старая версия этого файла, если она имеется, переименовывается, получая тип .BAK, а новая версия записывается под старым именем.

 

Команда "выполнить"

              Команда "X" (eXecute) дает возможность выполнять другие COM-программы из Турбо-системы, например, программы копирования и т.д. Если Вы введете "X", система ответит:

 Program: _

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

               > .

 

 

Команда вывода оглавления

              Команда "D" выводит оглавление текущего диска и информацию о количестве оставшегося на нем свободного пространства. После ввода "D" система выдает запрос:

 Dir mask: _

              Вы можете ввести имя диска (за которым должно следовать двоеточие), а также маску, определяющую имена файлов, в которой содержатся обобщающие символы "*" и "?". Если же просто нажать RETURN, то будет выведено полное оглавление текущего диска.

 

Команда окончания работы

              Команда "Q" используется для выхода из Турбо-системы. Если рабочий файл подвергался редактированию, система спросит, желаете ли Вы сохранить его до выхода.

 

Опции компилятора

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

 compile -> (M)emory   

  (C)om-file   

  c(H)n-file   

      

 (F)ind run-time error (Q)uit  

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

 

Команды M,C,H

               Команды "M","C","H" позволяют выбрать режим работы компилятора, т.е. то место, куда он должен поместить код, являющийся результатом компиляции.

              Режим "M" (Memory - память) подразумевается по умолчанию. Сформированный код записывается в оперативную память и остается там готовым к исполнению по команде из главного меню "R" (выполнить).

              По команде "C" устанавливается режим генерации COM-файла, а стрелка в меню перемещается на соответствующую строку. Готовый код записывается в файл с тем же именем, что и рабочий файл (или главный, если он указан), но с типом .COM. Этот файл содержит код программы и библиотеку периода выполнения Паскаля и может быть впоследствии запущен посредством ввода его имени с клавиатуры.

              По команде "H" устанавливается режим генерации CHN-файла, а стрелка в меню также перемещается на соответствующую строку. Готовый код записывается в файл с тем же именем, но с типом .CHN . Этот файл содержит код программы, но не имеет библиотеки периода выполнения Паскаля и должен активизироваться из другой Паскаль-программы с помощью процедуры CHAIN.

              При выборе режимов COM и CHN на экране появляются две дополнительные строки:

 

 (S)tart address: 20E2 (min 20E2)  

 (E)nd address: C942 (max CC06)  

 

Начальный адрес

              Команда "S" задает адрес первого байта кода программы в шестнадцатеричном формате. Обычно этот адрес равен конечному адресу библиотеки Паскаля плюс 1, однако его можно увеличить, если, например, Вы хотите оставить место для абсолютных переменных, которые должны разделяться несколькими CHAIN-программами.

              После ввода команды "S" система запрашивает новый адрес. Если при этом нажать просто клавишу RETURN, то будет принято минимальное значение.

 

Конечный адрес

              Команда "E" задает максимальный доступный программе адрес в шестнадцатеричном формате. Значение в круглых скобках указывает вершину свободной оперативной памяти (TPA), т.е. адрес BDOS минус 1. По умолчанию подразумевается несколько меньшее значение для размещения загрузчика, который располагается как раз под BDOS при исполнении программ из Турбо-системы.

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

 

Поиск ошибок периода выполнения

              Если при прогоне программы, записанной после компиляции в память, возникает ошибка периода выполнения, то включается редактор, и ошибка автоматически предъявляется пользователю. Очевидно, что такое невозможно для программы, записанной в COM-или CHN-файл. В этом случае ошибка периода выполнения порождает вывод сообщения, в котором указывается код ошибки и значение счетчика адреса (PC) в момент возникновения ошибки:

 

 Run-time error 1, PC=1B56    

 Program aborted    

 

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

 

 Enter PC: 1B56    

 

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

              Коды ошибок периода выполнения и ошибок ввода/вывода, а также соответствующая им расшифровка приведены в приложениях F и G.

 

Выход из меню опций

              Команда "Q" служит для выхода из меню опций компилятора и возврата в главное меню Турбо-системы.

 

Редактор системы Турбо

              Встроенный редактор - это экранный редактор, специально предназначенный для создания текстов программ. Если Вы знакомы с редактором WordStar, Вам не нужны дальнейшие пояснения по работе с Турбо-редактором, поскольку стандартные команды полностью идентичны известным Вам командам WordStar. Имеются некоторые незначительные отличия; кроме того, Турбо-редактор имеет ряд расширений: они обсуждаются в разделе этой главы "Сравнение редакторов Турбо и WordStar".

              Работать с редактором системы Турбо предельно просто: когда Вы определите рабочий файл и нажали клавишу "E", меню исчезает, и редактор запускается. Если рабочий файл уже существует на текущем диске, то он загружается, и на экране появляется первая страница текста. Если речь идет о новом файле, то экран остается пустым, за исключением СТРОКИ СОСТОЯНИЯ в верхней его части.

              Чтобы выйти из редактора и вернуться в меню, нужно нажать комбинацию клавиш CTRL-K-D; ниже мы рассмотрим это подробнее.

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

              Рассмотрим сначала структуру строки состояния, расположенную в верхней части экрана.

 

Строка состояния

              Первая строка экрана - это строка состояния, содержащая следующую информацию:

  Line N Col N  Insert  Indent X:FILENAME.TYP  

  Здесь:

              Line N     Показывает номер строки, в которой находится курсор, начиная от начала файла.

              Col N     Показывает номер столбца, в котором находится курсор, считая от начала строки.

              Insert     Показывает, что включен режим ВСТАВКИ, т.е. вводимые с клавиатуры символы будут вставлены в позицию курсора, а имеющийся справа от курсора текст будет сдвигаться вправо по мере ввода нового текста. Использование команды "Вкл/выкл режим вставки" (CTRL-V) приводит к появлению вместо "Insert" сообщения "Overwrite" (ЗАМЕНА), при этом вводимый с клавиатуры текст будет замещать символы под курсором, а не отодвигать их.

              Indent     Показывает, что включен режим автоматического отступа. Он может быть выключен командой "Вкл/выкл автоотступ" (CTRL-Q-I).

  X:FILENAME.TYP Дисковод, имя и тип редактируемого файла.

 

Команды редактирования

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

              Турбо-редактор содержит 45 команд редактирования для перемещения курсора, поиска и замены строк и т.д. Эти команды могут быть разделены на 4 группы:

  - команды перемещения курсора,

  - команды вставки и удаления,

  - блочные команды,

  - прочие команды.

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

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

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

 

 

 

 

Обзор команд редактирования

 

         КОМАНДЫ ПЕРЕМЕЩЕНИЯ КУРСОРА

На символ влево        

В начало экрана

На символ вправо        

В конец экрана

На слово влево         

В начало текста

На слово вправо        

В конец текста

На строку вверх        

В начало строки

На строку вниз         

В конец строки

Скроллинг вверх        

В начало блока

Скроллинг вниз         

В конец блока

На страницу вверх       

В последнюю позицию курсора

На страницу вниз

 

 

         КОМАНДЫ ВСТАВКИ И УДАЛЕНИЯ

Вкл/выкл режим вставки     

Уничтожить слово справа

Вставить строку        

Уничтожить символ под курсором

Удалить строку         

Уничтожить символ слева

Удалить символы до конца строки

 

 

 

  БЛОЧНЫЕ КОМАНДЫ         ПРОЧИЕ КОМАНДЫ

Пометить начало блока     

Окончить редактирование

Пометить конец блока      

Табуляция

Пометить слово         

Вкл/выкл автоотступ

Скопировать блок        

Восстановить строку

Переместить блок        

Найти

Уничтожить блок        

Найти и заменить

Прочитать блок с диска     

Повторить последний поиск

Записать блок на диск     

Префикс управляющих символов

Скрыть/показать блок

 

 

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

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

 

Заметка об управляющих символах

              Все команды предполагают использование управляющих символов. Управляющие символы - это специальные символы, генерируемые Вашей клавиатурой, если Вы будете удерживать в нажатом состоянии клавишу CTRL (УПР) и нажмете любую клавишу от A до Z,

(более того, даже клавиши [ ] ^ _ @ генерируют управляющие символы таким образом).

              Клавиша CTRL работает подобно клавише SHIFT: если при нажатой клавише SHIFT нажать A, то клавиатура сгенерирует прописную букву A; если же при нажатой клавише CTRL нажать A, то клавиатура сгенерирует CTRL-A - управляющий символ.

 

Начиная работу, нужно знать, как правильно ее закончить

              Команда выхода из редактора будет описана далее, однако Вам может оказаться полезным узнать уже сейчас, что команда CTRL-K-D реализует выход из редактора из возвращает Вас в главное меню. Эта команда не выполняет автоматическую запись файла на диск; запись файла на диск следует делать явным образом по команде "S" из главного меню (Save - сохранить).

 

Основные команды перемещения курсора

              Самое важное при изучении редактора - это научиться перемещать курсор по экрану. Редактор системы Турбо использует для этой цели специальную группу управляющих символов, а именно управляющие символы CTRL-A, CTRL-S, CTRL-D, CTRL-F,  CTRL-E, CTRL-R, CTRL-X и CTRL-C. Эти символы используются потому, что на клавиатуре системы "QWERTY" они находятся вблизи от клавиши CTRL и их расположение как бы логически соответствует их назначению. Для клавиатуры с русскими буквами системы "ЙЦУКЕНГ" пользоваться такими комбинациями неудобно, поэтому, если клавиши управления курсором генерируют другие управляющие символы, имеет смысл запустить программу TINST для перенастройки команд встроенного редактора под Вашу клавиатуру.

 

На символ влево CTRL-S

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

 

На символ вправо CTRL-D

              Перемещает курсор на один символ вправо, не уничтожая находящийся там символ. Если курсор находится в крайней правой позиции экрана, содержимое экрана смещается влево, пока курсор не окажется в крайней правой позиции строки, а именно в столбце 128, где и остановится.

 

На слово влево CTRL-A

              Перемещает курсор влево до начала слова. Слово определяется как последовательность символов, разделенных одним из следующих символов: ПРОБЕЛ < > , ; . ( ) [ ] ^ ' * + - / $. Эта команда может переводить курсор на другую строку.

 

На слово вправо CTRL-F

              Перемещает курсор вправо до конца слова. Может передвинуть кур-

сор в другую строку.

 

На строку вверх CTRL-E

              Перемещает курсор на строку вверх. Если курсор находится в верхней строке экрана, содержимое экрана перемещается (скроллируется) на одну строку вниз.

 

На строку вниз CTRL-X

              Перемещает курсор на одну строку вниз. Если курсор находился в одной из двух последних строк экрана, содержимое экрана перемещается (скроллируется) на одну строку вверх.

 

Скроллинг экрана вверх CTRL-W

              Вызывает перемещение на одну строку текста по направлению к его началу; содержимое экрана сдвигается вниз.

 

Скроллинг экрана вниз CTRL-Z

              Вызывает перемещение на одну строку текста по направлению к его концу; содержимое экрана сдвигается вверх.

 

На предыдущую страницу CTRL-R

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

 

На следующую страницу CTRL-C

              Перемещает курсор на одну страницу вниз с перекрытием на одну строку.

 

Расширенные команды перемещения курсора

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

              Для запуска этих команд требуется вводить два знака: сначала префикс CTRL-Q, а затем один из следующих управляющих символов: S, D, E, X, R и C (они повторяют уже знакомые нам управляющие символы перемещения курсора).

 

В начало строки CTRL-Q-S

              Перемещает курсор к левому краю экрана, т.е. в столбец 1.

  

В конец строки CTRL-Q-D

              Перемещает курсор в конец строки, т.е. в позицию, следующую за последним символом в строке. Хвостовые пробелы для экономии памяти удаляются всегда во всех строках.

   

В начало экрана CTRL-Q-E

              Перемещает курсор в начало экрана.

   

В конец экрана CTRL-Q-X

              Перемещает курсор в конец экрана.

   

В начало файла CTRL-Q-R

              Перемещает курсор на первый символ текста.

   

В конец файла CTRL-Q-C

              Устанавливает курсор за последним символом текста.

   

В начало блока CTRL-Q-B

              Перемещает курсор в позицию, помеченную маркером начала блока, который устанавливается командой CTRL-K-B (отсюда и Q-B). Эта команда срабатывает, даже если блок не отображается (см. далее команду "Скрыть/показать блок"), или если не установлен маркер конца блока.

 

В конец блока CTRL-Q-K

              Перемещает курсор в позицию, помеченную маркером конца блока, который устанавливается командой CTRL-K-K (отсюда и Q-K). Команда срабатывает, даже если блок не отображается (см. далее команду "Скрыть/показать блок"), или не установлен маркер начала блока.

 

В последнюю позицию курсора CTRL-Q-P

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

 

Команды вставки и удаления

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

              Отметим, что редактор системы Турбо позволяет вам "пойти на попятную" при корректировке текста: отменить все исправления текущей строки, пока Вы не вышли за ее пределы. Соответствующая команда (CTRL-Q-L) описана далее.

  

Вкл/выкл режим вставки CTRL-V

              При вводе текста может быть установлен один из двух режимов: ВСТАВКА или ЗАМЕНА. При запуске редактора по умолчанию устанавливается режим вставки; он позволяет вставлять новый текст в уже существующий. Имеющийся справа от курсора текст смещается вправо по мере ввода нового текста.

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

              Эти режимы переключаются командой "Вкл/выкл режим вставки" CTRL-V, а текущий режим отображается в строке состояния в верхней части экрана.

   

Удалить символ слева DEL

              Уничтожает символ слева от курсора. Все символы справа от курсора и сам курсор сдвигаются на одну позицию влево. Клавиша BACKSPACE, которая обычно продвигает курсор назад (влево), не стирая текст, подобно CTRL-S, может быть инсталлирована для выполнения этой функции, если эта клавиша более удобно расположена на Вашей клавиатуре, или если на Вашей клавиатуре вообще отсутствует клавиша DEL. Эта команда позволяет перейти на предыдущую строку, если курсор находился в начале строки, и может использоваться для уничтожения разделителя строк.

 

Удалить символ в позиции курсора CTRL-G

              Удаляет символ в позиции курсора и сдвигает все символы справа от курсора на одну позицию влево. Действие этой команды не распространяется далее признака конца строки.

   

Удалить слово справа CTRL-T

              Уничтожает слово справа от курсора. Слово определяется как последовательность символов, ограниченная одним из следующих разделителей: ПРОБЕЛ < > , ; . [ ] ( ) ' " + - / $ . Эта команда может действовать на следующую строку.

 

Вставить строку CTRL-N

              Вставляет разделитель строк в позицию курсора. Курсор не перемещается.

 

Удалить строку CTRL-Y

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

    

Уничтожить до конца строки CTRL-Q-Y

              Уничтожает весь текст от позиции курсора до конца текущей строки.

 

Блочные команды

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

              А пока проявим упорство и обсудим использование блоков текста.

              Блоком текста считается произвольный кусок текста - от одиночного знака до нескольких страниц. Блок помечается установкой МАРКЕРА НАЧАЛА БЛОКА на первом знаке и МАРКЕРА КОНЦА БЛОКА за последним знаком требуемого участка текста. Помеченный таким образом блок может быть скопирован, перемещен, удален и записан в файл. Имеется команда чтения файла с диска в текст как блока, а также специальная команда, помечающая одиночное слово как блок.

 

Пометить начало блока CTRL-K-B

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

 

Пометить конец блока CTRL-K-K

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

 

Пометить одиночное слово CTRL-K-T

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

 

Скрыть/показать блок CTRL-K-H

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

 

 

Скопировать блок CTRL-K-C

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

 

Переместить блок CTRL-K-V

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

 

Удалить блок CTRL-K-Y

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

 

Прочитать блок с диска CTRL-K-R

              Эта команда используется для чтения файла в текущий текст в позицию курсора, как если бы это был перемещаемый или копируемый блок. Считанный блок помечается маркерами начала и конца блока. После ввода этой команды редактор запрашивает имя файла. Им может быть любое допустимое имя. Если не введен тип файла, по умолчанию предполагается .PAS. Файл без типа вводится как имя, за которым следует точка.

 

Записать блок на диск CTRL-K-W

              Эта команда используется для записи предварительно помеченного блока в файл. Блок не изменяется и маркеры остаются на местах. После ввода этой команды редактор запрашивает имя файла для записи. Если файл с введенным именем уже существует, выводится предупреждение о том, что файл будет перезаписан. Если нет помеченного блока, команда игнорируется, и выдается сообщение об ошибке. Именем файла для записи может быть любое допустимое имя файла. Если тип файла не указан, то система автоматически подставляет тип .PAS . Файл без типа вводится как имя, за которым следует точка. Избегайте пользоваться типами .BAK, .CHN, .COM, поскольку эти типы используются системой Турбо для своих нужд.

   

Прочие команды редактирования

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

 

Закончить редактирование CTRL-K-D

              Эта команда вызывает окончание редактирования и возврат к главному меню. Редактирование выполняется исключительно в памяти и никак не затрагивает файлы на диске. Сохранить отредактированный файл можно командой "S" главного меню или автоматически в

связи с компиляцией или определением нового рабочего файла.

 

Табуляция CTRL-I

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

 

Вкл/выкл автоотступа CTRL-Q-I

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

 

Восстановить строку CTRL-Q-L

              Эта команда дат возможность аннулировать все изменения, сделанные в строке, до тех пор, пока Вы ее не покинули. Когда курсор попадает на строку, она запоминается, и по этой команде может быть восстановлена. Но как только курсор покидает строку, отредактированная строка записывается в буфер текста и уже не может быть восстановлена. По этой причине не может быть восстановлена строка, удаленная по команде "Удалить строку".

 

Поиск CTRL-Q-F

              Эта команда дает возможность найти любую строку длиной до 30 символов. При вводе этой команды строка состояния очищается, и редактор запрашивает образец для поиска. Введите образец, завершив ввод клавишей RETURN. Образец может содержать любые символы, включая управляющие. Управляющие символы вводятся в образец с помощью префикса CTRL-P, за которым следует нужный служебный символ. Например, чтобы ввести в образец CTRL-A, нужно при нажатой клавише CTRL нажать клавиши P и затем A. Так можно включить в образец признак конца строки, введя комбинацию CTRL-M CTRL-J. Отметим, что CTRL-A имеет особое значение: этот символ совпадает с любым знаком и может использоваться в образцах в качестве символа группирования имен.

              Образец для поиска может быть отредактирован командами "На символ влево", "На символ вправо", "На слово влево", "На слово вправо". Последняя команда вызывает предыдущий образец, который затем может быть отредактирован. Операция поиска может быть прервана командой прерывания (CTRL-U).

              После ввода образца для поиска редактор запрашивает опции поиска. Допустимы следующие опции:

              B - поиск назад, т.е. от текущего положения курсора к началу текста;

              G - глобальный поиск, т.е. поиск по всему тексту независимо от положения курсора;

n - любое число. Поиск n-го появления образца, считая от текущего положения курсора;

U - игнорировать различие между заглавными и строчными буквами (лат);

W - поиск только целых слов, т.е. пропускать образец, входящий в другие слова.

 

Примеры:

              "W"  - ищет только целые слова, т.е. образец "термин" не будет найдена в строке "терминал".

              "BU" - ищет в обратном направлении, игнорируя разницу между заглавными и строчными буквами. По образцу "Block" будут найдены "blockread", "BLOCKADE" и т.д.

              "125" - ищет 125-е появление образца.

              Список опций (если он имеется), следует оканчивать нажатием клавиши RETURN, после чего поиск начинается. Если в тексте имеется подстрока, подходящая по образцу, то курсор устанавливается в конец этой строки. Операцию поиска можно повторить с помощью команды "Повторить последнюю операцию поиска" (CTRL-L).

 

Поиск и замена CTRL-Q-A

              Эта команда позволяет найти строку длиной до 30 символов и заменить ее другой строкой длиной не более 30 символов. В ответна эту команду строка состояния очищается, и редактор запрашивает образец для поиска. Введите образец, завершив ввод клавишей RETURN. Образец может содержать любые символы, включая управляющие. Управляющие символы вводятся в образец с помощью префикса CTRL-P, за которым следует нужный служебный символ.

              Например, чтобы ввести в образец CTRL-A, нужно при нажатой клавише CTRL нажать клавиши P и затем A. Так можно включить в образец признак конца строки, введя комбинацию CTRL-M CTRL-J. Отметим, что CTRL-A имеет особое значение: этот символ совпадает с любым знаком и может использоваться в образцах в качестве символа группирования имен.

              Образец поиска может быть отредактирован командами "На символ влево", "На символ вправо", "На слово влево", "На слово вправо". Последняя команда вызывает предыдущий образец, который затем может быть отредактирован. Операция поиска с заменой может быть прервана командой прерывания (CTRL-U).

              После того, как образец для поиска введен, редактор запрашивает строку для замены. Вводить можно не более 30 знаков; ввод управляющих символов и редактирование выполняется также, как и для образца поиска, однако CTRL-A здесь уже не имеет никакого специального значения. Если же просто нажать клавишу RETURN, то в процессе замены образец будет заменен на пустую строку, т.е. просто удален.

              Далее, наконец, редактор запросит опции. Для поиска и замены имеются следующие опции:

              B - поиск и замена в обратном направлении, т.е. поиск и замена от текущего положения курсора до начала текста;

              G - глобальный поиск и замена, т.е. поиск и замена по всему тексту независимо от положения курсора;

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

              N - замена без дополнительного запроса, т.е. без остановки и запроса "Replace (Y/N)?" для каждого обнаруженного вхождения строки поиска;

              U - игнорировать различие между заглавными и строчными буквами (лат);

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

 

Примеры:

              "N10" - ищет следующие 10 вхождений строки поиска и заменяет их без запроса.

              "GWU" - ищет и заменяет целые слова в тексте, игнорируя разницу между заглавными и строчными буквами. 

              Список опций (если они имеются) следует завершить нажатием клавиши RETURN, после чего и начинается собственно операция. В зависимости от указанных опций может быть найдена последовательность, подходящая по образцу. Когда такая последовательность найдена (и если не указана опция N), курсор устанавливается в конце этой последовательности, а на строке подсказок в верхней части экрана появляется вопрос "Replace (Y/N)?" (Заменить (да/нет)? ). В этом месте можно прервать операцию поиска с заменой путем ввода команды "Прервать" (CTRL-U). Операция поиска с заменой может быть повторена командой "Повторить последнюю операцию поиска" (CTRL-L). 

 

Повторить последнюю операцию поиска CTRL-L

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

   

Префикс управляющих символов CTRL-P

              Турбо-редактор позволяет вводить в текст управляющие символы, предваряя нужный управляющий символ сочетанием CTRL-P, т.е. в начале нажимая CTRL-P, а затем нужный символ. Управляющие символы будут появляться на экране как бледно высвеченные заглавные буквы (или в инверсном изображении, в зависимости от типа Вашего дисплея).

 

Прерывание операции CTRL-U

              Команда CTRL-U дает возможность прервать обработку любой команды в тот момент, когда она приостанавливается для ввода, например, когда "Поиск с заменой" запрашивает "Replace (Y/N) ?" или во время ввода образца поиска или имени файла (чтение или запись блока).

 

 

 

Сравнение редакторов Турбо и WordStar

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

 

Перемещение курсора

              Команды, управляющие движением курсора, CTRL-S, D, E, X свободно перемещают его по экрану и не переводят его в первую колонку пустых строк. Это не значит, что экран заполняется пробелами, наоборот, все хвостовые пробелы автоматически удаляются. Этот способ передвижения курсора в данном случае очень полезен, например, для выделения сдвигом пар BEGIN/END.            CTRL-S и CTRL-D не переводят курсор через разделители строк. Для перехода с одной строки на другую нужно использовать CTRL-E, CTRL-X, CTRL-A, CTRL-F.

 

Пометить одиночное слово

              С помощью команды CTRL-K-T можно пометить отдельное слово как блок, что более удобно, чем двухшаговый процесс пометки начала и конца слова отдельно.

   

Закончить редактирование

              По команде CTRL-K-D редактирование заканчивается, и управление передается в главное меню. Поскольку редактирование в системе Турбо делается полностью в памяти, эта команда не меняет содержимого файла на диске (в отличие от редактора WordStar). Обновление файла на диске должно быть сделано явно командой "Записать на диск" (Save) из главного меню или автоматически в связи с компиляцией или определением нового рабочего файла. Команда редактора Турбо CTRL-K-D не похожа на команду CTRL-K-Q редактора WordStar (отказ от редактирования), поскольку измененный текст не исчезает; он остается в памяти готовым к записи на диск или компиляции.

 

Восстановить строку

Команда CTRL-Q-L восстанавливает строку к ее первоначальному состоянию до редактирования, если курсор ее не покинул.

   

Табуляция

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

 

Автоматический отступ

              Команда CTRL-Q-I включает или выключает режим автоматического отступа.

ГЛАВА 2.

ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА

Основные символы

              Основной словарь Турбо-Паскаля содержит символы, подразделяемые на буквы, цифры и специальные символы:

БУКВЫ:    A - Z, a - z и знак подчеркивания (_)

ЦИФРЫ:    0 1 2 3 4 5 6 7 8 9

СПЕЦСИМВОЛЫ: + - * / = ^ < > ( ) [ ] { } . , : ; ' # $

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

Оператор присваивания: :=

Операции отношения:   <> <= >=

Отрезок типа:      ..

Квадратные скобки:   (. и .) можно использовать вместо [ и ]

Комментарии:      (* и *) можно использовать вместо { и }

 

Зарезервированные слова

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

*avsolute

*external

nil

*shr

and

file

not

* string

array

for

of

then

begin

forward

or

to

case

function

packed

type

count

goto

procedure

until

div

if

program

var

do

in

record

while

downto

* inline

repeat

with

else

label

set

*xor

end

mod

*shl

 

 

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

 

Стандартные идентификаторы

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

              Следующие стандартные идентификаторы поэтому лучше использовать только для специальных целей:

Addr

CrtInit

Kbd

Real

ArcTan

DelLine

KeyPressed

RecurPtr

Assign

Delay

Length

Release

Aux

Delete

Ln

Rename

AuxInPtr

Dispose

Lo

Reset

AuxOutPtr

EOF

LowVideo

Rewrite

BDOS

EOLN

Lst

Round

BDOSHL

Erase

LstOutPtr

Seek

BIOS

Execute

Mark

Sin

BIOSHL

Exit

MaxInt

SizeOf

BlockRead

Exp

Mem

SeekEof

BlockWrite

False

MemAvail

SeekEoln

Boolean

FilePos

Move

Sqr

BufLen

FileSize

New

Sqrt

Byte

FillChar

NormVideo

StackPtr

Chain

Flush

Odd

Str

Char

Frac

Ord

Succ

Chr

FreeMem

Output

Swap

Close

GetMem

ParamCount

Text

ClrEOL

GotoXY

ParamStr

Trm

ClrScr

Halt

Pi

True

Con

HeapPtr

Port

Trunc

ConInPtr

Hi

Pos

UpCase

ConOutPtr

IOresult

Pred

Usr

Concat

Input

Ptr

UsrInPtr

ConstPtr

InsLine

Random

UsrOutPtr

Copy

Insert

Randomize

Val

Cos

Int

Read

Write

CrtExit

Integer

ReadLn

WriteLn

 

Разделители

              Элементы языка должны быть отделены друг от друга хотя бы одним из следующих разделителей: ПРОБЕЛ, КОНЕЦ СТРОКИ или КОММЕНТАРИЙ.

 

Строки программы

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

 

 

 

 

ГЛАВА 3.

СТАНДАРТНЫЕ ПРОСТЫЕ ТИПЫ

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

              Простой тип может быть, как определен программистом (в этом случае он называется ОБЪЯВЛЕННЫМ ПРОСТЫМ ТИПОМ), так и являться одним из СТАНДАРТНЫХ ПРОСТЫХ ТИПОВ: INTEGER, REAL, BOOLEAN, CHAR или BYTE. Ниже приведено описание этих пяти стандартных простых типов.

 

INTEGER - целый

              Это целые числа; в Турбо-Паскале лежат в диапазоне от -32768 до 32767. Число типа INTEGER занимает два байта памяти.

              При выполнении целочисленных арифметических операций переполнение не регистрируется. Отметим, в частности, что все промежуточные результаты при вычислении целочисленных выражений должны находиться в пределах диапазона представления целых чисел. Например, выражение 1000*100/50 не даст в результате 2000, так как умножение вызовет переполнение.

 

BYTE - байт

              Этот тип является подмножеством типа INTEGER; диапазон представления 0..255. Следовательно, величины типа BYTE совместимы с величинами типа INTEGER, т.е. всюду, где используется величина типа  BYTE,  может быть определена величина типа INTEGER, и наоборот, ЗА ИСКЛЮЧЕНИЕМ того случая, когда осуществляется передача этих значений в качестве параметров. Более того, переменные типа BYTE и INTEGER можно смешивать в выражениях, и переменной типа BYTE может быть присвоено значение типа INTEGER. Переменная типа BYTE занимает один байт памяти.

 

REAL - вещественный

              Диапазон представления вещественных чисел от 1E-38 до 1E+38 с мантиссой, содержащей 11 значащих цифр. Вещественные числа занимают 6 байт памяти.

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

              Хотя тип REAL относится к стандартным простым типам, имеются следующие различия между ним и остальными простыми типами:

  1) Функции PRED и SUCC не могут иметь аргументы типа REAL;

  2) Вещественные числа не могут быть использованы как индексы массивов;

  3) Вещественные числа не могут использоваться в качестве базового типа множеств;

  4) Вещественные числа не могут использоваться для управления операторах FOR и CASE;

  5) Задание диапазона вещественных чисел не разрешается.

 

BOOLEAN - логический

              Величины типа BOOLEAN могут принимать одно из двух логических значений,  обозначаемых стандартными идентификаторами TRUE и FALSE (истина и ложь). По определению FALSE < TRUE. Переменная этого типа занимает один байт памяти.

 

CHAR - символьный

              Значение типа CHAR - это один символ из набора символов ASCII. Символы упорядочены в соответствии с их кодами ASCII, например 'A'<'B'. Значения кодов символов лежат в диапазоне от 0 до 255. Переменная типа CHAR занимает один байт в памяти.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ГЛАВА 4.

ЭЛЕМЕНТЫ ЯЗЫКА, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ

Идентификаторы

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

 

Примеры идентификаторов:

  TURBO

  square

  persons_counted

  BirthDate

  3rdRoot           Неверно, начинается с цифры

  Two Words     Неверно, ПРОБЕЛ недопустим

 

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

 

Числа

              Числа - это константы типа REAL или INTEGER. Целые константы - это числа, записанные в десятичной или шестнадцатеричной системе. Шестнадцатеричным константам должен предшествовать знак $, например: $7AB. Диапазон целых чисел в десятичной системе: от -32768 до 32767, в шестнадцатеричной: от $0000 до $FFFF.

 

Примеры целых чисел:

  1

  12345

  -1

  $123

  $ABC

  $123G  Неверно, символ G не является 16-ричной цифрой

  1.2345 Не является целым, содержит десятичную точку

 

              Диапазон представления вещественных чисел: от 1E-38 до 1E+38 с мантиссой, содержащей 11 значащих цифр. Возможно использование экспоненциальной формы записи, при которой буква E предшествует целому порядку, что означает "умножить на 10 в степени...". Разделители внутри чисел не допускаются. Целые константы можно использовать всюду, где разрешены вещественные константы.

 

Примеры вещественных чисел:

  1.0

  1234.5678

  -0.012

  1E6

  2E-5

  -1.2345678901E+12

  1          Допустимо, но не является вещественным,

          это константа типа INTEGER

 

Строки

              Строковая константа - это последовательность символов, заключенная в одинарные кавычки, например:

  'Это строковая константа'

              Чтобы поместить одинарную кавычку внутрь строки, нужно записать ее дважды. Строки, содержащие только один символ, относятся к стандартному типу CHAR. Любая строка совместима с типом ARRAY OF CHAR (массив типа CHAR) той же длины. Все строчные константы совместимы со всеми типами STRING (строковый).

 

Примеры строковых констант:

  'Turbo'

  'ОБ''ЯВЛЕНИЕ'

  ''''

  ';'

  ''

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

              Последний пример - кавычки, не заключающие ни одного знака, - обозначает ПУСТУЮ СТРОКУ, которая совместима только с типами STRING.

 

Управляющие символы

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

  1) Знак #, за которым следует целочисленная константа из диапазона 0..255, обозначает символ с соответствующим значением кода ASCII;

  2) Знак ^, за которым следует символ, обозначает соответствующий управляющий символ (CTRL).

 

Примеры:

  #10   10 в коде ASCII (LF, перевод строки)

  #$1B  1BH в коде ASCII (ESC)

  ^G   CTRL-G (BELL, звонок)

  ^l   CTRL-L (FF)

  ^M   CTRL-M (CR, возврат каретки)

  ^[   CTRL-[ (ESC)

 

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

  #13#10

  #27^U#20

  ^G^G^G^G

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

'Жду ввода! '^G^G^G' Проснитесь пожалуйста'

#27'U '

'Это другая строка текста '^M^J

Эти строки содержат соответственно по 36, 3 и 27 символов.

 

Комментарии

              Комментарии могут быть вставлены всюду, где допускается разделитель. Они отделяются фигурными скобками { }, которые можно заменить символами (* и *) .

 

Примеры:

  { Это комментарий }

  (* Здесь допускаются скобки { и } *)

              Фигурные скобки { } внутри других фигурных скобок недопустимы; недопустимы также символы (* и *) внутри других таких же символов. Однако, фигурные скобки допустимы внутри комментариев, ограниченных символами (* и *), и наоборот, что позволяет убирать в комментарии некоторые части текстов программ, даже если они сами содержат комментарии.

              Примечание: При работе на компьютере с кодировкой КОИ7/Н2 (латинские и русские буквы) фигурным скобкам соответствуют русские буквы Ш и Щ. В этом случае для       выделения комментариев целесообразно пользоваться заменителями фигурных скобок (* и *).

 

Директивы компилятора

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

              Директива компилятора состоит из открывающей скобки, за которой непосредственно следует знак $ и первая буква директивы компилятора, или список директив компилятора, разделенных запятыми.

              Синтаксис директивы или списка директив зависит от вида директив. Полное описание каждой директивы компилятора находится в Приложении C.

Примеры:

  {$I-}

  {$I INCLUDE.FIL}

  (*$R-,B+,V-*)

 

Заметим, что перед и после знака $ пробелы не допускаются.

 

 

 

 

 

 

 

 

 

 

 

 

 

ГЛАВА 5.

ЗАГОЛОВОК ПРОГРАММЫ И ПРОГРАММНЫЙ БЛОК

              Программа на языке Паскаль состоит из заголовка программы, за которым следует программный блок. Программный блок, в свою очередь, подразделяется на РАЗДЕЛЫ ОПИСАНИЙ, в которых определяются все локализованные в данной программе объекты, и ОПЕРАТОРНУЮ ЧАСТЬ, в которой определены действия, выполняемые над этими объектами.

 

Заголовок программы

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

Примеры:

  program Circles;

  program Accountant (Input,Output);

  program Writer (Input,Printer);

 

Разделы описаний

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

  1) раздел описаний меток

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

  3) раздел определения типов

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

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

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

 

Раздел описаний меток

              Любому оператору в программе может предшествовать МЕТКА, дающая возможность прямой передачи управления этому оператору с помощью оператора GOTO. Метка состоит из имени метки, за которым следует двоеточие. Перед использованием метки должны быть описаны в разделе описания меток. Этот раздел начинается зарезервированным словом LABEL, за которым следует список идентификаторов меток, разделенных запятыми, и оканчивающийся символом ";".

Пример:   label 10,Error,999,Quit;

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

 

Раздел определений констант

              В разделе определения констант вводятся идентификаторы как синонимы значений констант. Этот раздел начинается зарезервированным словом CONST, за которым следует список присваиваний значений констант, разделенных символом ";". Каждое присваивание состоит из идентификатора, за которым следует знак равенства и константа. Константами могут быть как строки, так и числа.

Пример:

  const

   Limit=255;

   Max=1024;

   PassWord='SESAM';

   CursHome = ^['V';

 

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

  Имя   Тип и значение

  Pi   Real   (3.1415926536E+00)

  False  Boolean (внутреннее значение false)

  True  Boolean (внутреннее значение true)

  MaxInt Integer (32767)

 

              Как описано в главе 13, раздел определения констант может также определять константы с заданным типом.

 

Раздел определений типов

              Тип данных в Паскале может быть прямо описан в разделе определения типов, либо описан путем ссылки на идентификатор типа. Предусмотрены несколько стандартных идентификаторов типа; кроме того, программист может создавать свои собственные типы путем использования определения типа. Раздел определения типов начинается зарезервированным словом TYPE, за которым следует одно или несколько присваиваний типов, разделенных символом ";". Каждое присваивание типа состоит из идентификатора типа, за которым следует знак равенства и тип.

Пример:

  type

   Number = Integer;

   Day = (mon,tues,wed,thur,fri,sat,sun);

   List = array [1..10] of Real;

              Большое количество примеров определений типа Вы найдете в дальнейших разделах.

 

Раздел описаний переменных

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

              Объявление переменных состоит из зарезервированного слова VAR, за которым следует один или более идентификаторов, разделенных запятыми; за ними стоит двоеточие и тип. Это создает новую переменную указанного типа и связывает ее с заданным идентификатором.

              Область действия объявления идентификатора - блок, в котором оно помещено, и все блоки внутри этого блока. Заметим, однако, что любой блок внутри некоторого блока может определить другую переменную, используя тот же идентификатор. Эта переменная называется ЛОКАЛЬНОЙ по отношению к блоку, в котором она объявлена (и ко всем блокам внутри него), при этом переменная, объявленная на внешнем уровне (ГЛОБАЛЬНАЯ) становится недоступной.

Пример:

  var

   Result,Intermediate,SubTotal: Real;

   I, J, X, Y: Integer;

   Accepted, Valid: Boolean;

   Period: Day;

   Buffer: array[0..127] of Byte;

 

Абсолютные переменные

              Переменные можно объявлять так, чтобы они занимали заданные адреса; такие переменные называются абсолютными.

              Это достигается добавлением к описанию переменной зарезервированного слова ABSOLUTE, за которым следует константа типа INTEGER, например:

  var

   IObyte: byte absolute 3;

   CmdLine: string[127] absolute $0080;

              Атрибутом ABSOLUTE можно пользоваться также для того, чтобы две переменные начинались с одного и того же адреса - накладывались друг на друга. Когда после слова ABSOLUTE стоит идентификатор переменной или параметра, новая переменная будет начинаться с адреса этой переменной или параметра, например:

  var

   Str: string[32];

   StrLen: Byte absolute Str;

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

  Ident1, Ident2: Integer absolute $80;

  является недопустимой.

 

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

              Описание процедуры служит для определения процедуры внутри текущей процедуры или программы (см. раздел "Процедуры" в главе 16). Процедура запускается оператором вызова процедуры (см. раздел "Вызов процедуры" в главе 7), и после ее завершения выполнение программы продолжается с оператора, непосредственно следующего за оператором вызова процедуры.

              Описание функции служит для определения части программы, которая вычисляет и возвращает определенное значение (см. раздел "Описание функции" в главе 16). Функция запускается, когда ее имя встречается в выражении (см. раздел "Вызовы функций" в главе 6).

 

Операторная часть

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

 

 

 

 

 

 

 

 

 

 

 

 

 

ГЛАВА 6.

ВЫРАЖЕНИЯ

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

              В этой главе показано, как составлять выражения из величин, принадлежащих к стандартным простым типам INTEGER, REAL, BOOLEAN и CHAR. Выражения, содержащие объявленные простые типы, строковые типы и множества, описаны в соответствующих разделах глав 8, 9 и 12 соответственно.

 

Операции

              Операции делятся на 5 категорий согласно приоритета:

  1) Унарный минус

  2) NOT

  3) * / DIV MOD AND SHL SHR (операции группы умножения)

  4) + - OR XOR       (операции группы сложения)

  5) = <> < > <= >= IN (операции отношений)

 

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

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

 

Унарный минус

              Унарный минус обозначает отрицание своего операнда, который может иметь тип INTEGER или REAL, например: -A.

 

Операция NOT

              Это операция логического отрицания (инверсии) значения своего операнда типа BOOLEAN:

  NOT TRUE = FALSE

  NOT FALSE = TRUE

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

Примеры:

  NOT 0   = -1

  NOT -15  = 14

  NOT $2345 = $DCBA

 

Операции группы умножения

Обозначение

Операция

Тип операндов

Тип результата

*

Умножение

Real

Real

*

Умножение

Integer

Integer

*

Умножение

Real, Integer

Real

/

Деление

Real, Integer

Real

/

Деление

Integer

Real

/

Деление

Real

Real

DIV

Деление на цело

Integer

Integer

MOD

Взятие остатка

Integer

Integer

AND

Арифметич. "И"

Integer

Integer

AND

Логическое "И"

Boolean

Boolean

SHL

Сдвиг влево

Integer

Integer

SHR

Сдвиг вправо

Integer

Integer

 

Примеры:

  12*34     = 408

  123/4     = 30.75

  123 DIV 4   = 30

  12 MOD 5    = 2

  TRUE AND FALSE = FALSE

  12 AND 22   = 4

  2 SHL 7    = 256

  256 SHR 7   = 2

 

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

Обозначение

Операция

Тип операндов

Тип результата

+

Сложение

Real

Real

+

Сложение

Integer

Integer

+

Сложение

Real, Integer

Real

-

Вычитание

Real

Real

-

Вычитание

Integer

Integer

-

Вычитание

Real, Integer

Real

OR

Арифм. "ИЛИ"

Integer

Integer

OR

Логическое "ИЛИ"

Boolean

Boolean

XOR

Арифм. "ИСКЛ.ИЛИ"

Integer

Integer

XOR

Логич. "ИСКЛ.ИЛИ"

Boolean

Boolean

Примеры:

  123+456    = 579

  456-123.0   = 333.0

  TRUE OR FALSE = TRUE

  12 OR 22    = 30

  TRUE XOR FALSE = TRUE

  12 XOR 22   = 26

 

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

              Операции отношений применимы ко всем стандартным простым типам: REAL, INTEGER, BOOLEAN, CHAR и BYTE. Операнды типа INTEGER, REAL и BYTE могут смешиваться. Тип результата всегда BOOLEAN, т.е. TRUE или FALSE.

 

=   Равно

  <>  Не равно

  >   Больше чем

  <   Меньше чем

  >=  Больше или равно

  <=  Меньше или равно

Примеры:

  A=B  TRUE, если A равно B

  A<>B TRUE, если A не равно B

  A>=B TRUE, если A больше или равно B

 

Вызовы функций

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

Примеры:

  Round (PlotPos)

  Writeln(Pi*(Sqr(R)))

  (Max(X,Y) < 25) and (Z > Sqrt(X*Y))

  Volume (Radius,Height)

 

ГЛАВА 7.

ОПЕРАТОРЫ

              В операторной части определяются действия, которые должны быть выполнены программой (или подпрограммой). Эти действия определяются в форме последовательности ОПЕРАТОРОВ, каждый из которых задает какую-то одну часть общего действия. В этом смысле Паскаль представляет собой язык для последовательного программирования: операторы выполняются последовательно во времени и никогда - параллельно. Операторная часть ограничивается парой зарезервированных слов BEGIN и END, а между ними операторы отделяются друг от друга точкой с запятой. Операторы могут быть ПРОСТЫМИ и СТРУКТУРНЫМИ.

 

Простые операторы

              Простые операторы - это операторы, не содержащие внутри себя другие операторы. К этой группе относятся оператор присваивания, оператор вызова процедуры, оператор перехода и пустой оператор.

 

Оператор присваивания

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

              Возможно присваивание переменной любого типа (кроме типа FILE) значения выражения только того же типа. Как исключение, если переменная имеет тип REAL, тип выражения может быть INTEGER.

Примеры:

 Angle := Angle * Pi;

 AccessOk := False;

 Entry := Answer = PassWord;

 SpherVol := 4 * Pi * R * R;

 

Вызов процедуры

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

Примеры:

 Find (Name,Address);

 Sort (Address);

 UpperCase (Text);

 UpdateCustFile (CustRecord);

 

Оператор перехода

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

 1) Метки должны быть объявлены перед использованием. Это должно делаться в разделе описаний меток того блока, где эти метки используются;

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

 

Пустой оператор

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

Примеры:

 begin end.

 while Answer<>' ' do;

 repeat until KeyPressed; { Ожидание нажатия клавиши }

 

Структурные операторы

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

 

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

              Составной оператор используется, если нужно выполнить более, чем один оператор там, где синтаксис Паскаля допускает запись только одного оператора. Составной оператор представляет собой последовательность из любого числа операторов, разделенных символом ";" и ограниченных зарезервированными словами BEGIN и END. Эти операторы будут выполняться в той же последовательности, в которой они записаны.

Пример:

 if Small > Big then

  begin

   Tmp:=Small;

   Small:=Big;

   Big:=Tmp;

  end;

 

Условные операторы

              Условный оператор выбирает для выполнения только один из входящих в его состав операторов.

 

Оператор IF

              Оператор IF обеспечивает выполнение какого-либо оператора только если некоторое условие (выражение типа BOOLEAN) будет истинно. Если оно ложно, либо этот оператор будет обойден, либо выполнится другой оператор, записанный после зарезервированного слова ELSE. Заметим, что слову ELSE не должен предшествовать символ ";".

 Двусмысленность понимания следующей синтаксической конструкции:

 if Expr1 then

  if Expr2 then

   Stmt1

  else

   Stmt2

 устраняется путем интерпретации этой конструкции как:

 if Expr1 then

  begin

   if Expr2 then

   Stmt1

   else

   Stmt2

  end

 т.е. ветвь ELSE соответствует последнему оператору IF, не имеющему ветви ELSE.

 

Примеры:

 if Interest > 25 then

  Usury:=true

 else

  Takeloan:=OK;

 

 if (Entry < 0) or (Entry > 100) then

  begin

   Write('Диапазон от 1 до 100, пожалуйста повторите: ');

   Read(Entry);

  end;

 

Оператор CASE

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

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

              Типом селектора может быть любой простой тип, кроме REAL.

Примеры:

 case Operator of

   '+': Result:=Answer+Result;

   '-': Result:=Answer-Result;

   '*': Result:=Answer*Result;

   '/': Result:=Answer/Result;

 end;

 

 case Year of

   Min..1939: begin

      Time:=PreWorldWar2;

      Writeln('Мир без войны...');

     end;

   1946..Max: begin

      Time:=PostWorldWar2;

      Writeln('Построение нового мира.');

     end;

     else

     begin

      Time:=WorldWar2;

      Writeln ('Мы во время войны');

     end;

 end;

 

Операторы цикла

              Операторы повторения (цикла) вызывают многократное выполнение некоторых операторов. Если количество повторений известно до начала цикла, то применяется оператор FOR. В других случаях нужно использовать операторы WHILE и REPEAT (циклы с заранее неизвестным числом повторений).

 

Оператор FOR

              Оператор FOR показывает, что входящий в его состав оператор должен многократно выполняться с увеличением или уменьшением значения, присвоенного некоторой переменной, которая называется управляющей переменной или ПАРАМЕТРОМ ЦИКЛА. Если это значение необходимо увеличивать, используется зарезервированное слово TO, а если уменьшать, то слово DOWNTO, после чего указывается конечное значение.

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

              Если начальное значение больше конечного значения и используется форма TO, или если начальное значение меньше конечного и используется форма DOWNTO, оператор, входящий в состав оператора FOR, не выполняется ни разу.

Примеры:

 for i:=2 to 100 do

  if A[I] > Max then

   Max:=A[I];

 for i:=1 to NoOfLines do

  begin

  Readln (Line);

  if Length(Line) < Limit then

   ShortLines:=ShortLines+1

  else

   LongLines:=LongLines+1

  end;

              Заметим, что оператор, входящий в состав оператора FOR, не должен содержать операторы, изменяющие значения параметра цикла. Если необходимо прекратить цикл до достижения конечного значения, следует использовать оператор GOTO, хотя такие конструкции не рекомендуются: в хорошей программистской практике в такой ситуации пользуются операторами WHILE и REPEAT.

              После завершения оператора FOR параметр цикла равен конечному значению, если цикл вообще выполняется, в противном случае параметру цикла не присваивается никаких значений.

 

Оператор WHILE

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

Примеры:

 while Size>1 do

  Size:=Sqrt(Size);

 while ThisMonth do

  begin

  ThisMonth:=CurMonth=SampleMonth;

  Process; { Дальнейшая обработка }

  end;

 

Оператор REPEAT

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

Пример:

 repeat

  Write(^M,'Уничтожить эти данные ? (Y/N): ');

  Read(Kbd,Answer);

 until UpCase(Answer) in ['Y','N'];

 

 

 

 

 

ГЛАВА 8.

ПРОСТЫЕ И ОГРАНИЧЕННЫЕ ТИПЫ

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

 

Простой тип

              В дополнение к стандартным простым типам (INTEGER, REAL, BOOLEAN, CHAR и BYTE) Паскаль поддерживает простые типы, определенные пользователем. Они также называются объявленными простыми типами. Определение простого типа перечисляет по порядку все его возможные значения. Значения нового типа могут быть представлены идентификаторами и являются константами нового типа.

Примеры:

 type

  Operator=(Plus,Minus,Multi,Divide);

  Day  =(Mon,Tues,Wed,Thur,Fri,Sat,Sun);

  Month =(Jan,Feb,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);

  Card =(Club,Diamond,Heart,Spade);

              Переменные последнего типа Card могут принимать одно из четырех значений, а именно: Club, Diamond, Heart, Spade. Вы уже знакомы со стандартным типом BOOLEAN, который определяется как:

 type

  boolean=(False,True);

              Операции отношений «=» «<>»  «>»  «<»  «>=»  «<=» могут быть применимы ко всем простым типам, если оба операнда принадлежат к одному и тому же типу (типы INTEGER и REAL можно смешивать). Порядок значений простого типа является основой для сравнения, т.е. порядок, в котором перечислены значения в определении типа.

              Так, для типа Card:

 Club < Diamond < Heart < Spade

              Определены следующие стандартные функции над аргументами простого типа:

 Succ(Diamond) последователь Diamond (Heart)

 Pred(Diamond) предшественник Diamond (Club)

 

               Ord (Diamond) порядковый номер Diamond (1, поскольку порядковый номер первого значения простого типа равен 0).

 

Ограниченный тип

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

Примеры:

 type

  HemiSphere =(North,South,East,West);

  World  =(East..West);

  CompassRange =0..360;

  Upper  ='A'..'Z';

  Lower  ='a'..'z';

  Degree  =(Celc,Fahr,Reom,Kelv);

  Wine   =(Red,White,Rose,Sparkling);

              В этом примере тип WORLD является ограничением простого типа HEMISPHERE, который называется БАЗОВЫМ простым типом. Базовый простой тип для COMPASSRANGE - это тип INTEGER, а для типов UPPER и LOWER - тип CHAR.

              Вы уже знакомы со стандартным ограниченным типом BYTE, который определяется как:

 type

  Byte = 0..255;

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

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

 

Преобразование типов

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

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

              Так, для определений типов из примеров двух предыдущих разделов справедливо следующее:

 Integer(Heart)=2

 Month(10)  =Nov

 HemiSphere(2) =East

 Upper(14)  ='O'

 Degree(3)  =Kelvin

 Char(78)  ='N'

 Integer('7') =55

 

Проверка границ

              Генерация кода, обеспечивающего во время выполнения проверку границ для переменных простого и ограниченного типа, управляется директивой R компилятора. По умолчанию принимается {$R-}, т.е. отсутствие такой проверки. Когда выполняется присваивание переменной простого или ограниченного типа в условиях действия этой директивы: {$R+}, присваиваемое значение проверяется на вхождение в диапазон данного типа. Этим рекомендуется пользоваться до тех пор, пока программа не будет полностью отлажена.

Пример:

 program RangeCheck;

 type

  Digit=0..9;

 var

  Dig1,Dig2,Dig3: Digit;

 begin

  Dig1:=5;   { Верно }

  Dig2:=Dig1+3;  { Верно, поскольку DIG1+3<=9  }

  Dig3:=47;   { Неверно, но не вызывает ошибку }

  {$R+} Dig3:=55; { Неверно и приводит к ошибке выполнения }

  {$R-} Dig3:=167; { Неверно, но не вызывает ошибку }

 end.

 

 

 

 

ГЛАВА 9.

СТРОКОВЫЙ ТИП

              В Турбо-Паскале предусмотрены удобные строковые типы для обработки строк символов, т.е. последовательностей символов. Строковые типы - это структурные типы, и они во многом похожи на типы ARRAY (см. главу 10). Однако, между ними имеется принципиальное отличие: число символов в строке (т.е. ДЛИНА строки) может меняться динамически от 0 до объявленной верхней границы, в то время как число элементов массива постоянно.

 

Определение строкового типа

              Определение строкового типа должно указывать максимальное число символов, которое может содержать строка данного типа, т.е. максимальную длину строки данного типа. Определение состоит из зарезервированного слова STRING, за которым следует максимальная длина строки в квадратных скобках. Длина - это целая константа от 1 до 255. Заметим, что строки не имеют длину по умолчанию: длина всегда должна быть указана.

Пример:

 type

  FileName = string[14];

  ScreenLine = string[80];

              Строковая переменная занимает в памяти заданную максимальную длину байт плюс один байт, содержащий ее текущую длину. Отдельные символы в строке индексируются от 1 до длины строки.

 

Строковые выражения

              Манипуляции со строками выполняются с помощью СТРОКОВЫХ ВЫРАЖЕНИЙ. Строковые выражения состоят из строковых констант, строковых переменных, указателей функций и операций.

              Знак "+" может быть использован для конкатенации (сцепления) строк. Функция CONCAT (см. раздел "Функция CONCAT" в этой главе) выполняет ту же функцию, но знак "+" часто более удобен. Если длина результата более 255, фиксируется ошибка периода выполнения.

Примеры:

 'TURBO '+'Pascal' = 'TURBO Pascal'

 '123'+'.'+'456'  = '123.456'

 'A '+'B'+' C '+'D' = 'A B C D'

              Операции отношений = <> > < >= <= имеют меньший приоритет, чем операция конкатенации. Когда они применяются к строковым операндам, результат имеет значение типа BOOLEAN (TRUE или FALSE). При сравнении двух строк одиночные символы сравниваются слева направо. Если строки имеют разную длину, но их символы одинаковы, за исключением последних символов более длинной строки, более короткая строка считается меньшей. Строки равны между собой только в том случае, если их длины и содержание одинаковы.

Примеры:

 'A' < 'B'         true

 'A' > 'b'         false

 '2' < '12'        false

 'TURBO' = 'TURBO'       true

 'TURBO ' = 'TURBO'      false

 'Pascal Compiler' < 'Pascal compiler'  true

 

Строковое присваивание

              Для присваивания строковой переменной значения строкового выражения используется оператор присваивания.

Пример:

 Age:='fiftieth';

 line:='Many happy returns on your '+Age+' birthday';

              Если максимальная длина строковой переменной превышена (в результате присваивания переменной значения, содержащего слишком много символов), лишние символы справа отсекаются. Так, если переменная Age была объявлена как STRING[5], после присваивания она будет содержать только 5 левых символов: 'fifti'.

 

Процедуры обработки строк

              В Турбо-Паскале определены следующие стандартные процедуры, работающие со строками:

Процедура DELETE

 Синтаксис: DELETE(St,Pos,Num);

Эта процедура удаляет подстроку, содержащую Num символов, из строки St, начиная с позиции Pos. Если Pos больше, чем текущая длина строки, ни один символ не удаляется. При попытке уничтожить символы за концом строки (т.е. если Pos+Num превышает длину строки) удаляются только символы, принадлежащие строке. Если Pos не находится в диапазоне 1..255, фиксируется ошибка периода выполнения.

 Если St имеет значение 'ABCDEFG', то

 DELETE (St,2,4) присвоит St значение 'AFG',

 DELETE (St,2,10) присвоит St значение 'A'.

 

Процедура INSERT

 Синтаксис: INSERT(Obj,Target,Pos);

              Процедура INSERT вставляет строку Obj в строку Target, начиная с позиции Pos. Obj - это строковое выражение, Target - строковая переменная, Pos - это целое выражение. Если Pos превышает длину Target, строка Obj присоединяется справа к строке Target. Если Pos не принадлежит диапазону 1..255, фиксируется ошибка периода выполнения.

 Если St имеет значение 'ABCDEFG', то

 INSERT ('XX',St,3) присвоит St значение 'ABXXCDEFG'.

 

Процедура STR

 Синтаксис: STR(Value,St);

              Эта процедура преобразует численное значение Value в строку и запоминает результаты в St. Value - это параметр вывода типа INTEGER или REAL, St - это строковая переменная. Параметры вывода - это выражения со специальными командами форматирования. Подробнее об этом можно узнать из раздела, посвященного процедуре WRITE в главе 14.

 Если переменная I имеет значение 1234, то:

 STR(I:5,St) присвоит St значение ' 1234'.

 Если переменная X имеет значение 2.5E4, то:

 STR (X:10:0,St) присвоит St значение '  2500'.

              Функция, использующая процедуру STR, никогда не должна вызываться из выражения внутри операторов WRITE или WRITELN.

 

Процедура VAL

 Синтаксис: VAL(St,Var,Code);

              Эта процедура преобразует строковое выражение St в целое или вещественное значение (в зависимости от типа переменной Var) и запоминает это значение в переменной Var. St должно быть строкой, содержащей численное значение согласно правилам для числовых констант (см. раздел "Числа" в главе 4). Ни ведущие, ни концевые пробелы не разрешаются. Var должно быть целой или вещественной переменной, и Code должно быть целой переменной.

              Если ошибки не обнаружены, переменная Code устанавливается в 0, иначе Code принимает значение позиции первого ошибочного символа, в этом случае значение Var не определено.

 Если St имеет значение '234', то:

 VAL (St,I,Result) присвоит I значение 234, а Result - значение 0;

 Если St имеет значение '12X', то:

 VAL (St,I,Result) присвоит I неопределенное значение, а Result - значение 3;

 Если St имеет значение '2.5E4' и X имеет тип REAL, то:

 VAL (St,X,Result) присвоит X значение 2500, а Result - значение 0.

 Функция, использующая процедуру VAL, никогда не должна вызываться в выражении внутри процедур WRITE и WRITELN.

 

Функции обработки строк

              В Турбо-Паскале определены следующие стандартные строковые функции:

 

Функция COPY

 Синтаксис: COPY(St,Pos,Num)

              Эта функция возвращает подстроку, содержащую Num символов строки St, начиная с позиции Pos. St - это строковое выражение, Pos и Num - целые выражения. Если Pos превышает длину строки, возвращается пустая строка. Если делается попытка получить символы за концом строки (т.е. Pos+Num превышает длину строки), возвращаются только символы из строки. Если Pos не находится в диапазоне 1..255, фиксируется ошибка периода выполнения.

 Если St имеет значение 'ABCDEFG', то:

 COPY (St,3,2) вернет значение 'CD',

 COPY (St,4,10) вернет значение 'DEFG'

 COPY (St,4,2) вернет значение 'DE'

 

Функция CONCAT

Синтаксис: CONCAT(St1,St2[,..,Stn])

              Эта функция возвращает строку, полученную путем сцепления аргументов в том порядке, в котором они указаны. Аргументами может быть любое число строковых выражений St1,St2,..,Stn, разделенных запятыми. Если длина результата превышает 255, фиксируется ошибка периода выполнения. Как было указано в разделе "Строковые выражения" главы 9, операция "+" может быть использована для получения того же результата, что часто более удобно. Функция CONCAT предусмотрена только для совместимости с другими компиляторами с языка Паскаль.

              Если St1 имеет значение 'TURBO' и St2 имеет значение 'is fastest', то:

 CONCAT(St1,' Pascal ',St2) вернет значение 'TURBO Pascal is fastest'.

 

Функция LENGTH

Синтаксис: LENGTH(St)

              Возвращает длину строкового выражения St, т.е. число символов в St. Тип результата - INTEGER.

 Если St имеет значение '123456789', то:

 LENGTH (St) вернет значение 9.

 

Функция POS

Синтаксис: POS (Src,Trg)

              Эта функция "просматривает" строку Trg для поиска первого вхождения подстроки Src в строку Target. Src и Trg – строковые выражения, тип результата - INTEGER. Результатом является целое число, означающее позицию в Trg первого символа искомой подцепочки. Номер позиции первого символа равен 1. Если подстрока не найдена, возвращается значение 0.

              Если St имеет значение 'ABCDEFG', то:

 POS ('DE',St) вернет 4,

 POS ('H',St) вернет 0.

 

Строки и символы

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

              Более того, величины строкового и символьного типов можно смешивать в выражениях. Если переменной типа CHAR присваивается строковое значение, длина этой строки должна быть равна 1, иначе возникает ошибка периода выполнения.

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

Примеры:

 Buffer [5]

 Line [Length(Line)-1]

 Ord (Line[0])

              Вследствие того, что в начале строки по индексу 0 содержится длина строки, справедливо следующее равенство:

 Length (Line) = Ord (Line[0]).

              Если нулевому символу строки присваивается какое-либо значение, то ответственность за то, чтобы присваиваемое значение не превышало максимальной длины данной строковой переменной, ложится на программиста. Если включен режим проверки диапазонов (директива {$R+} компилятора), генерируется код, который проверяет, что значение индекса строки не превосходит максимальную длину строковой переменной. Однако можно задать индекс, превышающий текущую динамическую длину переменной. При этом читаемые из строки символы будут случайными, а присваивание за пределами текущей длины строки не изменит действительное значение строковой переменной.

 

 

 

 

 

 

 

 

ГЛАВА 10.

МАССИВЫ

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

 

Определение массива

              Определение массива состоит из зарезервированного слова ARRAY, за которым следует индексный тип, заключенный в квадратные скобки, затем следует зарезервированное слово OF и базовый тип (тип компонент массива).

Примеры:

 type

  Day=(Mon,Tue,Wed,Thu,Fri,Sat,Sun);

 var

  WorkHour: array[1..8] of Integer;

  Week : array[1..7] of Day;

 

 type

  Players =(Player1,Player2,Player3,Player4);

  Hand =(One,Two,Pair,TwoPair,Three,Straight,

    Flush,FullHouse,Four,StraightFlush,RSF);

  LegalBid=1..200;

  Bid  =array[Players] of LegalBid;

 var

  Player: Array[Players] of Hand;

  Pot: Bid;

 

              Доступ к компоненте массива осуществляется путем добавления индекса в квадратных скобках к идентификатору массива:

 Player [Player3]:=FullHouse;

 Pot [Player3]:=100;

 Player [Player4]:=Flush;

 Pot [Player4]:=50;

 

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

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

 

Многомерные массивы

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

Пример:

 type

  Card = (Two,Three,Four,Five,Six,Seven,Eight,Nine,

    Ten,Knight,Queen,King,Ace);

  Suit = (Hearts,Spade,Clubs,Diamonds);

  AllCards = array [Suit] of array[1..13] of Card;

 var

  Deck: AllCards;

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

 type

  AllCards = array [Suit,1..13] of Card;

              Аналогичное сокращение может быть использовано при выборе компоненты массива:

 Deck [Hearts,10] эквивалентно Deck [Hearts][10].

              Можно, конечно, определять многомерные массивы через предварительно определенные типы массивов.

Пример:

 type

  Pupils = string[20];

  Class = array [1..30] of Pupils;

  School = array [1..100] of Class;

 var

  J,P,Vacant: Integer;

  ClassA,ClassB: Class;

  NewTownSchool: School;

 

 После этих определений возможны следующие присваивания:

 ClassA [J]:='ВАСЯ';

 NewTownSchool [5][21]:='ПЕТЯ ИВАНОВ';

 NewTownSchool [8,J]:=NewTownSchool [7,J];

        { Ученик номер J меняет класс }

 ClassA [Vacant]:=ClassB [P];

      { Ученик номер P меняет класс и номер }

 

Массивы символов

              Массивы символов - это массивы с одним индексом и компонентами стандартного простого типа CHAR. Массивы символов могут рассматриваться как строки постоянной длины.

              В Турбо-Паскале массивы символов могут использоваться в строковых выражениях; в этом случае массив преобразуется в строку длины, равной длине массива. Таким образом, массивы можно сравнивать и манипулировать ими так же, как и строками; значение строковой КОНСТАНТЫ может быть присвоено массиву символов той же длины. Строковые переменные и значения, являющиеся результатом строковых выражений, не могут быть присвоены массиву символов.

 

Стандартные массивы

              Турбо-Паскаль дает возможность пользоваться двумя стандартными массивами типа BYTE, а именно MEM и PORT, которые используются для доступа к памяти процессора и портам данных.

 

Массив MEM

              Массив MEM используется для доступа к оперативной памяти. Каждая компонента массива имеет тип BYTE, а индексы соответствуют адресам памяти. Индекс имеет тип INTEGER. Если некоторое значение присваивается компоненте массива MEM, то это значение записывается в память по адресу, определяемому индексным выражением. Когда массив MEM участвует в выражениях, используется значение байта, расположенного по адресу, который задается индексом.

Примеры:

 Mem [I]:=2;

 Mem [I+1]:=$1B;

 Mem [I+2]:=Ord(' ');

 IObyte:=Mem [3];

 Mem [Addr+Offset]:=Mem [Addr];

 

 

Массив PORT

              Массив PORT используется для доступа к портам ввода/вывода микропроцессора Z80. Каждый элемент массива представляет один порт данных, причем индексы соответствуют номерам портов. Поскольку для выбора портов используются 8-разрядные адреса, индекс имеет тип BYTE. Когда некоторое значение присваивается компоненте массива PORT, это значение выводится в соответствующий порт. Когда же компонента такого массива употребляется в выражении, ее значение вводится из соответствующего порта. Использование массива портов ограничивается присваиванием значений и употреблением в качестве элементов выражений; в частности, компоненты массива PORT не могут использоваться как параметры-переменные процедур и функций. Более того, запрещены операции со ссылкой на весь массив портов как на единое целое (без индекса).

Примеры:

 Port[$F8]:=$0E;

 X:=Port[$0A];

 

Оптимизация индексов массивов

              Директива компилятора X позволяет программисту указать, следует ли проводить оптимизацию индексов массивов в отношении скорости выполнения или размера кода. По умолчанию подразумевается активный режим этой директивы: {$X+}, который порождает оптимизацию скорости выполнения. При пассивном состоянии: {$X-} минимизируется размер кода.

 

 

ГЛАВА 11.

ЗАПИСИ

              Запись - это структура, состоящая из фиксированного числа компонент, называемых ПОЛЯМИ. Поля могут быть различных типов; каждому полю присваивается имя - ИДЕНТИФИКАТОР ПОЛЯ, которое используется для обращения к этому полю.

 

Определение записи

              Определение типа записи состоит из зарезервированного слова RECORD, за которым следует СПИСОК ПОЛЕЙ, оканчивающийся зарезервированным словом END. Список полей - это последовательность СЕКЦИЙ ЗАПИСИ, разделенных точками с запятой. Каждая секция записи, в свою очередь, состоит из одного или более идентификаторов, разделенных запятыми, за которыми следует двоеточие и либо ИДЕНТИФИКАТОР ТИПА, либо ОПИСАТЕЛЬ ТИПА. Таким образом, каждая секция записи определяет идентификатор и тип для одного или более полей.

Пример:

 

 type

  DaysOfMonth = 1..31;

  Date  = record

      Day: DaysOfMonth;

      Month: (Jan,Feb,Mar,Apr,May,Jun,

        July,Aug,Sep,Oct,Nov,Dec);

      Year: 1900..1999;

     end;

 var

  Birth: Date;

  WorkDay: array [1..5] of Date;

 

              В данном примере Day, Month и Year - это идентификаторы полей. Идентификаторы полей должны быть уникальными только в пределах записи, в которой они определены. На поле можно сослаться путем указания идентификатора переменной и идентификатора поля, разделенных точкой.

 

Примеры:

 Birth.Month:=Mar;

 Birth.Year:=1962;

 WorkDay [Current]:=WorkDay [Current-1];

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

 

 type

  Name = record

     FamilyName: string[32];

     ChristianNames: array [1..3] of string[16];

    end;

  Rate = record

     NormalRate, OverTime,

     NightTime, WeekEnd: integer;

    end;

  Date = record

     Day: 1..31;

     Month: (Jan,Feb,MAr,Apr,May,Jun,

       July,Aug,Sep,Oct,Nov,Dec);

     Year: 1900..1999;

    end;

  Person = record

     ID: Name;

     Time: Date;

    end;

  Wages = record

     Individual: Person;

     Cost: Rate;

    end;

 

 var

  Salary, Fee: Wages;

              После этих определений возможны следующие операторы присваивания:

 Salary:=Fee;

 Salary.Cost.OverTime:=950;

 Salary.Individual.Time:=Fee.Individual.Time;

 Salary.Individual.ID.FamilyName:='Smith';

 

Оператор WITH

              Использование записей в том виде, как это показано выше, иногда приводит к необходимости очень длинных операторов, и в этом смысле было бы удобнее обращаться к отдельным полям записи как к простым переменным. Именно для этого и предназначен оператор WITH: он "раскрывает" запись так, что идентификаторы полей могут использоваться как идентификаторы переменных.

              Оператор WITH состоит из зарезервированного слова WITH, за которым следуют: список переменных типа RECORD, разделенных запятыми, зарезервированное слово DO и, наконец, оператор.

              Внутри оператора WITH поле обозначается только своим идентификатором, т.е. без идентификатора переменной-записи:

 with Salary do

  begin

  Individual:=NewEmployee;

  Cost:=StandardRates;

  end;

              Допускается вложенность операторов WITH, т.е. "раскрытие" записей внутри других записей. Например, конструкция:

 with Salary,Individual,ID do

  begin

  FamilyName:='Smith';

  ChristianNames [1]:='James';

  end;

 эквивалентна следующей:

 with Salary do

  with Individual do

  with ID do

   . . .

              Максимальная глубина вложения операторов WITH, подразумеваемая по умолчанию, равна 2, однако с помощью директивы W компилятора это значение может быть установлено равным от 0 до 9. Для каждого блока оператор WITH требует двух байтов памяти на каждый разрешенный уровень вложенности. Поэтому, для экономии памяти вложенность операторов WITH необходимо поддерживать на возможно более низком уровне.

 

Записи с вариантами

              Синтаксис типа RECORD предусматривает также наличие вариантной части, что позволяет организовывать альтернативные структуры записей так, чтобы конкретные экземпляры записей могли содержать различное число компонент различных типов, обычно в зависимости от некоторого ПОЛЯ ПРИЗНАКА.

              Вариантная часть состоит из поля признака ранее определенного типа, за которым следуют метки, соответствующие каждому возможному значению поля признака. Различные значения поля признака определяют разные варианты записи, а каждая метка возглавляет СПИСОК ПОЛЕЙ, который определяет тип варианта, соответствующего данной метке.

 Предположим существование типа:

 Origin = (Citizen,Alien);

 и типов Name и Date, определенных в в предыдущем примере.

              Следующая запись может иметь различную структуру в зависимости от значения поля признака CitizenShip: Citizen или Alien.

 type

  Person = record

     PersonName: Name;

     BirthDate: Date;

     case CitizenShip: Origin of

      Citizen: (BirthPlace: Name);

      Alien: (CountryOfOrigin: Name;

        DateOfEntry : Date;

        PermittedUntil : Date;

        PortOfEntry : Name);

    end;

              В этом определении записи с вариантами поле признака представляет собой явно описанное поле, которое можно извлекать и обновлять, как и всякое другое поле. Следовательно, если переменная Passenger имеет тип Person, то показанные ниже операторы являются допустимыми:

 Passenger.CitizenShip:=Citizen;

 With Passenger,PersonName do

  if CitizenShip=Alien then

   Writeln (FamilyName);

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

              Турбо-Паскаль не отвечает за установку соответствующих значений в поля признака: ответственность за это возлагается на программиста. Следовательно, в показанном выше типе Person доступ к полю DateOfEntry можно получить даже тогда, когда значение поля признака CitizenShip не равно Alien. В действительности идентификатор поля признака может быть вообще опущен, за исключением идентификатора типа. Такие записи с вариантами называются СВОБОДНЫМИ ОБЪЕДИНЕНИЯМИ, в противоположность вариантам записей с полем признака, которые называются СВЯЗАННЫМИ ОБЪЕДИНЕНИЯМИ. Свободные объединения применяются редко и должны использоваться только опытными программистами.

 

 

ГЛАВА 12.

МНОЖЕСТВА

              Множество - это совокупность связанных объектов, которая может рассматриваться как единое целое. Каждый объект в таком множестве называется ЧЛЕНОМ или ЭЛЕМЕНТОМ множества. Примерами множеств могут служить:

 1) Все целый числа от 0 до 100;

 2) Буквы алфавита;

 3) Согласные буквы алфавита.

              Два множества равны тогда и только тогда, когда все их элементы совпадают. При этом порядок их несущественный. Так, множества [1,3,5], [5,3,1], [3,5,1] равны. Если члены одного множества являются также членами другого множества, первое множество называется включенным во второе. Так, в приведенных выше примерах множество 3) включено во множество 2).

              Существует три операции над множествами, аналогичных операциям сложения, умножения и вычитания целых чисел:

 1) ОБЪЕДИНЕНИЕ (или сумма) двух множеств A и B (записывается как A+B) - это множество, содержащее все члены множеств A и B. Например, объединение множеств [1,3,5,7] и [2,3,4] дает [1,2,3,4,5,7].

 2) ПЕРЕСЕЧЕНИЕ (или произведение) двух множеств A и B (записывается как A*B) - это множество тех элементов, которые входят и во множество A, и во множество B. Так, пересечение множеств [1,3,4,5,7] и [2,3,4] дает [3,4].

 3) ДОПОЛНЕНИЕ (или вычитание) множества B до множества A (записывается как A-B) - это множество тех элементов множества A, которые не являются элементами множества B.

  Так, [1,3,5,7]-[2,3,4] дает [1,5,7].

 

Определение типа множества

              Как и в математике, не существует ограничений на объекты, которые могут быть элементами множества. Паскаль допускает только ограниченную форму множеств. Все элементы множества должны быть одного типа, который называется БАЗОВЫМ ТИПОМ. Базовый тип должен быть простым типом, т.е. любым простым типом, за исключением REAL. Тип множества вводится зарезервированными словами SET OF, за которыми следует простой тип.

Примеры:

 type

  DayOfMonth = set of 0..31;

  WorkWeek = set of Mon..Fri;

  Letter = set of 'A'..'Z';

  AdditiveColors = set of (Red,Green,Blue);

  Characters = set of Char;

 

              В Турбо-Паскале максимальное число элементов множества равно 256, и порядковые значения базового типа должны быть в диапазоне от 0 до 255.

 

Выражения с множествами

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

 

Множественные конструкции

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

Примеры:

 ['T','U','R','B','O']

 [X,Y]

 [X..Y]

 [1..5]

 ['A'..'Z','a'..'z','0'..'9']

 [1,3..10,12]

 []

              Последний пример показывает ПУСТОЕ МНОЖЕСТВО, которое, поскольку не содержит выражений, указывающих базовый тип, совместимо с любым типом множества. Множество [1..5] эквивалентно множеству [1,2,3,4,5]. Если X > Y, то [X..Y] задает пустое множество.

 

Операции над множествами

              По приоритету операции над множествами разделяются на следующие три категории:

 1) * Пересечение множеств

 2) + Объединение множеств

  - Дополнение множеств

 3) = Проверка на равенство

  <> Проверка на неравенство

  >= Истина (TRUE), если второй операнд включен в первый

  <= Истина (TRUE), если первый операнд включен во второй

  IN Проверка принадлежности множеству. Второй операнд должен быть типа множества, а первый операнд должен быть того же типа, что и базовый тип множества. Результатом операции будет TRUE, если первый операнд принадлежит второму операнду, и FALSE в противном   случае.

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

 A*B=[]

              Выражения с множествами часто полезны для записи сложных проверок. Например, проверка:

 if (Ch='T') or (Ch='U') or (Ch='R') or (Ch='B') or (Ch='O')

  then ...

 может быть записана более компактно как:

 if Ch in ['T','U','R','B','O'] then ...

 А проверку:

 if (Ch>='0') and (Ch<='9') then ...

 лучше записать как:

 if Ch in ['0'..'9'] then ...

 

Присваивание значений множествам

              Значения, являющиеся результатом выражений с множествами, могут быть присвоены переменным множественного типа с помощью оператора присваивания := .

Примеры:

 type

  ASCII = set of 0..127;

 var

  NoPrint,Print,AllChars: ASCII;

 begin

  AllChars:= [0..127];

  NoPrint := [0..31,127];

  Print := AllChars-NoPrint;

 end.

  

ГЛАВА 13.

 КОНСТАНТЫ С ЗАДАННЫМ ТИПОМ

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

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

              Константы с заданным типом определяются подобно константам без типа (см. подраздел "Раздел определений констант" в главе 5) за тем исключением, что указывается не только значение константы, но и ее тип. В определении таких констант записывается идентификатор, затем двоеточие, после него - идентификатор типа, знак равенства и значение константы.

 

Неструктурные константы с заданным типом

              Неструктурная константа с заданным типом - это константа, принадлежащая одному из простых типов.

Примеры:

 const

  NumberOfCards: Integer = 1267;

  Interest: Real = 12.67;

  Heading: string[7] = 'SECTION';

  Xon: Char = ^Q;

              В противоположность константам без типа константы с заданным типом можно использовать в качестве фактического параметра-переменной при вызове процедуры или функции. Поскольку константа с заданным типом по сути является переменной с постоянным значением, она не может быть использована в определении других констант или типов. Так, поскольку Min и Max – константы с заданным типом, следующая конструкция НЕДОПУСТИМА:

 const

  Min: Integer = 0;

  Max: Integer = 50;

 type

  Range: array [Min..Max] of Integer;

 

 

Структурные константы с заданным типом

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

 

Константы-массивы

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

Примеры:

 type

  Status = (Active,Passive,Waiting);

  StringRep = array [Status] of string[7];

 const

  Stat: StringRep = ('active','passive','waiting');

 

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

 Stat [Active] = 'active'

 Stat [Passive]= 'passive'

 Stat [Waiting]= 'waiting'

 

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

 const

  Digits: array [0..9] of Char =

    ('0','1','2','3','4','5','6','7','8','9');

 

 может быть записано более удобно как:

 const

  Digits: array [0..9] of Char = '0123456789';

 

 

Многомерные константы-массивы

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

Пример:

 type

  Cube = array [0..1,0..1,0..1] of Integer;

 const

  Maze: Cube = (((0,1),(2,3)),((4,5),(6,7)));

 begin

  Writeln (Maze[0,0,0],' = 0');

  Writeln (Maze[0,0,1],' = 1');

  Writeln (Maze[0,1,0],' = 2');

  Writeln (Maze[0,1,1],' = 3');

  Writeln (Maze[1,0,0],' = 4');

  Writeln (Maze[1,0,1],' = 5');

  Writeln (Maze[1,1,0],' = 6');

  Writeln (Maze[1,1,1],' = 7');

 end.

 

Константы-записи

              Определение константы-записи состоит из идентификатора константы, за которым следует двоеточие и идентификатор предварительно определенного типа записи, за ним следует знак равенства и значение константы, записанное как список констант-полей, разделенных символом ";" и заключенных в круглые скобки.

Примеры:

 type

  Point  = record

      X,Y,Z: Integer;

     end;

  OS   = (CPM80,CPM86,MSDOS,UNIX);

  UI   = (CCP,SomethingElse,MenuMaster);

  Computer = record

      OperatingSystems: array [1..4] of OS;

      UserInterface: UI;

     end;

 const

  Origo: Point = (X:0; Y:0; Z:0);

  SuperComp: Computer =

     (OperatingSystems:(CPM80,CPM86,MSDOS,UNIX);

     UserInterface: MenuMaster);

  Planel: array [1..3] of Point =

     ((X: 1; Y: 4; Z: 5),

     (X: 10; Y:-78; Z:45),

     (X:100; Y: 10; Z:-7));

 

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

 

Константы-множества

              Константа-множество состоит из одной или более спецификаций элемента, разделенных запятыми и заключенных в квадратные скобки. Спецификация элемента - это константа или выражение, задающее отрезок, которое состоит из двух констант, разделенных точками ".." .

Пример:

 type

  Up = set of 'A'..'Z';

  Low = set of 'a'..'z';

 const

  UpperCase: Up = ['A'..'Z'];

  Vocals: Low = ['a','e','i','o','u','y'];

  Delimiter: set of Char =

     [' '..'/',':'..'?','{'..'~','['..'_'];

  

ГЛАВА 14.

ФАЙЛЫ

              ФАЙЛЫ обеспечивают программу каналами, через которые она может передавать данные. В качестве файла может выступать некоторый ДИСКОВЫЙ ФАЙЛ, когда операции чтения/записи данных осуществляются с каким-либо магнитным устройством, или ЛОГИЧЕСКОЕ УСТРОЙСТВО, такое как стандартные предопределенные файлы INPUT и OUTPUT, которые соответствуют стандартным каналам ввода/вывода компьютера - клавиатуре и экрану дисплея.

              Файл состоит из последовательности компонент одного и того же типа. Число этих компонент в файле (РАЗМЕР ФАЙЛА) не указывается в определении файла. Вместо этого Турбо-Паскаль следит за доступом к файлу с помощью так называемого УКАЗАТЕЛЯ ФАЙЛА, и каждый раз, когда над некоторой компонентой файла выполняется операция чтения или записи, указатель этого файла продвигается на следующую компоненту. Поскольку все компоненты файла имеют одинаковую длину, может быть вычислена позиция любой заданной компоненты. Таким образом, указатель файла может быть перемещен на любую компоненту файла, что обеспечивает произвольный доступ к ней.

 

Определение типа файла

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

Примеры:

  type

   ProductName = string[80];

   Product = file of record

             Name: ProductName;

             ItemNumber: Real;

             InStock: Real;

             MinStock: Real;

             Supplier: Integer;

            end;

  var

   ProductFile: Product;

   ProductNames: file of ProductName;

              Компоненты файла могут иметь любой тип, за исключением типа FILE (это означает, в частности, что в предыдущем примере определение "file of Product" является недопустимым).

 

 

Операции над файлами

              Ниже описываются процедуры, предназначенные для обработки файлов. Обозначению FilVar соответствует идентификатор переменной типа FILE, объявленной как описано ранее.

 

Процедура ASSIGN

Синтаксис: ASSIGN(FilVar,StrExp);

              StrExp - это строковое выражение, результатом которого является строка, представляющая любое допустимое имя файла. Это имя файла присваивается переменной FilVar, и все дальнейшие операции над FilVar будут на самом деле выполняться с дисковым файлом StrExp. Эта операция никогда не должна выполняться над файлом, который находится в работе.

 

Процедура REWRITE

Синтаксис: REWRITE(FilVar);

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

 

Процедура RESET

Синтаксис: RESET(FilVar);

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

 

Процедура READ

Синтаксис: READ(FilVar,VarList);

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

 

Процедура WRITE

Синтаксис: WRITE(FilVar,VarList);

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

 

 

Процедура SEEK

Синтаксис: SEEK(FilVar,N);

              Эта процедура перемещает указатель файла так, что он устанавливается на N-ю компоненту файла FilVar, N - целое выражение. Первой компоненте соответствует значение N=0. Заметим, что для расширения файла можно установить указатель на компоненту, непосредственно следующую за последней компонентой файла. Таким образом, оператор

  SEEK(FilVar,FileSize(FilVar));

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

 

Процедура FLUSH

Синтаксис: FLUSH(FilVar);

              Эта процедура "опорожняет" внутренний буфер (размером в один сектор диска) дискового файла, связанного с файловой переменной FilVar, и тем самым обеспечивает запись этого буфера на диск, если с момента последнего обновления диска имели место какие-либо операции ввода/вывода. Процедура FLUSH также обеспечивает то, что при последующей операции чтения будет в действительно выполнено физическое чтение из дискового файла. Нельзя применять эту процедуру к закрытому файлу. Процедура FLUSH неприменима к текстовым файлам.

 

Процедура CLOSE

Синтаксис: CLOSE(FilVar);

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

 

Процедура ERASE

Синтаксис: ERASE(FilVar);

              Дисковый файл, связанный с FilVar, стирается. Если файл открыт, т.е. были выполнены процедуры REWRITE или RESET, перед стиранием его лучше закрыть.

 

Процедура RENAME

Синтаксис: RENAME(FilVar,StrExp);

              Дисковый файл, связанный с FilVar, получает новое имя, являющееся результатом строкового выражения StrExp. Оглавление диска модифицируется, и последующие операции с FilVar будут выполняться над файлом с новым именем. Процедуру RENAME нельзя

применять к открытому файлу.

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

  type

   Name = string[14];

  . . .

  . . .

  function Exist (FileName: Name): boolean;

  var

   Fil: file;

  begin

   Assign (Fil,FileName);

   {$I-} Reset (Fil); {$I+}

   Exist:=(IOresult=0);

   {$I-} Close (Fil); {$I+}

   if (IOresult=0) then;

  end;

 

Файловые стандартные функции

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

 

Функция EOF

  Синтаксис: EOF(FilVar)

              Эта функция типа BOOLEAN возвращает TRUE, если указатель позиционируется за концом дискового файла, т.е. пос