Л а б о р а т о р н а р о б о т а N 5
Робота з масивами та рядками символів
Мета роботи: вивчти способи оголошення, організації, ініціалізації
та алгоритмів опрацювання масивів даних і рядків символів.
Теоретичний вступ:
1. Масиви
Масиви містять кінцеву кількість елементів одного типу. Елементи масиву можуть бути структурованими. type ім'я_типу=array[T1] of T2; Найбільш часто для оголошення індексного типу використовується тип-діапазон.Якщо тип елементів в типі "масив" є масивом, то результатом є масив масивів, або багатовимірний масив: type matrix=array[boolean] of array[-2..2] of array[char] of byte; що еквівалентно наступному: type matrix=array[boolean,-2..2,char] of byte; Визначення типу "масив" не приводить до виділення пам'яті під масив. Пам'ять під масив виділяється компілятором при оголошенні змінних типу "масив" в блоці var.
Доступ до елементів масиву забезпечується вказанням їх індексів, сумісних з оголошеним індексним типом. Індекси вказуються після імені масиву у квадратних дужках. Для багатомірних масивів кожен індекс може братися в окремі квадратні дужки, або в одних квадратних дужках вказується список індексів через кому, наприклад:
mas[true][1]['a']:=5;mas[true,1,'a']:=5; Два масиви називаються тотожніми, якщо вони оголошені разом, або якщо для їх оголошення використовується один і той же ідентифікатор типу.
2. Рядковий тип
Рядковий тип (стрінг) у Турбо-Паскалі використовується для обробки текстів. Для його оголошення використовується ключове слово string: Якщо N не вказано, то довжина рядка приймається рівною 255 символів. Над стрінгами допускається виконання операції конкатенації, яка позначається символом '+'.На відміну від рядків фіксованої довжини результат конкатенації рядків можна присвоїти іншому стрінгу. Операція конкатенації допускається над стрінгом та іншим стрінгом, рядком символів фіксованої довжини або окремим символом.
Для стрінгів,рядків символів та окремих символів допускаються наступні операції відношення: =,<>,<,>,<=,>=. Операції відношення виконуються посимвольно зліва направо. При виконанні операцій відношення порівнюються ASCII-коди символів. Відповідність по довжині операндів не обов'язкова. Порівняння здійснюється до вичерпання довжини коротшого рядка. Результатом порівняння двох рядків є значення константи булевського типу true або false. Ввід рядка за допомогою процедури Read залишає у буфері вводу два символи #13#10, які виникають при натисканні клавіші Enter. Тому при наступному вводі рядків символів, наприклад, у циклі, буде прочитаний пустий рядок. Символи #13#10 будуть прочитані також наступною процедурою вводу символів, що приведе до неправильного вводу даних. Тому для вводу рядків та символів краще користуватися процедурою Readln, яка не залишає у буфері вводу вказаних символів. При вводі рядків у циклі необхідно обов'язково використовувати процедуру Readln. Наступна програма здійснює у циклі ввід рядків символів та записує їх у зворотному порядку.
4. Бібліотечні процедури та функції для роботи з рядками символів
1. Визначення довжини рядка.
Function Length(s:string):integer;
2. Конкатенація рядків.
Function Concat(s1 [,s2,...,sn]):string;
Здійснює об'єднання рядків s1, s2, ... ,sn. Якщо сумарна довжина рядка буде більшою від 255 або від довжини рядка, розміщеного в лівій частині оператора присвоєння, то результуючий рядок відсікається зправа.
3. Копіювання рядків.
Function Copy(s:string;index:integer;count:integer):string;
Повертає підрядок з count символів, починаючи з позиції index рядка s. Якщо index>length(s), то повертає пустий рядок. Якщо count>length(s)-index+1, то повертає length(s)-index+1 символ.
4. Визначення входження одного рядка в інший.
Function Pos(substr:string;s:string):byte;
Повертає номер позиції першого входження підрядка substr в рядок s. Якщо substr не входить в s, то повертає 0.
5. Вставка одного рядка в інший.
Procedure Insert(substr:string; var s:string; index:integer);
Вставляє підрядок substr в рядок s, починаючи з символа з номером index.
6. Витирання підрядка з рядка.
Procedure Delete(var s:string; index:integer; count:integer);
Витирає count символів з рядка s, починаючи з номера index. Якщо index=0, або count=0, або index>length(s), то рядок не міняється. Якщо count>length(s)-index+1, то витираються символи до кінця рядка.
7. Перетворення числа у рядок.
Procedure Str(t [:w [:d]]; var s:string);
Перетворює дійсне або ціле число t у рядок символів s. Значення w та d можуть бути константами, змінними або виразами типу integer і відповідно позначають загальну кількість символів та кількість символів після десяткової крапки (тільки для дійсного типу). Якщо w<=sizeof(s), то рядок буде складатися з w символів заокругленого числа. Якщо w>sizeof(s), то рядок буде містити sizeof(s) символів заокругленого числа. Якщо w>0, то рядок вирівнюється по правій стороні, якщо w<0, то по лівій стороні. Для дійсних чисел, якщо d=0, а w<8, то приймається w=8 і рядок представляє запис числа з плаваючою крапкою.
8. Перетворення рядка символів у число.
Procedure Val(s:string; var x; ErrCode:integer);
Перетворює рядок із цифр в значення цілого або дійсного числа x. В рядку s не повинно бути ведучих пропусків. Тип x повинен відповідати вмісту рядка s. Для контролю переповнення при перетворенні бажано використати директиву компілятора {$R+}. При перетворенні в ціле бажано оголосити x як longint.
Параметр ErrCode=0, якщо перетворення пройшло успішно, інакше містить номер позиції, де знайдений помилковий символ.
9. Заповнення змінної значенням байта.
Procedure FillChar(var x; count:word; ch:value);
Записує значення ch в count байтів змінної x. Змінна x може бути довільного типу, а значення ch - порядкового типу.
Завдання для роботи:
1. Задана послідовність iз n=20 дійсних чисел. Знайти середнє арифметичне чисел цієї послідовності, якi розміщені між максимальним та мінімальними числами, включаючи цих два числа.
2. Заданий рядок, що складається iз слiв, роздiлених пропусками:
а) знайти кiлькість однакових слiв у рядку;