
- •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
- •Использование сопроцессора
Var s : string[V],
где v - атрибут длины, представляющий собой целочисленное выражение.
Каждый символ строки занимает один байт.
Атрибут длины может принимать значение от 0 до 255. При v = 0 имеем строку нулевой длины, т.е. пустую строку. Если атрибут длины не указан в объявлении строки, то по умолчанию он принимается равным 255.
Если строка объявлена в виде string[n], то в памяти для нее выделяется n+1 байт, которые имеют номера 0, 1, ... , n. В нулевом байте хранится текущая длина строки.
Память строке, как и другим переменным, выделяется в соответствии с описанием ее типа. Однако, как и в массиве, эта память может использоваться не полностью. При объявлении string[Nmax] текущее количество символов строки, обрабатываемое в программе, может принимать значение 0 n Nmax. На это количество указывает содержимое нулевого байта строки. Поскольку численное значение байта изменяется в диапазоне 0 .. 255, то это и определяет минимальное и максимальное количество символов в строке.
Примечание. Хотя содержимое нулевого байта, определяющее текущую длину строки, по физическому смыслу – число, но этот байт, как и остальные байты строки, считается в программе символом. Поэтому более точно можно сказать, что текущая длина строки – это порядковый номер символа, записанного в нулевом байте.
Пример 1.
Var S1,S2 : string[20];
S3 : string;
Begin
S1:='abc'; S2:='';
Строкам S1 и S2 выделяется по 21 байту памяти, строке S3 - 256 байтов. Текущая длина строки S1 равна 3 символа, строки S2 - 0 символов (пустая строка); текущая длина строки S3 неопределенная, поскольку этой строке не присвоено никакого конкретного значения.
Пример 2.
Var S1 : string[10];
S2 : string[5];
S3 : string[20];
Begin
S1:='abcdefghijklmn';
S2:=S1; S3:=S1;
Как известно, при выполнении оператора присваивания вначале вычисляется значение выражения в его правой части, а затем полученное значение записывается в поле памяти, которое отведено для переменной в левой части. В первом операторе присваивания выражение в его правой части - это строка-константа 'abcdefghijklmn' длиной 14 символов. Так как эта длина превышает максимальную длину строки S1, то в S1 записываются лишь первые 10 символов, а остальные отбрасываются (они не поместятся в поле памяти, отведенное для строки S1).
Если строка в левой части оператора присваивания длиннее, чем значение строкового выражения, то ей устанавливается текущая длина, равная длине строки в правой части.
Содержимое строк в примере 2:
S1 : 'abcdefghij'; S2 : 'abcde'; S3 : 'abcdefghij';
Поскольку строка неявно представляет собою массив символов, то к отдельным символам строки можно обращаться по индексу.
Пример 3.
Var ch : char;
S : string;
Begin
S:='0123456789';
ch:=S[5]; S[7]:='z'; Writeln('ch=',ch,' S=',S);
S[0]:=chr(4); Writeln('ch=',ch,' S=',S);
Будет отпечатано:
ch=4 S=012345z789
ch=4 S=0123
Нулевой байт S[0], определяющий текущую длину строки, рассматривается в составе строки таким же образом, как и остальные байты, т.е. как символ. Поэтому оператор типа S[0]:=4 в данном случае недопустим, ибо он требует присвоить символу численное значение.
Для ввода-вывода строк используются те же процедуры, что и для ввода-вывода числовой информации.
Пример 4.
Var S : string[10];
Begin
S:='0123456789'; Writeln(' S=',S);
Writeln(' S=',S:15); Writeln(' S=',S:5);
Формат в процедуре печати определяет, сколько позиций на внешнем носителе (в данном случае на экране дисплея) должно быть выделено для размещения выводимого значения. Если формат превышает требуемое количество позиций, то "лишние" позиции слева заполняются пробелами (выводимая строка размещается в правой части поля). Если формат вывода меньше требуемого значения, то на внешнем носителе выделяется столько позиций, сколько содержится символов в выводимом значении.
В примере 4 будет отпечатано:
S=0123456789
S= 0123456789
S=0123456789
Пример 5. Ввод строковых переменных.
Будем рассматривать ввод из текстового файла F (частным случаем текстового файла является клавиатура ПЭВМ). Пусть в строках файла F, начиная с их первой позиции, записана следующая информация:
abcdefghijklmnopqrst
01234567899876
АБВГДЕЖЗИЙКЛМНОП
После открытия файла его указатель устанавливается в первую позицию первой строки файла. Ввод информации всегда производится, начиная с текущей позиции указателя файла. В данном случае имеем:
abcdefghijklmnopqrst
01234567899876
АБВГДЕЖЗИЙКЛМНОП
Пусть в разделе Var объявлены следующие переменные:
Var S1 : string[5];
S2 : string[10];
S3,S4 : string[15];
Рассмотрим выполнение оператора Read(F,S1,S2,S3,S4), эквивалентного следующим четырем операторам:
Read(F,S1); Read(F,S2); Read(F,S3); Read(F,S4).
При выполнении первого оператора в строку S1 будут занесены 5 символов, начиная с текущей позиции файла F; при этом строка S1 получит значение 'abcde'. Указатель файла переместится в позицию 6 первой строки:
abcdefghijklmnopqrst
01234567899876
АБВГДЕЖЗИЙКЛМНОП
После выполнения второго оператора ввода в переменную S2 запишется строка 'fghijklmno', а указатель файла переместится в позицию 16:
abcdefghijklmnopqrst
01234567899876
АБВГДЕЖЗИЙКЛМНОП
При вводе строк S3 и S4 будут использованы символы, начиная с текущего положения указателя файла и до конца строки. Тогда строке S3 будет присвоено значение 'pqrst', а строке S4 - пустое значение.
В этом случае текущая длина строки S3 станет равной 5, а строки S4 - 0.
Пусть по отношению к тому же файлу F ввод строк выполняют операторы
Readln(F,S1); Readln(F,S2); Readln(F,S3); Readln(F,S4).
Это эквивалентно следующему:
Read(F,S1); Readln(F);
Read(F,S2); Readln(F);
Read(F,S3); Readln(F);
Read(F,S4); Readln(F).
После выполнения первого оператора строка S1, как и раньше, получит значение 'abcde', а указатель файла переместится в позицию 6 первой строки. Выполняемый после этого оператор Readln(F) перемещает указатель в первую позицию второй строки. После выполнения всех операторов будем иметь:
S1 = 'abcde'
S2 = '0123456789'
S3 = 'АБВГДЕЖЗИЙКЛМНО'
S4 = ''.
По отношению к строкам выполняется лишь одна операция - операция сцепления (конкатенации), которая обозначается символом "+". Если переменные S1 и S2 объявлены как строки, то выражение S1 + S2 означает, что к концу строки S1 дописывается строка S2.
Пример 6.
Var S1,S2 : string[10];
S3 : string;
Begin
S1:='0123456789'; S2:='abcd'; S3:=S1+S2;
Writeln(' S3=',S3);
Будет отпечатано:
S3=0123456789abcd
Пример 7.
Var S : string[15];
i : byte;
Begin
S:='123456';
For i:=1 to 6 do
S:=S+'a';
Writeln('S=',S);
Получим:
S=123456aaaaaa (текущая длина строки равна 12)
Пример 8.
Var S : string[15];
i : byte;
Begin
S:='123456';
For i:=1 to 12 do
S:=S+'a';
Writeln('S=',S);
Получим:
S=123456aaaaaaaaa (текущая длина строки равна 15, но не 18 )
Пример 9.
Var S : string[15];
i : byte;
Begin
S:='123456';
For i:=7 to 12 do
S[i]:='a';
Writeln('S=',S);
Получим:
S=123456 (текущая длина строки равна 6)
В примере 9, хотя и будут заполнены байты 7 .. 12 символом 'a', но операции присваивания выполняются по отношению к отдельным символам, а не по отношению к строке в целом. Поэтому текущая длина строки не изменяется. Если после оператора цикла добавить оператор S[0] := chr(12), то будет напечатано
S=123456aaaaaa (текущая длина строки 12).
Для строк допустимы все операции отношения. Сравнение строк выполняется слева направо по одному байту, пока не будут обнаружены различные байты. Пусть в этих байтах расположены символы ch1 и ch2.
Тогда ch1 < ch2, если ord(ch1) < ord(ch2).
Если текущие длины сравниваемых строк неодинаковы, то более короткая строка дополняется справа символом chr(0), который меньше любого другого символа таблицы ASCII.
Пример 10.
Var b1,b2,b3 : boolean;
Begin
b1:='abcdefgh'<'abcdxyzu';
b2:='300'>'30';
b3:=''='1234567';
Здесь имеем b1 = true, b2 = true, b3 = false.
Строчные и прописные буквы в строке считаются разными. В частности, 'a' 'A', так как ord('a') ord('A').
Строки могут быть объявлены не только как переменные (раздел Var), но и как константы (раздел Const). Например
Const Digits = ‘0123456789’;
Здесь нужно обратить внимание на следующее обстоятельство: к элементам строки-константы нельзя обращаться по индексу. Следовательно, мы не можем записать
ch := Digits[5] или Digits[5]:=’a’;
Разрешение доступа по индексу означало бы, что строку-константу можно изменять (пример – приведенный выше второй оператор присваивания), а это недопустимо для констант.