Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму Дейкстри або Флойда та мови програмування С#

Розробка програми для моделювання роботи алгоритму Дейкстри мовою C# з використанням об’єктно-орієнтованих принципів програмування. Алгоритм побудови робочого поля. Програмування графічного інтерфейсу користувача. Тестування програмного забезпечення.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 06.08.2013
Размер файла 991,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

26

Размещено на http://www.allbest.ru/

Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму дейкстри або флойда та мови програмування С#

Пояснювальна записка до курсової роботи з дисципліни «Алгоритми та структури даних»

АНОТАЦІЯ

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

ЗМІСТ

  • ВСТУП
  • 1. ТЕХНІКО-ЕКОНОМІЧНЕ ОБҐРУНТУВАННЯ ТЕХНІЧНОГО ЗАВДАННЯ НА КУРСОВУ РОБОТУ
    • 1.1 Вимоги користувача
    • 1.2 Аналіз предметної області
    • 1.3 Вибір методу вирішення основної задачі
  • 2. РОЗРОБКА АЛГОРИТМІВ РОЗВ'ЯЗКУ ЗАДАЧІ
    • 2.1 Алгоритм побудови робочого поля
    • 2.2 Покроковий алгоритм
    • 2.3 Розробка меню
  • 3. ПРОГРАМНА РЕАЛІЗАЦІЯ
    • 3.1 Вибір мови програмування
    • 3.2 Програмування інтерфейсу
    • 3.3 Розробка програми
  • 4. ТЕСТУВАННЯ, ПЕРЕВІРКА ПРАВИЛЬНОСТІ РОБОТИ
    • 4.1 Готування тестування
    • 4.2 Аналіз результатів роботи
  • ВИСНОВКИ
  • ПЕРЕЛІК ПОСИЛАНЬ
  • ЛІТЕРАТУРА
  • ДОДАТОК А
  • ВСТУП
  • Алгоритм Дейкстри -- алгоритм на графах, відкритий Дейкстрою. Знаходить найкоротший шлях від одної вершини графа до всіх інших вершин. Класичний алгоритм Дейкстри працює тільки для графів без дуг від'ємної довжини [1]. Алгоритм широко застосовується в програмуванні й технологіях, наприклад, його використовує протокол OSPF для усунення кільцевих маршрутів. Відомий також під назвою Спочатку Найкоротший Шлях (Shortest Path First). Алгоритм був відкритий англійцем Елвіном Берлекемпом.
  • Вперше алгоритм Дейкстри був опублікований в 1959 році. Дейкстра не тільки привів метод побудови Shortest Path First, а й реалізував його на базі матриці суміжності (час виконання N2), а також показав, що тим же методом можна обчислити і MST (MST - Mininal Spanning Tree). Реалізація побудови MST для насичених графів була вперше опублікована Прімом у 1961 році, а потім дещо пізніше - алгоритм Дейкстри. Однак основна ідея алгоритму була висловлена чеським математиком Войцехом Ярніком задовго до цього в 1939 році.
  • Збільшення продуктивності цих алгоритмів для розріджених графів пов'язано з широким розповсюдженням черг з пріоритетами в сімдесятих роках минулого століття. У 1977 році Д. Джонсон запропонував реалізацію алгоритму Прима (алгоритм Прима - алгоритм побудови мінімального кістякового дерева, це жадібний алгоритм) за допомогою d-парних частково впорядкованих повних дерев, а не за допомогою стандартних повних бінарних дерев.
  • Подальші удосконалення черг з пріоритетами привели до ще більшої продуктивності алгоритмів. Реалізації черг з пріоритетами на базі повних дерев Фібоначчі, дозволяє зменшити час виконання алгоритмів до (E + N*log(N)). Це досягається тим, що час виконання операції «змінити (зменшити)» пріоритет стає постійним, а операція «видалення мінімального елемента» залишається логарифмічною.
  • Алгоритм Флойда-Воршелла -- динамічний алгоритм для знаходження найкоротших відстаней між усіма вершинами зваженого орієнтованого графа. Розроблений в 1962 році Робертом Флойдом і Стівеном Воршеллом [2].
  • Ці два алгоритми (Дейкстри та Флойда) призначені для знаходження найкоротших відстаней в графі, але відрізняються реалізацією.
  • В наш час широкого розмаху набули інформаційні технології. Хоча й алгоритм Дейкстри та Флойда-Воршелла мають широке коло використання, та саме в інформаційному просторі вони набули особливої ролі. Кожного дня створюється безліч різноманітної інформації, яку потрібно впорядкувати, організувати для подальшого використання. Провідні пошукові системи, такі як Google, Yandex, Live, Bing, Yahoo!, Nigma та інші, на основі отриманих результатів будують результати у вигляді графів чи дерев та, використовуючи згадані алгоритми, шукаються результат по заданим параметрам.
  • Саме через наявність великого інтересу автора до вивчення методів оптимізації, темою курсової роботи було обрано «Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму Дейкстри або Флойда та мови програмування С#».

