
- •Любой алгоритм, какой бы он сложный не был, содержит лишь три основных, или, иначе говоря, базовых структуры. Этими базовыми структурами являютия:
- •Любой алгоритм, какой бы он сложный не был, содержит лишь три основных, или, иначе говоря, базовых структуры. Этими базовыми структурами являютия:
- •Клавиши перемещения курсора:
- •Работа с блоками текста
- •Основные клавиши работы с Турбо-Паскалем:
- •Клавиши перемещения курсора:
- •Работа с блоками текста
- •Основные клавиши работы с Турбо-Паскалем:
- •Клавиши перемещения курсора:
- •Работа с блоками текста
- •Основные клавиши работы с Турбо-Паскалем:
- •Строковый тип данных
- •Описание констант
- •Операция присваивания
- •Приоритет операций
- •Оператор присваивания
- •Совместимость и преобразование типов
- •Элементарный ввод-вывод
- •Лекция 5 Выражения
- •Математические операции
- •Логические операции
- •Операции отношения
- •Приоритет операций
- •Основные математические функции
- •Уменьшает значение числа X на y. Если число y не указано, то уменьшение происходит на 1. Циклы
- •Арифметические циклы
- •Итерационные циклы с предусловием
- •Итерационные циклы с постусловием
- •Операторы завершения цикла
- •Операторы ветвления и цикла Условный оператор if
- •Оператор множественного выбора Case
- •Операторы цикла
- •Операторы ветвления и цикла
- •Условный оператор if
- •Оператор множественного выбора Case
- •Операторы цикла
- •Лекция 7. Подпрограммы: процедуры и функции
- •Пример 27
- •Обмен данными
- •4.2. Множества
- •4.2.1. Объявление типа множества
- •4.2.2. Операции над множествами
- •4.2.3. Пример использования множества
- •Пример 33
- •4.3. Строки
- •4.3.1. Объявление типа String
- •4.3.2. Операции над строковыми переменными
- •4.3.3. Встроенные процедуры и функции обработки строк
- •Пример 34
- •4.1. Матрица
- •4.1.1. Ввод-вывод элементов матрицы
- •4.1.2. Определение индексов элементов матрицы
- •Записи Объявление типа записи
- •Вложенные записи
- •Массивы записей
- •Пример обработки массива записей
- •Определение и особенности файлов
- •Доступ к компонентам файла
- •Текстовый файл
- •Чтение из текстового файла
- •Запись в текстовый файл
- •Файлы в Тубо Паскаль
- •Файловые процедуры и функции
- •Текстовые файлы
- •Типизированные файлы
- •Нетипизированные файлы
- •Графика Турбо Паскаля
- •Записи Объявление типа записи
- •Вложенные записи
- •Массивы записей
- •Пример обработки массива записей
- •Статические и динамические памяти переменные
- •Объявление указателей
- •Выделение и освобождение динамической памяти
- •Операции с указателем
- •Пример 41
- •Связанные списки
- •Понятие бинарные деревья. Операции над бинарными деревьями
- •Применение бинарных деревьев
- •Сравнение рекурсии и итерации
- •Пример 51
- •Реализация объектно-ориентированного подхода в турбо-паскале
- •Алгоритмическая и объектная декомпозиция
- •Объектный тип в Турбо-Паскале
- •Способы наследования и переопределения
- •Виртуальные методы
- •Модуль c r t
- •Модуль g r a p h
Совместимость и преобразование типов
Язык Турбо-Паскаль поддерживает принцип строгой типизации, в соответствии с которым все операции определены для операндов совместимых типов. В языке введено понятие эквивалентности типов.
Два типа Type1 и Type2 являются эквивалентными, если выполняется одно из двух условий:
1. Type1 и Type2 описаны одним и тем же идентификатором типа:
type Type1 = integer; Type2 = integer; |
2. Type2 описан с использование Type1 через непосредственное равенство вида:
type Type2 = Type1; |
или цепочку таких равенств.
Для следующего описания:
type T1 = array [1..50] of real; T2 = array [1..50] of real; |
типы T1 и T2 не являются эквивалентными, т.к. один тип не описан через другой. Однако переменные, указанные в одном и том же описании, имеют эквивалентные типы, например:
var X, Y: array[1..50] of integer; |
Сформулируем наиболее употребимые правила совместимости типов. Полный перечень этих правил можно найти в любой справочной литературе([5], [8], [9]). Два типа являются совместимыми, если:
- они эквивалентны; - оба они являются целыми; - оба они являются вещественными; - один тип является подинтервалом другого; - оба они являются подинтервалами одного и того же базового типа. Особенно жесткие ограничения накладываются на правила совместимости типов переменной и выражения в операторах присваивания. Пусть TypeV - тип переменной, а TypeE - тип выражения.
Присваивание TypeV := TypeE; возможно, если выполняется одно из условий:
- оба типа эквивалентны и ни один из них не является файловым типом или структурным типом, содержащим компонент с файловым типом; - оба типа являются совместимыми порядковыми типами и значения типа TypeE попадают в диапазон возможных значений TypeV; - оба типа являются вещественными типами, и значения типа TypeE попадают в диапазон возможных значений TypeV; - TypeV - вещественный тип и TypeE - целый тип; - TypeV - строка и TypeE - символ.
Здесь не приводятся условия совместимости для упакованных строк, множеств, указателей, процедурных и объектных типов. В Турбо-Паскале существуют средства обхода ограничений на совместимость типов - данные одного типа можно преобразовать в данные другого типа. Такие преобразования могут быть явными или неявными. Для явного преобразования типа можно использовать специальные стандартные функции, у которых аргумент принадлежит одному типу, а значение - другому, например:
Trunc(5.6) дает 5
Round(10.9) дает 11
Элементарный ввод-вывод
Для ввода и вывода значений используются специальные операторы Read (список ввода), Readln (список ввода) и Write (список вывода), Writeln (список вывода), которые по существу являются процедурами. С их помощью кодируют базовую операцию ввод/вывод. Процедура Read осуществляет ввод числовых и символьных значений с клавиатуры. Числовые значения при вводе разделяются пробелами или вводятся с новой строки. Значения, набираемые в одной строке экрана, вначале заносятся в буфер и только после нажатия на клавишу <ENTER> вводятся в компьютер, до этого их можно корректировать в строке ввода. Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Ввод с клавиатуры процедурой Read сопровождается эхо-печатью вводимых символов на экране персонального компьютера, например,
var R: real; I: integer; . . . read(R, I); |
33.13 19<ENTER>
В результате R примет значение 33.13, а I - 19. Следует соблюдать соответствие типов вводимых констант и переменных из списка ввода. При вводе значений типа Char кавычки не нужны, любой символ будет считан так, как он набран на клавиатуре. Процедура Readln идентична процедуре Read за исключением того, что она после ввода последней переменной из списка ввода осуществляет автоматический переход к первому символу новой строки, даже если в текущей строке ввода еще остались значения. Кроме того, процедуру Readln можно вызывать без списка ввода. В этом случае пропускаются все символы текущей строки и последующий ввод начнется с новой строки. Сравним действие процедур Read и Readln на примере:
var I, J, K, L: integer; . . . read(I, J); read(K, L); |
Для переменных I, J, K, L результат ввода будет одним и тем же, если значения будут набраны в одной строке или в разных:
1 13 7 8<ENTER> -> (I = 1, J = 13, K = 7, L = 8) 1 13<ENTER> 7 8<ENTER> -> (I = 1, J = 13, K = 7, L = 8) |
Если в программе использована процедура Readln(I, J) для входных данных:
10 20<ENTER> 40<ENTER> |
то I = 10, J = 20. В результате выполнения двух процедур Readln(I); Readln(J) для тех же входных данных: I = 10, J = 40. Процедура Write обеспечивает вывод информации на экран персонального компьютера. В отличие от Read в списке вывода указываются выражения. Выполнение процедуры Write заключается в вычислении значений всех выражений списка и выводе этих значений, например:
var I, J: integer; A: real; . . . I := 10; J := 20; write(I, J); |
На экране появится строка:
Догадаться, что речь идет о двух значениях 10 и 20 довольно, сложно. Вывод по формату облегчает интерпретацию результатов. Для любого параметра из списка вывода можно задать формат: [: Целое1 [: Целое2]], где Целое1, Целое2 - выражения. Квадратные скобки означают, что заключенные в них параметры могут отсутствовать. Целое1 - параметр, который указывает минимальную ширину поля, куда будет записываться выводимое значение. Если выводимое значение имеет большую длину, то этот параметр игнорируется и выделяется необходимое количество позиций. Целое2 - параметр, задающий количество десятичных знаков в дробной части вещественного числа. Этот параметр может использоваться только совместно с первым параметром и только для выражений вещественного типа, например:
. . . A := 12.34; write(A:12:4); write(A:12:5); |
На экране в одной строке будет выведено два числа:
12.3400 12.34000
Первое число вводится с отступом в 5 позиций, т.к. выделено 12 позиций под число. Между числами располагается 4 пробела. Для большей наглядности рекомендуется в операторах вывода использовать поясняющие надписи, например:
. . . I := 10; J := 20; write('Вывод:I=', I:3, ';J=', J:3); |
На экране получим:
Вывод: I = 10; J = 20
Символы выводятся без изменений. Значения логического выражения представляются строкой TRUE или FALSE. Вещественные числа имеют форму с экспонентой, если не указаны оба формата, т.е. Целое1 и Целое2. Мантисса числа выводится в нормализованном виде, для Турбо-Паскаля - это одна десятичная цифра до десятичной точки и 14 десятичных цифр в дробной части, например:
A := 12.34; write(A); |
На экране получим:
1.23400000000000Е+0001
Процедура Writeln осуществляет вывод значений списка и переход к следующей строке. Writeln без списка переведет курсор в начало следующей строки экрана. Приведем пример, иллюстрирующий особенности выполнения процедур вывода:
var N: integer; X: real; . . . X := 1.278473; N := 11; writeln(N, '-число итераций '); writeln; writeln(' полученное значение : X = ',X); |
На экране получим следующие три строки:
11-число итераций полученное значение : X = 1.27847300000000Е+0000 |