
- •Алфавит и лексемы
- •Константы
- •Имена, ключевые слова и знаки операций
- •Ввод с клавиатуры
- •Вывод на экран
- •Условный оператор if
- •Оператор варианта case
- •Цикл с предусловием while
- •Цикл с постусловием repeat
- •Цикл с параметром for
- •Рекомендации по использованию циклов
- •Оператор перехода goto
- •Перечисляемый тип данных
- •Интервальный тип данных
- •Двумерные массивы
- •Операции
- •Процедуры и функции для работы со строками
- •Множества
- •Операции над множествами
- •Подпрограммы для работы со всеми типами файлов Процедуры
- •Функции
- •Текстовые файлы
- •Бестиповые файлы
- •Компонентные файлы
- •Прямой доступ
- •Процедуры
- •Функции
- •Глобальные и локальные переменные
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Нетипизированные параметры
- •Открытые массивы и строки
- •Рекурсивные подпрограммы
- •Описание модулей
- •Использование модулей
- •Модуль System
- •Модуль Crt
- •Работа с экраном
- •Работа с клавиатурой
- •Модули Dos и WinDos
- •Модуль Graph
- •Структура графической программы
- •Модуль Strings
Операции
Строки можно присваивать друг другу. Если максимальная длина результирующей строки меньше длины исходной, лишние символы справа отбрасываются:
s2 := 'shooshpanchik';
s1 := s2; { в s1 будут помещены символы "shoo" }
Строки можно склеивать между собой с помощью операции конкатенации, которая обозначается знаком +, например:
s1 := 'ком';
s2 := s1 + 'пот'; { результат - "компот" }
Строки можно сравнивать друг с другом с помощью операций отношения. При сравнении строки рассматриваются посимвольно слева направо, при этом сравниваются коды соответствующих пар символов. Строки равны, если они имеют одинаковую длину и посимвольно эквивалентны:
'abc' > 'ab'
'abc' = 'abc'
'abc' < 'abc '
Имя строки может использоваться в процедурах ввода-вывода:
readln (s1, s2);
write (s1);
При вводе в строку считывается из входного потока количество символов, равное длине строки или меньшее, если символ перевода строки (Enter) встретится раньше. При выводе под строку отводится количество позиций, равное ее фактической длине.
К отдельному символу строки можно обращаться как к элементу массива символов, например, s1[4]. Символ строки совместим с типом char, их можно использовать в выражениях одновременно, например:
s1[4] := 'x'; writeln (s2[3] + s2[5] + 'r');
Процедуры и функции для работы со строками
Функция Concat(s1, s2, ..., sn) возвращает строку, являющуюся слиянием строк s1, s2, ..., sn. Ее действие аналогично операции конкатенации.
Функция Copy(s, start, len) возвращает подстроку длиной len, начинающуюся с позиции start строки s. Параметры len и start должны быть целого типа.
Процедура Delete(s, start, len) удаляет из строки s, начиная с позиции start, подстроку длиной len.
Процедура Insert(subs, s, start) вставляет в строку s подстроку subs, начиная с позиции start.
Функция Length(s) возвращает фактическую длину строки s, результат имеет тип byte.
Функция Pos(subs, s) ищет вхождение подстроки subs в строку s и возвращает номер первого символа subs в s или 0, если subs не содержится в s.
Процедура Str(x, s) преобразует числовое значение x в строку s, при этом для x может быть задан формат, как в процедурах вывода write и writeln, например, Str(x:6:2, s).
Процедура Val(s, x, errcode) преобразует строку s в значение числовой переменной x, при этом строка s должна содержать символьное изображение числа. В случае успешного преобразования переменная errcode равна нулю. Если же обнаружена ошибка, то errcode будет содержать номер позиции первого ошибочного символа, а значение не x определено.
Пример #1. |
|
|
Программа, которая читает текст из файла и выводит его на экран, заменяя заданную с клавиатуры последовательность символов на многоточие. |
program censor; var s, str : string[10]; f : text; i, dl : integer; begin assign(f, 'primer.txt'); reset(f); writeln('Какую последовательность заменять?'); readln(s); dl := length(s); while not Eof(f) do begin readln(f, str); i := 1; while i <> 0 do begin i := Pos(s, str); if i <> 0 then begin Delete(str, i, dl); Insert('...', str, i); end; end; writeln(str); end; close(f) end. |
Лекция 11
Записи и множества
Записи
В программах часто возникает необходимость логического объединения данных. Например, база данных предприятия содержит для каждого сотрудника его фамилию, дату рождения, должность, оклад и так далее. Однотипные данные организуются в массивы, а для объединения разнотипных данных предназначен тип "запись". Он вводится с помощью ключевого слова record. Элементы записи называются полями:
type имя_типа = record
описание 1-го поля записи;
описание 2-го поля записи;
...
описание n-го поля записи;
end;
Поля записи могут быть любого типа, кроме файлового. Например, для каждого товара на складе требуется хранить его наименование, цену и количество единиц:
type goods = record
name : string[20];
price : real;
number: integer;
end;
Переменные типа "запись" описываются обычным образом. Можно задавать описание типа при описании переменной, создавать массивы из записей, записи из массивов:
var g1, g2 : goods;
stock : array [1 .. 100] of goods;
student : record
name : string [30];
group : byte;
marks : array [1 .. 4] of byte;
end;
Можно присваивать одну запись другой, если они одного типа, например:
g1 := g2;
g2 := stock[3];
Все остальные действия выполняются с отдельными полями записи. Есть два способа доступа к полю записи: либо с помощью конструкции имя_записи.имя_поля, либо с использованием оператора присоединения with, например:
g1.price := 200;
with g1 do begin
price := 200; number := 10
end;
Пример #1. |
|
|
Сведения о товарах на складе хранятся в текстовом файле. Для каждого товара отводится одна строка, в первых 20 позициях которой записано наименование товара, а затем через произвольное количество пробелов его цена и количество единиц. Программа по запросу выдает сведения о товаре или сообщение о том, что товар не найден. |
program store; const Max_n = 100; type str20 = string [20]; goods = record name : str20; price : real; number : integer; end; var stock : array[1 .. Max_n] of goods; i, j, len : integer; name : str20; found : boolean; f : text; begin assign(f, 'stock.txt'); reset(f); i := 1; while not Eof(f) do begin with stock[i] do readln(f, name, price, number); inc(i); if i > Max_n then begin {1} writeln('Переполнение массива'); exit end; end; while true do begin {2} writeln('Введите наименование'); Readln(name); len := length(name); if len = 0 then break; {3} for j := len + 1 to 20 do name := name + ' '; {4} found := false; for j := 1 to i - 1 do begin {5} if name <> stock[j].name then continue; with stock[j] do writeln (name:22, price:7:2, number:5); found := true; break; end; if not found then writeln ('Товар не найден'); {6} end; end.
|
Инициализация записей выполняется в разделе констант, при этом для каждого поля задается его имя, после которого через двоеточие указывается значение:
const g : goods = ( name: 'boots';
price: 200; number: 10 );