ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 28.06.2020
Просмотров: 1679
Скачиваний: 3
СОДЕРЖАНИЕ
Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування
Тема 16: Динамічна пам'ять. Адреси і покажчики
Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті
Тема 18: Процедури та функції для роботи з динамічною пам’яттю
Тема 19: Символьний тип даних. Упаковані масиви
Тема 20: Процедури та функції для обробки рядків
Тема 21: Структурований тип даних - безліч
Тема 22: Структурований тип даних – записи
Тема 23: Опис файлових змінних. Обробка типізованих файлів
Тема 24: Послідовний та прямий доступ до файлів
Тема 25: Обробка не типізованих файлів
Тема 26: Робота з текстовими файлами
Тема 28: Поняття та робота з процедурами та функціями
Тема 29: Використання модуля CRT. Програмування клавіатури
Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора
Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph
Тема 32: Бібліотечні модулі користувача
Тема 33: Основні принципи ООП. Створення об’єктів. Використання об’єктів
Основні алгоритми обробки масивів
Тема 20: Процедури та функції для обробки рядків
Строковий тип даних. Змінна типу String.
Усе раніше розглянуті типи даних могли зберігати тільки один об'єкт: чи символ число. У Turbo Pascal-і є тип даних для обробки ланцюжка символів – рядків. Цей тип даних займає проміжне положення між простими структурованими типами.
Для збереження рядків використовується змінна типу String (рядок), що складається з елементів типу Char. Оголошення її має вид:
var ім'я змінної : string[n];
де n – довжина рядка (кількість символів), що може зберігатися в цій змінній. За замовчуванням довжина рядка максимальна – 225 символів.
Приклад описів:
var str1 : string;
str2 : string[10];
str3 : string[64];
Змінну типу String можна обробляти як цілий рядок, чи як складену з окремих елементів типу Char. Значення, що привласнюються строковій змінний, полягають в апострофи:
str1 :='ми – ';
str2 :='учні';
str3 :='10-а класу';
Ці рядки можна об'єднати операцією конкатенації:
str4 :='ми -' + 'учні' + '10-а класу';
Для допуску до окремого символу в рядку в імені змінної вказують у квадратних дужках номер позиції символу в цьому рядку, наприклад, привласнивши
str1[1] :='А'{першим символом у рядок str1 занести 'А'}
str3[4] :='б' {четвертим символом у рядок str3 занести 'б'}
одержимо:
“А ми – учні 10-б класу”
До символів рядка застосовні всі операції, що і до змінної типу Char.
Рядки обробляються за допомогою наступних стандартних процедур і функцій.
Функція Length (Str) визначає довжину текстового рядка, що зберігається в перемінної Str. Наприклад.
var
str : string;
begin
write ('Уведіть рядок:');
readln (str);
writeln (‘У цьому рядку’, length (str),’ символів.’ )
end.
Функція UpCase(Str[i]) перетворює латинську букву з рядкової в прописну в i-й позиції рядка, що зберігається в змінній Str. Рядок обробляється за допомогою циклу. Наприклад.
var
str : string; i : byte;
begin
write (‘Уведіть рядок:’);
readln (str);
for i := 1 to length(str) do
str[i] :=UpCase(str[i]);
writeln(str)
end.
Функція Copy(Str,p,n) вирізає з рядка, що зберігається в змінній Str, фрагмент довжиною n символів, починаючи з позиції p. Наприклад.
var
str1, str2, str3, str4 : string;
begin
str1 := 'абракадабра';
writeln(str1);
str2 := copy(str1,2,4);
writeln(str2);
str3 := copy(str1,2,3);
writeln(str3);
str4 := copy(str1,3,3);
writeln(str4);
end.
Функція Pos(Frag,Str) виконує пошук фрагмента Frag у рядку Str. Якщо рядок містить фрагмент, то функція повертає номер позиції в рядку, з якої починається цей фрагмент; якщо такого фрагмента немає, - функція повертає 0. При пошуку символи фрагмента повинні збігатися із символами рядка; прописні і малі літери розрізняються, тобто «А» не ідентична «а». Наприклад.
var
frag,str : string; position : byte;
begin
write('Введіть слово: ');
readln(str);
write('Введіть фрагмент: ');
readln(frag);
position := pos(frag,str);
if position <> 0 then
writeln(‘Фрагмент’, frag,’ міститься в слові ‘,str,
‘, починаючи з позиції ‘, position)
else
writeln(‘Фрагмент’, frag,’ не міститься в слові ‘,str)
end.
Процедура Insert(Str1, str2,p) уставляє рядок Str1 у рядок Str2, починаючи з позиції р.
Процедура Delete(Str,p,n,) видаляє n символів рядка Str, починаючи з позиції р. Наприклад.
var
str1, str2: string[20];
begin
str1 := 'комп'ютеризація';
writeln(str1);
delete(str1,1,7);
Writeln(str1);
Delete(str1,3,2);
Writeln(str1);
str2:=’Г’;
Insert(str2,str1,1);
Writeln(str1);
str2:=’не’;
Insert(str2,str1,3);
Writeln(str1);
end.
Процедура Сoncat(str1, str2, . . str) виконує зчеплення рядків str1, str2,...str у зазначеному рядку. Результуючий рядок не повинен перевищувати 255 символів. Наприклад.
var
str1,str2:string;
begin
str1 := ’електро’;
Writeln(str1);
str2 := ’технічний коледж’;
Writeln(str2);
Writeln(‘новий рядок:’,concat(str1,str2));
end.
Питання для контролю
-
Змінна строкового типу.
-
Присвоєння значень строкової змінної.
-
Доступ до символів рядка.
-
Визначення довжини рядка.
-
Витяг фрагмента з рядка.
-
Пошук фрагмента в рядку.
-
Вставка одного рядка в інший.
-
Видалення символів з рядка.
-
Операція конкатенації рядків.
Тема 21: Структурований тип даних - безліч
Безліч – це структурований тип даних, що представляє обмежений, неупорядкований набір різних елементів однакового типу.
Кількість елементів в одній безлічі не повинна перевищувати 256.
У Pascal-і елементи безлічі задаються в квадратних дужках:
['а', 'd', 's', 'р'] чи [12, 10, 6, 17].
Елементи в одній безлічі не можуть повторюватися.
Безліч, що не містить елементів, називається порожньою і позначається так: [ ].
Елементи безлічі не можна вводити і виводити за допомогою процедур Read і Write. Значення безлічей задають в операторі присвоювання, наприклад:
x1 := [‘а', ‘d’, ‘s’, ‘р']; x2 := [ 12,10,6,17]
Для опису безлічі використовується слово Set Of (безліч з…). Опис повинен знаходитися або в розділі Type:
type ім'я типу = set of t;
var ім'я безлічі : ім'я типу;
або безпосередньо в розділі Var:
var ім'я безлічі : set of t;
де t базовий тип елементів безлічі. В якості базового типу можуть бути стандартні типи Byte і Char, а також перелічувальні та обмежені типи, утворені з них. Інші типи неприпустимі. Це по'язано з обмеженням безлічі в 256 елементів.
Приклад опису.
type a = set of 1..100;
var x1, x2, x3 : a;
тут елементами безлічі x1, x2, x3 можуть бути будь-як цілі числа від 1 до 100, наприклад:
x1 := [1,23,45,17,21,3]; x2 := [1,15,10,33]; x3 := [100];
Опис цих безлічей безпосередньо в розділі Var має вигляд:
var x1,x2,x3 : set of 1..100;
Нижче представлені операції, які можна виконувати над безлічами :
+ * - = <> <= >= in |
об'єднання безлічей; перетинання безлічей; вирахування безлічей; перевірка безлічей на рівність; перевірка безлічей на нерівність; перевірка безлічі на включення “міститься в”; перевірка безлічі на включення “містить”; перевірка на приналежність елемента безлічі. |
Розглянемо операції на прикладах. Нехай дані безлічі:
a := [5,8,10,3]; b =: [2,8,3,17];
Об'єднанням безлічей А+В є нова безліч, кожен елемент якої належить або безлічі А або В, наприклад:
var a,b,c : set of byte;
x: byte;
begin
a := [5,8,10,3]; b:=[2,8,3,17]; c := a+b;
write(‘безліч з = ’);
write(‘[ ’);
for x := 2 to 17 do
if x in c then write(x,’,’);
write(‘]’);
end.
Перетинанням безлічей А*В є нова безліч, що містить елементи, які належать безлічам А та В, наприклад:
var a,b,c : set of byte;
x : byte;
begin
a := [5,8,10,3]; b := [2,8,3,17]; c := a*b;
write(‘безліч з = ’);
write(‘[ ’);
for x := 2 to 17 do
if x in c then write(x,’,’);
write(‘]’);
end.
Вирахуванням безлічей А-В є нова безліч, складена з елементів безлічі А, не приналежніх безлічі В, наприклад:
var a,b,c: set of byte;
x: byte;
begin
a := [5,8,10,3]; b := [2,8,3,17]; c := a - b;
write(‘безліч з = ’);
write(‘[ ’);
for x := 3 to 10 do
if x in c then write(x,’,’);
write(‘]’);
end.
Безліч А=В, якщо елементи безлічі А та В однакові. Результат операцій логічного типу, True чи False, наприклад:
var a,b : set of byte;
res : boolean;
begin
a := [5,8,10,3]; b := [2,8,3,17];
if a = b then res := true else
res := false;
writeln(res);
end.
Перевірка безлічі на включення “міститься в“. Безліч А міститься в безлічі В, якщо всі елементи безлічі А маються в безлічі В. Результат операції А<=B логічного типу, True чи False, наприклад:
var a,b : set of byte;
res : boolean;
begin
a := [5,8,10,3]; b := [2,8,3,17];
if a <= b then res := true else
res := false;
writeln(res);
end.
Перевірка безлічі на включення “містить”. Безліч А містить безліч В якщо всі елементи безлічі В маються в безлічі А. Результат операції А>=В логічного типу, True чи False, наприклад:
var a,b : set of byte;
res : boolean;
begin
a := [5,8,10,3]; b := [2,8,3,17];
if a >= b then res := true else
res := false;
writeln(res);
end.
Перевірка на приналежність елемента безлічі. Операція Х in А служить для перевірки приналежності елемента базового типу Х безлічі А. Результат операції логічного типу, True, якщо належить, чи False, якщо не належить. Наприклад:
var a,b : set of byte;
res : boolean;
begin
writeln(‘уведіть ціле число n :’);
readln(n);
a := [5,8,10,3];
if n in a then res := true else
res := false;
writeln(res);
end.
Питання для контролю
-
Поняття безлічі у Pascal.
-
Максимальна кількість елементів у безлічі. Чи можуть повторюватися елементи в одній безлічі? А в двох і більш безлічей?
-
Зображення безлічі у Pascal. Порожня безліч.
-
Як у Pascal задають значення безлічей? Чи можна організувати введення – виведення елементів за допомогою процедур Read і Write?
-
Опис безлічей у програмі.
-
Яким типом може бути базовий тип елементів безлічі?
-
Перелічте операції над безлічами.
-
Операції об'єднання безлічей.
-
Операції перетинання безлічей.
-
Операція вирахування безлічей.
-
Операція перевірки безлічей на рівність і на нерівність.
-
Операція перевірки безлічей на включення “міститься в”.
-
Операція перевірки безлічей на включення “містить”.
-
Операція перевірки на приналежність якого-небудь значення безлічі.
Тема 22: Структурований тип даних – записи
Розглянемо список успішності учнів:
№ п/п Прізвище , ім'я Оцінки
1 Іванов Петро 4 5 5 5
2 Петров Сергій 4 4 5 4
3 Сидоров Віктор 4 4 4 5
Він складається з даних різних типів:
№ п/п – ціле число;
прізвище й ім'я – рядок;
оцінки – масив цілих чисел.
При обробці подібних списків і документів дані різного типу поєднують в одну групу, що називається записом.
Запис – це структурований тип даних, що складається з фіксованого числа елементів одного чи декількох типів.
Запис і кожен елемент запису позначають іменами. Для списку успішності учнів можна ввести наступні позначення:
sap – ім'я запису ;
nom – порядковий номер;
fam – прізвище та ім'я;
oc – оцінки.
До елемента запису звертаються за допомогою імені запису та імені елемента, розділеними крапкою:
Sap.nom – ім'я елемента 1;
Sap.fam – ім'я елемента 2;
Sap.oc – ім'я елемента 3;
Опис запису має вид:
type ім'я типу = record
ім'я елемента 1 : тип;
. . .
ім'я елемента n: тип;
end;
var ім'я запису : ім'я типу;
Службові слова Record (запис) і End виконують роль операторних дужок, усередині яких описуються елементи запису. Елементи запису з їхнім описом називаються полями запису. Список успішності учнів буде мати наступний опис:
type spisok = record
nom : integer;
fam : string[20];
oc : array[1..4] of integer;
end;
var sap : array[1..n] of spisok;
Тут spisok – ім'я типу; sap – змінна, що представляє собою масив типу spisok. Кожен елемент запису має свій опис: nom – змінна цілого типу, fam – рядок з 20 символів, ос – масив з 4-х цілих чисел.
Записи можна описувати безпосередньо в розділі змінних:
var ім'я запису : record
ім'я елемента 1 : тип;
. . .
ім'я елемента n: тип;
end;
Список успішності учнів буде мати наступний опис :
var sap = record
nom : integer;
fam : string[20];
oc : array[1..4] of integer;
end;
Елемент запису в програмі використовується як звичайна змінна, та її можна вказувати як у лівій частині оператора присвоювання, так і у вираженнях. Над елементами запису виконують ті операції, що припустимі для типу їхніх даних. Наприклад:
-
ввести значення порядкових номерів Read(Sap.nom);
-
обчислити середній бал оцінок
Sr_bal := (Sap.oc[1] + Sap.oc[2] + Sap.oc[3] + Sap.oc[4]) / 4;
Оператор приєднання With…do
При спільній обробці декількох полів можна скористатися оператором приєднання With…do, який дозволяє спростити звертання до полів запису. Ім'я запису виноситься в заголовок оператора приєднання, а в блоці Begin-End використовуються тільки імена полів, тобто без вказівки перед ім'ям поля імені змінної, що визначає запис.
Оператор приєднання має вид:
with ім'я запису do
begin
оператори;
end;
Для нашого приклада оператор приєднання можна записати так:
with sap[i] do
begin
read(nom);
sr_bal := (oc[1] + oc[2] + oc[3] + oc[4])/4;
end;
Приклад. Інформація про успішність учнів зберігається в масиві записів, кожен з який містить прізвище учня й оцінки по чотирьох предметах. Роздрукувати прізвище відмінників.
const n = 10; {кількість учнів у класі}