1. ТЕХНІКО-ЕКОНОМІЧНЕ ОБҐРУНТУВАННЯ ТЕХНІЧНОГО ЗАВДАННЯ НА КУРСОВУ РОБОТУ

1.1 Вимоги користувача

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

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

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

Дані про час переливання повинні міститися у таблиці, яка відображатиме інформацію про взаємодію елементів один між одним, тобто і буде таблицею суміжності, на основі якої буде будуватись хід виконання програми. Дані, що вводитимуться в таблицю, повинні будуть відслідковуватись програмою та перевірятись на коректність, а у випадку хибного вводу, наприклад: від'ємні значення (час не може набувати від'ємного числового значення), інші символи (символи крім числових та символа “,” - кома, що позначає дробове число). Якщо ж хибні значення все-таки були введені, то програма зобов'язана автоматично виправити помилку та повідомити користувача про некоректність вводу.

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

1.2 Аналіз предметної області

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

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

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

Рисунок 1.1 - Реалізація алгоритму Дейкстри

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

1.3 Вибір методу вирішення основної задачі

Користувач власноручно задає розміщення ємкостей на формі та, тим самим, регулює їх кількість. Для роботи програми на основі елементів, що знаходяться на полотні, буде складатися таблиця суміжності. На основі цієї таблиці буде прохід алгоритму Дейкстри по вигідним відносно умови полям. Розмір таблиці буде рівним (N+1)*(N+1), де N - кількість об'єктів на формі, а ще одне поле та ще один стовпчик відводяться під найменування (тобто сервісні області з підказками по напрямкам відношень, що допоможуть користувачеві зорієнтуватись під час введення даних в таблицю).

Рисунок 1.2 - Схематичне зображення таблиці

На рисунку 1.2 зображено приклад схеми відношення елементу відповідно до його значення. Вихідні об'єкти, тобто ті об'єкти, з яких переливаємо, знаходять вгорі таблиці. Відповідно рисунку 1.2 з елемента під іменем «1» (виділений зеленим кольором) здійснюється переливання в елемент під іменем «3» (виділено червоним кольором). Потім, якщо даний елемент задовольняє умову, тобто переливання в нього займає найменший час серед усіх можливих, від рядка з номером кінцевого елемента переходимо до стовпчика з відповідним номером. Слід також зазначити, що пошук мінімального часу переливання серед можливих елементів здійснюється шляхом порівнювання всіх значень часу переливання для вибраного елементу в усі інші.

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

Рисунок 1.3 - Пошук мінімального

На рисунку 1.3 зображено пошук мінімального часу переливання. Жовтим кольором відмічені ті області, які проходитимуться, а нульові значення ігноруватимуться. Фіолетовим позначено знайдене мінімальне (для прикладу). Аналогічно і для всіх інших стовпців.

А тепер, власне, алгоритм. Позначимо мінімальне для кожного із стовпчиків через MIN, а кількість загальну елементів через N. Також, для роботи потрібна змінна, яка зберігатиме суму мінімальних значень - це дасть змогу орієнтуватись в тому, чи є пройдений шлях вигідним і витрачений час на нього менший за час переливання з початкової посудини в останню (позначимо цей час через R). Також, потрібна буде змінна, що вказує, в якому стовпчику знаходимось на даному етапі виконання. На початку виконання алгоритму знаходимось у першому стовпчику та другому рядку - це і є вихідна позиція, з якої будемо рухатись по таблиці. Шукаємо найменше значення серед усіх (MIN на цьому етапі буде дорівнювати будь-якому ненульовому значенню із даного, тобто першого, стовпця). Знайшовши найменше числове значення - запам'ятовуємо номер рядка, в якому воно знаходиться. Перевіривши всі елементи і знайшовши найменше, тобто MIN, перевіряємо чи менше це значення в сумі із S (на початку S=0), тобто чи S + MIN < R. Якщо виявиться що не менше - закінчуємо проходження та, очевидно, робимо висновок, що найвигіднішого шляху крім переливання з початкової посудини в останню нема. Якщо ж все-таки менше, тоді S збільшуємо на знайдене значення MIN та переходимо у стовпець під номером стрічки, де знаходилось найменше значення MIN. Для нового стовпця відразу перевіряємо, як і у попередньому, чи сума часу переливання з даної ємкості в кінцеву та значення S буде меншим, якщо менше - то це і є шуканий шлях, інакше - шукаємо в цьому стовпчику мінімальне значення. Знайшовши - перевіряємо, чи знайдене нове MIN в сумі із S менше R, якщо менше - переходимо у стовпчик під номером стрічки, в якій знаходилось мінімальне значення і виконуємо знову такі ж операції по пошуку мінімального значення в стовпчику та перевірки, чи менше воно в сумі із S за орієнтоване значення R до поки не знайдеться така місткість, з якої час переливання в останню посудину в сумі із S (затраченим часом на пошук) буде меншим ніж час переливання із першої посудини в останню (тобто за R). А якщо ж все-таки не знаходимо найкоротшого шляху - робимо висновок, що вигіднішого часу за час переливання із першої посудини в останню нема.

