Складні структури даних в паскалі

Автор: Пользователь скрыл имя, 27 Декабря 2011 в 11:37, курсовая работа

Описание работы

Мова Паскаль відноситься до парадигми структурного програмування. Це значить, що поняття «структура» входить у програму не тільки на рівні загальної її побудови, але і передбачає структурування самої логіки й даних якими оперує мова програмування. Перш за все, даний принцип знайшов своє застосування в типізації мови, тобто наділенні її жорсткою системою визначених типів, комбінуючи які кваліфікований програміст може створювати свої власні типи, причому вже не тільки прості (атомарні), але і складні конструкції, які представляють собою – структури даних.

Работа содержит 1 файл

курсова(паскаль)у.doc

— 99.00 Кб (Скачать)

     R.F,

     де R - змінна комбінованого типу;

     F - ідентифікатор поля.

     Незалежно від кількості оголошених змінних типу "запис", поля кожної змінної називаються однаково, відповідно до шаблона. Оскільки імена полів "сховані" усередині типу, вони можуть збігатися з іменами "зовнішніх" змінних і поля в інших описах записів, наприклад: 

      type PointRecType = RECORD

      X,Y : Integer

      END;

      ColorPointRecType = RЕСОRD

      X,Y:Integer;

      Color:Word

      END;

      var X,Y :Integer; Point :PointRecType;

      ColorPoint :ColorPointRecType; 

     У програмі X,Point.X, ColorPoint.X - зовсім різні  значення.

     Записи  в Паскалі можуть мати так звану варіантну частину. Це означає, що в межах одного типу можна задати декілька різних структур. Безпосередній вибір однієї зі структур буде визначатися контекстом або сигнальним значенням [2, c. 64]. Варіантні поля при завданні шаблону запису вказуються після того, як перераховані всі поля фіксованого типу й оформляються особливим чином:  

     TYPE

     VRecType = RECORD {Тип запису  з варіантами}

     Number :Byte;

     case Measure : Char of {Ознака  одиниць виміру  довжини}

     'д','Д':(INChes : Word); {В дюймах}

     'с','С':(cantimeters :LongInt); {В сантиметрах}

     '?':(Comment1,Comment2 : String[16]) {Тексти - коментарі}

     END;   

     В прикладі запису є звичайне фіксоване  поле Number, і поле-селектор Measure, обрамлене словами CASE і OF, після чого йде перерахування варіантів 3-го поля в круглих дужках. Вміст поля-селектора визначає, який саме варіант буде обраний при роботі з записом. В  один й той же момент доступні поля тільки одного з можливих варіантів, в залежності від значення, привласненого полю - селектору. Усі варіанти розташовуються в одному й тому ж самому місці пам'яті, а розмір цього місця визначається самим об'ємним варіантом – в даному випадку 2*(16+1) байтів для поля String[16].

     Поле-селектор можна ігнорувати, звертаючись до кожного з полів варіантів - те саме значення буде трактуватися відповідно до типу поля. В такому випадку завжди існує можливість помилок, які ніяк не діагностуються, але якщо не помилятися, то можна зі зручністю використовувати варіантні записи для збереження різних варіантів наприклад, як у наведеному прикладі, одиниць виміру довжини [3, c. 88].

     Якщо  явний покажчик варіанта не потрібний, його можна замінити ім'ям будь-якого перелічуваного типу, що має достатню кількість варіантів: 

      TYPE

      VRecType = RECORD

      Number :Byte;

      case Byte of

      1:(INChes : Word); {В дюймах}

      2:(cantimeters :LongInt); {В сантиметрах}

      3:Comment1,Comment2 : String[16]) {Тексти - коментарі}

      END;   

     Значення  констант в процесі опису в  цьому випадку - чиста формальність і можуть бути будь-якими неповторюваними  в межах типу Byte [7, c. 105]. При відмовленні від поля-селектора під час роботи програми вже не можна визначити, який варіант повинний використовуватися в даний момент і так звичайно працюють при необхідності різнотипного представлення тих самих даних:  

      TYPE

      CharArrayType = Array[1..4] of char;

      VAR

      V4:RECORD

      case Boolean of

      True : (C:CharArrayType);

      False: (B1,B2,B3,B4 :Byte)

      END;   

     Поля B1..B4 дозволяють працювати з ASCII - кодами символів, а поля З[1]..C[4] - із символами, не прибігаючи до явного перетворення типів.

     Змінні  типу "запис" можуть брати участь тільки в операціях присвоювання, а їх поля - у будь-яких дозволених для їхнього типу операціях [1, c. 103].

     Для полегшення роботи з полями записів  у Паскалі введений оператор приєднання WITH з наступним синтаксисом використання:

     WITH Ім.’яЗмінноїЗапису DO Оператор;

     Усередині оператора звертання до полів  уже виробляється без вказівки імені  змінної:  

      VAR

      DemoRec : RECORD X,Y :Integer END;

      WITH DemoRec DO

      begin

      X:=0;Y:=129;

      End;   

     При використанні всередині WITH "незаписних" змінних необхідно стежити, щоб їх імена не збігалися із "записними". При необхідності "розв'язки" всередині WITH до співпадаючих зовнішніх імен необхідно дописати перед ними через крапку, ім'я програми чи модуля в якому вони описані: 

      PROGRAM MAIN;

      VAR X,Y :Integer;

      RecXY :RECORD X,Y :Integer END;

      begin

      WITH RecXY DO begin

      X:=3.14*Main.X;

      Y:=3.14*Main.Y end;

      end;  

     Якщо  одне з полів запису - теж запис, можна поширити оператор приєднання на декілька полів всередину, перелічивши їх через кому, але всередині тіла оператора можна буде звертатися тільки до останніх полів: 

      WITH Имязаписи, Поле_Запис  DO

      begin

      Звертання до імен полів Поля_Запис

      end;

 

      РОЗДІЛ 3. ДЕМОНСТРАЦІЙНІ ПРИКЛАДИ

     3.1 Приклад 1.

 

 Дано два комплексних  числа. Знайти комплексне число, що є  сумою даних чисел. Використовувана структура даних - запис [14, c. 116].

  

