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

Лабораторная работа №3. Программирование процессов обработки символьной и строковой информации

Цель работы: изучение особенностей алгоритмизации и программирования процессов обработки символьной и строковой информации.

Общие положения

Строка (string) – это последовательность литер (символов строкового типа).

Тип данных (string) определяет строки с максимальной длиной 255 символов. Переменная этого типа может принимать значения переменной длины.

Выражения, в которых операндами служат строки, называются строковыми выражениями.

Возможны две формы описания переменных строкового типа:

1. Форма

type

<имя типа> = string[m];

var

<идентификатор1, …, идентификаторN>: <имя типа>;

Пользователь вводит свой тип строки, давая ему имя <имя типа> и задавая предельную допустимую длину строк в этом типе – m. В разделе описания переменных описывается идентификаторы, относящиеся к этому типу.

2. Форма

var

<идентификатор>: string[m];

где m – количество символов в строке.

Например:

type

stroka = string[20]; {длина строки 20 символов}

var

Street: stroke;

MaxLine: string; {строка длиной 255 символов}

City: string[30]; {строка длиной 30 символов}

Над строками определены две операции:

1. cцепления (+) применяется для объединения нескольких строк в одну.

Например, SumStr := 'Турбо'+'Паскаль'+'7.0';

2. отношения (=, <>, >, <, >=, <=) проводят сравнение двух строк слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной кодовой таблице. Результат выполнения операций отношения над строками всегда имеет булевый тип.

Например, выражение 'MS-DOS'<'MS-Dos' имеет значение True.

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

Строки считаются равными, если они совпадают по длине и содержат одни и те же символы на соответствующих местах в строке.

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

Допускается смешение в одном выражении операндов строкового и символьного типа. К отдельным символам строки можно обратиться по номеру (индексу) данного символа в строке.

Например, чтобы обратиться к третьему символу строки SumStr надо записать SumStr[3].

Для хранения строковых переменных выделяется память, на единицу большая максимальной длины строки. Начальный байт этой памяти отводится для хранения текущей длины строки, следующие байты – для символов самой строки. Так как элементы строк стандартно нумеруются целыми числами, начиная с единицы, байт с длиной строки можно считать нулевым ее элементом. Такая структура памяти допускает прямой доступ к ее элементам.

Например строка символов «мама мыла раму» будет описана в тексте программы как

Var stroka: string[17];

Т а же строка представлена в памяти следующим образом:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

stroka

14

м

а

М

а

м

ы

л

а

р

а

м

у

Для обработки строковых данных можно использовать встроенные процедуры и функции, представленные в таблице 1.

Таблица 1

Процедуры и функции для обработки строковых данных

Функции и процедуры

Примеры использования

Исходные

значения

Запись в

программе

Результат

chr(i) – преобразование номера i символа в кодовой таблице в соответствующий символ

i = 70

c:= chr(i)

c= ‘F’

Upcase(ch) – преобразует строчную букву в прописную (только латинского алфавита)

ch:= ‘a’

c:= upcase (ch)

c:= upcase (‘a’)

c= ‘A’

c= ‘A’

Concat(st1, …, stn) – выполняет сцепление строк в том порядке, в каком они указаны в списке параметров

st1=’универ’

st2=’ситет’

s:= concat(st1, st2)

s=’университет’

length(st) – определение длины строки st

st=’университет’

s:= length(st)

s=11

pos(st1, st2) – обнаруживает первое появление подстроки st1 в строке st2

st=’университет’

st1=’верс’

s:= pos(st1, st)

s:= pos(’верс’, st)

s = 4

s = 4

delete (Str, Poz, N) – удаление N символов строки Str, начиная с позиции Poz

st=’университет’

poz=7

n=5

Delete (Str,Poz,N)

Delete (Str,7,5)

’универ’

’универ’

insert (st1, st2, Poz) – вставка строки st1 в строку st2, начиная с позиции Poz

st1=’универ’

st2=’ситет’

poz=7

Insert (st2,st1,Poz)

Insert (st2,st1,7)

