Розробка уроку

Тема: cтворення й використання бібліотек і модулів мовою C#. Застосовання методу функціональної декомпозиції задачі.

Мета:

Після вивчення теми учень:

Обладнання: комп’ютери зі встановленими ОС та середовищем Monodevelop для програмування мовою C#.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Закріплення вивченого матеріалу.
  5. Підбиття підсумків уроку.
  6. Домашнє завдання.

Хід уроку

1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань

Принцип модульності у програмуванні формулюють як вимогу подати програму у виді сукупності модулів:

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

Загальна форма опису функції

тип назва_функції (список_параметрів)
{ …             // тіло функції
  return вираз; // тіло функції
}

Тіло функціївказівки функції, записані між фігурними дужками { } після назви.

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

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

3. Вивчення нового матеріалу

Примітка. Набуття практичнх навичок щодо створення і використання бібліотек та модулів у ході виконання дій, описаних у прикладах 1-3, можна здіснити при першому прочитанні опису або після нього — на розсуд вчителя. Але у першому випадку інструктаж з ТБ необхіно провести до виконання цих дій.

Бібліотека динамічних посилань (анґлійською Dynamic Link library, DLL) — файл з кодом програми, призначений для зберігання часто використовуваних класів, функцій, сталих. При компіляції програми у виконуваний файл з такої бібліотеки вбудовують лише таблицю посилань.

Файл DLL можна використовувати у різних програмах, додавши посилання імпортувати файл DLL. Файли DLL і exe є виконуваними програмними модулями. Але різниця полягає у тому, файл DLL неможливо виконати безпосередньо, бо він не містить жодного класу з точкою входження — методом Main.

Приклад 1. Cтворення і під'єднання бібліотеки у середовищі Monodevelop

  1. Створити проєкт бібліотеки. Для цього зробити таке:

    • або натиснути клавіші Ctrl+Shift+N,
      або використати вказівку меню Файл / New Project… (/ Нове рішення…);

    • у вікні діалогу Новий проект на вкладенні .NET вибрати Бібліотека і натиснути кнопку з написом Далі;

    • у вікні діалогу Новий проект у полі Назву проекту веести ownLibrary і натиснути кнопку з написом Створити

      і отримати вікно такого вигляду;

    • замінити код у вікні вбудованого редактора на такий;

      using System;
      namespace ownLibrary
      { public class Pair
        { int x, y;
          public Pair(int x, int y) { this.x = x; this.y = y; }
          public int sum() { return this.x + this.y; }
        }
      }
    • створити файл /home/chief/Projects/ownLibrary/ownLibrary/bin/Debug/ownLibrary.dll (тут замість /home/chief може бути інше розташування):
      • або натиснути клавішу F8;
      • або натиснути клавішу F7;
      • або використати вказівку меню Побудувати все;
      • або використати вказівку меню Побудувати ownLibrary.

  2. Створити проєкт ownProject, що буде використовувати бібліотеку з таким кодом,

    using System;
    using ownLibrary;   // імпорт бібліотеки
    public class Work
    { public static void Main()
      { Pair p=new Pair(2,-7); 
        Console.WriteLine(p.sum());
      }
    }

    Діі по створенню аналогічні описаним у попередньому пункті. Але у вікні діалогу Новий проект на вкладенні .NET вибрати Консольний проект.

  3. Приєднати бібліотеку до проєкту:

    • використати вказівку меню Проект / Редагувати посилання;

    • у вікні діалогу Редагувати посилання на вкладенні Збірка .NET клацнути на кнопці з написом Огляд…;

    • у вікні діалогу Виберіть збірку вказати розташування відкомпільованої бібліотеки і клацнути на кнопці з написом Відкрити;

    • у вікні діалогу Редагувати посилання помітити відображення відкомпільованої бібліотеки і клацнути на кнопці з написом Гаразд;

    • Запустити проєкт на виконання, натиснувши клавішу F5 або використавши вказівку меню Виконання / Start Debugging.

  4. Пересвідчитися у правильності роботи програми: консоль повинна містити запис: -5. У разі потреби змінити код.

