
- •Часть 2
- •Это связано с правилом соответствия типов: два структурированных элемента принадлежат одному типу (идентичному), если они принадлежат ранее описанному типу либо описаны одной командой.
- •Лабораторная работа №2. Использование подпрограмм при обработке массивов
- •Лабораторная работа №3. Программирование процессов обработки символьной и строковой информации
- •Список литературы
- •Приложение 1. Варианты заданий для самостоятельного решения Задачи на обработку одномерных массивов
- •Нахождение экстремумов в одномерных массивах
- •Задачи на обработку двумерных массивов
- •Задачи на формирование массивов
- •Вычисления с диагональными элементами в квадратных матрицах
- •Задачи на обработку двумерных массивов
- •Приложение2. Варианты заданий для самостоятельного решения
Лабораторная работа №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 |