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

     

     

     

     

     

         
     
    Закінчена програма
         

     

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

    Закінчена програма

    Розберемо процес написання програми для малювання на екрані геометричних фігур. Вона природним чином поділяється на три частини:

    Адміністратор екрану: підпрограми низького рівня і структури даних, що визначають екран; він відає тільки точками і прямими лініями;

    Бібліотека фігур: набір визначень основних фігур на зразок прямокутника і кола і стандартні програми для роботи з ними, а

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

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

    Адміністратор Екрану

    Спочатку був намір написати адміністратор екрана на C (а не на C + +), щоб підкреслити поділ рівнів реалізації. Це виявилося занадто втомливим, тому довелося піти на компроміс: Стиль C (немає функцій членів, віртуальних функцій, що визначаються користувачем операцій тощо), однак застосовуються конструктори, належним чином описуються і перевіряються параметри функцій і т.д. Озираючись назад, можна сказати, що адміністратор екрана дуже схожий на C програму, яку потім модифікували, щоб скористатися засобами C + + не переписуючи все повністю.

    Екран представляється як двовимірний масив символів, роботу з яким здійснюють функції put_point () і put_line (), що використовують при посиланні на екран структуру point:

    // фото screen.h

    const XMAX = 40, YMAX = 24;

    struct point (

    int x, y;

    point () ()

    point (int a, int b) (x = a; y = b;)

    );

    overload put_point;

    extern void put_point (int a, int b);

    inline void put_point (point p) (put_point (px, py);)

    overload put_line;

    extern void put_line (int, int, int, int);

    inline void put_line (point a, point b)

    ( put_line (a.x, a.y, b.x, b.y);)

    extern void screen_init ();

    extern void screen_refresh ();

    extern void screen_clear ();

    # include

    Перед першим використанням функції put екран треба ініціалізувати за допомогою screen_init (), а зміни в структурі даних екрана відображаються на екрані тільки після виклику screen_refresh (). Як побачить користувач, це "оновлення" ( "refresh") здійснюється просто за допомогою друку нової копії екрану під його попереднім варіантом. Ось функції і визначення даних для екрану:

    # include "screen.h"

    # include

    enum color (black ="*", white = "" );

    char screen [XMAX] [YNAX];

    void screen_init ()

    (

    for (int y = 0; y = a | | a <= b) y0 + = dy, eps -= two_a;

    )

    )

    Надаються функції для очищення екрана і його оновлення:

    void screen_clear () (screen_init ();)// очищення

    void screen_refresh ()// оновлення

    (

    for (int y = YMAX-1; 0 <= y; y -) (//зверху вниз

    for (int x = 0; x

    Бібліотека Фігур

    Нам потрібно визначити загальне поняття фігури (shape). Це треба зробити таким чином, щоб воно використовувалося (як базовий клас) усіма конкретними фігурами (наприклад, колами і квадратами), і так, щоб будь-який фігурою можна було маніпулювати виключно через інтерфейс, що надається класом shape:

    struct shape (

    shape () (shape_list.append (this);)

    virtual point north () (return point (0,0);)// північ

    virtual point south () (return point (0,0);)// південь

    virtual point east () (return point (0,0);)// схід

    virtual point neast () (return point (0,0);)// північний схід

    virtual point seast () (return point (0,0);)// південний схід

    virtual void draw () ();// намалювати

    virtual void move (int, int) ();// перемістити

    );

    Ідея полягає в тому, що розташування фігури задається за допомогою move (), і фігура поміщається на екран за допомогою draw (). Фігури можна мати у своєму розпорядженні відносно один одного, використовуючи поняття точки дотику, і ці точки перераховуються після точок на компасі (сторін світу). Кожна конкретна фігура визначає свій сенс цих точок, і кожна визначає спосіб, яким вона малюється. Для економії місця тут насправді визначаються тільки необхідні в цьому прикладі сторони світу. Конструктор shape:: shape () додає фігуру в список фігур shape_list. Цей список є gslist, то Тобто, одним з варіантів узагальненого односвязанного списку, визначеного в # 7.3.5. Він і відповідний ітератор були зроблені так:

    typedef shape * sp;

    declare (gslist, sp);

    typedef gslist (sp) shape_lst;

    typedef gslist_iterator (sp) sp_iterator;

    тому shape_list можна описати так:

    shape_lst shape_list;

    Лінію можна побудувати або по двох точках, або по точці і цілому. В останньому випадку створюється горизонтальна лінія, довжину якої визначає ціле. Знак цілого вказує, яким кінцем є точка: лівим або правим. Ось визначення:

    class line: public shape (

    /*

    лінія з "w" в "e"

    north () визначається як `` вище центру

    і на північ як до самої північної точки ""

    */

    point w, e;

    public:

    point north ()

    (return point ((w.x + e.x)/2, e.ydraw ();

    screen_refresh ();

    )

    І ось, нарешті, справжня сервісна функція (утиліта). Вона кладе одну фігуру на верх інший, задаючи, що south () однієї повинен бути відразу над north () інший:

    void stack (shape * q, shape * p)// ставить p на верх q

    (

    point n = p-> north ();

    point s = q-> south ();

    q-> move (n.x-s.x, n.y-s.y +1);

    )

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

    Прикладна Програма

    Прикладна програма надзвичайно проста. Визначається нова фігура my_shape (на печатці вона трохи схожа на пику), а потім пишеться головна програма, яка надягає на неї капелюха. Спочатку опис my_shape:

    # include "shape.h"

    class myshape: public rectangle (

    line * l_eye;// ліве око

    line * r_eye;// праве око

    line * mouth;// рот

    public:

    myshape (point, point);

    void draw ();

    void move (int, int);

    );

    Очі і рот - окремі і незалежні об'єкти, які створює конструктор my_shape:

    myshape:: myshape (point a, point b): (a, b)

    (

    int ll = neast (). x-swest (). x 1;

    int hh = neast (). y-swest (). y 1;

    l_eye = new line (

    point (swest (). x 2, swest (). y + hh * 3/4), 2);

    r_eye = new line (

    point (swest (). x + ll-4, swest (). y + hh * 3/4), 2);

    mouth = new line (

    point (swest (). x 2, swest (). y + hh/4), ll-4);

    )

    Об'єкти очі і рот порізно малюються заново функцією shape_refresh (), і в принципі можуть оброблятися незалежно з об'єкта my_shape, якій вони належать. Це один спосіб визначати засоби для ієрархічно побудованих об'єктів на кшталт my_shape. Інший спосіб демонструється на прикладі носа. Ніякої ніс не визначається, його просто додає до зображення функція draw ():

    void myshape:: draw ()

    (

    rectangle:: draw ();

    put_point (point (

    (swest (). x + neast (). x)/2, (swest (). y + neast (). y)/2 ));

    )

    my_shape пересувається за допомогою переміщення базового прямокутника rectangle і вторинних об'єктів l_eye, r_eye і mouth (лівого очі, правого ока і рота):

    void myshape:: move ()

    (

    rectangle:: move ();

    l_eye-> move (a, b);

    r_eye-> move (a, b);

    mouth-> move (a, b);

    )

    Ми можемо, нарешті, побудувати кілька фігур і трохи їх посувати:

    main ()

    (

    shape * p1 = new rectangle (point (0,0), point (10,10 ));

    shape * p2 = new line (point (0,15), 17);

    shape * p3 = new myshape (point (15,10), point (27,18 ));

    shape_refresh ();

    p3-> move (-10, -10);

    stack (p2, p3);

    stack (p1, p2);

    shape_refresh ();

    return 0;

    )

    Ще раз зверніть увагу, як функції начебто shape_refresh () і stack () маніпулюють об'єктами типів, що визначаються набагато пізніше, ніж були написані (і, може бути, відкомпілювати) самі ці функції.

    Результатом роботи програми буде:           

    ***********   

    *   *   

    *   *   

    *   *   

    *   *   

    *   *   

    *   *   

    *   *   

    *   *   

    *   *   

    ***********   

    *****************   

    *************   

    * *   

    * ** ** *   

    * *   

    * *   *   

    * *   

    * ********* *   

    * *   

    *************     

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

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

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

     

     

     

     

     

     

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