Примітка. Приєднання до проєкту Gtk# здійснюють таким самим чином.

Приклад 2. Cтворення і під'єднання бібліотек вказівками терміналу

  1. Створити файли:

    • ownLibrary.cs — з кодом бібліотеки;
      using System;
      namespace ownLibrary
      { public class Pair
        { int x, y;
          public Pair(int x, int y) { this.x = x; this.y = y; }
          public int sum() { return this.x + this.y; }
        }
      }
    • ownProject.cs — з кодим програми, що використовує програму.
      using System;
      using ownLibrary;   // імпорт бібліотеки
      public class Work
      { public static void Main()
        { Pair p=new Pair(2,-7); 
          Console.WriteLine(p.sum());
        }
      }
  2. Скомпілювати бібліотеку, виконавши вказівку терміналу:

    mcs -target:library -out:ownLibralry.dll ownLibrary.cs
    
    з таким тлумаченням складових:
    • -target:library — буде створено бібліотеку;
    • -out:ownLibrary.dll — у файл ownLibrary.dll поточної теці;
    • ownLibrary.cs — з коду файлу ownLibrary.cs поточної теки.

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

  3. Скомпілювати програму, що використає створену бібліотеку, виконавши вказівку терміналу:

    mcs /reference:ownLibrary.dll main.cs
    з таким тлумаченням складових:
    • /reference:ownLibrary.dll — використати бібліотеку ownLibrary.dll;
    • main.cs — файл з кодом програми.
  4. Виконати програму, виконавши вказівку терміналу:

    mono main.exe
    і пересвідчитися у виведенні числа -5.

NuGetце вільно поширювана система керування пакунками бібліотек, розроблена для Microsoft development platform.

Приклад 3. Під'єднання пакунку з NuGet

  1. У середовищі Monodevelop у контекстному меню проєкту вибрати Додати / Додати пакунки NuGet…

  2. У вікні діалогу Додати пакунки виставити мітку для потрібного пакунку (потрібних пакунків) і клацнути на кнопці з написом Add Package (Додати пакунок).

  3. Пересвідчитися, що пакунок успішно додано, клацнувши у місці розташування вказівника миші на малюнку нижче і прочитавши повідомлення: "… успішно додано".


Способи передавання параметра у функцію у більшості мов програмування такі:

C# як усталено передає параметри за значенням — див. приклад коду

using System;
class ByValue
{ public void    IntValue (int  i)   { i = 100;}
  public void   CharValue (char c)   { c = 'F';}
  public void DoubleValue (double d) { d =3.14;}
}
class Example
{ static void Main()
  { ByValue bv = new ByValue();
    int  i = 1;
    char c = 'A';
    double d = 0.1;
    bv.IntValue(i);
    bv.CharValue(c);к 
    bv.DoubleValue(d);
    Console.WriteLine("{0} {1} {2}",i,c,d);
  }
}

з таким виведенням:

1 A 0,1

Але спроба діяти аналогічно з об'єктом (наприклад, з масивом) призводить до результату, що ніби суперечить тезі: "C# як усталено передає параметри за значенням" — див. приклад коду

using System;
class Example
{ static void Change(int[] a)
  { a[0]=4;
    a[1]=5;
    a[2]=6; 
  }
  static void Main()
  { int[] a ={1,2,3};
    Console.WriteLine("{0} {1} {2}",a[0],a[1],a[2]);
    Change(a);
    Console.WriteLine("{0} {1} {2}",a[0],a[1],a[2]);
  }
}

буде виведено таке:

1 2 3
4 5 6

Що ж відбулося? При виклику функції Change у функцію було передано значення для створення копії вказівника на об'єкт (масив), а не самого об'єкта. Таким чином, у момент роботи функції існує два вказівника, які вказують на один і той самий об'єкт, який буде змінено у разі виклику функції.

Формальний параметр (аргумент) — це ідентифікатор (змінна) в описі параметрів функції.

Область видимості формального параметра функції визначається межами тіла функції.

Фактичний параметр (аргумент) — це значення, передане у функцію для надання цього значення формальному параметру.