Для прикладу, побудуємо таблицю відповідного часу переливання для п'яти елементів, як це зображено на рисунку 1.4.

Рисунок 1.4 - Приклад таблиці відповідностей

Також, на рисунку зеленим кольором обведене значення, яке при початку виконання алгоритму буде мінімальним (MIN). Згідно рисунку 1.5 перевіряємо, чи S (сума мінімальних значень, на початку рівно нулю) і часу переливання відразу в кінцеву посудину не менше R. В даному випадку: 0 + 11 > 10, отже шукаємо мінімальне значення. 11 менше 4 і 4 менше 2, тому MIN = 2.

Рисунок 1.5 - Перевірка першої умови

Мінімальне значення знаходиться в 4-тому рядку, тому переходимо в 4-тий стовпчик а S збільшуємо на MIN (S = S + 2 = 0 + 2 = 2). Перейшовши, відразу надаємо MIN перше ненульове значення - в даному випадку це буде 1 та перевіряємо, чи сума S і часу переливання в кінцеву посудину не менша за R, тобто: 2 + 9 = 11, а 11 > 10. Умова не справдилась, тому шукаємо мінімальне значення, як це зображено на рисунку 1.6.

Рисунок 1.6 - Пошук мінімального в 4-тому стовпчику

Згідно рисунку 1.6: 1 менше 5, а 0 не розглядаємо, тому мінімальним залишається значення 1. Отже, MIN знаходиться в 2-гому рядку - переходимо до другого стовпчику та збільшуємо S на значення MIN (S = S + 1 = 4). В цьому стовпчику проводимо аналогічні операції, як і в попередньому - перевіряємо, чи S в сумі із часом переливання відразу в кінцеву посудину менший за R (час переливання з першої в кінцеву посудину): S + 5 = 4 + 5 = 9, 9-ть менше R (9<10), тому алгоритм закінчується, а пройдені стовпці відповідно і є тим шуканим найкоротшим шляхом. Схематично рух по таблиці зображено на рисунку 1.7.

Рисунок 1.7 - Результат проходу таблиці

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

2. РОЗРОБКА АЛГОРИТМІВ РОЗВ'ЯЗКУ ЗАДАЧІ

2.1 Алгоритм побудови робочого поля

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

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

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

1. Кнопка відкриття/закриття таблиці, де користувач зможе вводити дані.

2. Кнопка розмітки зв'язків між усіма об'єктами на формі.

3. Кнопка обрахування найкоротшого шляху.

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

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

2.2 Покроковий алгоритм

Рисунок 2.1 - Блок-схема основного алгоритму

На рисунку 2.1 зображена блок-схема алгоритму.

2.3 Розробка меню

Меню (англ. menu) -- список варіантів (режимів, команд, відповідей тощо), що виводяться на екран дисплею і пропонуються користувачу для вибору. [3]

Меню являє собою набір таких елементів:

