- •1. Двоичная система счисления.
- •2. Восьмеричная система счисления.
- •3. Шестнадцатеричная система счисления.
- •4. Сложение и вычитание в 2, 8 и 16 c/c.
- •2. Вещественные числа (числа с плавающей запятой).
- •3. Логические данные.
- •2. Зарезервированные слова.
- •X a8 alpha Massiv z52d9 eps Res_52_a ___75
- •6. Метка.
- •2. Целые типы данных.
- •4. Вещественные типы.
- •1. Раздел описания меток.
- •2. Раздел описания констант.
- •3. Раздел описания типов.
- •4. Раздел описания переменных.
- •6. Раздел операторов.
- •7. Последовательность разделов.
- •1. Формульно-словесный способ.
- •2. Блок-схемный способ.
- •Ввод - вывод одномерного массива
- •2. Ввод массива из текстового файла.
- •3. Вывод одномерного массива на экран.
- •Примеры обработки одномерных массивов
- •1. Параметр цикла должен быть ординального типа.
- •2. Параметр должен быть описан в том же блоке, где находится сам оператор цикла.
- •5. В теле цикла параметр не должен изменяться.
- •6. Начальное и конечное значения параметра цикла вычисляются только один раз, до начала цикла.
- •7. При нормальном завершении цикла значение его параметра считается неопределенным.
- •Контроль ординальных переменных
- •Вставка элемента в упорядоченный массив
- •Удаление элементов из массива
- •«Школьный» алгоритм сортировки
- •Группировка массива методом прямой выборки
- •Группировка массива методом прямого обмена
- •Var c : array[1..10,1..15,1..8] of real.
- •1. Ввод элементов матрицы с клавиатуры.
- •2. Ввод матрицы из текстового файла.
- •3. Вывод матрицы на экран.
- •Тождественные и совместимые типы
- •Обработка в процедуре одномерных массивов с различными именами типов
- •Обработка в процедуре матриц с различными именами типов
- •Var s : string[V],
- •Процедуры и функции для обработки строк
- •Определение битовой структуры поля памяти
- •Процедуры и функции для файлов любого типа
- •Var p : pointer;
- •1. Формирование стека из текстового файла.
- •7. Определение значения и местоположения максимального элемента в стеке.
- •8. Удаление из стека максимального элемента.
- •9. Добавление элемента в упорядоченный стек.
- •2. Добавление нового элемента в очередь.
- •3. Удаление элемента из очереди.
- •6. Удаление произвольного элемента из очереди.
- •7. Добавление нового элемента в произвольное место очереди.
- •1. Формирование дека.
- •Var sin : integer;
- •Процедура заполнения FillChar
- •Процедура перемещения данных move
- •Управление экраном в текстовом режиме
- •Сохранение и восстановление экрана
- •Interface
- •Implementation
- •Процедуры управления текстовым режимом экрана
- •Intr(n:byte; Var Reg:Registers),
- •If KeyPressed then
- •Автоматическая оптимизация программ
- •1. Свертывание констант.
- •2. Слияние констант.
- •3. Вычисление по короткой схеме.
- •4. Удаление неиспользуемого кода.
- •If false then
- •5. Эффективная компоновка.
- •Оверлейная структура программы
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Использование сопроцессора
2. Целые типы данных.
Значениями переменных целого типа являются элементы ограниченного подмножества целых чисел.
В Турбо Паскале имеется пять целочисленных типов данных: shortint, byte, integer, word и longint.
Тип shortint (short intеger – короткое целое) обозначает целочисленную переменную длиной один байт со знаком. Биты однобайтного поля памяти нумеруются в последовательности 0, 1, 2, 3, 4, 5, 6, 7. Нулевой бит – это знак числа: 0 – «+», 1 – «-». Следовательно, значение числа определяется семью двоичными цифрами. Число типа shortint изменяется в пределах -128 .. 127 (минимальное значение 100000002 = -12810, см. раздел «Представление информации в ПЭВМ»).
Тип byte – это короткое целое длиной один байт без знака (все восемь бит - двоичные цифры), пределы изменения 0 .. 255.
Тип integer определяет целое число длиной два байта со знаком. Пределы изменения –от –32768 до 32767. Этому типу соответствует предописанная константа MaxInt, равная максимальному значению числа: MaxInt = - 1 = 32767 .
Тип word – это целое длиной два байта без знака, пределы изменения 0 .. 65535.
Тип longint - длинное целое размером 4 байта со знаком, пределы изменения
- 2 147 483 648 .. 2 147 483 647.
Для типа longint предопределена константа MaxLongint, равная - 1 = 2147483647.
Для целых значений допустимы следующие арифметические операции:
+ сложение;
- вычитание;
* умножение;
div деление нацело (целая часть от деления);
mod остаток от деления.
Пример 2.
19 div 5 = 3; 19 mod 5 = 4
Очевидно, что a mod b = a - (a div b) b
В арифметическом выражении не могут стоять рядом два знака операции. Например, нельзя писать a * -b. Здесь должно быть a * (-b).
Старшинство операций:
1) выражения в скобках;
2) *, div, mod (операции типа умножения);
3) +, - (операции типа сложения).
Операции одинакового старшинства выполняются слева направо.
Пример 3.
5 + 3 * 7 div 4 - 17 mod 3 = 5 + 5 - 2 = 8
Примечание. На машинном уровне для целочисленных переменных может быть использована лишь одна операция деления, но ее результат записывается в два различных регистра (регистр – это быстродействующая ячейка памяти): в один регистр – частное, во второй – остаток от деления. Тогда в Паскаль-программе содержимое первого регистра воспринимается как результат операции div , а второго – как результат операции mod.
Операции возведения в степень в Паскале нет. Для целых показателей степени эта операция может быть заменена многократным умножением. Более эффективный способ программной реализации операции возведения в степень рассмотрен в разделе «Вычисление степенной функции».
Целый результат дают следующие предописанные функции:
1) abs(i) - абсолютное значение целого аргумента i;
2) sqr(i) - квадрат значения целого аргумента i;
3) trunc(R) - целая часть вещественного значения R;
4) round(R) - целое значение, ближайшее к вещественному значению R.
Пример 4.
trunc(3.3) = 3; round(3.3) = 3;
trunc(3.5) = 3; round(3.5) = 4;
trunc(3.8) = 3; round(3.8) = 4;
trunc(-3.3) = -3; round(-3.3) = -3;
trunc(-3.8) = -3; round(-3.8) = -4.
Следовательно,
trunc(x) = sign(x) trunc(abs(x)); round(x) = sign(x) round(abs(x)),
где sign(x) = 1 при x > 0, sign(x) = 0 при x = 0 и sign(x) = -1 при x < 0.
Если i - целое, то succ(i) = i + 1; pred(i) = i - 1; ord(i) = i .
Целочисленным переменным можно присваивать значения не только десятичных, но и шестнадцатеричных констант. Отрицательные значения можно задавать, используя знак "-" или дополнительный код числа. В этом смысле приведенные ниже операторы для переменных i, k и l эквивалентны.
i:=-$5D; i:=$A3;
k:=-$7C0F; k:=$83F1;
l:=-$2BF01400; l:=$C40FEC00 .
Целочисленные переменные могут рассматриваться как битовые последовательности. В связи с этим к ним применимы следующие операции:
Shl k (Shift Left) – сдвиг влево на k разрядов;
Shr k (Shift Right) – сдвиг вправо на k разрядов;
Not – отрицание;
And – логическое умножение;
Or – логическое сложение;
Xor – исключающее ИЛИ.
При сдвиге влево разряды, выходящие за пределы разрядной сетки, теряются, а справа в число добавляется k нулевых бит. Аналогичная работа выполняется при сдвиге вправо.
Для положительных чисел операции «shl k» и «shr k» эквивалентны соответственно умножению и делению на .
Пример 5
Var m,n,p : integer;
................
p:=100; m:=p shl 2; n:=p shr 2;
Получим: m = 400; n = 25.
В двоичном представлении:
p = 0000 0000 0110 0100;
m = 0000 0001 1001 0000; n = 0000 0000 0001 1001.
При компиляции программы выражения типа р* и р div автоматически заменяются операциями сдвига.
Логические операции not, and, or, xor выполняются поразрядно (см. пример 5 в разделе «Представление информации в ПЭВМ»).
Рассмотрим теперь возможные способы определенич четности целочисленных переменных.
Вполне очевидно что целочисленная переменная k четная, если
k mod 2 = 0,
и нечетная, если
k mod 2 = 1.
В то же время несколько выше было указано, что для определения четности может быть использована логическая функция odd(k).
Запишем последовательно в двоичном представлении числа 5, 6, 7, 8, 9:
0101
0110
0111
1000
1001
Из этой записи видно, что четность двоичного числа определяется значением последнего разряда (0 – четное, 1 – нечетное число). Следовательно, функция odd(k) анализирует лишь последний разряд числа. Это эквивалентно вычислению следующего выражения:
odd(k) k and 1 k and 00000001
Операция and – это логическая операция, mod – арифметическая, которая выполняется на порядок дольше по сравнению с логической операцией. Следовательно, использование функции odd(k) при определении четности повышает быстродействие программы (микрооптимизация программы).
3. Символьный тип данных (тип char). Обозначение char - это сокращение слова character (символ, 'kæriktə).
Значениями переменных символьного типа являются элементы конечного и упорядоченного множества символов. Это значение обозначается одним символом, заключенным в апострофы.
Пример 6. 'A', 'a', '8', '''' (апостроф как символ пишется дважды).
Вне зависимости от реализации, т.е. от конструкции конкретного транслятора, для символьного типа справедливы следующие допущения.
1) Десятичные цифры от '0' до '9' упорядочены в соответствии с их значениями и записаны одна за другой. Следовательно,
succ('5') = '6'; pred('5') = '4' .
2) Имеются все прописные буквы латинского алфавита от 'A' до 'Z'. Это множество упорядочено по алфавиту, но не обязательно связно. Следовательно, в любой реализации должно выполняться 'I' < 'J', но может не выполняться succ('I') = 'J'.
3) Могут быть строчные буквы латинского алфавита от 'a' до 'z'. Если это так, то это множество букв упорядочено по алфавиту, но не обязательно связно.
В таблице ASCII заданы как большие, так и малые латинские буквы, причем их последовательность непрерывная.
Для символьного типа определены две взаимно обратные функции преобразования ord и chr:
k = ord(ch) - порядковый номер символа ch;
ch = chr(k) - символ с порядковым номером k.
Очевидно, что
chr ( ord ( ch ) ) = ch ; ord ( chr ( k ) ) = k .
В последнем случае должно быть k = 0 .. 255 .
Рассмотрим содержательный смысл функций ord и chr на машинном уровне. Как уже отмечалось, внутреннее представление символа в байте памяти - это его порядковый номер по таблице ASCII. Например, для буквы "Ю" имеем #158, тогда содержимое байта равно 9E16 = 100111102 .
Примечание. «#» - это порядковый номер символа в таблице ASCII.
Если байт, содержащий значение 10011110, используется в программе при выводе результатов как символ, то печатается буква "Ю"; если этот байт используется как число, то печатается значение 158. Следовательно, функции ord и chr никакого преобразования содержимого байта не производят; они лишь разрешают программе по-разному трактовать это содержимое (как символ или как число).
Для символьного типа определены все операции отношения.
Считается, что ch1 < ch2, если ord(ch1) < ord(ch2), где ch1, ch2 - переменные символьного типа.