’университет’

’университет’

str (Number, Stroka) – преобразует число в строку

i=1500

str (i, st)

st = ‘1500’

val (Stroka, Number, Code) – преобразует строку в число и выдает код правильности преобразования

st = ‘1500’

val (st, i, Code)

st = 1500

Примеры обработки символьной и строковой информации

Задача 3.1. Дана строка символов, содержащая слово дом. Заменить в строке слово дом на домик. Для решения данной задачи необходимо использовать оператор цикла while-do для просмотра всех элементов строки. В цикле последовательно выполняются следующие действия: определение позиции, с которой начинается слово дом; удаление трех элементов с данной позиции; вставка слова домик. Для определения позиции используется функция pos(st1, st2), для удаления слова домdelete (Str, Poz, N), для вставки слова домикinsert (st1, st2, Poz).

Таблица идентификаторов

входные

промежуточные

Выходные

Переменная

st

t

i

St

Имя

st

t

i

St

Тип

string

integer

integer

string

Программа составляется по блок-схеме с учетом таблицы распределения идентификаторов.

program stroka;

uses Crt;

var

st: string;

i, t: integer;

begin

writeln('Введите строку:');

readln(st);

st:=' '+st+' ';

while pos(' дом ', st)>0 do

begin

t:= pos(' дом ',st);

delete(st, t+1, 3);

insert('домик', st, t+1);

end;

writeln('Преобразованная строка: ', st);

end.

Результаты выполнения прог-раммы:

Введите строку:

Мой дом - твой дом

Преобразованная строка: Мой домик - твой домик

Рис. 3.1. Блок-схема программы

Задача 3.2. Дана строка символов. Определить самое длинное слово в строке.

Таблица идентификаторов

входные

Промежуточные

выходные

переменная

St

k

V

max

t

I

s[v]

Имя

St

k

V

max

t

I

s[v]

Тип

String

integer

Integer

integer

integer

Integer

Astring

Блок-схема программы представлена на рис. 3.2.Программа составляется по блок-схеме с учетом таблицы распределения идентификаторов.

program stroka;

uses Crt;

var

s: array [1..20] of string;

st: string;

i, t, k, v, max: integer;

begin

{Ввод исходной строки}

writeln('Введите строку:');

readln(st);

{Формирование массива s из слов исходной строки}

t:= length(st);

k:=1;

for i:=1 to t do

if st[i]= ' ' then k:=k+1

else s[k]:=s[k]+st[i];

{Поиск максимального по длине слова}

max:=length(s[1]);

for i:=2 to k do

if length(s[i])>max then

begin

max:= length(s[i]);

v:=i;

end;

{Вывод максимального по длине слова на экран}

writeln ('Самое длинное слово:', s[v]);

end.

Результаты выполнения программы:

Введите строку:

Я учусь на первом курсе

Самое длинное слово: – первом

Рис. 3.2. Блок-схема программы

Задача 3.3. Дана строка символов. Определить количество слов в строке Строка должна начинаться с буквы.

Таблица идентификаторов

входные

промежуточные

Выходные

переменная

st

T

i

T

Имя

st

T

i

T

тип

string

integer

integer

Integer

Блок-схема программы представлена на рис. 3.3. Программа составляется по блок-схеме с учетом таблицы распределения идентификаторов

Рис. 3.3. Блок-схема программы

program stroka;

uses Crt;

var

st: string;

i, t: integer;

begin

{Ввод исходной строки}

writeln('Введите строку:');

readln(st);

{Удаление из строки лишних пробелов}

while pos(' ', st)>0 do

begin

t := pos(' ',st);

delete(st, t, 1);

end;

st:= st+' ';

{После удаления из строки лишних пробелов в строке количество слов будет равно количеству пробелов}

t:=0;

for i:=1 to length(st) do

if st[i]= ' 'then t:=t+1;

{Вывод результата на экран}

writeln ('Количество слов= ', t);

end.

Результаты выполнения программы:

Введите строку:

Я учусь на первом курсе

Количество слов= 5