Лабораторна робота №4
Тема: Опрацювання даних типу рядок.
Загальні завдання Записати символи текстового рядка в зворотному порядку. У текстовому рядку замінити кожну группу підряд розмішених пропусків одним пропуском. Знайти кільість різних символів текстового рядка. Знайти найдовше слово в тексті. Знайти однакові слова двох текстових рядків. Впорядкувати слова текстового рядка в алфавітному порядку.
Індивідуальні завдання Записати кожне слово текстового рядка в окремий рядок з великої літери. У рядку знайти слова які повторюються. Обчислити значення виразу який подано текстовим рядком abc де а перша цифра в друга цифра ,с знак арифметичноъ операцыъ. Знайти найдовше однакове слово двох рядків. Зясувати чи правельно розмішені дужки в арифметичному виразі. У рядку перше слово записати після останього . Урядку остане слово записати після першого. Записати кожне слово рядка з великої літери. У рядку замінити всі одноцифрові десяткові числа римськими числами. Змінити регістр символів текстового рядка на протилежний.
^ Тип String Для опрацювання послідовностей символів (рядків) визначено тип даних ^ – одновимірний масив символів. Розмірність такого масиву (найбільша довжина рядка) задається у квадратних дужках за ідентифікатором String у розділах описів і вказує на розмір пам’яті, яка виділяється для збереження символів. Якщо розмірність не вказується, то за замовчуванням приймається найбільша довжина рядка, рівна 255. | var S1 : String[20]; S : String; begin S1 := ‘BORLAND PASCAL 6.0’; ^ … | Поточна кількість символів рядка зберігається в елементі під номером 0, як символ, код якого вказує на дійсну кількість символів, які зберігаються у масиві. Нумерація символів масиву починається з 1. | В наведеному прикладі змінна ^ вказує на масив, у якому може розміститися 255 символів, змінна S1 указує на масив 60 символів. Розмірність | Поточна довжина | Рядок символів S1 | 20 | 18 | ^ | 20 | 7 | ‘BORLAND’ | Схематично розміщення символів у масиві S1 можна подати так: p=7 | n=20 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | #7 | B | O | R | L | A | N | D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| знаходиться символ, код якого рівний 7 |
| n | – | розмірність рядка |
| p | – | поточна довжина рядка | Надати значення змінній типу ^ можна за допомогою стандартної процедури введення ReadLn або за допомогою оператора надання значень. При цьому встановлюється нова довжина рядка. Наприклад, | var S : String; begin S := ‘BORLAND PASCAL 6.0’; … | До виконання оператора надання значень довжина рядка S рівна 0.
Після виконання – 18. | Виведення текстових рядків або їх елементів на екран здійснюється стандартними процедурами WriteLn , Write. Наприклад, | ^ WriteLn(S); … for i:=9 to 14 do Write(S[i]);
|
На екран буде виведено усі символи рядка S.
На екран буде виведено символи рядка S, які мають номери від 9 до 14, тобто ‘PASCAL’. | Процедури та функції для роботи з рядками типу String ^ | Приклад S1:=’Turbo Pascal 6.0’; S2 := ‘Pascal’; | Concat(s1, s2,…, sn: String) : String; s1 ,s2 ,…, sn – вирази типу String; Функція Concat повертає рядок символів, який утворюється послідовним з’єднанням рядків s1, s2,…, sn. Символи, номери яких перевищують 255, не зберігаються. | S := Concat(S2, ’ ‘, S1); S – ’Pascal Turbo Pascal 6.0’; | Copy(s : String; n, k : Integer) : String; s – вираз типу String; n, k – вирази цілого типу; Функція Copy повертає рядок із n символів, які беруться з рядка s, починаючи з позиції k. | S := Copy(S1, 7, 6); S – ’Pascal’ | Length(s : String) : Integer; s – вираз типу String; Функція Length повертає поточну довжину рядка s. | N := Length(S2); N – 6 S :=’’; N := Length(S); N – 0 | Pos(s1, s : String) : Byte; s1, s – вирази типу String; Функція Pos шукає рядок символів s1 в рядку s і повертає номер позиції першого символа рядка s1 в рядку s. Якщо в рядку s не знайдено рядок s1, то функція повертає 0. | N := Pos(S2, S1); N – 7 | Delete(var s : String; n, k : Integer); s – вираз типу String; n, k – вирази цілого типу; Процедура Delete вилучає n символів із рядка s, починаючи з позиції k. | Delete(S1, 1, 6); S1 – ‘Pascal 6.0’ | Insert(s1 : String; var s : String; n : Integer); s1, s – вирази типу String; Процедура Insert вставляє рядок s1 у рядок s з позиції n. Символи, номери яких перевищують 255, не зберігаються. | ^ S2 – ‘Turbo Pascal’ Insert(S1, S2, 7); S2 – ’PascalTurbo Pascal 6.0’ | Str(n [ : size [ : dec ] ], var s : String); n – вираз числового типу; dec, size – вирази цілого типу: параметри форматування (можна не вказувати); s – вираз типу String; Процедура Str перетворює n в рядок символів s у відповідності з параметрами форматування size та dec. | K := 5.123; Str(K ,S); S – ‘5.123 Pos(‘.’, S) – 2 Str(K : 10 : 2, S); S – ‘_ _ _ _ _ _5.12’ | Val(s : String; var r; var Code : Integer); s – вираз типу String; r – змінна цілого або дійсного типу; Code – змінна цілого типу. Процедура Val перетворює рядок s в числове подання і зберігає результат в r. Якщо в рядку зустрічається недопустимий символ, то в Code записується його номер, інакше 0. | S :=’12.345’; Val(S, K, Code); K – 12.345 Code – 0 S := ’12,345’; Val(S, K, Code); Code – 3 | Операції над значеннями типу String З’єднання рядків Для позначення операції з’єднання двох рядків використовується символ (+). Результатом такої операції є рядок, утворений приєднанням символів другого рядка праворуч від символів першого рядка. Символи другого рядка, які у результуючому рядку матимуть номер більший за 255, не приєднуються. Наприклад, ‘abcd’+’efghi’ ‘abcdefghi’ ^ Для порівняння рядків використовуються операції відношення <, >, <=, >=, =, <>. При порівнянні рядків здійснюється порівняння кодів символів зліва направо за стандартом ASCII. Наприклад, ‘ABCD’ < ‘AD’, ‘ABC’ < ’abc’, ‘MNL’ > ’MN!’.
^ Кожну літеру рядка замінити на відповідну їй велику. Розв’язування. Визначимо потрібні об’єкти: S – змінна типу String: заданий текстовий рядок; i – змінна типу Byte: індекс поточного символу рядка. Алгоритм | Програма | ввести рядок ^ ; Length(S) раз повторити дії (i змінюється від 1 до Length(S)): i-ту літеру рядка S замінити на відповідну їй велику за допомогою функції UpCase; вивести на екран результат – S. | var S : String; i : Byte; begin Write(' Введіть текстовий рядок: ');ReadLn(S); for i := 1 to Length(S) do S[i] := UpCase(S[i]); WriteLn(' S –', S ) end. | Кожне слово текстового рядка вивести в окремому рядку екрану. Розв’язування. Розв’яжемо задачу трьома способами. Визначимо потрібні об’єкти (для всіх способів): ^ – змінна типу String: заданий текстовий рядок; i – змінна типу Byte: індекс поточного символу рядка.
Алгоритм | 1-й спосіб. | Програма | ввести рядок ^ ; Length(S) раз повторити дії (i змінюється від 1 до Length(S)): якщо i-й символ рядка S рівний пропуску, то перейти до наступного рядка екрану, інакше вивести на екран i-й символ рядка S. | var S : String; i : Byte; begin Write('Введіть текстовий рядок: '); ReadLn(S); WriteLn('Слова:'); for i:=1 to Length(S) do if S[i] = ' ' then WriteLn else Write(S[i]); end. | . Алгоритм | 2-й спосіб | Програма | ввести рядок ^ ; додати в кінець рядка S пропуск; поки рядок S не порожній, виконувати дії: вивести на екран символи рядка S, починаючи з першого символу до першого пропуску; перейти до нового рядка екрану; вилучити символи рядка S, починаючи з першого символу по перший пропуск включно; | var S : String; i : Byte; begin Write('Введіть текстовий рядок: '); ^ while S <> '' do begin WriteLn(Copy(S, 1, Pos(' ', S)-1)); Delete(S, 1, Pos(' ', S)); end; end. |
Алгоритм: | 3-й спосіб. | Програма | Введемо змінну k типу Byte – позиція першого символу слова. ввести рядок ^ ; додати в кінець рядка S пропуск; змінній k надати значення 1; Length(S) раз повторити дії (i змінюється від 1 до Length(S)): якщо i-й символ рядка S є пропуском, то вивести на екран з k-го по i-1-й символи рядка S; перейти до нового рядка екрану; змінній k надати значення i + 1. | var S : String; i,k : Byte; begin Write('Введіть текстовий рядок: '); ReadLn(S); S := S + ' '; WriteLn(' Слова:'); k := 1; for i:=1 to Length(S) do if S[i]=' ' then begin WriteLn(Copy(S, k, i-k)); k := i + 1; end; end. | |