Розробка програмного забезпечення розрахунку прибутку перукарні
Міністерство
освіти і науки України
Державний
вищий навчальний заклад
"Криворізький
національний університет"
Кафедра
інформатики та прикладного програмного забезпечення
Курсова
робота
Розробка
програмного забезпечення розрахунку прибутку перукарні
Студента 4 курсу
ФІТ групи ПЗАС-10-3
Будніка Дмитра Васильовича
Керівник курсової роботи
к.е.н., доцент Лисенко В.С.
Кривий
Ріг 2013
Завдання на курсову роботу
перукарня прибуток програма visual
Дисципліна "Програмування клієнт-серверних
додатків"
Тема курсової роботи "Розробка програмного
забезпечення розрахунку прибутку перукарні"
Мета роботи: створення програмного забезпечення
розрахунку прибутку перукарні; табличний та графічний вигляд запитів та звітів;
мова програмування Visual С++, Visual С#; СУБД ACCES.
Реферат
Буднік Дмитро Васильович
Розробка програмного забезпечення розрахунку
прибутку перукарні
Курсова робота студента 4 курсу спеціальності
"Програмна інженерія" з дисципліни "Програмування
клієнт-серверних додатків". "Криворізький національний
університет". Кривий Ріг, 2013.
Обсяг роботи 30 сторінок, 8 таблиць, 25
рисунків, 19 джерел, 12 додатків.
Предмет дослідження: інформаційна підтримка
процесу управління перукарні.
Об’єкт дослідження: перукарня.
Мета роботи: Створення програмного забезпечення
розрахунку прибутку перукарні.
Методи дослідження: методи
об’єктоно-орієнтованого проектування, методика проектування баз даних, методи
дослідження операцій.
Програмне забезпечення: мова програмування
Visual С++, Visual С#, Microsoft Access.
Результати та їх новизна: спроектовано базу
даних та створено програмне забезпечення управління перукарнею.
Висновки: розроблено працездатне програмне
забезпечення, яке автоматизує вибір користувачей, дає можливість отримати
навички роботи з БД, розробки задач, наближених до реальних умов.
Ключові слова: перукарня, СУБД, програмне
забезпечення, Visual С++, Visual С#.
Зміст
Вступ
Розділ
І. Постановка задачі
.1
Характеристика задачі
.2
Вхідна інформація
.3
Вихідна інформація
Розділ
ІІ. Розробка алгоритму розвязання задачі
.1
Розробка
алгоритму розв’язання задачі на мові програмування Visual
С++
.2
Розробка алгоритму розв’язання задачі на мові програмування Visual С#
Розділ
ІІІ. Організація інформаційного забезпечення
.1
Загальна
характеристика інформаційного забезпечення
.2
Структура баз даних та інформаційних масивів
Розділ
IV. Розробка програмного забезпечення задачі
.1
Опис
головного модулю програми (головного вікна) на мові Visual С++
.2
Опис
головного модулю програми (головного вікна) на мові Visual С#
Висновки
Список
використаних джерел
Додатки
Вступ
Інформація - явище незрівнянно більш
древнє, ніж сама людина. Уже природа у процесі своєї еволюції передавала
закодовану інформацію в рослинах і живих організмах.
З перших своїх кроків люди шукають і
знаходять нові засоби передачі, збереження та обробки інформації.
Однак ніколи раніше людство не
накопичувало інформацію й знання настільки стрімкими темпами.
Тому закономірним є те, що жодна
галузь людської діяльності не зазнала такого розвитку як інформаційні
технології. Саме вони були покликані збільшити ефективність та зручність
використання різноманітних видів інформації. За останні десятиріччя
інформаційні технології зазнали такого глобального поширення, що зараз уже
важко уявити життя сучасної людини без них.
На сучасному етапі можна без
особливих труднощів навести приклади використання інформаційних технологій у
всі галузях: від освіти і до менеджменту.
Сьогодні успіх буде мати та фірма,
той заклад, який володіє найсучаснішими комп’ютерними технологіями. Значного
прогресу можна досягти і в галузі освіти з впровадженням відповідних
інформаційних комп’ютерних технологій, які зможуть зробити процес здобуття
освіти більш гнучким, індивідуалізованим і одночасно нададуть змогу студентам
використовувати глобальні ресурси для навчання, спілкуватись та обмінюватись
досвідом із студентами інших міст, країн тощо.
Насправді, перспективи розвитку
інформаційних комп’ютерних технологій безмежні.
Мета курсової роботи - створення
програмного забезпечення розрахунку прибутку перукарні.
Головні завдання роботи:
автоматизація розрахунку прибутку перукарні; вивід в окремій таблиці прибуток
від окремого перукаря; вироблення основних вимог до програмного забезпечення в
цій галузі. Як об’єкти досліджень в роботі виступають перукарі.
Предметом дослідження даної роботи є
інформаційна підтримка перукарні.
Дана тема є актуальною в наш час,
тому що завжди люди бажають гарно виглядати, й вони користуються послугами
перукарів, отже виникає необхідність в автоматизації процесу записів та
підрахунку прибутку перукарні.
Програмна система, що
розроблятиметься, буде призначена для полегшення та покращення обліку.
Програмний продукт буде розроблено
за допомогою інструментальних засобів розробки мови програмування Visual С++ та
Visual C#.
Розділ І. Постановка
задачі
.1 Характеристика задачі
При створенні даного програмного
забезпечення, було поставлено основну задачу - спроектувати програмне
забезпечення, яке можна було б використовувати для розрахунку прибутку
перукарны. В програмі можливо здійснювати швидкий доступ до даних о перукарях
та замовленнях. Облік записів повинен здійснюватися перукарем й виведення
результату займає багато часу. Саме тому процес повинен бути автоматизований з
метою отримання найбільш точних даних у найкоротший термін з мінімальними
затратами часу.
На меті є програмний комплекс, який
би мав такі характерні риси:
а) простий та зрозумілий інтерфейс;
б) робота з базою даних;
в) вивід діаграми;
г) пошук даних.
Таким чином ми маємо створити
програмне забезпечення, що дозволяло б зберігати та аналізувати інформацію, яка
описуватиме весь процес функціонування перукарні.
.2 Вхідна інформація
Вхідні данні представляють собою
інформацію про підприємство, а також ті данні яки необхідно обчисляти, та
аналізувати.
Для найбільшої ефективності,
необхідна вся важлива первісна інформація.
Для проектування ефективної роботи
перукарні вхідними даними виступають показники таких таблиць як
"Услуги"(послуги)- таблиця 1.1,
"Сотрудники"(співробітники)- таблиця 1.2,
"Заказы"(замовлення) - таблиця 1.3.
В них зібрана вся довідкова
інформація про працівників,пропозиції та замовлення.
Перелік і опис вхідних повідомлень
Таблиця 1.1
Таблиця "Услуги"(Послуги)
№ п/п
|
Назва Вхідного повідомлення
|
Ідентифікатор
|
Форма представлення
|
Частота Оновлення
|
Джерело
|
1
|
Код послуги
|
IDy
|
Таблична
|
При реєстрації нової послуги
|
Перукар
|
2
|
Назва послуги
|
Tip
|
Таблична
|
При реєстрації нової послуги
|
Перукар
|
3
|
Вартість послуги
|
Stoimost
|
Таблична
|
При реєстрації нової послуги
|
Перукар
|
Таблиця 1.2
Таблиця "Сотрудники"
(Співробітники)
№ п/п
|
Назва Вхідного повідомлення
|
Ідентифікатор
|
Форма представлення
|
Частота оновлення
|
Джерело
|
1
|
Код співробітника
|
IDsotr
|
Таблична
|
При реєстрації нового співробітника
|
Перукар
|
2
|
Прізвище співробітника
|
Fam
|
Таблична
|
При реєстрації нового співробітника
|
Перукар
|
3
|
Ім’я співробітника
|
Name
|
Таблична
|
При реєстрації нового співробітника
|
Перукар
|
4
|
Дата народження
|
Datarog
|
Таблична
|
При реєстрації нового співробітника
|
Перукар
|
5
|
Мобільний номер
|
Mobnum
|
Таблична
|
При реєстрації нового співробітника
|
Перукар
|
Таблиця 1.3
Таблиця
"Заказы"(замовлення)
№ п/п
|
Назва Вхідного повідомлення
|
Ідентифікатор
|
Форма представлення
|
Частота оновлення
|
Джерело
|
1
|
Код замовлення
|
IDzak
|
Таблична
|
При реєстрації нового замовлення
|
Перукар
|
2
|
Дата замовлення
|
Datazak
|
Таблична
|
При реєстрації нового замовлення
|
Перукар
|
3
|
Код співробітника
|
IDsotr
|
Таблична
|
При реєстрації нового замовлення
|
Перукар
|
4
|
Код послуги
|
IDy
|
Таблична
|
При реєстрації нового замовлення
|
Перукар
|
1.3 Вихідна інформація
Вихідна інформація представляє собою
результати роботи з базою даних.
У даному проекті вихідною
інформацією є розрахований прибуток від кожної послуги окремо, прибуток від
послуг по дням, прибуток від кожного співробітника по дням, а також загальний
прибуток співробітників.
Характеристика вихідних повідомлень наведена
у таблиці 1.4.
Таблиця 1.4
Перелік і опис
вихідних повідомлень
№ п/п
|
Назва вхідного повідомлення
|
Ідентифікатор
|
Форма представлення
|
Термін і частота надходження
|
Джерело
|
1
|
Прибуток від послуг
|
SUM
|
Таблична
|
Генерується після виконання послуги
|
Перукар
|
2
|
Прибуток співробітників
|
SUM
|
Таблична
|
Генерується після виконання послуги
|
Перукар
|
Розділ ІІ. Розробка
алгоритму розвязання задачі
.1 Розробка алгоритму розв’язання
задачі на мові програмування Visual С++
Робота з програмою здійснюється на
основі управління через об’єкти типу ListBox та Button, зображених на рис. 2.1
та рис. 2.2.
Рис. 2.1. Управління через об’єкт
типу ListBox
Рис. 2.2. Управління через об’єкти
типу Button
Редагування, додавання та видалення
інформації можливе лише при виконанні SQL-запиту (дивись рис. 2.3). Треба
спочатку вписати SQL-запит у текстове поле, потім натиснути відповідну кнопку.
Рис. 2.3. Редагування, додавання та
видалення інформації з бази даних
Як видно з рисунку 2.3. у програмі є
можливість пошуку та сортування даних обраної таблиці.
Алгоритм, за яким виконується
програма, наведено на рис. 2.4.
Рис. 2.4
Опис алгоритму:
. Початок - це відкриття нашої
програми.
. Створення головного вікна програми
- малюється головне вікно програми.
-4. Підключення бази даних -
підключається база даних, котру обере користувач.
-6. Якщо успішне підключення то ми
продовжуємо роботу з програмою, в протилежному випадку є можливість обрати іншу
базу даних.
. З’являється Форма-1, в котрій є
можливість роботи за базою даних: відображення таблиць, запитів, створення
запитів на видалення, додавання,редагування даних.
. При на тисненні кнопки
"График", в нас з’явиться Форама-2.
. Форма 2 - в цій формі
відображається діаграма.
. Діаграма з Форми-2 відображається
на екрані.
. Кнопка завершення роботи з
програмою.
. Кінець роботи з програмою.
.2 Розробка алгоритму розв’язання
задачі на мові програмування Visual С#
Робота з програмою здійснюється на
основі управління через об’єкти типу ListBox та Button, зображених на рис. 2.5
та рис. 2.6.
Рис. 2.5. Управління через об’єкт
типу ListBox
Рис. 2.6. Управління через об’єкти
типу Button
Редагування, додавання та видалення
інформації можливе е при виконанні SQL-запиту (дивись рис. 2.7) або через об’єкт
типу bindingNavigator(дивись рис. 2.8). Треба спочатку вписати SQL-запит у
текстове поле, потім натиснути кнопку "Выполнить".
Рис. 2.7. Редагування, додавання та
видалення інформації з бази даних
Рис. 2.8. Робота з даними бази даних
за допомогою об’єкту bindingNavigator
Як видно з рисунку 2.8, дані можна додавати
,
видаляти
та редагувати.
Щоб зберегти зміни треба клацнути на
зображення дискети.
Нижче приведений програмний код
збереження даних в базу даних:
.Open();(MessageBox.Show("Вы
хотите сохранить изменения в базе данных?",
"Сохранение",
MessageBoxButtons.YesNo,.Question) == DialogResult.Yes) dbAdapter1.Update(dataTable);.Close();
При натисканні на ,
в нас з’являється повідомлення, при натисненні "Да" - зміни
зберігаються, але якщо натиснути на "Нет" зміни не будуть збережені в
базі даних, й вона прийме вид, котрий був при початку роботи з базою.
Алгоритм, за яким виконується
програма, наведено на рис. 2.9.
Рис. 2.9
Опис алгоритму:
. Початок - це відкриття нашої
програми.
. Створення головного вікна програми
- малюється головне вікно програми.
-4. Підключення бази даних -
підключається база даних за замовчуванням.
-6. Якщо успішне підключення то ми
продовжуємо роботу з програмою, в протилежному випадку є можливість обрати іншу
базу даних.
. З’являється Форма-1, в котрій є
можливість роботи за базою даних: відображення таблиць, запитів, створення
запитів на видалення, додавання,редагування даних .
. При на тисненні кнопки
"График", в нас з’явиться Форама-2.
. Форма 2 - в цій формі
відображається діаграма.
. Діаграма з Форми-2 відображається
на екрані.
. Кнопка завершення роботи з
програмою.
. Кінець роботи з програмою.
Розділ ІІІ. Організація
інформаційного забезпеченн
.1 Загальна характеристика
інформаційного забезпечення
Вся необхідна
інформація в базі даних розміщена у вигляді таблиці 3.1. База даних створена у
форматі Microsoft Access (.mdb)
Таблиця 3.1
Перелік і опис
таблиць бази даних
№ п/п
|
Назва таблиці
|
Ідентифікатор
|
Опис
|
1
|
Замовлення
|
Заказы
|
Інформація про замовлення послуг:
номер,дата,співробітник та послуга.
|
2
|
Співробітники
|
Сотрудники
|
Інформація про робітників: код, прізвище,
ім’я, дата народження,номер телефону.
|
3
|
Послуги
|
Услуги
|
Інформація про види послуг: код , назва,
вартість.
|
Для контролю введення інформації
використовується "унікальність полів", тобто в таблиці, наприклад, не
може бути однакового коду робітника. Також таблиці реляційно зв’язані між
собою.
.2 Структура баз даних та
інформаційних масивів
База даних, використана для роботи
програми, складається з трьох таблиць: Замовлення,Робітники, та Послуги.
Таблиця "Замовлення" має
ідентифікатор "Заказы". Її структура наведена у таблиці 3.2.
Таблиця "Послуги" має
ідентифікатор "Услуги". Її структура наведена у таблиці 3.3.
Таблиця "Робітники" має
ідентифікатор "Сотрудники". Її структура наведена у таблиці 3.4.
Таблиця 3.2
Опис структури таблиці
"Замовлення"
Найменування
|
Поле
|
Тип поля
|
Довжина
|
Кількість знаків після десятинної точки
|
Первинний ключ
|
Умова на значення
|
Обов'язкове поле
|
Індексне поле
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Номер
|
IDzak
|
Лічильник
|
|
|
+
|
-
|
+
|
+
|
Дата
|
Datazak
|
Дата/Час
|
|
|
-
|
-
|
+
|
-
|
Код Робітника
|
IDsotr
|
Числове
|
|
0
|
-
|
-
|
+
|
-
|
Код Послуги
|
IDy
|
Числове
|
|
0
|
-
|
-
|
+
|
-
|
Таблиця 3.3
Опис структури таблиці
"Послуги"
Найменування
|
Поле
|
Тип поля
|
Довжина
|
Кількість знаків після десятинної точки
|
Первинний ключ
|
Умова на значення
|
Обов'язкове поле
|
Індексне поле
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
IDy
|
Лічильник
|
|
|
+
|
-
|
+
|
+
|
Тип послуги
|
Tip
|
Текстове
|
50
|
|
-
|
-
|
+
|
+
|
Вартість
|
Stoimost
|
Грошове
|
|
|
-
|
-
|
+
|
-
|
Таблиця 3.4
Опис структури таблиці
"Робітники"
Найменування
|
Поле
|
Тип поля
|
Довжина
|
Кількість знаків після десятинної точки
|
Первинний ключ
|
Умова на значення
|
Обов'язкове поле
|
Індексне поле
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Код робітника
|
IDsotr
|
Лічильник
|
|
|
+
|
-
|
+
|
+
|
Прізвище
|
Fam
|
Текстове
|
50
|
|
-
|
-
|
+
|
+
|
Ім’я
|
Name
|
Текстове
|
50
|
|
-
|
-
|
+
|
-
|
Дата народження
|
Datarog
|
Дата/Час
|
|
|
-
|
-
|
+
|
-
|
Номер телефону
|
Mobnum
|
Текстове
|
20
|
|
-
|
-
|
+
|
-
|
Таблиці бази даних зв’язані між
собою (рис 3.2).
Рис. 3.2.Реляційний зв'язок таблиць
БД.
Розділ IV. Розробка
програмного забезпечення задачі
.1 Опис головного модулю програми
(головного вікна) на мові Visual С++
Рис 4.1. Головне
вікно програми
Головне вікно програми - відправний
пункт для проведення будь-яких операцій. Для вибору необхідних дій слід
використовувати кнопки на цьому вікні.
При натисненні кнопки "Выбор БД"
запускається функція OnOpenDb(), яка відкриває діалог, в котрому обирається
база даних. Після того, як відкривається База Даних, стають активні елементи
для роботи з базою даних (див. рис. 4.2):) "Сортировка";) "Запрос
на выполнение";) "Запрос на выборку";) "Поиск";) "Доход
от услуг";) "Доход по дням";) "Доход от
сотрудников по дням";) "Общий доход от сотрудников".
Рис. 4.2. DataGrid з даними після
відкриття БД.
Як видно за малюнку що вище, в нас є
можливість відсортувати дані по обраному стовбцю. Для цього необхідно ввести в
текстове поле стовпця, по якому необхідно відсортувати дані та нажати на
СheckBox.
При виконані заитів на виконання та
вибірку діє перевірка. Наприклад якщо натиснути на запит вивконаня в нас діє
такая перевірка:
(str.Mid(0,3).Compare("SEL")==0)
{MessageBox("Команда SELECT
недопустима для этой
кнопки");return;}(str.Mid(0,3).Compare("DEL")==0)
{ str1 = "DELETE FROM
<таблица> [ where<условие> ]";= 1;
}(str.Mid(0,3).Compare("UPD")==0)
{= "UPDATE <таблица> SET
<поле>=<выражение>, [<поле>=<выражение>,]... [where<óñëîâèå>]";=2;
}(str.Mid(0,3).Compare("INS")==0)
{ str1 = "INSERT INTO
<таблица> (<список имен полей>) VALUES (<список
значений>)";=3;}(str.Mid(0,3).Compare("CRE")==0)
{ str1 = "CREATE TABLE
<таблица> (<имя поля1> <тип>, < имя поля 2> < тип
>... )";=4;
}(str.Mid(0,3).Compare("DRO")==0)
{str1 = "DROP TABLE
<Таблица>";=5; }
Якщо ми ввели в поле запит не на
виконання то нам висвітиться про не відповідність запиту (див. рис. 4.3.).
Рис. 4.3. Перевірка в запиті на
виконання
Якщо в нас буде введена не вірна
структура запиту, тоді з’явиться строка з синтаксисом запиту (див. рис. 4.4.).
Рис. 4.4. Підсказка синтаксису
запиту
Як видно з малюнку вище в текстовому
полі нам висвітився синтаксис запроса на додавання запису до БД, аналогічні
синтаксиси будуть з’являтися якщо ми введемо не вірно запит на: видалення,
редагування даних. Це дуже зручно адже не завжди пам’ятаєш синтаксис кожної операції.
Для того щоб підрахувати : прибуток
від послуг, прибуток по дням, прибуток співробітників по дням та загальний
прибуток співробітників, необхідно клацнути на відповідну кнопку в панелі
"Робота с БД".
Для пошуку даних треба натиснути у
формі на кнопку "Поиск". Перед цим обравши таблицю пошуку, та в
текстовому полі ввести назву поля та його значення, після чого в нас здійметься
пошук й про результат нас проінформує повідомлення (див рис. 4.5.).
Рис. 4.5. Пошук даних в таблиці
При перегляді загального прибутку
від співробітників в нас з’являється ще одна кнопка "График" (дивись
рис. 4.6.).
Рис. 4.6. DataGrid з даними при
перегляді загального прибутку.
При натисканні на кнопку
"График", в нас з’являється нове вікно, в якому відображається
діаграма по даним загального прибутку від співробітників (дивись рис. 4.7.)
Рис. 4.7. Графік по загальному
прибутку від співробітників
Будування графіку виконується за
допомогою наступного коду:
sum=0;(
i=0;i<Doc->n;i++)sum+=Doc->mas[i];(i=0;i<Doc->n;i++)kof[i]=(100*Doc->mas[i])/sum;(i=0;i<Doc->n;i++)otr[i]=(360*kof[i])/100;data;(time(0));*quadObj;=
gluNewQuadric();(quadObj, GLU_FILL);=90;r,g,b;(i=0;i<Doc->n;i++)
{r=colorArray[i];=(colorArray[i])>>8;=(colorArray[i])>>16;ub(r,g,b);(quadObj,
0, 0.5, 15, 1,data,otr[i]);+=otr[i];}
В цьому коді ми спочатку
підраховуємо необхідні значення для малювання круговою діаграми, а потім вже
малюємо саму діаграму за допомогою функціїї gluPartialDisk().
.2 Опис головного модулю програми
(головного вікна) на мові Visual С#
При старті програми в нас
з’являється головне вікно програми (див. рис. 4.8).
Рис. 4.8. Головне вікно програми
Головне вікно одразу заповнюється
даними котрі знаходяться в базі даних. Для того щоб переключатись між
таблицями, необхідно клікнути на необхідну таблицю в об’єкті ListBox
"Таблицы", й записи цієї таблиці відобразяться в об’єкті DataGrid.
Також в є можливість підрахунку різних видів
прибутку:) від послуг;) по дням;) співробітників по
дням;) загальний прибуток співробітників.
Підрахунок прибутку від послуг здійснюється за
допомогою SQL-запиту до бази даних та відображається на екрані (див. рис. 4.9).
При натисненні на кнопку "Доход от услуг" викликається функція запиту
до бази даних zapros(string str), в котру ми передаємо строку з запитом до бази
даних.
Код підрахунку прибутку від послуг виглядає
наступним чином:
("SELECT Услуги.Tip, Sum(Услуги.Stoimost)
AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON
Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY
Услуги.Tip ORDER BY Услуги.Tip, Sum(Услуги.Stoimost)");
Рис. 4.9. Відображення прибутку від послуг
При натисканні на кнопку "Общий доход по
сотрудникам" (див. рис. 4.10.) в нас виконуються майже ті самі дії, що і
при натисканні кнопки "Доход от услуг".
Рис. 4.10. Відображення загального прибутку по
перукарям
Змінюється лише запит до бази даних,
котрий виглядає наступним чином:
("SELECT Сотрудники.Fam,
Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Услуги INNER JOIN (Сотрудники INNER
JOIN Заказы ON Сотрудники.IDsotr = Заказы.IDsotr) ON Услуги.IDy = Заказы.IDy
GROUP BY Сотрудники.Fam ORDER BY Sum(Услуги.Stoimost) DESC");
В цьому запиті ми з’єднуємо таблиці
бази даних, та отримуємо виручку від перукарів за весь період.
Для того щоб отримати прибуток від
перукарів по дням, необхідно клацнути на кнопку "Доход сотрудников по
дням" (див. рис. 4.11.).
Рис. 4.11. Прибуток від перукарів по
дням
Запит підрахунку прибутку від
перукарів по дням виглядає так:
("SELECT Заказы.Datazak,
Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER
JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr
= Заказы.IDsotr GROUP BY Заказы.Datazak, Сотрудники.Fam ORDER BY Заказы.Datazak,
Sum(Услуги.Stoimost) DESC");
Завдяки цьому запиту ми отримуємо
дані про те скільки грошей та в який день кожен перукар заробив.
Також є можливість підрахунку
загальною суми прибутку за день. Для цього необхідно клацнути на кнопку
"Доход по дням" (рис. 4.12.). Після чого в нашому вікні відобразиться
вся інформація прибутку котрий ми отримує в окремий день.
Ця інформація відображається в
елементі DataGridWiev, кожен день відображається на новому рядку. Дані можна
відсортувати по даті заказів або по їх загальній сумі, для цього необхідно
клікнути на заголовок стовпця, й поруч з заголовком з’явиться стрілка вверх
(сортування даних від мінімально до максимально) або стрілка вгору (сортування
даних відповідного стовпця від максимального значення до мінімального).
Рис. 4.12. Прибуток по дням
Запит до бази даних для підрахунку
прибутку по дням виглядає наступним чином:
("SELECT Заказы.Datazak,
Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER
JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr
GROUP BY Заказы.Datazak ORDER BY Заказы.Datazak");
В цьому запиті ми об’єднуємо таблиці
"Сотрудники", "Услуги" та "Заказі", та групую
записи по полю дати, також здійснюється сортування даних від меншої до більшої
дати.
Після підрахунку прибутку від послуг
та загального прибутку від співробітників, є можливість відображення цих даних
на діаграмі. Для цього необхідно клікнути на кнопку "График", яка
появиться в нашому вікні (див. рис. 4.13.).
При натисканні на кнопку
"Графік" виконуються наступний код:
= new
string[dataGridView1.RowCount];= new float[dataGridView1.RowCount];=
dataGridView1.RowCount+1;(int i = 0; i < dataGridView1.RowCount-1; i++)
{a[i] = dataGridView1[0, i].Value.ToString();[i]
= float.Parse(dataGridView1[1, i].Value.ToString());}f2 = new Form2();.temp(a,
b, n);.Show();
Завдяки цьому коду ми зчитуємо дані
прибутку з нашого DataGridView та записуємо їх у змінні і передаємо у Форму-2 й
викликаємо саму форму(див. рис. 4.14.).
Рис. 4.13. Вікно з кнопкою
"График"
Рис. 4.14. Вікно з діаграмою по
прибутку перукарів за весь час
Як видно з рисунку вище, в нас
відображається кругова діаграма з легендою по загальному прибутку від
перукарів. Відповідний запис підсвічується відповідним кольором сектору
діаграми.
В нас є можливість відобразити
кругову діаграму по загальному прибутку від послуг (див. рис. 4.15), для цього
необхідно клацнути кнопку "Доход от услуг" на Формі-1.
Рис. 4.15. Вікно з діаграмою по
загальному прибутку від послуг
На рисунку , що вище також видно
відповідність кольору сектору діаграми , задньому кольору тексту.
Висновки
В Результаті виконання курсової
роботи, було створено програмне забезпечення, яке дозволяє керувати даними
перукарні. Була сформульована характеристика задачі, мета вирішення та цілі,
які вона переслідує. В ході виконання роботи була визначена структура та зміст
вхідної й вихідної інформації, основні вимоги до їх оформлення. Джерела, які
забезпечують задачу вхідною інформацією та особи, які мають отримати вихідну
інформацію.
Для реалізації задачі було створено
базу даних з трьох таблиць, призначену для зберігання вхідної інформації.
Відповідно до розробленої моделі, був визначений алгоритм побудови програми.
Для його реалізації було обрано мови програмування Visual С++ та Visual С#. В
якості СУБД для роботи зі створеною базою даних було використано Microsoft
Access.
До переваг програми слід віднести
можливості швидкого та зручного внесення змін та введення даних у відповідну
базу даних, отримання необхідних табличних результатів.
На основі виконаної роботи можна
розвивати та вдосконалювати розроблену програмну систему, задля підвищення її
функціональності.
Список використаних
джерел
1. Секунов
Н.Ю. Самоучитель Visual C++ 6. - СПб.: БХВ - Санкт-Петербург, 1999. - 960 с.
2. Абрамян
М. Visual C# на примерах. - СПб.: БХВ-петербург, 2008. - 496с.
. Агуров
П. C#. Разработка компонентов в MS Visual Studio 2005/2008. - СПб.:
БХВ-петербург, 2008. - 480с
. Павловская
Т.А. C#. Программирование на языке высокого уровня. Учебник для вузов. - СПб.:
Питер, 2007. - 432 с.
. Шкарина
Л.Ш. Язык SQL: учебный курс. - СПб.: Питер, 2001. - 592 с.: ил.
. Страуструп
Б. Язык программирования C++. - СПб.: БИНОМ, 1999. - 991 с.
7. Павловская
Т.А. С/С++. Программирование на языке высокого уровня. - СПб.: Питер, 2003. -
461 с.
8. Джон
Вейскас. Эфективная работа с Access 7.0. - Санкт-Петербург: Питер, 1997.-830с.
9. Уэйт
М. Язык С. Руководство для начинающих. / М. Уэйт, С. Прага, Д. Мартин. - М.:
Мир, 1995. - 521 с.: ил.
. Фридман
А.Л. Язык программирования С++ / А.Л.Фридман. - М.: Бином, 2006. - 523 с.: ил.
. OpenGL.
Суперкнига, 3-е издание.: Пер. с англ - М.: Издательский домм
"Вильямс", 2006. - 1040с. : ил. - Парал. тит. англ.
. Программирование
для Microsoft Windows на С#/ Петцольд Ч. - М.: Издательско-торговый дом
"Русская Редакция", 2002 - В 2-х т. Т. 1. - 576 с.
. Холзнер
С. Visual C++ 6: учебный курс - СПб: ЗАО "Издательство
"Питер"", 1999. - 576 с.
. Грегори
К. Использование Visual C++ 6. Учебное пособие - СПб: К.: Издательский дом
"Вильямс", 1999. - 864 с.
. Олафсен
Ю., Скрайбнер К., Уайт К. MFC и Visual C++ 6. Энциклопедия программиста - СПб.:
ООО "ДиаСофтЮП", 2003. - 992 с.
. Секунов
Н.Ю. Самоучитель Visual C++ 6. - СПб.: БХВ - Санкт-Петербург, 1999. - 960 с.
. Зеленский
А.С., Лысенко В.С., Баран С.В. Методические указания к выполнению лабораторных
и индивидуальных работ на основе типовых примеров разработки программного
обеспечения в Visual C++ 6.0 по дисциплине "Новые информационные
технологии" для магистров специальности "Экономическая
кибернетика" (программа "Информационный менеджмент") // ГВУЗ
"КНЭУ имени Вадима Гетьмана" Криворожский экономический институт -
Кривой Рог: КЭИ - 2007. - 63 с.
. Зеленский
А.С., Лысенко В.С., Баран С.В. Методические указания для самостоятельного
изучения работы с базами данных на Visual C++ с использованием объектов ActiveX
Data Object (ADO) по дисциплинам "Мониторинг информационных
технологий", "Информационные системы в экономике",
"Автоматизация проэктирования информационных систем" // ГВУЗ
"КНЭУ имени Вадима Гетьмана" Криворожский экономический институт -
Кривой Рог: КЭИ - 2008. - 54 с.
. Зеленский
А.С., Лысенко В.С. Методические указания использования объектов ADO при работе
с базами данных на Visual C++ в примерах по дисциплинам: "Мониторинг
информационных технологий", "Информационные системы в
экономике", "Автоматизация проэктирования информационных систем"
(практическая основа для выполнения лабораторних, индивидуальных, курсових и
дипломних работ) // ГВУЗ "КНЭУ имени Вадима Гетьмана" Криворожский
экономический институт - Кривой Рог: КЭИ - 2008. - 65 с.
Додатки
Додаток А
.h
#if !defined(AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_)
#define
AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN// Exclude
rarely-used stuff from Windows headers
#include <afxwin.h> // MFC
core and standard components
#include <afxext.h> // MFC
extensions
#include <afxdisp.h> // MFC
Automation classes
#include <afxdtctl.h>// MFC
support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>// MFC
support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include
"msado15.tlh"namespace ADODB;
#include <GL\gl.h>
#include <GL\glu.h>
#include <GL\glut.h>
#include <GL\glaux.h>
#pragma comment(lib,
"opengl32.lib")
#pragma comment(lib,
"glu32.lib")
#pragma comment(lib,
"glaux.lib")
#pragma comment(lib,
"glut32.lib")
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert
additional declarations immediately before the previous line.
#endif //
!defined(AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_)
Додаток В
.h
#include "Grafik.h"
#if
!defined(AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_)
#define
AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER >
1000CMainFrame : public CFrameWnd
{protected: // create from
serialization only();_DYNCREATE(CMainFrame)
// Attributes:*graf;pfd;
// Operations:
// Overrides
// ClassWizard generated virtual
function overrides
//{{AFX_VIRTUAL(CMainFrame)BOOL
PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation:~CMainFrame();
#ifdef _DEBUGvoid AssertValid()
const;void Dump(CDumpContext& dc) const;
#endif: // control bar embedded
membersm_wndStatusBar;m_wndToolBar;
// Generated message map functions:
//{{AFX_MSG(CMainFrame)_msg int
OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG_MESSAGE_MAP()};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert
additional declarations immediately before the previous line.
#endif //
!defined(AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_)
Додаток С
.h
#if
!defined(AFX_KURSOVAYAVIEW_H__20E5AAB1_F20B_4B8B_A6CA_DECD3E8A975E__INCLUDED_)
#define
AFX_KURSOVAYAVIEW_H__20E5AAB1_F20B_4B8B_A6CA_DECD3E8A975E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER >
1000CKursovayaView : public CView
{protected: // create from
serialization only();_DYNCREATE(CKursovayaView)
// Attributes:* GetDocument();
// Operations:
// Overrides
// ClassWizard generated virtual function
overrides
//{{AFX_VIRTUAL(CKursovayaView):void
OnDraw(CDC* pDC); // overridden to draw this viewBOOL
PreCreateWindow(CREATESTRUCT& cs);:BOOL OnPreparePrinting(CPrintInfo*
pInfo);void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);void OnEndPrinting(CDC*
pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation:~CKursovayaView();
#ifdef _DEBUGvoid AssertValid()
const;void Dump(CDumpContext& dc) const;
#endif:
// Generated message map functions:
//{{AFX_MSG(CKursovayaView)
// NOTE - the ClassWizard will add
and remove member functions here.
// DO NOT EDIT what you see in these
blocks of generated code !
//}}AFX_MSG_MESSAGE_MAP()};
#ifndef _DEBUG // debug version in
kursovayaView.cppCKursovayaDoc* CKursovayaView::GetDocument()
{ return (CKursovayaDoc*)m_pDocument;
}
#endif
#endif
Додаток D
.h
#if
!defined(AFX_KURSOVAYADOC_H__5EC4DE28_9A33_4AC5_B2C0_416A587C8496__INCLUDED_)
#define
AFX_KURSOVAYADOC_H__5EC4DE28_9A33_4AC5_B2C0_416A587C8496__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER >
1000CKursovayaDoc : public CDocument
{: // create from serialization
only();_DYNCREATE(CKursovayaDoc)
// Attributes:
_ConnectionPtr pConn;
_RecordsetPtr pRecordset;fields;
CString baza;
CString table;
int mas[200];
int n;ms[200];
// Operations:
// Overrides
// ClassWizard generated virtual
function overrides
//{{AFX_VIRTUAL(CKursovayaDoc):BOOL
OnNewDocument();void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
//
Implementation:~CKursovayaDoc();ErrMessage(_com_error &ce);
#ifdef _DEBUGvoid AssertValid()
const;void Dump(CDumpContext& dc) const;
#endif:
// Generated message map functions:
//{{AFX_MSG(CKursovayaDoc)_msg void
OnDdd();
//}}AFX_MSG_MESSAGE_MAP()};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert
additional declarations immediately before the previous line.
#endif
Додаток E
.h
#if
!defined(AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_)
#define
AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_
#include "kursovayaDoc.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include
"kursovayaDoc.h"Grafik : public CFrameWnd
{_DYNCREATE(Grafik):
// protected constructor used by
dynamic creation
// Attributes:();*
mf;colorArray[17];i;proc[200];kof[200];otr[200];*Doc;Init_3d();
// protected constructor used by
dynamic creation~Grafik();
// Operations:
// Overrides
// ClassWizard generated virtual
function overrides
//{{AFX_VIRTUAL(Grafik):BOOL
PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation:
// Generated message map functions
//{{AFX_MSG(Grafik)_msg int
OnCreate(LPCREATESTRUCT lpCreateStruct);_msg void OnPaint();_msg void
OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert
additional declarations immediately before the previous line.
#endif //
!defined(AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_)
Додаток F
.h
//{{AFX_INCLUDES()
#include "datagrid.h"
//}}AFX_INCLUDES
#if !defined(AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_)
#define
AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_
#include "Grafik.h"
#include "MainFrm.h"
#include "kursovayaDoc.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000Dlg :
public CDialog
{
// Construction:(CWnd* pParent =
NULL); // standard constructor*Doc;~Dlg();*graf;*mfr;
// Dialog Data
//{{AFX_DATA(Dlg){ IDD = IDD_DIALOG1
};_pol;_tab;_editquery;_datagrid;
_ConnectionPtr pConn;
_RecordsetPtr
pRecordset;fields;baza;table;
//}}AFX_DATAStructura_BD();Connect_Baza(CString
str);Recordset_Baza(CString str);
// Overrides
// ClassWizard generated virtual
function overrides
//{{AFX_VIRTUAL(Dlg):void
DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation:
// Generated message map functions
//}}AFX_MSG_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert
additional declarations immediately before the previous line.
#endif //
!defined(AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_)
Додаток G
.cpp
#include "stdafx.h"
#include "kursovaya.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILEchar THIS_FILE[] =
__FILE__;
#endif_DYNCREATE(CMainFrame,
CFrameWnd)_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)_WM_CREATE()
//}}AFX_MSG_MAP_MESSAGE_MAP()UINT
indicators[] =
{_SEPARATOR, // status line
indicator_INDICATOR_CAPS,_INDICATOR_NUM,_INDICATOR_SCRL,
};::CMainFrame()
{=0;=
{(PIXELFORMATDESCRIPTOR), // size of
this pfd
, // version number_DRAW_TO_WINDOW |
// support window_SUPPORT_OPENGL | // support OpenGL_DOUBLEBUFFER, // double
buffered_TYPE_RGBA, // RGBA type
, // 24-bit color depth
, 0, 0, 0, 0, 0, // color bits
ignored
, // no alpha buffer
, // shift bit ignored
, // no accumulation buffer
, 0, 0, 0, // accum bits ignored
, // 32-bit z-buffer
, // no stencil buffer
, // no auxiliary buffer_MAIN_PLANE,
// main layer
, // reserved
, 0, 0 // layer masks ignored
};= pfd1;// TODO: add member
initialization code here
}::~CMainFrame()
{
}CMainFrame::OnCreate(LPCREATESTRUCT
lpCreateStruct)
{(CFrameWnd::OnCreate(lpCreateStruct)
== -1)-1;(!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{("Failed to create
toolbar\n");-1; // fail to create
}(!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,(indicators)/sizeof(UINT)))
{("Failed to create status
bar\n");-1; // fail to create
}_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);(CBRS_ALIGN_ANY);(&m_wndToolBar);0;
}CMainFrame::PreCreateWindow(CREATESTRUCT&
cs)
{( !CFrameWnd::PreCreateWindow(cs)
)FALSE;
// TODO: Modify the Window class or
styles here by modifying
// the CREATESTRUCT csTRUE;
}
// CMainFrame diagnostics
#ifdef
_DEBUGCMainFrame::AssertValid() const
{::AssertValid();
}CMainFrame::Dump(CDumpContext&
dc) const
{::Dump(dc);
}
#endif //_DEBUG
Додаток H
.cpp
#include "stdafx.h"
#include "kursovaya.h"
#include "dlg.h"
#include "kursovayaDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILEchar THIS_FILE[] =
__FILE__;
#endif_DYNCREATE(CKursovayaDoc,
CDocument)_MESSAGE_MAP(CKursovayaDoc, CDocument)
//{{AFX_MSG_MAP(CKursovayaDoc)_COMMAND(ID_DDD,
OnDdd)
//}}AFX_MSG_MAP_MESSAGE_MAP()::CKursovayaDoc()
{(NULL);= 0;=
0;(pConn.CreateInstance("ADODB.Connection"))
{= 0;
::MessageBox(0," Не выполнена
инициализация Connection","Ошибка!!!",MB_ICONINFORMATION); ;
}>ConnectionTimeout =
15000;>CommandTimeout = 15000;>CursorLocation = adUseClient;>Mode =
adModeReadWrite;(pRecordset.CreateInstance(L"ADODB.RecordSet"))
{
::MessageBox(0,"Не выполнена
инициализация Recordset","!!!!Ошибка!!!",MB_ICONINFORMATION);
.Release();= 0;= 0;
}= "";=
"";(pConn==0)return;
}::~CKursovayaDoc()
{
}CKursovayaDoc::ErrMessage(_com_error
&ce)
{err="";+="\n";+="Source:
";+="\n";
::MessageBox(0,err,"Îøèáêà!!!",MB_ICONINFORMATION);
}CKursovayaDoc::OnNewDocument()
{(!CDocument::OnNewDocument())FALSE;
// TODO: add reinitialization code
here
// (SDI documents will reuse this
document)TRUE;
}
// CKursovayaDoc
serializationCKursovayaDoc::Serialize(CArchive& ar)
{(ar.IsStoring())
{
// TODO: add storing code here
}
{
// TODO: add loading code here
}
}
// CKursovayaDoc diagnostics
#ifdef
_DEBUGCKursovayaDoc::AssertValid() const
{::AssertValid();
}CKursovayaDoc::Dump(CDumpContext&
dc) const
{::Dump(dc);
}
#endif //_DEBUGCKursovayaDoc::OnDdd()
{dlg;.Doc = this;.pConn =
pConn;.pRecordset = pRecordset;.DoModal();
}
Додаток J
.cpp
#include "stdafx.h"
#include "kursovaya.h"
#include "Grafik.h"
#include "MainFrm.h"
#include "Dlg.h"
#include "MainFrm.h"
#include <windows.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILEchar THIS_FILE[] =
__FILE__;
#endif_DYNCREATE(Grafik,
CFrameWnd)::Grafik()
{[0] = 0x0000000L; colorArray[1] =
0x0AFAFAFL;[2] = 0x0FF0000L; colorArray[3] = 0x000FF00L;[4] = 0x00000FFL;
colorArray[5] = 0x0FFFF00L;[6] = 0x000FFFFL;
}::~Grafik()
{
//((CMainFrame*)AfxGetMainWnd())->graf
= 0;
}_MESSAGE_MAP(Grafik, CFrameWnd)
//{{AFX_MSG_MAP(Grafik)_WM_CREATE()_WM_PAINT()_WM_SIZE()
//}}AFX_MSG_MAP_MESSAGE_MAP()
// Grafik message handlersGrafik::Init_3d()
{;pixelformat;* pp =
(CMainFrame*)AfxGetMainWnd();
//if ((pixelformat =
ChoosePixelFormat(GetDC()->GetSafeHdc(), &(pp->pfd))) == 0 ||
//
SetPixelFormat(GetDC()->GetSafeHdc(), pixelformat, &pp->pfd) ==
FALSE)
//return false;((pixelformat = ChoosePixelFormat(GetDC()->GetSafeHdc(),
&(pp->pfd))) == 0 ||(GetDC()->GetSafeHdc(), pixelformat,
&pp->pfd) == FALSE)false;
::DescribePixelFormat(GetDC()->GetSafeHdc(),
pixelformat, sizeof(pp->pfd),
&(pp->pfd));(pp->pfd.cColorBits<16)return false;hrc = wglCreateContext(GetDC()->GetSafeHdc());(GetDC()->GetSafeHdc(),
hrc);(GL_DEPTH_TEST);true;
}Grafik::PreCreateWindow(CREATESTRUCT&
cs)
{(!CFrameWnd::PreCreateWindow(cs))FALSE;.dwExStyle
|= WS_EX_CLIENTEDGE;.style &= ~WS_BORDER;.lpszClass =
AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW),
HBRUSH(0), NULL);TRUE;
}Grafik::OnCreate(LPCREATESTRUCT
lpCreateStruct)
{(CFrameWnd::OnCreate(lpCreateStruct)
== -1)-1;(!Init_3d())MessageBox("Error");0;
}Grafik::OnPaint()
{dc(this);
// device context for
painting();(1,1,1,1);(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);glPushAttrib(GL_ALL_ATTRIB_BITS);sum=0;(
i=0;i<Doc->n;i++)sum+=Doc->mas[i];(i=0;i<Doc->n;i++)kof[i]=(100*Doc->mas[i])/sum;(i=0;i<Doc->n;i++)otr[i]=(360*kof[i])/100;data;(time(0));*quadObj;=
gluNewQuadric();(quadObj, GLU_FILL);=90;r,g,b;(i=0;i<Doc->n;i++)
{=colorArray[i];=(colorArray[i])>>8;=(colorArray[i])>>16;ub(r,g,b);(quadObj,
0, 0.5, 15, 1,data,otr[i]);+=otr[i];
}();(wglGetCurrentDC());();();rect;font;(&rect);.CreatePointFont(140,"Arial");.SelectObject(&font);z=40;br;.CreateSolidBrush(colorArray[0]);.SelectObject(&br);k;(i=0;i<Doc->n;i++)
{.DeleteObject();.TextOut(rect.Width()-200,z,Doc->ms[i]);.CreateSolidBrush(colorArray[i]);.SelectObject(&br);.Rectangle(rect.Width()-230,z,rect.Width()-210,z+25);
//dc.FillRect(k,br);+=40;
}
// TODO: Add your message handler
code here
// Do not call CFrameWnd::OnPaint()
for painting messages
}Grafik::OnSize(UINT nType, int cx,
int cy)
{::OnSize(nType, cx, cy);(cx>cy)
{(0,0,cy,cy);
}
{(0,(cy-cx)/2,cx,cx);
}(false);
}
Додаток K
.cpp
#include "stdafx.h"
#include "kursovaya.h"
#include "Dlg.h"
#include "time.h"
#include <sys/timeb.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILEchar THIS_FILE[] =
__FILE__;
#endif::Dlg(CWnd* pParent /*=NULL*/)
: CDialog(Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(Dlg)
// NOTE: the ClassWizard will add
member initialization here
//}}AFX_DATA_INIT
}::~Dlg()
{
//exit(0);
}Dlg::DoDataExchange(CDataExchange*
pDX)
{::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Dlg)_Control(pDX,
IDC_POLYA, m_pol);_Control(pDX, IDC_TABLE, m_tab);_Control(pDX, IDC_EDIT1,
m_editquery);_Control(pDX, IDC_DATAGRID1,
m_datagrid);(IDC_DOHOD_OT_USLUG)->ShowWindow(SW_HIDE);(IDC_DOHOD_PO_DNYAM)->ShowWindow(SW_HIDE);(IDC_DOHOD_SOTR_PODNYAM)->ShowWindow(SW_HIDE);(IDC_ALL_DOHOD_SOTR)->ShowWindow(SW_HIDE);(IDC_ZAPROS_MAKE)->ShowWindow(SW_HIDE);(IDC_ZAPROS_SELECT)->ShowWindow(SW_HIDE);(IDC_Find)->ShowWindow(SW_HIDE);(IDC_Sort)->ShowWindow(SW_HIDE);(IDC_GRAF)->ShowWindow(SW_HIDE);
//}}AFX_DATA_MAP
}_MESSAGE_MAP(Dlg, CDialog)
//{{AFX_MSG_MAP(Dlg)_BN_CLICKED(IDC_OPEN_DB,
OnOpenDb)_BN_CLICKED(IDC_ZAPROS_MAKE,
OnZaprosMake)_BN_CLICKED(IDC_ZAPROS_SELECT,
OnZaprosSelect)_BN_CLICKED(IDC_Find, OnFind)_BN_CLICKED(IDC_GRAF,
OnGraf)_BN_CLICKED(IDC_DOHOD_OT_USLUG,
OnDohodOtUslug)_BN_CLICKED(IDC_DOHOD_PO_DNYAM,
OnDohodPoDnyam)_BN_CLICKED(IDC_DOHOD_SOTR_PODNYAM,
OnDohodSotrPodnyam)_BN_CLICKED(IDC_ALL_DOHOD_SOTR,
OnAllDohodSotr)_LBN_SELCHANGE(IDC_TABLE,
OnSelchangeTable)_LBN_SELCHANGE(IDC_POLYA, OnSelchangePolya)_BN_CLICKED(IDC_First,
OnFirst)_BN_CLICKED(IDC_Left, OnLeft)_BN_CLICKED(IDC_Right,
OnRight)_BN_CLICKED(IDC_Last, OnLast)_BN_CLICKED(IDC_Sort, OnSort)
//}}AFX_MSG_MAP_MESSAGE_MAP()Dlg::OnOpenDb()
{OpenDialog(true, "",
"",_FILEMUSTEXIST |OFN_HIDEREADONLY,
"Microsoft Access Database
(*.mdb)|*.mdb|");(OpenDialog.DoModal()!=IDOK) return;str_con =
OpenDialog.GetPathName();_con.MakeLower
();_editquery.SetWindowText("");g;(1)
{= str_con.Find('\\',0);(g ==
-1)break;_con = str_con.Mid(g+1);
}= str_con;.MakeUpper();_con=("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=");_con+=OpenDialog.GetPathName();_con+=";";_datagrid.SetRefDataSource(0);
{_Baza(str_con);
}(_com_error &ce)
{>ErrMessage(ce);;
}(IDC_DOHOD_OT_USLUG)->ShowWindow(SW_SHOW);(IDC_DOHOD_PO_DNYAM)->ShowWindow(SW_SHOW);(IDC_DOHOD_SOTR_PODNYAM)->ShowWindow(SW_SHOW);(IDC_ALL_DOHOD_SOTR)->ShowWindow(SW_SHOW);(IDC_ZAPROS_MAKE)->ShowWindow(SW_SHOW);(IDC_ZAPROS_SELECT)->ShowWindow(SW_SHOW);(IDC_Find)->ShowWindow(SW_SHOW);(IDC_Sort)->ShowWindow(SW_SHOW);_BD();//
TODO: Add your control notification handler code here
}Dlg::OnZaprosMake()
{_timeb
timebuffer;(IDC_GRAF)->ShowWindow(SW_HIDE);
_ftime( &timebuffer );nach =
timebuffer.time+timebuffer.millitm/1000.0;str,str1;kod=0;_editquery.GetWindowText
(str);.TrimLeft();.MakeUpper ();(str.Mid(0,3).Compare("SEL")==0)
{MessageBox("Команда SELECT
недопустима для этой
кнопки");return;}(str.Mid(0,3).Compare("DEL")==0)
{= "DELETE FROM <таблица>
[ where<условие> ]";= 1;
}(str.Mid(0,3).Compare("UPD")==0)
{= "UPDATE <таблица> SET
<поле>=<выражение>, [<поле>=<выражение>,]...
[where<óñëîâèå>]";=2;
}(str.Mid(0,3).Compare("INS")==0)
{= "INSERT INTO <таблица>
(<список имен полей>) VALUES (<список значений>)";=3;
}(str.Mid(0,3).Compare("CRE")==0)
{= "CREATE TABLE
<таблица> (<имя поля1> <тип>, < имя поля 2> < тип
>... )";=4;
}(str.Mid(0,3).Compare("DRO")==0)
{= "DROP TABLE
<Таблица>";=5;
}
{>BeginTrans();>Execute((_bstr_t)str,0,adCmdText);>CommitTrans();
}(_com_error &ce)
{>RollbackTrans();>ErrMessage(ce);(kod
&& str.GetLength()< 15)m_editquery.SetWindowText
(str1);_editquery.SetFocus();;
}(pRecordset->GetState())pRecordset->Requery
(-1);
_ftime( &timebuffer );conec =
timebuffer.time+timebuffer.millitm/1000.0;vr_zap;_zap.Format(" Запрос
выполнен за %f сек ",conec - nach);(vr_zap);_editquery.SetWindowText
("");// TODO: Add your control notification handler code here
}Dlg::OnZaprosSelect()
{(IDC_GRAF)->ShowWindow(SW_HIDE);str_query;_editquery.GetWindowText(str_query);_query.MakeUpper
();(str_query.Mid(0,6).Compare("SELECT"))
{("В запросе на выборку
отсутствует параметр SELECT","Ошибка!!!",MB_ICONINFORMATION );
_editquery.SetWindowText("SELECT <*>|<имя поля> FROM
<таблица>");_editquery.SetFocus();;
}
{_Baza(str_query);_datagrid.SetRefDataSource(pRecordset);
}(_com_error &ce)
{("erorrchik");>ErrMessage(ce);
}_editquery.SetFocus ();// TODO: Add
your control notification handler code here
}Dlg::OnFind()
{(pRecordset->GetState()==0)return;(IDC_GRAF)->ShowWindow(SW_HIDE);
_variant_t bb =
0L;str_query;_editquery.GetWindowText(str_query);_timeb timebuffer;
_ftime( &timebuffer );nach =
timebuffer.time+timebuffer.millitm/1000.0;
{>Find((_bstr_t)str_query,0L,adSearchForward,bb);
_ftime( &timebuffer );conec =
timebuffer.time+timebuffer.millitm/1000.0;vr_zap;_zap.Format(" Поиск
выполнен за %f сек",conec -
nach);(vr_zap);(pRecordset->ADO_EOF)("Значение не найдено! Уазатель за
концом БД (EOF = true)");
}(_com_error &ce)
{>ErrMessage(ce);_editquery.SetFocus
();
}// TODO: Add your control
notification handler code here
}Dlg::OnGraf()
{(pRecordset->GetState()==0)return;kol_zap
= pRecordset->GetRecordCount ();(!kol_zap)
{("И что мы собрались
считать?!!!","Ошибка!!!",MB_ICONINFORMATION);;
}i;j;
_bstr_t zn;
_variant_t pol,vr;=
(long)0;str="";buf[100];{_datagrid.SetRefDataSource(0);sum = 0;kol =
0;=0;(i = 0; i < kol_zap;i++)
{=
fields->GetItem(0L)->GetValue();= "NULL";(vr.vt!= VT_NULL) zn =
vr;+=zn;>ms[j]=str;="";=fields->GetItem(1L)->GetValue();>mas[j]=atoi((_bstr_t)vr);>MoveNext();++;
}>n=j;rect;(&rect);.OffsetRect(20,80);=
new Grafik;
//graf->mf = mfr;>Doc=this->Doc;>CreateEx(NULL,NULL,"Grafik",WS_VISIBLE|WS_OVERLAPPEDWINDOW,rect,AfxGetMainWnd(),
0);
}(_com_error &ce)
{>ErrMessage(ce);
} // TODO: Add your control
notification handler code here
}Dlg::OnDohodOtUslug()
{str_query;_query="SELECT
Услуги.Tip, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN
(Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr =
Заказы.IDsotr GROUP BY Услуги.Tip ORDER BY Услуги.Tip,
Sum(Услуги.Stoimost)";_Baza(str_query);_datagrid.SetRefDataSource(pRecordset);//
TODO: Add your control notification handler code
here(IDC_GRAF)->ShowWindow(SW_HIDE);
}Dlg::OnDohodPoDnyam()
{str_query;_query="SELECT
Заказы.Datazak, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER
JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr
= Заказы.IDsotr GROUP BY Заказы.Datazak ORDER BY
Заказы.Datazak";_Baza(str_query);_datagrid.SetRefDataSource(pRecordset);(IDC_GRAF)->ShowWindow(SW_HIDE);
}Dlg::OnDohodSotrPodnyam()
{str_query;_query="SELECT
Заказы.Datazak, Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM
Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON
Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Заказы.Datazak, Сотрудники.Fam ORDER
BY Заказы.Datazak, Sum(Услуги.Stoimost)
DESC";_Baza(str_query);_datagrid.SetRefDataSource(pRecordset);(IDC_GRAF)->ShowWindow(SW_HIDE);
}Dlg::OnAllDohodSotr()
{str_query;_query="SELECT
Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Услуги INNER JOIN
(Сотрудники INNER JOIN Заказы ON Сотрудники.IDsotr = Заказы.IDsotr) ON
Услуги.IDy = Заказы.IDy GROUP BY Сотрудники.Fam ORDER BY Sum(Услуги.Stoimost)
DESC";_Baza(str_query);_datagrid.SetRefDataSource(pRecordset);(IDC_GRAF)->ShowWindow(SW_SHOW);
}Dlg::OnSelchangeTable()
{str;(IDC_GRAF)->ShowWindow(SW_HIDE);_pol.ResetContent
();(m_tab.GetCurSel ()<0)
{MessageBox("Ололо выбери
таблицу");;
}_tab.GetText (m_tab.GetCurSel
(),str);= str;.MakeUpper();= "`"+str+"`";
_RecordsetPtr pRec;
pRec =
pConn->Execute((_bstr_t)str,0,adCmdTable);(long
i=0;i<pRec->GetFields()->GetCount();i++)
{=
(char*)(_bstr_t)pRec->GetFields ()->GetItem (i)->GetName
();_pol.AddString (str);
}>Close();= "SELECT * FROM
";=
str+"`"+table+"`";_editquery.SetWindowText(str);();(IDC_STATIC2)->SetWindowText("Работа
с таблицей "+table);// TODO: Add your control notification handler code
here
}Dlg::OnSelchangePolya()
{
// TODO: Add your control
notification handler code here
}Dlg::OnFirst()
{
if(pRecordset->GetState()==0)return;(!pRecordset->GetRecordCount())return;
{>MoveFirst();
}(_com_error &ce)
{>ErrMessage(ce);
}
}Dlg::OnLeft()
{(pRecordset->GetState()==0)return;(!pRecordset->GetRecordCount())return;
{(!pRecordset->BOF)
{>MovePrevious();(pRecordset->BOF)pRecordset->MoveFirst();
}pRecordset->MoveFirst();
}(_com_error &ce)
{>ErrMessage(ce);
}
}Dlg::OnRight()
{(pRecordset->GetState()==0)return;(!pRecordset->GetRecordCount())return;
{(!pRecordset->ADO_EOF)
{>MoveNext();(pRecordset->ADO_EOF)pRecordset->MoveLast();
}pRecordset->MoveLast();
}(_com_error &ce)
{>ErrMessage(ce);
}
}Dlg::OnLast()
{(pRecordset->GetState()==0)return;(!pRecordset->GetRecordCount())return;
{>MoveLast();
}(_com_error &ce)
{ Doc->ErrMessage(ce);
}}Dlg::Recordset_Baza(CString str)
{(pRecordset->GetState())pRecordset->Close();>CursorLocation
= adUseClient;>Open ((_bstr_t)str,(IUnknown
*)pConn,,adLockOptimistic,adCmdText);= pRecordset->GetFields();
}Dlg::Structura_BD()
{str;
_RecordsetPtr
pTables("ADODB.Recordset");= pConn->OpenSchema
(ADODB::adSchemaTables);_tab.ResetContent();_pol.ResetContent
();(!pTables->ADO_EOF)
{=
(char*)(_bstr_t)pTables->GetFields ()->GetItem
((_bstr_t)"TABLE_TYPE")->GetValue
();(!str.Compare ("TABLE"))_tab.AddString
((_bstr_t)pTables->GetFields ()->GetItem
((_variant_t)"TABLE_NAME")->GetValue ());>MoveNext ();
}>Close();
}Dlg::Connect_Baza(CString str)
{(pRecordset->GetState())
pRecordset->Close();(pConn->GetState())pConn->Close();>Open((_bstr_t)str,"","",0);
}Dlg::OnSort()
{(pRecordset->GetState()==0)return;_datagrid.SetRefDataSource(0);str_query;_editquery.GetWindowText(str_query);_timeb
timebuffer;
_ftime( &timebuffer );nach =
timebuffer.time+timebuffer.millitm/1000.0;
{vr_zap;(((CButton*)GetDlgItem(IDC_Sort))->GetCheck
()==1)
{>PutSort ((_bstr_t)str_query);
_ftime( &timebuffer );conec =
timebuffer.time+timebuffer.millitm/1000.0;_zap.Format("Сортировка
выполнена за %f сек ",conec -
nach);_datagrid.SetRefDataSource(pRecordset);(vr_zap);
}
{>Sort =
"";_datagrid.SetRefDataSource(pRecordset);
_ftime( &timebuffer );conec =
timebuffer.time+timebuffer.millitm/1000.0;_zap.Format(" Сортировка снята
за %f секунд",conec - nach);(vr_zap);
}// TODO: Add your control
notification handler code here
}(_com_error &ce)
{
m_datagrid.SetRefDataSource(pRecordset);>ErrMessage(ce);
((CButton*)GetDlgItem(IDC_Sort))->SetCheck
(0);_editquery.SetFocus ();
}
}
Додаток L
.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Data.OleDb;System.Windows.Forms;WindowsFormsApplication1
{partial class Form1 : Form
{dbCon = new
OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=dimabudnik.mdb");dataTable ;dbAdapter1;[] a;[] b;n;Form1()
{();.Visible = false;
}void Form1_Load(object sender,
EventArgs e)
{.Items.Clear();
//подключаемся в БД.Open();
//получаем список таблицtbls =
dbCon.GetSchema("Tables", new string[] { null, null, null,
"TABLE" }); //список всех таблиц
//Пробегаем по списку и добавляем в
ЛистБокс(DataRow row in tbls.Rows)
{TableName =
row["TABLE_NAME"].ToString();.Items.Add(TableName);
}.Close();.SelectedIndex = 0;
// TODO: данная строка кода
позволяет загрузить данные в таблицу "dimabudnikDataSet.Заказы". При
необходимости она может быть перемещена или удалена.
}void
listBox1_SelectedIndexChanged(object sender, EventArgs e)
{.Visible = false;
//подключаемся в БД.Open();
//Делаем запрос к БД= new
OleDbDataAdapter(@"SELECT * FROM " + listBox1.SelectedItem, dbCon);=
new DataTable();
//Заполняем Грид значениями с
таблиці.Fill(dataTable);bb = new OleDbCommandBuilder(dbAdapter1);
//Создаем новое подлючение для
управленияbs1 = new BindingSource();
//заполняем дату значениеями с
таблицы.DataSource = dataTable;
//даём навигатору наши
значения.BindingSource = bs1;
//заполняем грид.DataSource = bs1;
//заполняем поля.Items.Clear();(var
item in dataTable.Columns)
{.Items.Add(item.ToString());
}.Close();
}void toolStripButton1_Click(object
sender, EventArgs e)
{.Open();(MessageBox.Show("Вы
хотите сохранить изменения в базе данных?",
"Сохранение",
MessageBoxButtons.YesNo,.Question) == DialogResult.Yes)
dbAdapter1.Update(dataTable);.Close();
}void button1_Click(object sender,
EventArgs e)
{("SELECT Услуги.Tip,
Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER
JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr
GROUP BY Услуги.Tip ORDER BY Услуги.Tip, Sum(Услуги.Stoimost)");.Visible =
true;
}void button2_Click(object sender,
EventArgs e)
{("SELECT Заказы.Datazak,
Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER
JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr
GROUP BY Заказы.Datazak ORDER BY Заказы.Datazak");.Visible = false;
}void button3_Click(object sender,
EventArgs e)
{.Visible = false;("SELECT
Заказы.Datazak, Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM
Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON
Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Заказы.Datazak, Сотрудники.Fam ORDER
BY Заказы.Datazak, Sum(Услуги.Stoimost) DESC");
}void button4_Click(object sender,
EventArgs e)
{.Visible = true;("SELECT
Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Услуги INNER JOIN
(Сотрудники INNER JOIN Заказы ON Сотрудники.IDsotr = Заказы.IDsotr) ON
Услуги.IDy = Заказы.IDy GROUP BY Сотрудники.Fam ORDER BY Sum(Услуги.Stoimost)
DESC");
}void zapros(string str)
{.Open();
//Делаем запрос к БД= new
OleDbDataAdapter(@""+str+"", dbCon);= new DataTable();
//Заполняем Грид значениями с
таблицы.Fill(dataTable);
//Создаем новое подлючение для
управленияbs1 = new BindingSource();
//заполняем дату значениеями с
таблицы.DataSource = dataTable;
//даём навигатору наши
значения.BindingSource = bs1;
//заполняем грид.DataSource =
bs1;.Close();
}void button5_Click(object sender,
EventArgs e)
}void Form1_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
}void button6_Click(object sender,
EventArgs e)
{.Visible = true;= new
string[dataGridView1.RowCount];= new float[dataGridView1.RowCount];=
dataGridView1.RowCount+1;(int i = 0; i < dataGridView1.RowCount-1; i++)
{[i] = dataGridView1[0,
i].Value.ToString();[i] = float.Parse(dataGridView1[1, i].Value.ToString());
}f2 = new Form2();.temp(a, b,
n);.Show();
}
}
}
Додаток M
.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;WindowsFormsApplication1
{partial class Form2 : Form
{[] a;[] b;x =
SystemInformation.PrimaryMonitorSize.Width;y =
SystemInformation.PrimaryMonitorSize.Height;k;[] brsh = { Brushes.Red,
Brushes.Blue, Brushes.Aqua, Brushes.Green, Brushes.Yellow, Brushes.Gold,
Brushes.AliceBlue, Brushes.AntiqueWhite, Brushes.Aquamarine, Brushes.Azure,
Brushes.Beige, Brushes.Bisque, Brushes.BlanchedAlmond, Brushes.BlueViolet, Brushes.Brown,
Brushes.BurlyWood, Brushes.CadetBlue, Brushes.Chartreuse, Brushes.Chocolate,
Brushes.Coral, Brushes .CornflowerBlue};[] cl = { Color.Red, Color.Blue,
Color.Aqua, Color.Green, Color.Yellow, Color.Gold,
Color.AliceBlue,.AntiqueWhite, Color.Aquamarine, Color.Azure, Color.Beige,
Color.Bisque,.BlanchedAlmond, Color.BlueViolet, Color.Brown, Color.BurlyWood,
Color.CadetBlue,.Chartreuse, Color.Chocolate, Color.Coral, Color.CornflowerBlue
};tol_lin = 1;Form2()
{= true;= true;();= new Size(x, y);
}void temp(string[] name, float[]
val, int n)
{= name;= val;= n;
}void Form2_Paint(object sender,
PaintEventArgs e)
{Total = 0.0F;f2, f1 = 0.0F;rd = new
Random();pen = new Pen(Color.Black, tol_lin);rect = new Rectangle(tol_lin,
tol_lin,.Width/2 * tol_lin, ClientSize.Height - 2 * tol_lin);(float lval in
b)+= lval;i = 0;(float lval in b)
{= 360 * lval /
Total;.Graphics.FillPie(brsh[i], rect, f1, f2);.Graphics.DrawPie(pen, rect, f1,
f2);+= f2;l = new Label();.AutoSize = true;.Font= new Font("Arial",
14, FontStyle.Italic);.Location = new Point(5, (i + 1) * 30);(k-2 > i)
{.Text = a[i] + " = " +
b[i].ToString();.BackColor = cl[i];
}.Controls.Add(l);++;
}.AutoSize = true;.Location = new
Point(ClientSize.Width - groupBox1.Width, 0) ;
}
}
}