Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostostoyat_Paskal.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
360.96 Кб
Скачать

Урок № 26

(згідно робочої навчальної програми)

Робота з елементами двомірного масиву

Питання для вивчення:

  1. Знаходження кількості елементів з даною властивістю.

  2. Заповнення масиву по правилу

Для обробки двовимірних масивів можуть застосовуватися методи рішення задач, розглянуті в темі "Одновимірні масиви". Оскільки положення елементу в двовимірному масиві описується двома індексами (перший - номер рядка, другого, - номер стовпця), програми більшості завдань будуються на основі вкладених циклів.

Знаходження кількості елементів з даною властивістю. Завдання на знаходження номерів елементів із заданими властивостями і на знаходження кількості таких елементів у всьому масиві залишаться практично такими ж. У них тільки додасться другий цикл або виведення двох індексів замість одного.

Завдання 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;

Питання для контролю вивченого матеріалу:

  1. Наведіть приклад об’яви двовимірного масиву.

  2. Як масив заповнується по певній формулі?

  3. Яким методом відбувається пошук елемента з певною властивістю двовимірного масиву?

  4. Як обчислюється кількість таких елементів?

Література:

Фаронов В.В. Турбо Паскаль. В 3-х кн. Кн. 1. Основы Турбо Паскаля М.: МВТУ - ФЕСТО ДИДАКТИК, 1992, стор. 209 — 215

Урок № 27

(згідно робочої навчальної програми)

Записи. Види записів. Робота з записами

Питання для вивчення:

      1. Поняття записів.

      2. Оголошення записів.

      3. Масиви записів.

      4. Записи з варіантами

Поняття записів. Запис - структурований тип даних. Записи є неоднорідними неупорядкованими структурами з прямим доступом до компонентів. Компоненти запису називають полями запису.

Зазвичай запис містить сукупність різнотипних атрибутів, що відносяться до одного об'єкту. Наприклад, інформація про рекорди з бігу у чоловіків для відкритих стадіонів може містити наступні атрибути

рекордсмен

країна

статус змагань (Олімпіада, чемпіонат світу)

довжина дистанції

рік рекорду

час

Оголошення записів. Запис може бути оголошена в розділі 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 (байт)

Питання для контролю вивченого матеріалу:

  1. Чим відрізняється тип "запис" від інших структурованих типів?

  2. Чи можуть поля запису бути одного і того ж типу?

  3. Як звернутися до окремого поля запису?

  4. Як заповнити масив записів?

Література:

Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 95 — 103

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]