Інформатика

Робота з текстовою інформацією

У Паскалі при роботі з текстовою інформацією існує можливість обробки одиночних символів типу Char та послідовності символів — рядків типу String.
Символьний тип. Тип Char — це один з базових типів мови, призначений для збереження та опрацювання одного символу. Множиною його значень є окремі символи (букви, цифри, знаки), впорядковані у відповідності із розширеним набором символів ASCII-коду. Змінна цього типу займає 1 байт пам’яті. Завдяки тому що в пам’яті машини символи зберігаються у вигляді кодів (більшим вважається той символ, чий код більший), їх можна порівнювати. Для символів припустимі всі операції порівняння: <, <=, =, >, >=, <>.
Опис даних символьного типу:
Const Name1 = ‘v’; — опис символьної константи,
Var Name2: CHAR; — опис символьної змінної.
Як правило, значення для символьних змінних та констант задаються в лапках, наприклад, ‘f’, ‘1’, ‘+’. Також можна задати значення, вказавши безпосередньо числове значення ASCII-коду, поставивши перед цим числовим кодом знак #, наприклад, #35, #102.
У Паскалі для роботи з символьною інформацією реалізовані функції перетворення: CHR(N) — символ з кодом N, ORD(S) — код символа S. Також застосовуються функції, що визначають SUCC(S) — наступний символ, PRED(S) — попередній символ. Для цих функцій виконуються такі залежності:
SUCC(S) = CHR(ORD(S) +1);
PRED (S) = CHR(ORD(S) –1).
Для латинських літер ‘a’..‘z’ виконується функція UPCASE(S), яка переводить ці літери у верхній регістр ‘A’..’Z’.
Рядковий тип. Тип String — тип даних, призначений для збереження та опрацювання послідовності символів. Рядок можна розглядати як особливу форму одновимірного символьного масиву.
Опис даних рядкового типу:
Const Name1=‘computer’; — опис рядкової константи,
Var Name2: STRING; — опис рядкової змінної,
Name3: STRING [20]; — опис рядкової змінної заданої довжини,
За умовчанням довжина рядкової змінної дорівнює 255 символам, але можна обмежити довжину рядка за допомогою явної вказівки довжини рядка.
У Паскалі реалізовано опрацювання рядків двома шляхами: опрацювання рядка як єдиного цілого та як об’єкта, який створюється з окремих символів.
Перший шлях надає можливість:
• присвоєння рядковій змінній за одну операцію цілого рядка символів, наприклад, Name2:=‘computer’; Name3:=‘science’;
• об’єднання рядків у довільному порядку за допомогою операції «+» (операції скріплення, об’єднання), наприклад,
Name3:= ‘computer’+‘science’;
Name3:= Name2 + Name3;
• порівняння рядків за допомогою операцій порівняння: <, <=, =, >, >=, <>, наприклад,
If Name3 <> Name2 then write (‘no’);
Другий шлях надає можливість до кожного окремого символу рядка звертатися за його номером позиції як до елемента масиву за індексом, наприклад,
Name3:= Name2 [6] + Name2 [2] + Name2 [4];
Елемент з нульовим індексом містить символ, код якого вказує на дійсну довжину даного рядка.
У Паскалі реалізовані процедури і функції для опрацювання рядків. Поточну довжину рядка S можна дізнатися за допомогою функції LENGTH (S).
Група функцій та процедур, спрямована на опрацювання фрагментів рядка:
• функція COPY(S, N, M) — копіювання фрагменту рядка S довжиною M, що починається з позиції N;
• функція POS (S1, S) — пошук фрагменту S1 в рядку S (отримуємо позицію, з якої починається фрагмент S1 в рядку S);
• функція CONCAT (S1, S2,…) — об’єднання рядків S1, S2,…;
• процедура INSERT (S1, S2, M) — вставка фрагменту S1 у рядок S2 із позиції M;
• процедура DELETE (S1, N, M) — вилучення частини рядка S1 довжиною M, починаючи з позиції N;
• процедура VAL (S, N, Code) — перетворення рядка цифрових символів S у число N (параметр Code=0, якщо рядок S утворений не із цифрових символів);
• процедура STR (N, S) — перетворення числа N у рядок цифрових символів S.
Для сортування символьних рядків (наприклад, за алфавітом) доцільно створити масив символьних рядків (масив типу String), що, з урахуванням можливості використання операцій порівняння для рядків, дозволить у простий спосіб застосовувати основні алгоритми сортування.

