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

3.1.3. Подпрограммы, работающие со строками

Рассмотрим лишь некоторые подпрограммы. Они имеются во всех рассматриваемых версиях Паскаля.

Функции

CONCAT(S1 ,S2,...,SN)-функция типаSTRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметровS1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.

COPY(ST,INDEX,COUNT)-функция типаSTRING; копирует из строкиST COUNTсимволов, начиная с символа с номеромINDEX.

LENGTH(ST)-функция типаINTEGER; возвращает длину строкиST.

POS(SUBST,ST)-функция типаINTEGER; отыскивает в строке ST первое вхождение подстрокиSUBSTи возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.

Процедуры

DELETE(ST,INDEX,COUNT)-удалениеCOUNTсимволов из строкиST, начиная с символа с номеромINDEX.

INSERT(SUBST, ST, INDEX)- вставка подстрокиSUBST в строкуST, начиная с символа с номеромINDEX.

STR(X[:WIDTH[:DECIMALS]],ST)-преобразование значения типа REALилиINTEGERв строку символовSTтак, как это делает процедураWRITELNперед выводом; параметрыWIDTHиDECIMALS, если они присутствуют, задают формат преобразования (WIDTH- длину числа,DECIMALS- длину дробной части; параметрDECIMALимеет смысл указывать только для вещественных чисел).

VAL(ST, X, CODE)- преобразование строкиSTво внутреннее представление целого или вещественного числаХ; параметрCODEсодержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строкеST, где обнаружен ошибочный символ; пробелы перед числом в строкеSTдолжны отсутствовать.

Одной из практически важных задач, решаемых с помощью строковых типов, является задача обработки данных сложной структуры. Эти данные часто собраны в таблицу. Строка таблицы соотвествует некоторому объекту исследования: товару, человеку, предприятию. Строка, несмотря на то, что состоит из символов, содержит смысловые данные разного типа; например, наименование товара имеет символьный тип, его стоимость – вещественный, и т. д.

Для обработки такой строки необходимо выделить ее смысловые поля-подстроки (с помощью функции COPY), перевести некоторые поля из символьного представления в числовое (с помощью процедурыVAL). Затем, возможно, потребуется проанализировать символьные поля с помощью функцииPOSи подготовить строку выходных данных с помощьюSTR иCONCAT.

Ниже рассматривается пример такой задачи.

Пример. Сведения об игрушках представлены в виде таблицы:

N

название игpушки

миним. возраст

максим.

возраст

цена

(руб.)

1

Конструктор "Юность-3"

4

10

70

2

LEGO (конструктор)

3

7

200

3

Кукла

2

5

50

2 с.

29 символов

8 симв.

8 симв.

8 симв.

Последняя строка таблицы не относится к исходным данным, в ней задается ширина столбцов в символах без учета разделителей между столбцами.

Определить самый дорогой конструктор для детей в возрасте до семи лет и его стоимость.

Program Primer3_1_3;

VAR N:Integer;{число строк таблицы}

TABL:String[60];{строка таблицы–содержимое столбцов +5 разделителей}

nu:String[2]; {подстрока-номер игрушки}

name:String[29]; {подстрока-название игрушки}

MinAge,MaxAge,Rub:String[8]; {подстроки: мин. и макс. возраст,цена}

max:Real; {максимальная стоимость конструктора}

MaxAR,RubR:Real;{макс.возраст и стоимость в веществен. представлении}

namemax:String[29];{название конструктора с максимальной ценой}

i {счетчик игрушек},

C {номер ошибочного символа при преобразовании строки в число} :Integer;

BEGIN

Writeln(' Введите число наименований игpушек');

ReadLn(N);

max:=0;

Writeln('Вводите сведения об игpушках в виде таблицы');

Writeln(

'┌─┬─────────────┬─────┬─────┬────┐');

Writeln(

'|N | название игpушки | миним. | макс. | стои- |');

Writeln(

'| | | возpаст |возpаст |мость |’);

Writeln(

'├─┼─────────────┼─────┼─────┼────┤');

For i:=1 to N Do

BEGIN

Readln(TABL);

name:=Copy(TABL,5,29); {выделение подстрок названия}

MaxAge:=Copy(TABL,44,8); {и максимального возраста}

Val(MaxAge,MaxAR,C); {преобразование строка - число }

If C<>0 Then

Writeln(' ошибка в',C,'-й позиции MaxAge')

Else

Begin

If ((Pos('констpуктоp',name)>0) or {входит ли в название}

(Pos('Констpуктоp',name)>0)) and {слово "конструктор"}

(MaxAR<=7) Then

Begin

Rub:=Copy(Tabl,53,8); {выделение подстроки цены}

Val(Rub,RubR,C); {преобразование строка-число}

If C<>0 Then

Writeln(' ошибка в',C,'-й позиции Rub')

Else

Begin

If RubR>max Then {определение текущего значения}

BEGIN {максимальной цены}

max:=RubR;

namemax:=name{запомнили конмтруктор с макс. ценой}

END;

End

End

End

END;

If max=0 Then

WriteLn(' Констpуктоpов для детей до семи лет нет')

Else

BEGIN

WriteLn('Cамый доpогой констpуктоp для детей до семи лет');

STR(max:6:2,Rub);{перевод max в строку}

WriteLn(CONCAT(namemax, ' стоит ',Rub, ‘ рублей’);

END;

END.

При обработке таблиц большого объема эта программа имеет, по крайней мере, два недостатка:

  1. количество строк таблицы задается вводом (но ручной подсчет количества строк таблицы – это достаточно большой труд);

  2. ввод данных происходит с экрана, хотя, конечно, лучше хранить данные в файле на внешнем носителе и осуществлять ввод из файла.

Эти недостатки можно устранить, используя тип файл (см. §3.3).