Головна |
Завдання "Пошук символів в тексті"
Розглянемо обробку рядків на прикладі наступної задачі:
З клавіатури вводиться 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.
лабораторна робота "обробка рядків"
Власенко О. Ф., Бєляєва І. В. | Символьний тип char | Приклади використання стандартних процедур і функцій обробки символів | Вбудований тип STRING | Операції над рядками string | Стандартні процедури та функції для роботи з рядками string | процедура Val | безлічі | Операції над множинами |