
- •Методичні вказівки для допомоги студентам у вивченні самостійних тем з предмету
- •Урок № 6
- •Особливості інтегрованого середовища програмування Turbo Pascal. Основні пункти меню
- •Урок № 13
- •Поняття рекурсії. Зовнішні оголошення та оголошення процедур та функцій з випередженням
- •Урок № 14
- •Особливості роботи в текстовому режимі
- •Урок № 20
- •Сортування масиву. Методи сортування масиву
- •Урок № 21
- •Рекурсивне сортування масиву методом вибору
- •Урок № 21
- •Алгоритми роботи з двомірними таблицями на мові програмування Pascal
- •Урок № 25
- •Приклади опису багатомірних масивів засобами мови програмування Pascal
- •Урок № 26
- •Робота з елементами двомірного масиву
- •Урок № 27
- •Записи. Види записів. Робота з записами
- •Урок № 30
- •Множини. Дії над множинами
- •Урок № 32
- •Запис/читання файлу. Маніпуляції вмістом файлу
- •Урок № 33
- •Типізовані файли. Текстові файли. Нетипізовані файли
- •Урок № 37
- •Динамічні данні без внутрішніх посилань
- •Урок № 42
- •Робота з кольорами
- •Урок № 43
- •Робота з координатами
- •Урок № 44
- •Принцип виведення точки та лінії на екран
- •Урок № 45
- •Принцип побудови не заповнених геометричних фігур
- •Урок № 46
- •Принцип побудови заповнених геометричних фігур
- •Урок № 47
- •Виведення тексту в графічному режимі
- •Урок № 50
- •Використання модуля mouse Питання для вивчення:
- •Урок № 51
- •Принципи побудови графічного зображення, що рухається
- •Урок № 52
- •Модуль Graphs3d
Урок № 26
(згідно робочої навчальної програми)
Робота з елементами двомірного масиву
Питання для вивчення:
Знаходження кількості елементів з даною властивістю.
Заповнення масиву по правилу
Для обробки двовимірних масивів можуть застосовуватися методи рішення задач, розглянуті в темі "Одновимірні масиви". Оскільки положення елементу в двовимірному масиві описується двома індексами (перший - номер рядка, другого, - номер стовпця), програми більшості завдань будуються на основі вкладених циклів.
Знаходження кількості елементів з даною властивістю. Завдання на знаходження номерів елементів із заданими властивостями і на знаходження кількості таких елементів у всьому масиві залишаться практично такими ж. У них тільки додасться другий цикл або виведення двох індексів замість одного.
Завдання 1. Знайти максимальний елемент масиву і його індекси. Оскільки елементи можуть повторюватися, то потрібно запам'ятати тільки індекси першого максимального елементу. Процедура, якою передається масив, і її результатом є значення максимального елементу і індекси першої зустрічі такого значення.
Procedure Maximum(X : MyArray; n, m : integer; Var Max, Maxi, Maxj : integer);
Var i, j : integer;
Begin
Max := X[1, 1]; {нехай максимумом є перший елемент}
Maxi := 1;
Maxj := 1; {и перший стовбчик}
for i := 1 to n do
for j := 1 to m do
if X[i, j] > Max {якщо серед елементів знайшли більший}
then
begin
Max := X[i, j];{внесем новое найденное значение в переменную Мах}
Maxi := i; {и не забудем запомнить индексы строки}
Maxj := j; {и столбца этого элемента}
end;
End;
Заповнення масиву по правилу. Завдання. Заповнити масив А розміром NXM "змійкою" таким чином:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Для того, щоб заповнити, треба вивести правило заповнення, а воно в даному випадку буде таким:
якщо ряд непарний, то A[i, j]=(i-1)*m+j;
якщо ряд парний, то A[i, j]=i*m-j+1.
За цим правилом і складаємо процедуру заповнення:
Procedure FillArray(Var X : MyArray2; n, m : integer);
Var
i, j : integer;
Begin
for i := 1 to n do
for j := 1 to m do
if i mod 2 =1
then
A[i, j]=(i-1)*m+j
else
X[i, j]=i*m-j+1;
End;
Питання для контролю вивченого матеріалу:
Наведіть приклад об’яви двовимірного масиву.
Як масив заповнується по певній формулі?
Яким методом відбувається пошук елемента з певною властивістю двовимірного масиву?
Як обчислюється кількість таких елементів?
Література:
Фаронов В.В. Турбо Паскаль. В 3-х кн. Кн. 1. Основы Турбо Паскаля М.: МВТУ - ФЕСТО ДИДАКТИК, 1992, стор. 209 — 215
Урок № 27
(згідно робочої навчальної програми)
Записи. Види записів. Робота з записами
Питання для вивчення:
Поняття записів.
Оголошення записів.
Масиви записів.
Записи з варіантами
Поняття записів. Запис - структурований тип даних. Записи є неоднорідними неупорядкованими структурами з прямим доступом до компонентів. Компоненти запису називають полями запису.
Зазвичай запис містить сукупність різнотипних атрибутів, що відносяться до одного об'єкту. Наприклад, інформація про рекорди з бігу у чоловіків для відкритих стадіонів може містити наступні атрибути
рекордсмен
країна
статус змагань (Олімпіада, чемпіонат світу)
довжина дистанції
рік рекорду
час
Оголошення записів. Запис може бути оголошена в розділі type:
ідентифікатор типу = Record
поле1: тип;
поле2: тип;
...
полеN: тип
end;
Наприклад,
type beg = record
fam: string [25];
srtana: string [20];
status: boolean; {Олімпіада - true; чемпіонат світу — false}
dlina: longint;
god: 1900 .. 2009;
vr: string [15];
end;
Var a: beg;
До кожного елементу запису можна звернутися, використовуючи складене ім'я, яке має наступну структуру:
<Ім'я змінної>. <Ім'я поля>
Наприклад,
a.fam; a.dlina і т.п.
Якщо, наприклад, потрібно полю "status" присвоїти значення «true», то це робиться так:
a.status: = true;
Поля запису можуть мати будь-який тип, крім файлу, зокрема, самі можуть бути записами. Наприклад,
type beg1 = record
fam: string [25];
srtana: string [20];
status: boolean; {Олімпіада - true; чемпіонат світу — false}
dlina: longint;
god: 1900 .. 2009;
vr: record min: longint;
sec: real
end
end;
Var a: beg1;
Поля такого запису, що знаходяться на третьому рівні, ідентифікуються потрійним складовим ім'ям. Наприклад,
a.vr.min
a.vr.sec
Масиви записів. У програмі можуть використовуватися масиви записів.
Будь-яка обробка записів, у тому числі введення і виведення, проводиться поелементно. Наприклад,
var b: array [1 .. 200] of beg1;
...
write ('Кількість рекордсменів?'); readln (n);
for i: = 1 to n do
with b [i] do
begin
write ('Прізвище спортсмена?'); readln (fam);
write ('Громадянин якої країни спортсмен?'); readln (strana);
write ('Статус змагання?'); readln (status);
write ('Довжина дистанції?'); readln (dlina);
write ('Рік проведення змагання?'); readln (god);
write ('Час, за який спортсмен пробіг дистанцію (хв, сек)?'); readln (vr.min,
vr.sec);
end;
...
У прикладі був використаний оператор приєднання, який має наступний вигляд:
with <змінна типу запис> do <оператор>;
Він дозволяє, один раз вказавши ім'я змінної типу "запис" після слова with, працювати в межах одного оператора (простого чи складеного) з іменами полів як з звичайними змінними, тобто не писати громіздких складових імен. Обсяг пам'яті, займаний записом, визначається сумарним обсягом, займаним її полями:
type beg1 = record
fam: string [25]; {26 байт}
srtana: string [20]; {21 байт}
status: boolean; {1 байт}
dlina: longint; {4 байти}
god: 1900 .. 2009; {2 байти}
vr: record min: longint; {4 байти}
sec: real {6 байт}
end
end;
Всього отримано: 26 +21 +1 +4 +2 +4 +6 = 65 байт
Масив, описаний вище, займає 65 байт × 200 елементів = 13000 байт оперативної пам'яті.
Записи з варіантами. При визначенні типу запису в неї можна включати варіантну частину. Це означає, що різні змінні, хоча вони відносяться до одного типу, можуть мати різні структури. Варіантна частина запису починається вибором case і слід за загальною частиною; після її закінчення в запису не можуть з'являтися ніякі інші поля, тому case закривається службовим словом end.
Будь-який запис може мати тільки одну варіантну частину, яка повинна розміщуватися в кінці запису (після фіксованої частини). Однак, усередині якого-небудь варіанта, в свою чергу, може бути присутнім інша варіантна частина, вкладена в першу.
При запису варіанта (списків елементів) обов'язкова наявність круглих дужок, навіть якщо в них нічого не укладається.
Наприклад, нехай необхідно задати інформацію про деяке людині, вказавши прізвище і рік народження, а також, якщо це чоловік, то повідомити, військовозобов'язаний чи він і яку має спеціальність, а якщо це жінка, то вказати, чи заміжня вона і скільки має дітей.
Type pol = (m, w);
people = record
fam: string [20];
godro: 1900 .. 2007;
case mw: pol of
m: (voen: boolean; spec: string [15]);
w: (merry: boolean; child: byte)
end;
var p1, p2: people;
Всі імена елементів повинні бути різними, навіть якщо вони зустрічаються в різних варіантах. До елементів варіантної частини можна звертатися так само, як до елементів фіксованої частини запису.
P1.mw: = m; p1.voen: = true; p2.child: = 2;
У процесі виконання програми в структуру запису включається той варіант, елементам якого в даний момент було присвоєно значення. Як тільки якому-небудь елементу іншого варіанту присвоюється деяке значення, в структуру запису включається цей варіант, а елементи попереднього варіанта стають невизначеними. Дана обставина враховується і при підрахунку обсягу пам'яті, що відводиться під запис з варіантами. Статичні поля враховуються звичайним чином, а серед варіативної частини відшукується той випадок, де сумарний обсяг пам'яті для полів максимальний.
Type pol = (m, w);
people = record
fam: string [20]; {21}
godro: 1900 .. 2007; {2}
case mw: pol of {1}
m: (voen: boolean; spec: string [15]); {1 +16 = 17}
w: (merry: boolean; child: byte) {1 +1 = 2}
end;
21 + 2 + 1 + max (17, 2) = 41 (байт)
Питання для контролю вивченого матеріалу:
Чим відрізняється тип "запис" від інших структурованих типів?
Чи можуть поля запису бути одного і того ж типу?
Як звернутися до окремого поля запису?
Як заповнити масив записів?
Література:
Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 95 — 103