- рядок меню (англ. menu bar) - основна частина меню, яка постійно знаходиться у вікні програми (рідше, ховається і з'являється при певних діях користувача). Цей рядок є так званим головним меню вікна (англ. main menu) або меню верхнього рівня (англ. top-level menu);

- спливаюче меню (англ. popup menu) або підменю (англ. submenu). Вибір елемента головного меню зазвичай призводить до виклику з'являється під головним підменю, яке в свою чергу може містити підменю;

- пункт меню - окремі опції програми.

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

Пункти меню в головному і спливаючих меню можуть бути включені (англ. enabled), виключені (англ. disabled) або недоступні (англ. grayed). Іноді замість слів «включено» і «виключене» використовують слова «активно» (англ. active) і «неактивно» (англ. inactive). Зазвичай пункти, позначені як включені або виключені, для користувача виглядають однаково, а недоступний пункт меню виводиться кілька затемненим, зокрема сірим кольором.

Таким чином меню утворює ієрархічну структуру функціональних можливостей програми.

Розрізняють такі типи меню [3]:

- текстове;

- графічне;

- головне меню програми;

- спливаюче меню;

- контекстне меню;

- системне меню.

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

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

Планується, що на панелі управління будуть кнопки, які показуватимуть усі можливі зв'язки між ємкостями на полотні.

3. ПРОГРАМНА РЕАЛІЗАЦІЯ

3.1 Вибір мови програмування

Для розробки програми на курсову роботу автором була обрана мова програмування C# що працює з .NET Framework версії 4.0 під операційну систему Windows. Слід також зазначити, що існує реалізація C# і на такі операційні системи, як GNU/Linux, Solaris, Mac OS X. Це середовище Mono і завдяки його є можливість з мінімальною кількістю виправлень скомпілювати програмний код у будь-якій з цих операційних систем.

C# -- об'єктно-орієнтована мова програмування з безпечною системою типізації для платформи .NET. [4]

Мова C# активно використовується при створенні прикладних додатків, у тому числі й для розробки Web-Додатків, баз даних, GUI. Завдяки продуманій об'єктно-орієнтованій структурі, С# є відмінним інструментом швидкої розробки створення компонентів. Такі можливості, як "збирання сміття", автоматична ініціалізація перемінних, неможливість створення посилання на неіснуючу область пам'яті полегшують роботу й допомагають уникнути потенційних помилок. Перевагами мови C# є зручність вивчення об'єктно-орієнтованого програмування, наявність значної кількості вільно доступних середовищ розробки, переважна більшість з яких підтримує візуальне програмування, та повна придатність для забезпечення професійної діяльності фахівців-програмістів.

Об'єктно орієнтовані мови програмування як C# та Java є прямими наслідниками мови С++, адже ці мови спрямовані на вдосконалення та полегшення написання програми. Для ефективної роботи в оточенні CLR і підвищення ефективності роботи програмістів у мову C# було внесено значну кількість спрощень порівняно з C++. Деякі із них основані на таких можливостях, як виключення окремого заготовочного файлу та препроцесора та інше.

Таким чином, як базовою мовою програмування серед C#\С++\ Java було обрано С#, якa для нашого випадку є найбільш сприятливою.

3.2 Програмування інтерфейсу

Графічний інтерфейс користувача (ГІК, англ. GUI, Graphical user interface) -- інтерфейс між комп'ютером і його користувачем, що використовує піктограми, меню, і вказівний засіб для вибору функцій та виконання команд. Зазвичай, можливе відкриття більше, ніж одного вікна на одному екрані. Це, також, система засобів для взаємодії користувача з комп'ютером, заснована на представленні всіх доступних користувачеві системних об'єктів і функцій у вигляді графічних компонентів екрану (вікон, значків, меню, кнопок, списків і т. п.). [5] На даний момент графічний інтерфейс підтримують і активно використовують такі операційні системи, Mac OS, Ubuntu, Microsoft Windows, NEXTSTEP, OS/2.

Рисунок 3.1 - Вікно привітання програми

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

3.3 Розробка програми

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

Для збереження створених картинок використовуватиметься масив даних типу PictureBox, в якому по порядку збільшення значення КількістьКаністр буде паралельно збільшуватись кількість картинок, що створюватимуться в ньому динамічно.

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

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

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

Серед усіх інших методів та подій, які в основному слугуватимуть для підтримки роботи програми та забезпечення зручності користування та налаштування роботи програми, слід відзначити метод button3_Click_1(object sender, EventArgs e). Цей метод слугує для обраховування найкоротшого шляху. У ньому міститимуться такі змінні як:

- int[,] a = new int[this.КількістьКаністр, this.КількістьКаністр] - двовимірний масив для зберігання часу переливання між кожними ємкостями на формі.

- R = Convert.ToInt32(a[this.КількістьКаністр - 1, 0]) - орієнтоване значення, час переливання з вихідної у кінцеву посудину.

- min = a[1, 0] - мінімальний час переливання з кожної посудини, використовується окремо, на початку має значення першого ненульового елемента у стовпчику з порядковим номером відповідної ємкості.

- temp_i = 0 - змінна, що тимчасово містить у собі номер вигідної для переливання посудини, залежить від min і призначена для запам'ятовування останньої пройденої посудини задля забезпечення можливості малювання лінії між пройденими ємкостями.

- y = 0 - змінна, що "переміщається" по посудинам в результаті виконання алгоритму, містить у собі порядковий номер посудини.

- S = 0 - сума з часу переливання кожного елемента у "вигідній" послідовності, для знаходження найкоротшого шляху повинне бути менше R. На початку роботи програми ініціалізується значенням 0 і збільшується на MIN після кожного проходження елементу, що належить до шуканого вигідного шляху.

4. ТЕСТУВАННЯ, ПЕРЕВІРКА ПРАВИЛЬНОСТІ РОБОТИ

4.1 Готування тестування

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

Якість не є абсолютною, це суб'єктивне поняття. Тому тестування не може повністю забезпечити коректність програмного забезпечення. Воно тільки порівнює стан і поведінку продукту зі специфікацією. При цьому треба розрізняти тестування програмного забезпечення і забезпечення якості програмного забезпечення, до якого належать усі складові ділового процесу, а не тільки тестування.

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

Види тестування:

· Автоматичне та ручне тестування

· Динамічне та статичне тестування

· Функціональне тестування

· Регресивне тестування

· Тестування процесу роботи програми (workflow testing) [6]

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

Рисунок 4.1 - Вигляд головного вікна

На рисунку 4.1 зображено вигляд головного вікна на початку роботи програми. Користуючись меню «Налаштування» - «Розмістити ємкості» та натискаючи ліву кнопку миші розмістимо ємкості на полотні.

Рисунок 4.2 - Результат розміщення

Результат розміщення п'яти ємкостей на полотні зображено на рисунку 4.2. Відповідно рисунку ємкість на фоні червоного кольору означає вихідну позицію (вона завжди під номером «1»), а кінцева - зеленого кольору і має номер відповідно кількості об'єктів ємкостей на формі.

Рисунок 4.3 - Заповнення таблиці

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

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

Щоб побачити зв'язки між усіма об'єктами слід натиснути кнопку «Показати всі можливі зв'язки» (дивитись рисунок 4.4).

Рисунок 4.4 - Демонстрація зв'язків між ємкостями

На рисунку 4.4 зображено результат роботи програми після натискання кнопки «Показати всі можливі зв'язки», це дозволяє зобразити граф відносин між усіма об'єктами на формі. Під час роботи у програмі ця функція особливого значення не має, але надає змогу користувачу зорієнтуватися у графоподібній схемі.

Коли все введено - можемо натиснути клавішу «Знайти коротший шлях».

Натискання цієї кнопки спричинить виклик методу button3_Click_1(object sender, EventArgs e), що обраховує найкоротший шлях та проводить зелені лінії між всіма елементами, що належать найбільш «вигідному» шляху переливання.

Рисунок 4.5 - Позначення найкоротшого шляху

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

4.2 Аналіз результатів роботи

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

Розробка програми збільшила навички роботи в середовищі Visual Studio 2010 мовою програмування C# версії 4.0.

моделювання програма інтерфейс

ВИСНОВКИ

Підводячи підсумки можна зазначити, що була написана програма для моделювання роботи алгоритму Дейкстри на тему «Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму Дейкстри або Флойда та мови програмування С#». Програма написана мовою C# з використанням об'єктно-орієнтованих принципів програмування. Програма має зручний інтерфейс і приємну кольорову гамму, що на практиці гарно виглядає і не викликає в користувача небажаних емоцій. Створивши тести перевірено, що алгоритм в програмі працює чітко і вірно. Програма обробляє усі можливі виключення і забезпечує надійну роботу під час використання на практиці.

ЛІТЕРАТУРА

1. Круподьорова Л.М., Пєтух А.М. Технологія програмування мовою Сі, ВНТУ, 1-2 частини, 2006 рік .

2. Круподьорова Л.М. Методичні вказівки для курсового проектування, ВНТУ, 2004.

3. Власюк В. Х., Круподьорова Л.М. “Програмування мовою Сі, Вінниця, ВДТУ, 2001.

4. М. Эллис, Б. Страструп. Справочное руководство по языку С++ с комментариями: Пер. с англ. - Москва: Мир, 1992.

5. В.В. Подбельский, С.С. Фомин. Программирование на ЯЗЫКЕ Си. - Москва: «Финансы и статистика», 2002.

ДОДАТОК А

Лістінг

/*--------------------------------Program.cs--------------------------*/

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace cups_ver_0

{

static class Program

{

/// <summary>

/// Головна точка входу в програму.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new FormHello());

}

}

}