Масиви даних

Масив — це структурована сукупність фіксованої кількості елементів одного типу, доступ до яких здійснюється за допомогою індексів. Елементи масиву називаються індекс­ними змінними. За кількістю індексів, які треба вказати для доступу до окремого елемента масиву, розрізнюють одновимірні, двовимірні, …, n-вимірні масиви. Вимоги до індексів різні в різних алгоритмічних мовах. У Паскалі індекс — це змінна порядкового типу.
Опис масиву містить ім’я масиву (ідентифікатор), принцип індексації елементів (діапазон зміни індексів), тип елементів масиву.
VAR <ім’я_масиву>: ARRAY <діапазони зміни індексів> OF <тип_даних>;
Масив називається одновимірним (лінійна таблиця), якщо для доступу до його елементів достатньо одного індексу.
Наприклад, одновимірний масив із 8 дійсних чисел у Паскалі можна оголосити таким чином:
• VAR Name: ARRAY [1..8] OF real;
• Const N=8;
VAR Name: ARRAY [1..N] OF real;
• TYPE MASSIV = ARRAY [1..8] OF real;
VAR Name: MASSIV;
Масив називається двовимірним (матриця), якщо для доступу до його елементів необхідно вказати значення двох індексів. Перший індекс вказує номер рядка, а другий — номер стовпця в цьому рядку.
При розподілі пам’яті в описовій частині програми під масив резервується стільки місця, скільки передбачає вказана кількість елементів масиву, враховуючи тип елементів. Межі зміни індексів повинні бути сталими величинами, а не змінними, інакше буде невідомо, скільки місця необхідно відвести в пам’яті для такого масиву.
У пам’яті комп’ютера елементи одновимірних масивів розташовано послідовно. Двовимірні масиви розташовуються таким чином: спочатку елементи першого рядка, потім другого і т. д.
Роботу з масивами можна умовно поділити на три частини:
• формування масиву;
• опрацювання масиву;
• виведення масиву.
Формування масиву. Формування значень елементів масиву можна виконувати у такий спосіб:
• уведення значень елементів масиву з клавіатури або з файла;
• формування значень випадковим чином, з використанням функції-генератора випадкових чисел Random;
• обчислення значень елементів масиву за формулою.
Опрацювання масиву. Класичними задачами для роботи з масивами можна назвати:
• пошук заданого елемента в масиві;
• знаходження суми (добутку) елементів масиву;
• пошук максимального (мінімального) елемента в масиві;
• упорядкування масиву за ознакою (наприклад за зростанням або спаданням та ін.).
Одним із найскладніших завдань є впорядкування елементів масиву. Для розв’язання цієї задачі існує декілька алгоритмів.
Сортування вибором:
1. Установити номер найбільшого елемента масиву.
2. Поміняти місцями найбільший і останній елементи.
3. Повторити 1 і 2 над остачею масиву (без останнього елемента).
Застосовувати цей метод до елементів масиву, що залишилися, доки залишок не скоротиться до одного елемента.
Аналогічно сортування вибором можна застосувати до найменшого елемента, міняючи його з першим. У результаті все одно отримаємо зростаючу (незменшувану) послідовність елементів масиву.
Обмінне сортування («бульбашка»):
1. Порівняти два поруч розташованих елементи.
2. Якщо пара порушує потрібний порядок слідування, елементи міняють місцями.
Порівняння відбувається до кінця масиву. Обмін здійснюється доти, поки прохід по масиву не викличе жодного обміну.
Існують й інші методи сортування масивів: метод уставки, швидке сортування тощо.
Виведення масиву. Виведення елементів одновимірного масиву на екран можна виконувати в рядок:
For i:=1 to n do Write (mas[i]);
або у стовпчик:
For i:=1 to n do Writeln (mas[i]).
Для виведення елементів двовимірного масиву у вигляді двовимірної таблиці (матриці) можна використовувати таку конструкцію:
For i:=1 to n do
Begin
For j:=1 to m do
Write (mas[i,j]);
Writeln;
End.