PROGRAM Summa (Input,Output);

      type

         Complex = Record

                      RE: Real;

                      IM: Real

                   end;

      var  X,Y: Complex;   { Вхідні параметри }

             S: Complex;   { Результат          }

   BEGIN

      WriteLn ('Уведіть дійсну  і мниму частину  комплексного числа  X :');

      Read (X.RE,X.IM); WriteLn;

      WriteLn ('Уведіть дійсну  і мниму частину  комплексного числа  Y :');

      Read (Y.RE,Y.IM); WriteLn;

      S.RE:=X.RE+Y.RE; S.IM:=X.IM+Y.IM;

      Write ('Перед Вами - результат... ', S.RE:5:2,' + i',S.IM:5:2)

   END.

     3.2 Приклад 2.

     Програма, що демонструє роботу оператора приєднання With [12, c. 94].  

        PROGRAM  Wit (Input,Output);

           type

              R = Record         { R - ім'я комбінованого  типу }

                     X: Real;

                     Y: Char

                  end;

              Q = Record         { Q - ім'я комбінованого  типу }

                     A: Integer; { A - ім'я поля }

                     B: R

                  end;

           var U: Q;

               X: Integer;

               A: Char;

        BEGIN

           U.A:=2; U.B.X:=7.3; U.B.Y:='І';   { Ініціалізація змінних  комбінованого типу }

           WriteLn ('Уміст поля A ... ',U.A); { Інший спосіб ініціалізації  }

           WriteLn; WriteLn 1  0('     Використання оператора With...');

           With  1  0U  1  0do

              begin

                 A:=1; B.X:=6.7; B.Y:='A'; WriteLn ('Уміст  поля A 1.. ',A,', ')

              end;

           A:='C'; WriteLn ('а значення  змінної A ... ',A)

        END.

     3.3 Приклад 3.

     Копіювання  одного запису в іншу [11, c. 315]. 

        PROGRAM  Copyrovanie (input,output);

           type

              P = Record

                     n      : integer;

                     FIO    : string[12];

                     Otsenka: array[1..3] of integer

                  end;

           var V,VCopy: P;

        BEGIN

           V.n:= 5; V.FIO:= 'Зеніт';  { Ініціалізація змінної  V комбінованого типу }

           V.Otsenka[1]:= 4; V.Otsenka[2]:= 5; V.Otsenka [3]:= 3;

           VCopy := V;        { Запис V скопійований  у запис VCopy! }

           WriteLn('Гляньте, чи правильно ми скопіювали... ');

           Write (VCopy.n,' ',VCopy.FIO,' ',VCopy.Otsenka[1],' ',

                            VCopy.Otsenka[2],' ',VCopy.Otsenka[3]); WriteLn

        END.

     3.4 Приклад 4.

     Нижче наведена демонстраційна програма, яка  показує основні моменти роботи з комбінованими типами даних, а саме:

     a) опис масиву записів; 

     b) ініціалізацію масиву записів; 

     c) передача значень комбінованого  типу в процедуру і повернення  результатів в основну програму.

     Постановка  задачі: дано масив записів, який складає з двох елементів. Запис має три поля: речовинного, цілого і символьного типів. Необхідно знайти для кожного елемента масиву суму вмісту "цілого" і "речового" полів [9, c. 130]. 

        PROGRAM Demostr;

           type

              R = 1..2;

              Q = Record           { Q - ім'я комбінованого типу }

                   Logic: Boolean;         { Ім'я   поля : Logic  }

                   Tchislo: Integer;       { Ім'я   поля : Tchislo}

                   Coffi: Real;            { Ім'я  поля : Coffi  }

                end;              { Після імені поля - тип поля }

Информация о работе Складні структури даних в паскалі