/*----------------------------Program.cs--------------------*/

/*----------------------------Form1.cs----------------------*/

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace cups_ver_0

{

public partial class FormHello : Form

{

/// <summary>

/// Кількість секунд до старту

/// </summary>

int КількістьСекунд = 10;

public FormHello(){

InitializeComponent();

}

#region Запуск головної форми

private void Зміна_форм()

{

this.Hide();

MainForm ГоловнаФорма = new MainForm();

ГоловнаФорма.Show();

}

#endregion

private void button1_Click(object sender, EventArgs e)

{

this.Зміна_форм();

this.timer1.Stop();

}

private void Form1_Load(object sender, EventArgs e)

{

this.timer1.Start();

}

private void timer1_Tick(object sender, EventArgs e)

{

this.КількістьСекунд--;

if (this.КількістьСекунд == -1){

this.Зміна_форм();

this.timer1.Stop();

}

else

this.button1.Text = Convert.ToString(this.КількістьСекунд);

}

}

}

/*--------------------------Form1.cs------------------------*/

/*--------------------------Form2.cs------------------------*/

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Threading;

namespace cups_ver_0

{

public partial class MainForm : Form

{

#region Змінні та константи

/// <summary>

/// КАРТИНКИ на форму.

/// </summary>

PictureBox[] КучаКартинок = new PictureBox[ГраничнаКількістьКартинок];

/// <summary>

/// Підписи картинок

/// </summary>

Label[] підписиПідКартинками = new Label[ГраничнаКількістьКартинок];

/// <summary>

/// Поточна кількість картинок на формі.

/// </summary>

int КількістьКаністр = 0;

/// <summary>

/// Для запам'ятовування розміщення картинки на формі.

/// </summary>

int[,] МасивКоординатКучіКартинок = new int[ГраничнаКількістьКартинок, 2];

/// <summary>

/// Максимальна к-сть картинок на формі.

/// </summary>

const int ГраничнаКількістьКартинок = 99;

#endregion

#region Конструктор класу

public MainForm()

{

InitializeComponent();

}

#endregion

#region Натиснення на картинку

/// <summary>

/// Натиснення на картинку

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void кляцалкаКартинок_Click(object sender, System.EventArgs e)

{

this.Refresh();

for (int i = Convert.ToInt32(((PictureBox)sender).Name); i < this.КількістьКаністр ; i++)

{

this.КучаКартинок[i].Location = new Point(this.КучаКартинок[i + 1].Location.X, this.КучаКартинок[i + 1].Location.Y);

this.підписиПідКартинками[i].Location = new Point(this.підписиПідКартинками[i + 1].Location.X, this.підписиПідКартинками[i + 1].Location.Y);

}

--this.КількістьКаністр;

this.позначенняПершогоТаОстаннього();

}

#endregion

#region MainForm_MouseMove Рух вказівника по формі

/// <summary>

/// Рух вказівника по формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void MainForm_MouseMove(object sender, MouseEventArgs e){

if (this.pictureBox1.Visible)

{

/*this.Refresh();*/ /*З фіналки вирізано*/

this.pictureBox1.Location = new System.Drawing.Point(e.X - this.pictureBox1.Size.Height / 2, e.Y - this.pictureBox1.Size.Width / 2);

//this.розміткаВсіхЗвязків(); /*З фіналки вирізано*/

this.позначенняПершогоТаОстаннього();

/*this.розміткаВсіхЗвязків();*/

}

}

#endregion

#region MainForm_MouseDown - натиснення кнопки миші

/// <summary>

/// Клік по формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void MainForm_MouseDown(object sender, MouseEventArgs e)

{

#region Натиснення правої кнопки миші

if (e.Button == MouseButtons.Right)

{

this.Refresh();

this.позначенняПершогоТаОстаннього();

this.pictureBox1.Hide();

}

#endregion

if (this.pictureBox1.Visible)

{

this.Refresh();

this.КучаКартинок[КількістьКаністр].Show();

this.КучаКартинок[КількістьКаністр].Location = new System.Drawing.Point(e.X - this.pictureBox1.Size.Height / 2, e.Y - this.pictureBox1.Size.Width / 2);

#region Запис координат створеної картинки на формі

this.МасивКоординатКучіКартинок[КількістьКаністр, 0] = e.X - this.pictureBox1.Size.Height / 2;

this.МасивКоординатКучіКартинок[КількістьКаністр, 1] = e.Y - this.pictureBox1.Size.Width / 2;

#endregion

this.підписиПідКартинками[КількістьКаністр].Location = new System.Drawing.Point(e.X + this.pictureBox1.Size.Height - 58, e.Y - this.pictureBox1.Size.Width / 2);

this.КількістьКаністр++;

this.button3.Enabled = false;

/*this.розміткаВсіхЗвязків();*/

}

}

#endregion

#region Кнопка "Про програму"

/// <summary>

/// Інформація про програму

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void проПрограмуToolStripMenuItem_Click(object sender, EventArgs e)

{

System.Windows.Forms.MessageBox.Show("\n\nКУРСОВА РОБОТА\n\n© Степанюк Дмитро\n2011р.\n\nskipper.nightingale@gmail.com", "Інформація", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);

}

#endregion

#region Кнопка "Показати всі можливі зв'язки"

/// <summary>

/// Кнопка "Показати всі можливі зв'язки"

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button2_Click(object sender, EventArgs e) {

this.розміткаВсіхЗвязків();

}

#endregion

#region Створення картинки

/// <summary>

/// Створення картинки

/// </summary>

private void СтворенняКартинки()

{

this.pictureBox1.Show();

if (this.КучаКартинок[0] == null)

for (int i = 0; i < ГраничнаКількістьКартинок; i++){

this.КучаКартинок[i] = new PictureBox();

this.КучаКартинок[i].Image = this.pictureBox1.Image;

this.КучаКартинок[i].Location = new System.Drawing.Point(-100, -100);

this.КучаКартинок[i].Size = this.pictureBox1.Size;

this.КучаКартинок[i].SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

this.КучаКартинок[i].TabIndex = 0;

this.КучаКартинок[i].TabStop = false;

//КучаКартинок[i].Parent = this;

this.КучаКартинок[i].Name = i.ToString();

this.КучаКартинок[i].Hide();

this.КучаКартинок[i].Tag = i;

this.КучаКартинок[i].Click += new EventHandler(this.кляцалкаКартинок_Click);

this.Controls.Add(this.КучаКартинок[i]);

this.підписиПідКартинками[i] = new System.Windows.Forms.Label();

this.підписиПідКартинками[i].Name = (i + 1).ToString();

this.підписиПідКартинками[i].Text = (i + 1).ToString();

this.підписиПідКартинками[i].Location = new Point(-100, -100);

if (i < 9)

this.підписиПідКартинками[i].Size = new System.Drawing.Size(22, 24);

else

this.підписиПідКартинками[i].Size = new System.Drawing.Size(45, 24);

//підписиПідКартинками[i].Parent = this;

this.підписиПідКартинками[i].TabIndex = 0;

this.підписиПідКартинками[i].Font = new Font(System.Drawing.FontFamily.GenericMonospace, 20, System.Drawing.FontStyle.Regular);

this.Controls.Add(this.підписиПідКартинками[i]);

}

}

#endregion

#region Помічення всіх зв'язків між елементами на формі

/// <summary>

/// Помічення всіх зв'язків між елементами на формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void розміткаВсіхЗвязків()

{

System.Drawing.Graphics formGraphics = this.CreateGraphics();

System.Drawing.Pen greenPen = new System.Drawing.Pen(System.Drawing.Color.Green, 3);

//greenPen.Width = 2;

for (int i = 0; i < this.КількістьКаністр; i++)

for (int j = i + 1; j < this.КількістьКаністр; j++)

{

System.Drawing.Point ПочатковаТочка = new System.Drawing.Point(this.МасивКоординатКучіКартинок[i, 0] + 40, this.МасивКоординатКучіКартинок[i, 1] + 40);

System.Drawing.Point КінцеваТочка = new System.Drawing.Point(this.МасивКоординатКучіКартинок[j, 0] + 40, this.МасивКоординатКучіКартинок[j, 1] + 40);

formGraphics.DrawLine(greenPen, ПочатковаТочка, КінцеваТочка);

}

}

#endregion

#region Малювання кола навколо картинки

private void малюванняКіл(System.Windows.Forms.PictureBox sender, Color колірЗаповнювача)

{

System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(колірЗаповнювача);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.FillEllipse(

brush1,

new System.Drawing.Rectangle(

((System.Windows.Forms.PictureBox)sender).Location.X - 20,

((System.Windows.Forms.PictureBox)sender).Location.Y - 20,

#region Розміри еліпса - ширина і довжина

System.Convert.ToInt32(System.Math.Sqrt

(

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Height), 2)

+

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Width), 2)

)),