Циклічні програми

Циклічними програмами називають програми, в яких реалізовано команди циклу.
У Паскалі передбачено три різновиди операторів циклу: цикл із передумовою, цикл з післяумовою, цикл із лічильником (із покроковою зміною аргументу). Також реалізована робота із вкладеними циклами. Вкладені цик­ли — циклічні процеси, що допускають укладеність одних циклів в інші.
Цикл із передумовою (або цикл-«поки») — це цикл, у якому тіло циклу виконується тільки у разі виконання умови, заданої перед тілом циклу. Якщо умова стає невірною, то робота циклу припиняється і керування передається оператору, наступному за оператором циклу.
На мові Паскаль оператор циклу з перед­умовою ще називається «циклом While-Do».
WHILE <умова> DO <оператор>;
Приклад: обчислення суми перших 100 натуральних чисел методом послідовного додавання.
m:=1; S: =0;
WHILE m<=100 DO
begin
S:=S+m;
m:=m+1;
end;
Цикл із післяумовою (або цикл-«до») — це цикл, у якому тіло циклу виконується доти, поки умова, задана після тіла циклу, не стане правильною. Якщо умова стає правильною, то робота циклу припиняється й управління передається оператору, наступному за оператором циклу.
На мові Паскаль оператор циклу з після­умовою ще називається «цикл Repeat-Until».
REPEAT <оператор> UNTIL <умова>;
Приклад: обчислення суми перших 100 натуральних чисел методом послідовного додавання.
m:= 0; S: = 0;
REPEAT
m:=m +1;
S:=S+m;
UNTIL m >= 100;
Цикл із лічильником (із покроковою зміною аргумен­ту) — це цикл, у якому тіло циклу виконується заздалегідь відому кількість разів. У різних алгоритмічних мовах реалізація цього циклу може передбачати використання аргументів різних типів, зміну аргументу на різний крок, діапазон зміни аргументу і т. д.
Цикл із лічильником аргументу реалізовується таким чином:
1) аргументу надається початкове значення;
2) якщо значення входить у заданий діапазон, то виконується тіло циклу;
3) аргумент змінюється на заданий крок; виконується 2);
4) якщо значення не входить у заданий діапазон, то виконання циклу припиняється і керування передається оператору, наступному за оператором циклу.
У мові Паскаль реалізовано два оператори циклу з покроковою зміною аргументу: «цикл For-То» і «цикл For-DownТо».
FOR <лічильник циклу>:=<початкове значення> TO <кінцеве значення >DO<оператор>; (цикл з кроком 1),
FOR <лічильник циклу>:=<початкове значення>DOWNTO <кінцеве значення >DO<оператор>; (цикл з кроком –1),
де <лічильник циклу> — змінна порядкового типу,
<початкове значення> і <кінцеве значен­ня> — вирази того самого типу, що і <лічильник циклу> (діапазон зміни лічильника циклу),
<оператор> — простий або складовий оператор.
Приклади: обчислення суми перших 100 натуральних чисел методом послідовного додавання.
а) S: =0;
for m:=1 to 100 do
S:=S+m;
б) S: =0;
for m:=100 downto 1 do
S:=S+m;
Під час реалізації циклу з покроковою зміною аргументу в Паскалі необхідно заздалегідь знати про кількість повторень тіла циклу і пам’ятати про можливість зміни лічильника циклу тільки на 1 або –1.