Записи. Види записів. Робота з записами
Питання для вивчення: 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
Урок № 30 (згідно робочої навчальної програми) ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|