Записи » Pascal - основи програмування

Основи програмування на мові Pascal

 

Спонсори

Записи

    Досить часто в повсякденному житті ми маємо справу не з одним видом інформації, а з комбінацією деяких видів інформації. Як приклад можна привести:

  • телефонні довідники, де розміщено відомості про абонентів (прізвище, ім’я, по батькові, адреса, номер телефону);
  • медична картка з різноманітними записам про пацієнта, але більшість з них співпадають (прізвище, ім’я, по батькові, дата народження, адреса, вага, зріст);
  • облікова картка володаря автомобіля (марка автомобіля, державний та заводський номери, дата проходження технічного огляду, колір) і т.д.

У програмуванні подібні однотипні записи прийнято називати записами.  Запис – це структурований тип даних, який об’єднує в собі різнотипні елементи, які називають полями запису. Запис описується спеціальною конструкцією, яка розпочинається словом Record. Наприклад, для ведення власного бібліотечного каталогу можна було б використати таку конструкцію:


Type                                                                                                                                                                               { розділ опису типів}
Book = Record { початок запису }
AuthorFamile : string[20];  { прізвище автора }
AuthorName : string[15];   { ім’я автора }
Title : string[90];   назва книги }
Date : word;   { рік видання }
Page : integer; { кількість сторінок }
Klass : byte;  { для визначення тематики книги }
End;  { кінець запису }

Описаний тип можна графічно представити так:

Book

AuthorFamile      AuthorName       Title         Date      Page      Klass

    Тобто ми маємо тип, у якого характерним є те, що він містить у собі дані різних типів (поля). У свою чергу, поля можуть бути записами, так наприклад, ми могли б більш точно задати поле Date, розбивши його в свою чергу на поля Day (день), Month (місяць),  Year (рік).

    Для роботи з такими даними ми повинні у розділі змінних ввести довільні змінні, наприклад BookOld та BookNew типу Book і працювати з ними далі можна як і з звичайними змінними. Відмітимо, що крім доступу до змінних, ми ще можемо мати доступ і до окремих полів. Так, якщо нам, наприклад, потрібно зробити запис у поле Year, то це здійснюється при допомозі команди BookNew.Year := 1999. Як видно, ми спочатку вказуємо назву змінної, а потім, через крапку, назву поля.

     Втім, для кращого розуміння сформулюємо і розв’яжемо задачу, в якій і покажемо методи роботи з записами.

 

    Задача: 1. Скласти програму заповнення та редагування бази даних про домашній електронний телефонний довідник.

    Розв’язання: Перед тим, як приступити до створення програми до поставленого завдання, ми повинні чітко усвідомити, які дані буде містити наша програма. Оскільки в задачі про це нічого не сказано, всю відповідальність покладено на нас.

    Домовимось для простоти, оскільки нас цікавить сам метод роботи з записами, що у нашому довіднику будуть міститися лише прізвища абонентів та їх телефони. Причому прізвища ми оголосимо в розділі сталих, а номери телефонів візьмемо довільні, наприклад, будемо їх утворювати при допомозі генератора псевдовипадкових чисел. У цьому випадку наша програма може мати хоча б такий вигляд:


Program demoRecord;
uses dos, crt;
const n    = 10;
      Name : array[1..n] of string[15] = ('Петренко','Козлюк',
               'Василенко','Носенко','Деричуб','Вернигора',
               'Котигорошко','Iвасюк','Iваненко','Коваленко');
Type Abonent = Record
                  FName : string[15];
                  Phone : integer;
                end;
Var Klient : array[1..2*n] of abonent;
    i, kol : integer;
    o, m : byte;
Procedure NewKlient;
begin
  inc(kol);
  write('Прiзвище нового абонента: '); readln(Klient[kol].FName);
  write('Телефон нового абонента: '); readln(Klient[kol].Phone);
  writeln;
end;
Procedure EditKlient;
begin
  write('Номер по списку абонента: '); readln(m);
  if (m > kol) or (m<1) then writeln('Будьте уважнi!')
  else begin
         write('Новий телефон абонента: ');
         readln(Klient[m].Phone);
       end;
  writeln;
end;
Begin
    for i := 1 to n do
    begin
       Klient[i].Fname := Name[i];
       Klient[i].Phone := Random(10001)+20001;
    end;
    kol := n;
    writeln;
    repeat
      for i := 1 to kol do writeln(i:2,'.  ',Klient[i].Phone,' - ',Klient[i].Fname);
      writeln;
  write('1-Новий абонент 2-Редагувати телефон 3-Закiнчити роботу');
      readln(o);
      if o = 1 then NewKlient;
      if o = 2 then EditKlient;
    until o > 2;
end.

    Як видно з приведеного тексту програми, робота з записами не вимагає нічого аж занадто складного, просто потрібно уважно працювати з відповідними змінними, не забуваючи вказувати потрібні поля. Ще раз наголошуємо, що при створенні власних програм, що будуть працювати з записами найбільш відповідальним є момент створення структури самого запису. Уявімо собі таку ситуацію, що у запропонованому варіанті розв’язання останньої задачі ми захотіли ввести прізвище ’Недеридоверхуноса’. Прізвище цілком можливе у тому розумінні, що може зустрітися прізвище, у якому більше ніж 15 символів. Що ж буде у цьому випадку? Нічого такого, що могло б заставити програму видати повідомлення про помилку – просто у поле FName буде занесено значення ’Недеридоверхуно’. Як бачите, наша примітивна база даних поступила досить розумно – вона просто відкинула від прізвища “зайві” символи, тобто ніби укоротила прізвище. У нашому випадку це не становить нічого страшного, але у випадку солідної програми, що працює ну хоча б в банку, така ситуація просто недопустима. Тому на етапі проектування   структури запису потрібно бути дуже уважним і передбачити всі крайні випадки. Більше того, у нашій програмі ми поле для номера телефону зробили типу Integer, тобто ми наперед свідомо “запрограмували” можливість помилок в роботі програми.

    Давайте ще раз запустимо на виконання нашу програму і введемо нового абонента з довільним прізвищем і телефоном ’2–22–22’. Спробуйте, і побачите, що програма видасть помилку і перестане працювати. Як ви вже здогадались, це пов’язано з тим, що ми вводили значення типу String, а програма очікувала отримати дані типу Integer. Спробуйте самостійно і досконало розібратись з питанням захисту програми від помилок під час її роботи, а ми до цього питання повернемось у наступному параграфі.

    Важливою особливістю записів є те, що звертання до полів запису є трохи громіздким, особливо при використанні довгих імен змінних та полів.        Для розв’язання цієї проблеми в мові Паскаль передбачено використання оператора with, який дозволяє лише один раз вказавши змінну типу запис в операторі with працювати з іменами полів як з звичайними змінними.

Так, у приведеній вище програмі, замість послідовності операторів


...
Klient[i].Fname := Name[i];
Klient[i].Phone := Random(10001)+20001;
...
можна було б записати так:
...
with Klient[i] do
begin
Fname := Name[i];
Phone := Random(10001)+20001;
end;
...

    Для кращого розуміння оператора with рекомендуємо самостійно модифікувати попередню програму, використавши в ній вказаний оператор.

скачать dle 10.4фильмы бесплатно Наступна сторінка » Файли Попередня сторінка » Множини