Файл: ОП Конспект лекций - Паскаль.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 28.06.2020

Просмотров: 1656

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Тема 13: Складні типи. Масиви

Тема 14: Багатомірні масиви

Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування

Тема 16: Динамічна пам'ять. Адреси і покажчики

Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті

Тема 18: Процедури та функції для роботи з динамічною пам’яттю

Тема 19: Символьний тип даних. Упаковані масиви

Тема 20: Процедури та функції для обробки рядків

Тема 21: Структурований тип даних - безліч

Тема 22: Структурований тип даних – записи

Тема 23: Опис файлових змінних. Обробка типізованих файлів

Тема 24: Послідовний та прямий доступ до файлів

Тема 25: Обробка не типізованих файлів

Тема 26: Робота з текстовими файлами

Тема 27: Типізовані константи

Тема 28: Поняття та робота з процедурами та функціями

Тема 29: Використання модуля CRT. Програмування клавіатури

Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора

Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph

PointType = record

Тема 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.



Питання для контролю

  1. Змінна строкового типу.

  2. Присвоєння значень строкової змінної.

  3. Доступ до символів рядка.

  4. Визначення довжини рядка.

  5. Витяг фрагмента з рядка.

  6. Пошук фрагмента в рядку.

  7. Вставка одного рядка в інший.

  8. Видалення символів з рядка.

  9. Операція конкатенації рядків.


Тема 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.



Питання для контролю

  1. Поняття безлічі у Pascal.

  2. Максимальна кількість елементів у безлічі. Чи можуть повторюватися елементи в одній безлічі? А в двох і більш безлічей?

  3. Зображення безлічі у Pascal. Порожня безліч.

  4. Як у Pascal задають значення безлічей? Чи можна організувати введення – виведення елементів за допомогою процедур Read і Write?

  5. Опис безлічей у програмі.

  6. Яким типом може бути базовий тип елементів безлічі?

  7. Перелічте операції над безлічами.

  8. Операції об'єднання безлічей.

  9. Операції перетинання безлічей.

  10. Операція вирахування безлічей.

  11. Операція перевірки безлічей на рівність і на нерівність.

  12. Операція перевірки безлічей на включення “міститься в”.

  13. Операція перевірки безлічей на включення “містить”.

  14. Операція перевірки на приналежність якого-небудь значення безлічі.


Тема 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; {кількість учнів у класі}