ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Інтервальні типи даних. Оператор TYPE. Масиви
         

     

    Інформатика, програмування

    Інтервальні типи даних. Оператор TYPE. Масиви

    С.А. Григор'єв

    Інтервальний тип - це деякий підтип порядкового типу даних (згадаємо, що порядкові типи - це ShortInt, Byte, Integer, Word, LongInt, Char і Boolean). Нехай, наприклад, деяка мінлива в програмі може приймати значення від -1 до 99. Ми могли б описати її як LongInt або Integer (безглуздо!), Могли б описати її як ShortInt, що досить розумно. Але можна створити для неї і спеціальний тип даних, який об'єднує лише числа від -1 до 99:

    VAR x: -1 .. 99;

    Замість імені одного з стандартних типів ми використовували в описі змінної побудований нами власний інтервальний тип. Таким чином описана мінлива x може приймати лише значення -1,0,1 ,..., 99, в іншому вона нічим не відрізняється від інших цілих змінних. Її можна вводити, виводити, використовувати в якості змінної циклу, підставляти у вирази і т.п. Будь-інтервальний тип є підтип деякого стандартного базового типу, в нашому випадку - типу ShortInt. Але якщо б ми стали використовувати інтервальний тип -1 .. 200, то він би вже був підтипом типу Integer, а 0 .. 200 - підтипом типу Byte. Компілятор Паскаля самостійно аналізує інтервальні типи і підбирає для них мінімальний відповідний базовий тип. Це потрібно знати, щоб визначати розмір та спосіб кодування ваших змінних. Ви можете виконати оператор

    WRITE ( 'мінлива x: -1 .. 99 займає ', SizeOf (x),' байт');

    і переконатися, що її розмір дійсно дорівнює 1.

    Як базовий типу можна використовувати не тільки арифметичні типи, але і типи Char і Boolean (правда, в останньому випадку це досить безглуздо). Опишемо, наприклад, змінну, значення якої можуть бути тільки маленькі латинські літери:

    VAR Letter: 'a' .. 'z';

    або змінну, в якій можуть зберігатися російські літери:

    VAR RusLetter: 'А' .. 'я';

    У загальному випадку інтервальний тип описується як

    константні вираз 1 .. вирази зі сталими 2,

    де обидва вирази мають один порядковий тип і друга з них не менше першого. Створеним вами типами ви можете давати імена, для цього використовується оператор TYPE:

    TYPE ім'я типу = опис типу;

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

    CONST Tmin =- 5;

    Tmax = 15;

    TYPE T_Range_Type = Tmin .. Tmax;

    VAR t: T_Range_Type;

    TYPE T_Range_SubType = Tmin +3 .. Tmax-5;

    VAR t1: T_Range_SubType;

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

    Тепер, знаючи про інтервальних типах, ми можемо говорити про масивах. Масив у всіх мовах програмування - це безліч індексованих (пронумерованих) однотипних елементів. У Паскалі опис одновимірного масиву має вигляд:

    ARRAY [тип індексу] OF тип елементу

    Тут тип індексу - ShortInt, Byte, Char, Boolean або інтервальний тип; тип елемента - будь-який тип, у тому числі і масив. Ви помітили, що не всі порядкові типи можна використовувати як тип індексу, це не означає, що, наприклад, тип Word чимось гірше типу Byte. Таке обмеження обумовлене тим, що в Паскалі ніякої об'єкт не може мати розмір більше (64К - 2) байти, або 65534 байти. Це обмеження діє і для інтервальних типів, так ви можете описати масив VAR a: ARRAY [1 .. 65534] OF BYTE;

    але не масив VAR a: ARRAY [1 .. 65535] OF BYTE;

    і не масив VAR a: ARRAY [1 .. 33000] OF WORD;

    Більше ніяких обмежень на тип індексу не накладається. Тип елементів масиву може бути будь-яким - цілочисельності, речовим, символьним, логічним, інтервальним. Елементи масиву можуть бути масивами, тоді ви отримаєте масив розмірністю більше ніж 1. Опишемо кілька масивів:

    VAR a: ARRAY [Char] OF 1 .. 5;

    - масив із 256 елементів, кожен з яких є ціле число від 1 до 5, індекси елементів змінюються від 0 до # # 255;

    CONST Max = 99;

    Min = 10;

    TYPE Nums = Min .. Max;

    TYPE ArrayType = ARRAY [-10 .. 0] OF Nums;

    VAR a: ArrayType;

    - масив з 11 елементів з індексами від -10 до 0, кожен елемент - ціле позитивне число з двох цифр;

    TYPE IndexType = 'a' .. 'z';

    VAR a: ARRAY [IndexType] OF BOOLEAN;

    - масив з 26 елементів з індексами від 'a' до 'z', кожен елемент - логічна змінна.

    У програмі ви можете використовувати як масиви цілком, так і окремі елементи масивів. Елемент одновимірного масиву записується у вигляді:

    ім'я масиву [індексне вираз]

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

    VAR a: ARRAY [1 .. 3] OF REAL;

    b, c, d: ARRAY [1 .. 3] OF REAL;

    TYPE Massiv = ARRAY [1 .. 3] OF REAL;

    VAR e, f: Massiv;

    g : Massiv;

    h, i : Massiv;

    то масиви b, c, d - однотипні і масиви e, f, g, h, i теж однотипні, але масиви a і b (a і c, a і d) мають різний тип; і масиви b (c, d, a) і e (f, g, h, i) теж мають різний тип! Компілятор вважає, що дві змінні мають один і той же тип, тільки якщо вони описані в одному операторі через кому, або імена їх типів однакові! Запам'ятайте це дуже важливе правило.

    Запишемо приклад програми, що використовує (поки одномірні) масиви:

    (програма вводить масив із N цілих чисел, де N не перевершує 20, і виводить його в порядку неубиванія)

    CONST Nmax = 20;

    TYPE IndexType = 1 .. Nmax;

    Massiv = ARRAY [IndexType] OF Integer;

    VAR a: Massiv; i, j, N: IndexType; t: Integer;

    BEGIN WRITELN;

    REPEAT WRITE ( 'Введіть довжину масиву від 1 до', Nmax, '');

    READ (N); WRITELN;

    UNTIL (N> = 1) AND (N <= Nmax);

    ( Вводимо масив поелементно)

    WRITELN ( 'Введіть елементи масиву');

    FOR i: = 1 TO N DO READ (a [i ]);

    ( Сортуємо елементи масиву за неубиванію. Використовуємо дуже простий, але

    неефективний алгоритм сортування - порівнюємо кожен елемент з кожним

    і, якщо перша більше друге, міняємо їх місцями)

    FOR i: = 1 TO N-1 DO FOR j: = i 1 TO N DO

    IF a [i]> a [j] THEN BEGIN t: = a [i]; a [i]: = a [j]; a [j]: = t; END;

    ( Виводимо відсортований масив поелементно)

    WRITELN ( 'Результат сортування :');

    FOR i: = 1 TO N DO WRITE (a [i]: 8);

    END.

    Зверніть увагу на алгоритм перестановки двох елементів! Запис a [i]: = a [j]; a [j]: = a [i];, очевидно, привела б до невірного результату. Використаний нами алгоритм сортування цілком надійний, але не дуже гарний, тому що виконує багато зайвих операцій. Чи не становить праці удосконалити його - для кожного i від 1 до N-1 знайдемо найменший з елементів ai, ai +1, ... , AN і помістимо його на i-те місце; такий алгоритм виконує стільки ж порівнянь, скільки і початковий, але вимагає істотно меншої кількості перестановок.

    FOR i: = 1 TO N-1 DO BEGIN

    a_max: = a [i]; n_max: = i;

    FOR j: = i 1 TO N DO

    IF a [j]

    IF n_max <> i THEN BEGIN a [n_max]: = a [i]; a [i]: = a_max; END;

    END;

    Як бачите, запис алгоритму декілька довше, і треба було два нових змінних a_max - типу Integer і n_max - типу IndexType. Це дію універсального закону збереження - з двох вірних алгоритмів кращий, як правило, складніше.

    Тепер перейдемо до розгляду багатовимірних масивів. Розмірністю, або кількістю вимірів масиву, називається кількість індексів у елемента масиву, але не кількість елементів у масиві. Ми вже знаємо, що елемент масиву може бути масивом, тому двовимірний масив можна описати, наприклад, так:

    VAR a: ARRAY [1 .. 10] OF ARRAY [1 .. 20] OF Real;

    змінну a можна розглядати як одновимірний масив одновимірних масивів і використовувати в програмі запис виду a [i]; але можна розглядати і як двовимірний масив дійсних чисел. Елемент цього масиву записується в програмі у вигляді a [індексне вираз, індексне вираз] і є змінною типу Real, наприклад, a [i 1,3]. Втім, можна записати і так: a [i +1] [3], обидві ці записи еквівалентні. Опис багатовимірних масивів також можна записувати компактно: замість

    ARRAY [t1] OF ARRAY [t2] OF ARRAY ... OF t;

    можна записати

    ARRAY [t1, t2, ... ] OF t;

    Втім, бувають випадки, коли перший опис краще. Тепер, вміючи працювати з багатовимірними масивами, напишемо програму, перемножуються два квадратні речові матриці:

    CONST Nmax = 20; (максимальний розмір матриці)

    TYPE IndexType = 1 .. Nmax;

    Matrix = ARRAY [IndexType, IndexType] OF Real;

    VAR a, b, c: Matrix; n, i, j, k: IndexType;

    BEGIN WRITE ( 'введіть розмір матриць'); READ (n);

    IF (n <1) OR (n> Nmax) THEN BEGIN

    WRITELN ( 'невірний розмір!'); Halt; END;

    WRITELN ( 'введіть матрицю A порядково');

    FOR i: = 1 TO n DO FOR j: = 1 TO n DO READ (a [i, j ]);

    WRITELN ( 'введіть матрицю B порядково');

    FOR i: = 1 TO n DO FOR j: = 1 TO n DO READ (b [i, j ]);

    FOR i: = 1 TO n DO FOR j: = 1 TO n DO BEGIN

    c [i, j]: = 0; FOR k: = 1 TO n DO c [i, j]: = c [i, j] + a [i, k] * b [k, j]; END;

    WRITELN ( 'матриця A * B :');

    FOR i: = 1 TO n DO FOR j: = 1 TO n DO WRITE (c [i, j ]);

    WRITELN;

    END.

    Наша програма спрацювала правильно, але отриману матрицю вивела погано - всі елементи підряд без поділу на рядки. Виправимо алгоритм виведення:

    FOR i: = 1 TO n DO BEGIN

    FOR j: = 1 TO n DO WRITE (c [i, j]: 8);

    WRITELN;

    END;

    Тепер матриця виводиться акуратно.

    У Паскалі допускаються типізовані константи -- масиви, список значень елементів масиву задається в круглих дужках і розділяється комами:

    CONST a: ARRAY [1 .. 5] OF Byte = (1,2,3,4,5);

    c: ARRAY [0 .. 3] OF Char = ( 'a', 'b', 'c', 'd');

    b: ARRAY [1 .. 1] OF Boolean = (FALSE, TRUE, FALSE);

    Символьні масиви можна ініціалізувати і більше простим способом:

    CONST c: ARRAY [0 .. 3] OF Char = 'abcd';

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

    CONST A: ARRAY [1 .. 3,1 .. 2] OF Real = ((0,1), (2,4), (3,5 ));

    Яким саме чином згрупувати значення елементів, легко зрозуміти, згадавши, що масив ARRAY [1 .. 3,1 .. 2] OF Real є насправді компактна запис опису ARRAY [1 .. 3] OF ARRAY [1 .. 2] OF Real.

    Отже, ми дізналися, що крім величин відомих нам арифметичних, символьного, логічного типу та інтервальних типів, кожна з яких має одне значення, існують масиви - сукупності багатьох значень. Перші величини називаються скалярними, а масиви і ряд інших типів, поки нам не відомих, структурованими величинами.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://elib.albertina.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status