Лекция: Пример Обработки массива строк

 

Задача “Поиск символов в тексте”

 

Рассмотрим обработку строк на примере следующей задачи:

С клавиатуры вводится 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.

 

 

лабораторная работа “обработка строк”

 

еще рефераты
Еще работы по информатике