Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0043234_0ADD1_ayap.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
682.5 Кб
Скачать

Операции

Строки можно присваивать друг другу. Если максимальная длина результирующей строки меньше длины исходной, лишние символы справа отбрасываются:

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 );