Convert.ToInt32(System.Math.Sqrt(

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Height), 2)

+ System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Width), 2)

)

)

#endregion

));

brush1.Dispose(); formGraphics.Dispose();

}

#endregion

#region Позначення першого і останнього малюнка як кінцеві

/// <summary>

/// Позначення початку і кінця

/// </summary>

private void позначенняПершогоТаОстаннього()

{

if (КучаКартинок[0] != null)

{

this.малюванняКіл(КучаКартинок[0], Color.Red);

if (КількістьКаністр - 1 >= 0)

this.малюванняКіл(КучаКартинок[КількістьКаністр - 1], Color.Green);

}

}

#endregion

#region Виконано! Допоміжні ф-ції

#region Запуск головної форми

private void MainForm_Load(object sender, EventArgs e)

{

this.pictureBox1.Hide();

}

#endregion

#region Загальний вихід вихідToolStripMenuItem1

private void вихідToolStripMenuItem1_Click(object sender, EventArgs e)

{

System.Windows.Forms.Application.Exit();

}

#endregion

#region Перезапуск

private void перезапускToolStripMenuItem_Click(object sender, EventArgs e)

{

System.Windows.Forms.Application.Restart();

}

#endregion

#region Закриття програми (не меню)

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

{

System.Windows.Forms.Application.Exit();

}

