Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример Обработки массива строк



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

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

С клавиатуры вводится 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.662 с)...