- •1. Структура (состав) языка
- •2. Алфавит
- •3. Лексическая структура языка
- •4. Структура программной единицы
- •5. Стиль записи программ на языке Паскаль
- •6. Типы данных в Паскале
- •6.3 Классификация типов данных в Турбо Паскале
- •6.4 Порядковые типы
- •6.4.2 Булевский (логический) тип
- •Repeat тело_цикла until (логическое_выражение);
- •6.4.3 Целые типы Выделяют целые типы ------------- со знаком – shortint, integer, longint)
- •1 Группа функций:
- •2 Группа функций:
- •3 Группа функций:
- •6.4.4 Перечисляемый тип.
- •6.4.6 Символьный тип
- •6.5 Вещественные типы.
- •7. Выражения в языке Паскаль.
- •10. Вычисление по формулам.
- •10.1 Оператор присваивания .
- •10.2 Характер использования переменных в математике и в программах.
- •10.3 Бесконечности
- •10.4 Нестандартные операции
- •6.6 Строки
- •1) Операции присваивания и сравнения.
- •3) Заполнение строки одним символом
- •4) Стандартные функции и процедуры для работы со строками:
- •5) Подпрограммы преобразования из строкового представления в числовое и наоборот:
- •8. Совместимость и преобразование типов.
- •Совместимость типов
- •8.2 Тип результата арифметических выражений.
- •8.3 Преобразование (приведение) типов и значений.
- •8.3.1 Явное преобразование (приведение) типов.
- •8.3.2 Неявное преобразование или приведение типов.
- •9. Простейший ввод-вывод на Паскале
- •Стандартные файлы Input и Output
- •9.2 Процедуры ввода информации (с клавиатуры.
- •9.3 Процедуры вывода в тр.
- •10. Вычисление по формулам (продолжение)
- •10.6. Уточнение многоместных (n - арных) операций
- •11. Средства языка Паскаль для циклов с известным числом повторений.
- •12. Табулирование функций
- •13. Разветвляющиеся алгоритмы
- •13.1 Таблица ситуаций и команда выбора.
- •13.2 Средства языка Паскаль для программирования разветствляющихся алгоритмов
- •13.4 Описание ситуаций
- •13.5 Запись команды выбора (case) (уточнение таблицы ситуаций) с помощью набора команд ветвления
- •13.6 Запись последовательных команд ветвления в случае, когда соседние зависимые ситуации имеют общие признаки.
- •13.6.1 Восходящий подход
- •13.6.2 Нисходящий подход
- •14. Циклы с неизвестным числом повторений
- •15. Структурированные типы данных. Массивы
- •15.1 Классификация (особенности) структурированных типов данных
- •15. 2. Определение массива
- •15.3 Объявление массива на Турбо Паскале
- •15.4 Хранение элементов массива. Доступ к элементам и частям массива
- •15.5 Уточнение команд обработки массива
- •16. Правила разработки цикла
- •15. 6 Действия над массивами
- •17. Множества.
- •17.1 Множества в Паскале и в математике. Сходства и различия между ними.
- •17.2 Объявление множества на Паскале
- •17.3 Присваивание значений множествам. Конструктор множества
- •17.4 Операции над множествами.
- •17.5 Сравнение множеств.
- •17.6 Применение множеств.
- •18. Вспомогательные алгоритмы (подпрограммы).
- •18.1 Три способа записи повторяющихся команд
- •18.2 Понятие блока
- •18.3 Объекты подпрограммы (то, над чем выполняются действия).
- •18.4 Свойства локальных и глобальных объектов
- •Свойства глобальных объектов:
- •18.5 Выделение памяти под локальные и глобальные переменные
- •18.6 Передача параметров в подпрограммы.
- •Фактические параметры
- •18.7 Подпрограммы, возвращающие значение (функции)
- •18.8 Особенности использования процедур и функций в Турбо Паскале
- •18.9. Побочный эффект (side effect)
- •18.10 Опережающее определение процедур и функций.
- •18.11 Рекурсия и итерация.
- •18.12 Процедуры и функции как параметры.
- •18.13 Директивы подпрограмм
- •Директива forward
- •Директивы far и near
- •Директива external
- •Директива assembler
- •Директива inline
- •Директива interrupt
- •Отладка и тестирование программ, содержащих подпрограммы
- •18.14.1 Нисходящее тестирование и подпрограммы-заглушки
- •18.14.2 Восходящее тестирование и программы-тестеры
- •18.14.3 Рекомендации по отладке программ, содержащих подпрограммы
- •18.14.4 Использование отладчика для трассировки процедур
- •18.14.5 Область действия идентификаторов и переменные в окне Watch
- •18.15. Получение доступа а параметрам командной строки, запуск внешних программ.
- •19. Записи.
- •19.1 Понятие записи. Объявление записи в программе.
- •19.2 Доступ к полям записи.
- •19.3 Оператор with
- •19.4 Действия над записями
- •19.5 Записи с вариантами
- •Замечание1:Порядок частей – именно такой, как показано: фиксированная часть всегда первая (или единственная)
- •19.6 Типизированные константы - записи
- •20. Модули (Unit)
- •20.1 Что такое модуль?
- •20.2 Зачем нужны модули и какие есть средства, аналогтчные (в какой-то мере) модулям
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Подключение других модулей к данному (модулю)
- •20.4 Ссылки на описания модуля
- •Пример создания модуля
- •Использование модулей. Режимы Compile, Build и Make при компиляции модулей
- •Косвенные и перекрестные ссылки на модули
- •Пример модуля (стек)
- •Модули и большие программы
8.2 Тип результата арифметических выражений.
С вопросом совместимости типов непосредственно связан вопрос о типе результата арифметического выражения, если в этом выражении смешаны разные целые типы. Например, при данных объявлениях.
Пусть надо выполнить:
Var
R: real;
B: byte;
I: integer;
W: word;
Begin
………….
R := B * I + W;
................
В данном случае, не зная определенных правил, трудно предсказать тип результата (что будет присвоено R).
На этот случай существуют правила внутреннего преобразования результата арифметического выражения:
в случае бинарной (двухмерной) операции над целыми операндами оба операнда преобразуются к так называемому общему типу.
действия (для целых операндов) выполняются над данными общего типа, и результат получается общего типа.
Общим типом для двух разных целых чисел является целый тип с наименьшим диапазоном, охватывающим диапазон возможных значений обоих операндов.
При этом:
Для Integer и Byte общим типом будет Integer.
Для Integer и Shortint будет Integer.
Для Integer и Word общим типом будет тип, который охватывает диапазон их значений (в отрицательной области Integer не охватывает Word, в положительной Word не охватывает Integer). Для них общим типом будет Longint.
Если в бинарной операции смешиваются целые и вещественные типы, то целый операнд автоматически преобразуется в операнд вещественного типа и результат также получается вещественного типа. Вычисления производятся над операндами типа extended, а результат округляется до нужной ширины вещественного типа.
Тип результата выражения в правой части оператора присваивания формируется независимо от типа той переменной, которая находится в левой части оператора присваивания.
R := B * I + W;
- - общий тип для выражения справа - Longint
При выполнении присваивания значения выражения типа Longint переменной другого целого типа возможно две ситуации:
1). Когда тип выражения справа от знака присваивания "вписывается" в тип переменной, которая слева (от знака присваивания)
2). Когда тип выражения справа (от знака присваивания) не вписывается в тип переменной, которая слева от знака присваивания.
Для присваивания B := A; слова тип переменной А "вписывается" в тип переменной В означает, что диапазон возможных значений типа переменной А меньше или равен диапазону возможных значений типа переменной В. Если выражение справа от знака присваивания имеет тип результата, который не вписывается в тип переменной, которая слева от знака присваивания, то преобразование (значения выражения справа к типу переменной слева) происходит с потерей информации (если присваивается один целый тип другому целому типу, то теряются старшие байты).
8.3 Преобразование (приведение) типов и значений.
8.3.1 Явное преобразование (приведение) типов.
Паскаль является строго типизированным языком, но в нем имеется много средств, которые позволяют обойти все запреты, связанные с несовместимостью типов.
То, что приводится
тип (переменная)
ПРИМЕР: l
= $33 32 31 03
длина
строки
Type
ts = String[3];
область памяти для переменной L
рассматривается как строка из 3 символов
Var #3
‘1’ ’2’ ‘3’
l : Longint
;
vs : ts; l = $33 32 31 03
Begin при
l := '123'; была бы
ошибка несовместимости типа
ts(l) := '123';
l := $34 33 32 02;
vs := ts(l); ------> vs = '23'
End. внутреннее представление переменной L рассматривается как строка
Из примера видно, что преобразование типа выполняется как слева от знака присваивания, так и справа. В первой строке преобразование типа выполняется слева от значка присваивания. При этом область памяти, отведенная под переменную l, трактуется как строка длиной 3. Известно, что эта строка занимает 4 байта. После такого присваивания переменная l получит значение l =$33323103. В этом значении 03 - текущая длина строки (младший байт). После выполнения третьей строчки программы: vs = '23'. (31 – код символа ‘1’, 32 - код символа '2’, 33 – код символа '3’, 34 – код символа '4’)
Рассмотренные преобразования типов называются преобразованием типа переменных. Преобразование типа переменной, как видно из рассмотренного примера, может находиться и в левой, и в правой части оператора присваивания. При этом тип переменной в скобках и тип, к которому выполняется приведение, должны быть совместимы в машинном представлении, т.е. занимать в памяти одно и тоже количество байт.
Имеется другой тип преобразования – преобразование типа значения. Отличие от преобразования типа переменной:
- преобразование типа значения может находиться лишь в правой части оператора присваивания;
- мы меняем не точку зрения на хранимой в памяти значение, а само внутреннее представление значения в памяти.
Форма записи преобразования типа значения такая же, как у преобразования типа переменной (аналогично вызову функции).
ПРИМЕРЫ.
Integer('r'); - символьное значение (занимает 1 байт) преобразовывается к целому типу (занимает 2 байта).
char(25)
Возможно две ситуации при таком преобразовании:
При приведении значения к более широкому типу значение записывается в младшие байты области памяти новой формы представления.
При приведении к более узкому типу преобразования переходят с потерей значения: копируются только младшие байты, а старшие байты теряются.
Есть ограничение, которое накладывается на преобразование типа значения: и приводимый тип и тип, к которому приводят, должны быть порядковыми или ссылочными(оба).
Var
s: Shortint;
Begin значение
не порядкового типа, поэтому такая
запись неправильна
s := Shortint(
1.28 );
End;
Данный пример является грубой семантической ошибкой. (синтаксической ошибки нет). При этом компилятором будет выдано сообщение о неправильном приведении типа: «Type cast error»