#endregion

private void розміститиЄмкостіToolStripMenuItem_Click(object sender, EventArgs e)

{

this.СтворенняКартинки();

}

#region Згортання програми з меню

private void згорнутиToolStripMenuItem_Click(object sender, EventArgs e)

{

WindowState = FormWindowState.Minimized;

}

#endregion

#endregion

#region Перевірка корректності вводу інформації в таблицю

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

{

System.Windows.Forms.TextBox коректністьВвооду = (System.Windows.Forms.TextBox)e.Control;

коректністьВвооду.KeyPress += new KeyPressEventHandler(коректністьВвооду_KeyPress);

}

void коректністьВвооду_KeyPress(object sender, KeyPressEventArgs e)

{

if (!(System.Char.IsDigit(e.KeyChar)) && (e.KeyChar != '.'))

{

if (e.KeyChar != (char)Keys.Back)

e.Handled = true;

}

}

#endregion

#region Відкриття\закриття таблиці

/// <summary>

/// Відкриття\закриття таблиці

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void КнопкаПереходу_Click_1(object sender, EventArgs e)

{

this.button3.Enabled = true;

if (this.КнопкаПереходу.Text == "Перейти в режим введення інформації")

{

this.КнопкаПереходу.Text = "Сховати таблицю";

this.dataGridView1.Show();

this.dataGridView1.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 15, System.Drawing.FontStyle.Regular);

this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;

this.dataGridView1.RowCount = 1 + this.КількістьКаністр;

this.dataGridView1.ColumnCount = 1 + this.КількістьКаністр;

this.dataGridView1.Columns[0].ReadOnly = true;

this.dataGridView1.Rows[0].ReadOnly = true;

this.dataGridView1.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.BottomCenter;

this.dataGridView1.Rows[0].Cells[0].Value = "*";

for (int k = 1; k < this.КількістьКаністр + 1; k++)

for (int j = 1; j < this.КількістьКаністр + 1; j++)

this.dataGridView1.Rows[k].Cells[j].ReadOnly = false;

for (int i = 1; i < this.КількістьКаністр + 1; i++)

{

this.dataGridView1.Rows[i].Cells[0].Value = "в \"" + i.ToString() + "\"";

this.dataGridView1.Rows[0].Cells[i].Value = "з \"" + i.ToString() + "\"";

this.dataGridView1.Rows[i].Cells[i].Value = "0";

this.dataGridView1.Rows[i].Cells[i].ReadOnly = true;

this.dataGridView1.Rows[i].Cells[this.КількістьКаністр].Value = "0";

this.dataGridView1.Rows[i].Cells[this.КількістьКаністр].ReadOnly = true;

this.dataGridView1.Rows[1].Cells[i].Value = "0";

this.dataGridView1.Rows[1].Cells[i].ReadOnly = true;

}

}

