![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Задача “Поиск символов в тексте”
Рассмотрим обработку строк на примере следующей задачи:
С клавиатуры вводится n строк (n<=10). Каждая строка содержит не более 70 символов. Необходимо найти и вывести все гласные буквы (без повторений), которые встретились в этих строках.
Решим эту задачу в соответствии с процедурным подходом, то есть разобьем решение на набор процедур и функций. Постараемся сделать процедуры и функции как можно более универсальными, чтобы их можно было использовать в других подобных задачах.
В результате анализа задачи в ней были выделены следующие процедуры:
1. Ввод массива строк - ReadStrings.
2. Вывод массива строк - PrintStrings.
3. Определение множества символов в массиве строк - GetAllChars.
4. Вывод массива строк с подсветкой символов, входящих в указанное множество - PrintColorStrings.
5. Вывод множества символов - WriteSetChar.
6. Ожидание нажатия любой клавиши - WaitPressed.
Имея такой набор процедур, решить нашу задачу очень просто. Для этого достаточно ввести множество русских гласных букв.
Программа:
{
Вводится не более 10 строк.
Ищутся и выводятся на экран гласные буквы, находящиеся
во введенных строках.
}
uses crt; {В программе будут использоваться средства
консольного ввода-вывода, в том числе процедуры
textcolor и clrscr, и функции readkey}
Const
MaxLengthString = 70; {Максимальная длина строки}
MaxNumberStrings = 10; {Максимальное количество строк}
Type
TString = string[MaxLengthString]; {Строка, в которой может
храниться не более MaxLengthString символов}
SetChar = Set of char; {Множество символов}
ArrayTString = array [1..MaxNumberStrings] of TString;
{Массив строк}
{Процедура ReadString.
Ввод строк в массив str. N - количество реально введенных строк.}
procedure ReadStrings(var str: ArrayTString;
var N: Integer);
var
s: TString; {Строка для ввода}
begin
clrscr; {Очистка экрана}
{Вывод приглашения к вводу}
textcolor(LightGray); {Установка цвета для выводимого
на экран текста}
writeln;
writeln('Введите не более ', MaxNumberStrings,
' строк.');
writeln('Конец ввода - пустая строка:');
{Ввод строк}
n:=0; {Вначале введенных строк нет}
repeat
{Вывод номера вводимой строки}
textcolor(DarkGray); {Установка темно-серого цвета}
write(n+1,'> '); {Вывод номера - темно-серым цветом}
{Ввод строки}
textcolor(LightGray); {Установка серого цвета}
readln(s); {Ввод строки - серым цветом}
if s <> '' then {Если введена непустая строка}
begin
inc(n); {То вписываем ее в массив SS}
str[n]:= s;
end;
until (n = MaxNumberStrings) or (s = ''); {Выход из цикла
ввода либо после ввода 10 строк,
либо после ввода пустой строки}
end;
{Процедура PrintStrings.
Выводятся на экран строки из массива str.
N - количество строк в массиве str.}
procedure PrintStrings(const str: ArrayTString;
N: Integer);
var
i: integer;
begin
clrscr; {Очистка экрана}
textcolor(LightBlue); {Цвет вывода - голубой}
writeln;
writeln('Вы ввели ', n, ' строк(у,и). Вот они:');
for i:= 1 to n do
begin
{Номер строки выводится голубым цветом}
textcolor(LightBlue);
write(i:2, '> ');
{Сама строка выводится серым цветом}
textcolor(LightGray);
writeln(str[i]);
end;
end;
{Процедура GetAllChars.
Получаем все символы.
Заносит все символы, встретившиеся в массиве строк str,
в множество AllChars. N - количество строк в массиве str.}
procedure GetAllChars(const str: ArrayTString; N: Integer;
var AllChars: SetChar);
var
i, j: integer;
begin
AllChars:= []; {Инициализация множества}
for i:= 1 to n do {Для всех введенных строк}
for j:= 1 to length(str[i]) do {Для всех символов
i-ой строки}
AllChars:= AllChars + [ str[i,j] ]; {Добавляем по
очереди все символы к множеству AllChars}
end;
{Процедура PrintColorStrings.
Выводятся на экран строки из массива str.
N - количество строк в массиве str.
При выводе строк ЦВЕТОМ помечаются те символы,
которые есть в множестве S. }
procedure PrintColorStrings(const str: ArrayTString;
N: Integer;
var S: SetChar);
var
i, j: integer;
begin
writeln;
textcolor(LightBlue); {Цвет - голубой}
writeln('Гласные буквы выделены цветом');
{Проход по всем строкам массива str}
for I:= 1 to n do
begin
{Вывод номера строки голубым цветом}
textcolor(LightBlue);
write(i:2,'> ');
{Проход по всем символам i-ой строки}
for j:= 1 to length(str[i]) do {Length(str[i]) - количество
символов в строке str[i]}
begin
if str[i,j] in S {Если j-ый символ i-ой строки
имеется в множестве S}
then textcolor(LightGreen) {Тогда он выводится
светло-зеленым }
else textcolor(DarkGray); {Иначе – темно-серым}
write(str[i,j]); {Выводится символ}
end;
writeln; {После вывода всех символов i-ой строки
переходим на следующую строку}
end; {Заканчивается цикл по строкам}
end;
{Процедура WriteSetChar.
Процедура выводит символы, содержащиеся в множестве S,
на экран.
S – множество.
Message - строка, выводимая перед выводом множества.
ColorMessage - цвет текста сообщения Message.
ColorSet - цвет символов множества S}.
procedure WriteSetChar(message: string; S: SetChar;
ColorMessage, ColorSet: Integer);
var
C: char; {Выводимый символ}
begin
{Вывод сообщения}
textcolor(ColorMessage); {Цвет текста сообщения}
Write(message);
{Вывод символов, хранящихся в множестве}
textcolor(ColorSet); {Цвет символов множества}
For c:= #0 to #255 do
{Если символ есть в множестве, он выводится}
If c in S then write(c, ' ');
Writeln;
end;
{Процедура WaitPressed.
Выводит сообщение message на экран.
ColorMessage - цвет символов сообщения.
После вывода сообщения ждет нажатия любой клавиши. }
procedure WaitPressed(message: string;
ColorMessage: Integer);
begin
textcolor(ColorMessage); {Установить цвет текста}
write(message); {Вывод сообщения}
readkey; {Ожидание нажатия любой клавиши}
writeln;
end;
const
{Множество всех гласных букв}
AllGlasn: SetChar = ['а', 'я', 'у', 'ю', 'э', 'е', 'о',
'ё', 'и', 'ы',
'А', 'Я', 'У', 'Ю', 'Э', 'Е', 'О',
'Ё', 'И', 'Ы' ];
var
ArrayStr: ArrayTString; {Массив строк}
N: integer; {Количество введенных строк}
FoundChars: SetChar; {Все найденные в ArrayStr символы }
FoundGlasn: SetChar; {Все найденные в ArrayStr
ГЛАСНЫЕ символы }
begin {Начало тела программы}
{Ввод строк}
ReadStrings(ArrayStr, N);
{Вывод строк}
PrintStrings(ArrayStr, N);
{Получение всех символов, введенных в строки ArrayStr}
GetAllChars(ArrayStr, N, FoundChars);
{Получаем все гласные символы, находящиеся в строках ArrayStr }
FoundGlasn:= FoundChars * AllGlasn;
{Печатаем введенные символы с выделением гласных букв}
PrintColorStrings(ArrayStr, N, FoundGlasn);
{Печатаем гласные буквы, встречающиеся в строках ArrayStr}
WriteSetChar('Во введенных строках присутствуют' +
' гласные буквы: ',
FoundGlasn, Red, LightRed);
{Ждем нажатия любой клавиши}
WaitPressed('Для завершения работы программы нажмите' +
' любую клавишу...', LightBlue);
end. {Конец программы}
Задача “Поиск слов в строке и удаление символов”
В качестве второго примера возьмем такую задачу: в строке из слов, начинающихся с двух согласных букв, удалить все гласные буквы.
{
Пример обработки строки.
Удаляются все гласные буквы в словах, которые начинаются
с двух согласных букв
}
{=====================================================}
{Функция IsLetter.
Возвращает TRUE, если Ch является русской буквой.
Иначе возвращает False.}
function IsLetter(Ch: char): boolean;
begin
IsLetter:= ch in ['А'..'Я','а'..'п','р'..'я','ё','Ё'];
end;
{=====================================================}
{Функция IsSoglasn.
Возвращает TRUE, если Ch является русской согласной буквой.
Иначе возвращает False.}
function IsSoglasn(ch:char):boolean;
begin
IsSoglasn:= ch in ['б','в','г','д','ж','з','й','к','л',
'м','н','п','р','с','т','ф','х','ц',
'ч','ш','щ','ъ','ь',
'Б','В','Г','Д','Ж','З','Й','К','Л',
'М','Н','П','Р','С','Т','Ф','Х','Ц',
'Ч','Ш','Щ','Ъ','Ь'];
end;
{=====================================================}
{Функция IsGlasn.
Возвращает TRUE, если Ch является русской гласной буквой.
Иначе возвращает False.}
function IsGlasn(ch:char):boolean;
begin
IsGlasn:= ch in
['а','е','ё','и','о','у','ы','э','ю','я',
'А','Е','Ё','И','О','У','Ы','Э','Ю','Я'];
end;
{=====================================================}
{Функция FindNextWord.
Ищет в строке S следующее слово, начиная с символа Start.
Если слово найдено, то возвращается True
и возвращается индекс первого символа слова (через BeginWord)
и его длина (через LengthWord).
Если слово не найдено, возвращается False.}
function FindNextWord(const S: String;
Start: Integer;
var BeginWord: Byte;
var LengthWord: Byte): Boolean;
var
i: Integer; {Индекс может выйти за границы 255,
поэтому Byte использовать нельзя!}
Len: Byte; {Длина строки}
Begin
{Вычисляем длину строки}
Len:= length(s);
{Ищем начало слова, начиная со стартового символа строки}
i:= Start;
{В цикле продвигаем i вперед по строке до тех пор,
пока не встретится буква или пока не кончится строка }
while not isLetter(S[i]) and (i <= Len) do
inc(i);
{Сейчас i указывает на первый символ найденного слова}
BeginWord:= i;
{Ищем конец слова}
{Для этого продвигаем i вперед до тех пор, пока не встретится
НЕ БУКВА или пока i не выйдет за пределы строки}
while isLetter(S[i]) and (i <= Len) do
inc(i);
{Сейчас i указывает на первый символ-разделитель, следующий
за словом (или i указывает на символ за пределами границ
строки).
Длину слова вычисляем как разность между индексами его
последнего и первого символов }
LengthWord:= i - BeginWord;
{Если вычисленная длина слова больше 0, значит, слово в строке
найдено. Возвращаем True.
Иначе - слова в строке нет. Возвращаем False.}
if LengthWord > 0
then FindNextWord:= true
else FindNextWord:= false;
end;
{=====================================================}
{Функция StringWithoutGlasn.
Возвращает строку, созданную из строки
S путем удаления всех гласных букв.}
function StringWithoutGlasn(const s:string):string;
var
res: string; {Результат}
i: integer;
begin
res:= ''; {Сначала результирующая строка пустая}
for i:= 1 to length(s) do {Затем все символы}
if not IsGlasn(s[i]) then, {Которые не являются}
res:= res + s[i]; {Гласными буквами,
добавляются к строке}
WordWithoutGlasn:= res; {Получившаяся строка возвращается}
end;
{=====================================================}
{Функция DeleteGlasn.
В строке S во всех словах, начинающихся на две согласные буквы, удаляются гласные буквы.
Полученная строка возвращается.}
function DeleteGlasn(const s:String):String;
var
newstr: string; {Новая строка}
i: integer; {Счетчик}
beg: byte; {Индекс начала слова}
len: byte; {Длина слова}
w: string; {Выделенное слово}
begin
newstr:= ''; {новая строка вначале пустая}
{В строке S ищем все слова по очереди}
I:= 1;
while FindNextWord(S, i, beg, len) do {Ищем очередное
слово}
begin
{К новой строке прицепляем все разделители,
стоящие перед очередным словом}
newstr:= newstr + Copy(S, i, beg-i);
{Найденное слово копируем в W}
w:=Copy(s,beg,len);
{Если первые две буквы слова являются согласными}
if IsSoglasn(w[1]) and IsSoglasn(w[2]) then
newstr:= newstr + WordWithoutGlasn(w) {К строке
прицепляем слово без гласных букв}
else
newstr:= newstr + w; {Иначе - прицепляем
неизмененное слово}
I:= beg + len; {Поиск очередного слова начнем
с символа, следующего за концом этого слова}
end;
DeleteGlasn:= newstr; {Возвращаем созданную новую строку}
end;
{Тело программы}
var
s: string; {трока}
begin
s:= 'В словах удалить все гласные буквы';
s:= DeleteGlasn(s);
writeln(s); {Будет выведено 'В слвх удалить вс глсн буквы'}
end.
лабораторная работа “обработка строк”
Дата публикования: 2014-11-29; Прочитано: 379 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!