Декомпози́ціяметод вирішення проблем, що використовує структуру завдання і полягає у заміні вирішення одного великого завдання вирішенням послідовності менших завдань (нехай і взаємопов'язаних).

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

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

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

Велика кількість рівнів створює враження, що завдання складне. Велика кількість підсистем однієї системи (на одному рівні) спричиняє складність встановлення зв'язків між ними. Зазвичай виділяють 3-6 рівнів.

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

Будь-яке завдання, яке виконують програмісти, — це створення проектів на основі їхньої декомпозиції. Ієрархічна структура робіт (Work Breakdown Structure, WBS) — це інструмент, що дозволяє розбити проект на складові частини. Саме вона встановлює ієрархічно структурований розподіл робіт з реалізації проекту для всіх задіяних в ньому працівників.

У ході побудови WBS здійснюється послідовна декомпозиція проекту на підпроекти — пакети робіт різного рівня, пакети детальних робіт. Декомпозиція повинна бути коректною: елементи будь-якого рівня повинні бути необхідні й достатні для створення відповідного елемента верхнього рівня.

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

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

Правила декомпозиції

Ієрархічна структура робіт (WBS) створюють або згори донизу, або знизу догори, або використовують обидва підходи. Зазвичай застосовують «рухому хвилю» — чим віддаленіший за часом той чи інший елемент, тим менше глибина його декомпозиції.

У результаті побудови ієрархічної структури робіт потрібно врахувати всі цілі проекту і створити всі необхідні передумови для його успішного втілення.

Підстави для розбиття проекту:

Мистецтво декомпозиції проекту полягає в узгодженні основних структур проекту:

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

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

Правила побудови ієрархічної структури робіт (WBS)

  1. На основі попередньої інформації проводять послідовну декомпозиція робіт проекту. Її продовжують до тих пір, поки всі складові не буде визначено таким чином, щоб їх могли планувати, скласти для них бюджет і т.п.

  2. Кожному елементу WBS надають унікальний ідентифікатор — WBS-код. Коди організовано відповідно до плану рахунків — системи відстеження витрат проекту за категоріями, що грунтується на плані рахунків організації і прийнятої в ній системі управлінського обліку.

Всі елементи WBS описують у словнику. Словник містить короткий опис кожного елемента, що входить в ієрархічну структуру робіт, тобто:

На основі WBS будують інші структурні моделі проекту:

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

На прикладах задач зі шкільного курсу інформатики користь від декомпозиції можна отримати лише на етапі розробки програми. Можливість паралельних (одно­часних) обчислень призводить до можливості отримати користь на етапі виконання, підвищивши ефективність розв'язання за часом. Наприклад, у царині векторної алгебри, при використанні різнецевих схем для наближення рівнянь аеро- та гідро­динаміки, при розпізнаванні образів. Останнє, крім цивільного застосування, має і військове. Тому надзвичайно актуальними є поняття й міркування, подані далі. Хоча з ними реально зіткнутися як розробник можна лише при роботі у провідних (у цірині інформаційних технологій) організаціях і корпораціях.

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

  1. Декомпозиція. На цьому етапі початкову задачу аналізують щодо можливості й доцільності її розкладу й розпаралелювання. При можливості й доцільності задачу й пов’язані з нею дані розділяють підзадачі й структури даних.

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

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

  4. Планування обчислень. На цьому етапі розподіляють обчислювальні ресурси на виконання окремих підзадач. Основний критерій вибору — ефективне використання з мінімальними витратами часу на обмін даними.

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

Розділяти (сегментувати) можна як обчислювальний алгоритм, так і дані.

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

Функціональна декомпозиція полягає у поділі алгоритму з наступним підбором схеми декомпозиції даних. Успіх (підвищення ефективності) в цьому випадку не завжди гарантовано, оскільки схема може вимагати багатьох додаткових пересилань даних. Але цей метод декомпозиції може виявитися корисним у випадку, якщо немає структур даних, які можна розпаралелити очевидним чином.

Розмір блоків програми може бути різним. Залежно від розміру блоків вказівок, які виконують паралельно (одночасно), розпаралелення алгоритму може мати різну «зернистість». Її виміром у найпростішому випадку є кількість операцій у блоці. Зазвичай виділяють три ступеня «зернистості» дрібно­зернистий, середньо­блоковий і велико­блоковий:

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

Частини програми (підзадачі) можна виконувати паралельно (одночасно), якщо вони незалежні за даними, за керуванням і за введенням/виведенням:

Історичний нарис. У 1974 р. на конгресі ІFІP Глушков виступив із доповіддю про рекурсивні ЕОМ, засновані на нових принципах організації обчислювальних систем (співавтори В.А.Мясніков, І.Б.Ігнатьєв, В.А.Торгашев). Він висловив думку про те, що лише розробка принципово нової не неймановської архітектури обчислювальних систем, дозволить вирішити проблему побудови супер-ЕОМ із необмеженим ростом продуктивності при нарощуванні апаратних засобів. Подальші дослідження показали, що повна і безкомпромісна реалізація принципів побудови рекурсивних ЕОМ і мозкоподібних структур при наявному тоді рівні електронної технології передчасна. Компромісні рішення було знайдено Глушковим і покладено в основу оригінальної структури високопродуктивної ЕОМ, названої макроконвеєром.

Глушков не зміг побачити створені за його ідеями макроконвеєрні ЕОМ ЄС-2701 і ЄС-1766, які не мали аналогів у світовій практиці (за оцінкою Державної комісії, яка приймала роботи). Це були найпотужніші обчислювальні системи на початку 1990-х років. Продуктивність ЄС 1766 при використанні повного комплекту процесорів (256 пристроїв) оцінювали два мільярди операцій на секунду. На жаль, ці потужні й конкурентноспроможні щодо кращих американських ЕОМ комп'ютери було випущено малою серією.

У період з 1990 по 1993 роки понад 90% експлуатованих у СРСР мейнфреймів ЄС ЕОМ було демонтовано й утилізовано з метою вилучення з них дорогоцінних металів (кілька десятків грамів золота і близько одного або декількох кілограмів срібла в одній ЕОМ).


4. Інструктаж з ТБ
5. Вироблення практичних навичок


Завдання 1. Здійснити дії, описані у прикладі 1: створення і під'єднання бібліотеки у середовищі Netbeans. Назви пакунків, класів та їхнє наповнення можуть бути іншими — на розсуд учня.

Завдання 2. Здійснити дії, описані у прикладі 2: створення і під'єднання бібліотеки вказівками терміналу. Назви пакунків, класів та їхнє наповнення можуть бути іншими — на розсуд учня.

Завдання 3. Здійснити дії, описані у прикладі 3: створення і використання модуля засобами вказівок терміналу. Назви пакунків, класів та їхнє наповнення можуть бути іншими — на розсуд учня.

Завдання 4. Створити програму й використовувані нею бібліотеки (по одній бібліотєці з одним класом для одного учня) для вирішення найпростіших для обчислювальної геометрії (методу координат) на площині.

  1. Обчислення відстані між двома точками, заданими своїми координатами.
  2. Обчислення коефіцієнтів загального рівняння прямої, що проходить через дані дві різні точки.
  3. Обчислення відстані від точки, заданої своїми координатами, до прямої, заданої загальним рівнянням.
  4. Обчислення кута між векторами, заданими своїми координатами.
  5. Обчислення площі трикутника, вершини якого задано координатами.
  6. Обчислення відстані від точки, заданої своїми координатами, до прямої, заданої загальним рівнянням.
  7. Обчислення кутів, довжин сторін, медіан, бісектрис і висот трикутника за координатами його вершин на основі використання бібліотек до задач 1-6, але без створення самих бібліотек.
  8. Обчислення коефіцієнтів загальних рівнянь продовжень сторін, медіан, бісектрис і висот трикутника за координатами його вершин на основі використання бібліотек до задач 1-6, але без створення самих бібліотек.

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

6. Підбиття підсумків уроку
Виставлення оцінок.

7. Домашнє завдання
Вивчити матеріал уроку. При потребі доробити завдання.


Текст упорядкував Олександр Рудик.