else

{

this.КнопкаПереходу.Text = "Перейти в режим введення інформації";

this.dataGridView1.Hide();

this.позначенняПершогоТаОстаннього();

}

}

#endregion

#region Власне сам алгоритм міститься тут. Працює на основі зібраної інформації з таблиці

private void button3_Click_1(object sender, EventArgs e)

{

System.Drawing.Graphics formGraphics = this.CreateGraphics();

System.Drawing.Pen greenPen = new System.Drawing.Pen(System.Drawing.Color.Green, 10);

/* greenPen.Width = 15; */

/*int[] кількістьВершин = new int[this.КількістьКаністр];*/

int[,] a = new int[this.КількістьКаністр, this.КількістьКаністр];

for (int yi = 0; yi < this.КількістьКаністр; yi++)

for (int xi = 0; xi < this.КількістьКаністр; xi++)

{

if (this.dataGridView1.Rows[xi + 1].Cells[yi + 1].Value == DBNull.Value){

System.Windows.Forms.MessageBox.Show("Деякі значення не введені!", "Achtung! Caution!");

goto end;

}

else

a[xi, yi] = Convert.ToInt32(this.dataGridView1.Rows[xi + 1].Cells[yi + 1].Value); }

////////////////////////////////////////////////////////////////

int

R = Convert.ToInt32(a[this.КількістьКаністр - 1, 0]),/*Орієнтоване значення, час переливання з вихідної у кінцеву посудину*/

min = a[1, 0],/*Мінімальний час переливання з кожної посудини, використовується окремо, на початку має значення першого ненульового елемента*/

temp_i = 0,/*Змінна, що містить у собі номер вигідної для переливання посудини, залежить від min*/

y = 0,/*Змінна, що "переміщається" по посудинам в результаті виконання алгоритму, містить у собі порядковий номер посудини*/

S = 0;/*Сума з часу переливання кожного елемента у "вигідній" послідовності, для знаходження коротшого шляху повинне бути менше R*/

;

////////////////////////////////////////////////////////////////

for (; ; )

{

if (S + a[this.КількістьКаністр - 1, y] < R)

{

System.Windows.Forms.MessageBox.Show(КучаКартинок[y].Name);

System.Drawing.Point Point_pre_last = new System.Drawing.Point(this.КучаКартинок[y].Location.X + 40, this.КучаКартинок[y].Location.Y + 40);

System.Drawing.Point Point_last = new System.Drawing.Point(this.КучаКартинок[this.КількістьКаністр - 1].Location.X + 40, this.КучаКартинок[this.КількістьКаністр - 1].Location.Y + 40);

formGraphics.DrawLine(greenPen, Point_pre_last, Point_last);

S += a[this.КількістьКаністр - 1, y];

break;

}

else

{

for (int i = 0; i < this.КількістьКаністр; i++)

{

if (min > a[i, y] && a[i, y] != 0)

{

min = a[i, y];

a[i, y] = 0;

temp_i = i;

}

}

if (S + min < R)

{

System.Drawing.Point point1 = new System.Drawing.Point(this.КучаКартинок[temp_i].Location.X + 40, this.КучаКартинок[temp_i].Location.Y + 40);

System.Drawing.Point point2 = new System.Drawing.Point(this.КучаКартинок[y].Location.X + 40, this.КучаКартинок[y].Location.Y + 40);

formGraphics.DrawLine(greenPen, point1, point2);

if (temp_i!=0)

this.малюванняКіл(this.КучаКартинок[temp_i], System.Drawing.Color.Blue);

S += min;

y = temp_i;

min = a[this.КількістьКаністр - 1, 0];

}

else

{

this.Refresh();

this.позначенняПершогоТаОстаннього();

System.Drawing.Point point1 = new System.Drawing.Point(this.КучаКартинок[0].Location.X + 40, this.КучаКартинок[0].Location.Y + 40);

System.Drawing.Point point2 = new System.Drawing.Point(this.КучаКартинок[this.КількістьКаністр - 1].Location.X + 40, this.КучаКартинок[this.КількістьКаністр - 1].Location.Y + 40);

formGraphics.DrawLine(greenPen, point1, point2);

S = 0;

break;

}

}

}

/*System.Windows.Forms.MessageBox.Show(S.ToString(), "Інформація", MessageBoxButtons.OK,MessageBoxIcon.Information);*/

end: /* <= точка для обходу коду*/ ;

}

#endregion

}

}

/*------------------------Form2.cs----------------------*/

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.