96629

Розробка програми побудови графіків функцій

Курсовая

Информатика, кибернетика и программирование

Експлуатаційне призначення данного програмного виробу полягає в створенні програми для побудови графіків функцій. Програмний виріб повинен бути написаний в середовищі програмування Dev-cpp на мові програмування С, для застосування його у подальшому в операційній системі DOS і Windows. Форматування по ширині.

Украинкский

2015-10-08

653 KB

0 чел.

ЗМІСТ

ВСТУП 4

1  АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ 5

1.1  Найменування та область застосування…………………………………....6

1.2 Призначення розробки…………………………………………………...….7

1.3 Вимоги до програмного забезпечення………………………………...…...8

       1.3.1 Вхідні дані……………………………………………………………..9

       1.3.2 Вихідна інформація…………………………………………………...9

       1.3.3 Вимоги до надійності……………………………………….……….11

       1.3.4 Умови експлуатації…………………………………….……….……12

1.4 Вимоги до програмної документації………………………………………13

1.5 Стадії та етапи розробки……………………………………………………14

1.6 Порядок контролю та прийому…………………………………………….15

2 РОЗРОБКА ТЕХНІЧНОГО ПРОЕКТУ 16

2.1  Постановка задачі на розробку програмного забезпечення 16

2.2  Опис та обгрунтування вибору структури та методу                  

        організації  вхідних та вихідних даних...................................................18

2.3. Опис методів реалізації функцій програми...............................................19

2.4.  Визначення інформаційних зв'язків ……………….….…..26

2.5. Написання текстів програм.......................................................................29

3 ТЕСТУВАННЯ ТА НАЛАГОДЖЕННЯ ПРОГРАМ .................. .30

ВИСНОВКИ .........................................................................….….. .32

ПЕРЕЛІК ПОСИЛАНЬ .............................................. 33

ДОДАТКИ..............................................................................................….....35

Додаток А. Текст програми на мові С.....……………………………..……....30

ВСТУП

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

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

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

C  це мова програмування загального призначення, що включає економiю представлення, сучасне керування потоком i структурою даних i багатий набiр операторiв. Мова С проектувалась з розрахунком на те, щоб використовуватись у системному програмуванні. Отже, вона не вимагає додаткового часу на виконання перевірок різноманітних умов, які ніколи не відбудуться у правильно написаній програмі, а забезпечує простий, прямий доступ до адреси будь якого об'єкта. Проте, C не прив’язана до певного обладнання чи системи, i на нiй легко писати програми,що працюватимуть без змiн на будь-якiй машинi, яка пiдтримує C.

  1.  АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

  1.  Найменування та область застосування

Курсова робота на тему:Розробка програми побудови графіків функцій”.

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

  1.  Призначення розробки

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

Програмний виріб повинен бути написаний в середовищі програмування Dev-cpp на мові програмування С, для застосування його у подальшому в операційній системі DOS і Windows.

Форматування по ширині

  1.  Вимоги до програмного забезпечення

Програма  буде  розроблена  з  використанням  операторів  мови  програмування С та з функціями WinAPI. 

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

Для  логічної  організації  вхідних  та  вихідних  даних  використовується  структури  та  файли довільного доступу.

  1.  Вхідні дані

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

  1.  Вихідні  інформація

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

  1.  Вимоги до надійності

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

  1.  Умови експлуатації

Дана  програма  повинна  виконувати  наступну  функцію:

  •  Виконувати  побудову графіків функцій;

Системні  вимоги  для  данного  програмного   продукту:

  •  операційна система: Windows 98 і новіше;
  •  процесор Intel  Pentium III (1.00 GHz) і новіше;
  •  ОЗП: 128 МВ і більше;
  •  Жорсткий диск: 80 MB вільної пам’яті і більше;
  •  Відеоадаптер: ASUS EAX 1300 і новіше;
  •  Клавіатура;
  •  маніпулятор «миша».

  1.  Вимоги до програмної документації

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

  •  інструкція  установки  програми  на комп’ютер  користувача;
  •  інструкція  з  експлуатації  даного  програмного  продукту;
  •  опис  основних  можливостей   даної   програми;
  •  причини  і  усунення  можливостей  збоїв  в  роботі програми.

  1.  Стадії та етапи розробки

Даний програмний продукт повинен мати наступні стадії розробки:

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

  1.  Порядок контролю та прийому

Тестування  програми  буде  проводитись  на  базі  ПК  такої конфігурації  апаратного  та  програмного забезпечення:

  •  Операційна  система: Windows XP ;
  •  Процесор: Intel Celeron N2840 (2.16 ГГц);
  •  Оперативна пам’ять: 2 ГБ;
  •  Графічний адаптер: Intel HD Graphics;
  •  Обєм HDD: 500 ГБ.

  1.  РОЗРОБКА ТЕХНІЧНОГО ПРОЕКТУ

  1.  Постановка задачі на розробку програмного забезпечення

Метою курсової роботи є реалізація програми побудови графіків функцій, що буде виконувати такий список функцій:

  1.  Простий графічний інтерфейс.
  2.  Додавання та видалення функцій.
  3.  Створення та видалення графіків.
  4.  Збереження створених функцій.

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

Дана програма не потребує потужного програмного забезпечення  та не вимагає від користувача додаткових знань про програму. Тому програму може використовувати користувач-початківець.

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

2.2  Опис та обгрунтування вибору методу організації  вхідних та вихідних даних

Вхідними являються  дані, введені користувачем з клавіатури. Для вводу інформації   використовуються    стандартні   оператори   вводу  мови  С  з

специфікаторами.

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

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

2.3. Опис методів реалізації функцій програми

Курсова робота реалізована за допомогою мови програмування С,  а також підпрограм написаних програмістом. Все це в сукупності складає реалізацію програмної системи.

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

  •  WinMain ( )викликається системою як початкова точка входу , для базується на Windows, прикладної програми;
  •  Wndproc ( ) функція, яка обробляє повідомлення, відправлені до вікна;
  •  GetDlgItemText (  ) – витягує заголовок або текст , пов'язаний з органом управління в діалоговому вікні;
  •  SendDlgItemMessage (  ) – відправляє повідомлення заданому елементу управління в діалоговому вікні;
  •  DrawTab() - функція видалення фігури;
  •  DrawAll ( ) – відображення всіх фігур;
  •  Show ( ) – відкриває вікно і повертається не чекаючи закриття знову відкритого вікна;
  •  Delete ( ) – блок відміни виділення пам'яті;
  •  DeleteDC ( ) – видаляє контексти пристроїв Windows , які зіставлені з
  •  m_hDC в поточному об'єкті;
  •  DeleteObject ( ) – функція видаляє логічне перо, пензля, шрифту, растровий, регіону, або палітру, звільняючи всі системні ресурси, пов'язані з об'єктом;
  •  GetDC ( ) – функція захоплення екрану;
  •  GetClientRect ( ) – копіює клієнтські координати клієнтської області в структуру, на яку вказує lpRect ;
  •  BitBlt ( ) – виконує передачу бітових блоків даних про колір;
  •  Draw ( ) – Функція малює на рахунок примітивів;
  •  CreateCompatibleDC ( ) – Створює контекст пристрою пам'яті , сумісний з  пристрою , вказане в pDC;
  •  Rectangle ( ) – малює прямокутник , використовуючи вибране пеpо , і закpашівает його внутpенней за допомогою поточної вибраної кисті;
  •  CreatePen ( ) – створює логічне перо, яке має заданий стиль, ширину і колір;
  •  MessageBox ( ) – показує повідомлення в діалоговому вікні , очікує натискання кнопки і повертає ціле число, що визначає натиснуту кнопку;

Блок-схема алгоритму функції Init знаходиться в додатку В.

Блок-схема алгоритму функції AddMessage знаходиться в додатку В.

2.4.  Визначення інформаційних зв'язків

Інформаційні зв’язки програми побудовані по функціональній специфікації за рівнями зверху – вниз. На верхньому рівні виділені групи функцій на наступних рівнях вони деталізуються.

Отже головною функцією програми є функція Main(…), з якої викликаються інші функції.  

Структурна схема інформаційних зв’язків програми відображена на рисунку 2.1. В таблиці 2.1 зображено призначення функцій.

 

Рисунок 2.1 – Структурна схема інформаційних зв’язків

Таблиця 2.1- Функції програми

№ п/п

Призначення функції

Назва функції

1

Основна функція програми

WinMain

1.1

Функція обробки вікна програми

Wndproc

1.2

Витягує заголовок або текст

GetDlgItemText

1.3

Відправляє повідомлення

SendDlgItemMessage

1.4

Функція видалення фігури

DrawTab

1.5

Відкриває вікно і повертається

Show

1.6

Відображення всіх фігур

DrawAll

1.7

Блок відміни виділення пам'яті

Delete

1.8

Видаляє контексти пристроїв

DeleteDC

1.9

Видаляє логічне перо

Deleteobject

2

Передача бітових блоків

BitBlt

2.1

Малює на рахунок примітивів

DRAW

2.2

Захоплення екрану

GetDC

2.3

Малює прямокутник

Rectangle

2.4

Створює логічне перо

CreatePen

2.5

Показує повідомлення

MessageBox

2.6

Копіює клієнтські координати

GetClientRect

2.7

Створює контекст пристрою пам'яті

CreateCompatibleDC

2.5. Написання текстів програм

Для розробки програми була використана мова програмування С, а також псевдографіка. У виготовлені програми дотримано всіх правил написання тексту програми та коментарів до них. Мова програмування С - це гнучка мова програмування з великими можливостями для програміста. Основні відомості та особливості даної мови програмування:

Мова С забезпечує різноманітність типів даних. Базовими типами є цілі, дійсні числа і символи (літери). Мова вирішує модифікацію базових типів даних, а також створення призначених для користувача типів. У мові використовуються стандартні типи даних int, char, float, double; застосовуються масиви, структури (записи), файли; є можливість конструювання черг, списків. Мова має в своєму розпорядженні інструкції, що управляють, дозволяють створювати добре структуровані програми:

  •  складена інструкція або блок {…};  
  •  галуження по умові if – else;  
  •  вибір один з багатьох варіантів switch;  
  •  цикли з передумовою while, for;  
  •  цикл do…while цикл з післяумовою;  
  •  переривання і продовження циклу break,continue.

Проте в С відсутні багато засобів, властивих іншим мовам програмування, зокрема:

  •  вбудовані засоби введення/виводу, методи доступу до файлів;
  •  засоби роботи з символьними рядками;
  •  засоби роботи із складеними об'єктами (масиви, структури).

Все це – механізми високого рівня, які в С реалізуються за допомогою явних функцій, що викликаються.  Програма на С  складається з програмних одиниць одного типа – функцій. Аргументи можуть передаватися функціям за допомогою копіювання значень цих аргументів. При цьому викликана функція не може змінити фактичний аргумент в зухвалій підпрограмі. Можливий інший варіант – передача параметра по ссилці, коли явно передається покажчик, тобто адреса, при цьому функція зможе змінити об'єкт, на який посилається покажчик.  У С  передбачений ряд операцій низького рівня: прямий доступ до пам'яті, операції над бітами даних і адресної арифметики. Програми на мові С компактні і гнучкі. Мова C довіряє програмістові і дозволяє йому практично все. Із-за цього C не можна вважати мовою надійного програмування, і вся відповідальність за якість програми лежить на програмістові, який повинен знати особливості мови і його реалізації. Безліч символів, використовуваних в мові С, можна розділити на п'ять груп:

  •  символи, використовувані для запису ключових слів і ідентифікаторів, до яких відносяться прописні і рядкові букви англійського алфавіту і символ підкреслення ( _ ). Слід зазначити, що однакові прописні і рядкові букви вважаються різними символами, оскільки мають різні коди (A, а – різні символи). Компілятори мов C і C++ розпізнають прописні і рядкові букви;
    •  арабські цифри 0 ., 9;
    •  роздільники:, . ; : ? '' " ! | / \ ~ * () {} [] <> + ? & # % = _ ., що використовуються, з одного боку, для організації процесу обчислень, а з іншої – для передачі компілятору певного набору інструкцій;
    •  пробільні символи (пропуск, символи табуляції, переведення рядка, кінця файлу), що відокремлюють один від одного об'єкти, визначувані користувачем (константи, ідентифікатори). Послідовність пробільних символів розглядається компілятором як один символ (послідовність пропусків);
    •  Esc-символі (escape-символі, escape-послідовності або послідовності, що управляють), тобто послідовність символів, що починається з символу \ (зворотної похилої межі), використовувана для вистави в програмі коди одного символу, що як друкується, так і недрукованого (керівника).

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

Лексемою називається одиниця тексту програми, яка має певний сенс для компілятора і не може бути надалі розбита на складові частини. В мові C лексемами є знаки пунктуації, всі види дужок, знаки операцій, константи ідентифікатори, ключові слова. У ряді випадків лексеми можуть зрозуміти компілятором невірно, наприклад, x---y буде сприйняте як (x--) -(y), а не як (x) -(--y).  Для виключення неоднозначності рекомендується використовувати дужки.

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

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

3 СПЕЦІАЛЬНИЙ РОЗДІЛ

3.1 Інструкція з інсталяції  програмного забезпечення

Програмний продукт не потребує інсталяції.

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

3.2 Інструкція з експлуатації програмного комплексу

При запуску програми користувач має можливість ознайомитись з головним вікном програми ,зображено на рисунку 3.1.

Рисунок 3.1- Головне вікно програми

Для подальшої роботи з програмою потрібно ввести функцію. Після натискання кнопки «Добавити функцію» введена функція буде добавлена в «Список функцій»(див.рис.3.2).

Рисунок 3.2- Список функцій

Після добавлення  функції в «Список функцій» над нею можна виконати 3 дії «Видалити функцію», «Побудувати графік похідною», «Побудувати графік». Після натискання клавіші «Побудувати графік» в правій частині буде побудовано графік функції яку  вибрали в «Списку функцій»(див.рис.3.3).

Рисунок 3.3- Графік функції

Готовий програмний продукт тестувався на ПК з відповідними програмними та апаратними характеристиками:

  •  операційна система: Windows 7 Домашня розширена (х32);
  •  процесор: Celeron(R) Dual-Core CPU  T3100 1.90GHz;
  •  оперативна пам'ять: DDR2 2Gb;
  •  жорсткий диск: 320Gb з 120Gb вільного простору;
  •  відеоадаптер: NVIDIA GeForce 5200 GT.

Також було проведено тестування даного програмного продукту на ПК наступної конфігурації:

  •  операційна система: Windows ХР SP3 та 7 Ultimate (х64);
  •  процесор: Intel Core ІЗ 3110М 2.8 HHz;
  •  оперативна пам'ять: DDR3 4Gb;
  •  жорсткий диск: 500Gb з 100Gb вільного простору.
  •  відеоадаптер: NVIDIA GeForce 5600 GT.

При тестуванні помилок не виявлено, програмний продукт виконує всі необхідні функції

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

ВИСНОВКИ

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

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

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

ПЕРЕЛІК ПОСИЛАНЬ

  1.  Методичні вказівки до виконання курсової роботи з системного        програмування / Марціяш Г.Я. - Тернопіль.: ТКТНТУ  імені Івана Пулюя, 2014.
    1.  М.Узйт, С.Прата, Д.Мартин Язьік Си: Пер с англ.-М.: Мир, 1988.- 463 с.,ил.
    2.  Глинський Я. М., Ахонін B.C. Ряжська В. А. C++, 2004.- 192 с., іл.
    3.  Вычислительная техника и программирование: Учебник для техн.

вузов / Под ред.  А. В. Петрова. – М.: Высш.шк.: 1990.

  1.  Інформатика.  Комп’ютерна техніка.  Комп’ютерні технології . : Посібник для ВНЗ. – К.: 2001.
    1.  Программирование на С++: Учеб. пособие / Под ред.  А. Д. Хомоненко. – С-Пб.: 1999.
    2.  Дейтел Х. М., Дейтел П. Дж. Как программировать на С: Пер. с англ. - М.: ЗАО Издательство БИНОМ, 2000.– 1008 с.
    3.  Шаммас Н. К. Основы С++ и объектно-ориентированного программирования. - К.: Диалектика, 1996.– 448 с.
    4.  Кирби Лоуренс, Хэзфилд Ричард и др. Искусство программирования на С. Фундаментальные алгоритмы, структуры данных и примеры приложений: Пер. с англ. - СПб.: ООО ДиаСофтЮП, 2003.– 736 с.

ДОДАТОК А

Текст програми

#include <stdio.h>

#include <conio.h>

#include <windows.h>

#include <math.h>

#include "resource.h"

#include "conert.h"

//Global:

HINSTANCE hInst;

//End Global

//Classes

struct Page

{

HDC hdc,hMemDC;

HWND hwndP;

HBITMAP hBitmap;

RECT rc;

void Init(HWND hwndP,bool clear);

HWND GetHwnd();//Визначення вікна

void Show(HWND hwndP);

void Delete();

};

void Page::Init(HWND hwndP,bool clear)//Створення сторінки з/без очистки сторінки

{

   Page::hwndP=hwndP;

hdc=GetDC(hwndP);

GetClientRect(hwndP,&rc);

hBitmap=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);

hMemDC=CreateCompatibleDC(hdc);

SelectObject(hMemDC,hBitmap);

if (!clear)

 BitBlt(hMemDC,0,0,rc.right,rc.bottom,hdc,0,0,SRCCOPY);

else

 Rectangle(hMemDC,0,0,rc.right,rc.bottom);

}

void Page::Show(HWND hwndP)//Відображення сторінки

{

HDC hdc1=GetDC(hwndP);

RECT rc1; GetClientRect(hwndP,&rc1);

BitBlt(hdc1,0,0,rc1.right,rc1.bottom,hMemDC,0,0,SRCCOPY);

DeleteDC(hdc1);

}

void Page::Delete()//Знищення сторінки

{

DeleteDC(hdc); DeleteDC(hMemDC); DeleteObject(hBitmap);

}

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

//End classes

void Line(HDC hdc,int x1,int y1,int x2,int y2)

{

MoveToEx(hdc,x1,y1,NULL);

LineTo(hdc,x2,y2);

}

void DrawTab(Page page,bool clear,int x1,int x2,int y1,int y2)

{

if (clear)

 Rectangle(page.hMemDC,0,0,page.rc.right,page.rc.bottom);

int x_center=(int)(page.rc.right-page.rc.left)/2;

int y_center=(int)(page.rc.bottom-page.rc.top)/2;

HPEN hPen=CreatePen(1,1,0);

HPEN hOldPen=(HPEN)SelectObject(page.hMemDC,(HGDIOBJ)hPen);

SelectObject(page.hMemDC,(HGDIOBJ)hPen);

for (int x=0; x<=x2-x1; x++)

{

 if (x==-x1)

 {

  hPen=CreatePen(1,2,RGB(255,0,0));

  SelectObject(page.hMemDC,(HGDIOBJ)hPen);

  Line(page.hMemDC,(int)(2*x_center*x/(x2-x1)),0,(int)(2*x_center*x/(x2-x1)),page.rc.bottom);

  hPen=CreatePen(1,1,0);

  SelectObject(page.hMemDC,(HGDIOBJ)hPen);

 }

 else

 {

  Line(page.hMemDC,(int)(2*x_center*x/(x2-x1)),0,(int)(2*x_center*x/(x2-x1)),page.rc.bottom);

 }

}

for (int y=0; y<=y2-y1; y++)

{

 if (y==-y1)

 {

  hPen=CreatePen(1,2,RGB(255,0,0));

  SelectObject(page.hMemDC,(HGDIOBJ)hPen);

  Line(page.hMemDC,0,2*y_center-(int)(2*y_center*y/(y2-y1)),page.rc.right,2*y_center-(int)(2*y_center*y/(y2-y1)));

  hPen=CreatePen(1,1,0);

  SelectObject(page.hMemDC,(HGDIOBJ)hPen);

 }

 else

 {

  Line(page.hMemDC,0,2*y_center-(int)(2*y_center*y/(y2-y1)),page.rc.right,2*y_center-(int)(2*y_center*y/(y2-y1)));

 }

}

DeleteObject((HGDIOBJ)hPen);

SelectObject(page.hMemDC,hOldPen);

DeleteObject((HGDIOBJ)hOldPen);

}

Page page;

String *built=NULL;

int num=0,xs=-10,xe=10,ys=-10,ye=10;

struct Graphic

{

bool show;

bool built_once;

Page look;

void Draw(Page page,bool once,int num,int type,int x1,int x2,int y1,int y2)

{

String vir=built[num];

int x_center=Round((page.rc.right-page.rc.left)/2);

int y_center=Round((page.rc.bottom-page.rc.top)/2);

long int color=((int)RGB(255,255,255)/2+rand())%(RGB(255,255,255));

HPEN hPen=CreatePen(1,1,0);

HPEN hOldPen=(HPEN)SelectObject(page.hMemDC,(HGDIOBJ)hPen);

hPen=CreatePen(1,2,color);

SelectObject(page.hMemDC,(HGDIOBJ)hPen);

look.Init(page.hwndP,true);

SelectObject(look.hMemDC,(HGDIOBJ)hPen);

double x_last,y_last;

bool last_error=true;

for (double i=0; i<=page.rc.right; i++)

{

 long double x=i*(x2-x1)/page.rc.right+x1;

 sprintf(::x.string,"%f",x);

 double y=Change(vir);

 

 if (type==0)

 {

  if (last_error)

  {

   MoveToEx(page.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(y-y1)/(y2-y1)),NULL);

   MoveToEx(look.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(y-y1)/(y2-y1)),NULL);

  }

  else

  {

   if (!def_error)

   {

    LineTo(page.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(y-y1)/(y2-y1)));

    LineTo(look.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(y-y1)/(y2-y1)));

   }

  }

 }

 

 if (type==1)

 {

  if (last_error)

  {

   double yp=(y-y_last)/(x-x_last);

   MoveToEx(page.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(yp-y1)/(y2-y1)),NULL);

   MoveToEx(look.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(yp-y1)/(y2-y1)),NULL);

  }

  else

  {

   if (!def_error)

   {

    double yp=(y-y_last)/(x-x_last);

    LineTo(page.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(yp-y1)/(y2-y1)));

    LineTo(look.hMemDC,Round(i),Round(page.rc.bottom-page.rc.bottom*(yp-y1)/(y2-y1)));

   }

  }

  x_last=x; y_last=y;

 }

 

 if (!once)

  page.Show(page.hwndP);

 last_error=def_error;

 def_error=false;

}

if (strlen(error.string)>0)

 MessageBox(0,error.string,"Помилка",0);

DeleteObject((HGDIOBJ)hPen);

SelectObject(page.hMemDC,hOldPen);

DeleteObject((HGDIOBJ)hOldPen);

}

};

Graphic *gr=NULL;

Graphic *pr=NULL;

void DrawAll(Page page)

{

for (int i=0; i<num; i++)

{

 if (gr[i].show && gr[i].built_once)

  BitBlt(page.hMemDC,0,0,page.rc.right,page.rc.bottom,gr[i].look.hMemDC,0,0,SRCAND);

 if (gr[i].show && !gr[i].built_once)

  gr[i].Draw(page,true,i,0,xs,xe,ys,ye);

 if (pr[i].show && pr[i].built_once)

  BitBlt(page.hMemDC,0,0,page.rc.right,page.rc.bottom,pr[i].look.hMemDC,0,0,SRCAND);

 if (pr[i].show && !pr[i].built_once)

  pr[i].Draw(page,true,i,0,xs,xe,ys,ye);

}

}

void AddMessage(HWND hWnd,int lb_list,char *message,int num)

{

static int i;

if (num==1) { i=0; num=0; }

if (num==0)

{

SendDlgItemMessage(hWnd,lb_list,LB_ADDSTRING,0,(LPARAM)message);

 i++;

 SendDlgItemMessage(hWnd,lb_list,LB_SETCURSEL,i-1,0);

 if (gr[i-1].show==true)

   SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Вилучити графік");

  else

   SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Побудувати график");

 if (pr[i-1].show==true)

   SetDlgItemText(hWnd,DRAW_PROIZV,"Вилучити графік похідною");

  else

   SetDlgItemText(hWnd,DRAW_PROIZV,"Побудувати графік похідною");

}

if (num==2)

{

 SendDlgItemMessage(hWnd,lb_list,LB_RESETCONTENT,0,0);

 i=0;

}

if (num==3)

{

 SendDlgItemMessage(hWnd,lb_list,LB_ADDSTRING,0,(LPARAM)message);

 SendDlgItemMessage(hWnd,lb_list,LB_SETCURSEL,i-1,0);

}

}

LRESULT CALLBACK DlgProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{   

int wmId = LOWORD(wParam),wmEvent = HIWORD(wParam);

int x=LOWORD(lParam),y=HIWORD(lParam);

switch (iMsg)

{

case WM_INITDIALOG:

 {

  strcpy(name.string,"x");

  page.Init(GetDlgItem(hWnd,IDC_PICTURE),true);

  SetDlgItemText(hWnd,IDC_X1,"-10");

  SetDlgItemText(hWnd,IDC_X2,"10");

  SetDlgItemText(hWnd,IDC_Y1,"-10");

  SetDlgItemText(hWnd,IDC_Y2,"10");

  SetDlgItemText(hWnd,IDC_X,"0");

  SetDlgItemText(hWnd,IDC_F,"0");

  DrawTab(page,false,xs,xe,ys,ye);

  page.Show(page.hwndP);

  return 0;

 }

case WM_COMMAND:

 {

  switch(wmId)

  {

  case IDC_HISTORY:

   {

    static int last_pos=-1;

    int pos=SendDlgItemMessage(hWnd,IDC_HISTORY,LB_GETCURSEL,0,0);

    if (pos!=last_pos)

    {

     if (gr[pos].show==true)

      SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Вилучити графік");

     else

      SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Побудувати график");

     if (pr[pos].show==true)

      SetDlgItemText(hWnd,IDC_DRAW_PROIZV,"Вилучити графік похідною");

    else

 SetDlgItemText(hWnd,IDC_DRAW_PROIZV,"Побудувати графік похідною");

     last_pos=pos;

    }

   }

   break;

  case IDC_ONLY_ADD:

   {

    String vir;

    GetDlgItemText(hWnd,IDC_F_X,vir.string,1024);

    if (strlen(vir.string)>0)

    {

     bool match=false;

     for (int i=0;i<num;i++)

     {

      if (strcmp(vir.string,built[i].string)==1)

       match=true;

     }

     if (match)

    MessageBox(hWnd,"Функція вже добавлена",0,0);

     if (match==false)

     {

      num++;

      

      String *a;

      a=(String*)malloc(sizeof(String)*(num-1));

      for (int i=0; i<num-1; i++)

       a[i]=built[i];

      free((void*)built);

      built=(String*)malloc(sizeof(String)*num);

      for (int i=0; i<num-1; i++)

       built[i]=a[i];

      built[num-1]=vir;

      free((void*)a);

      Graphic *g=(Graphic*)malloc(sizeof(Graphic)*(num-1));

      for (int i=0; i<num-1; i++)

       g[i]=gr[i];

      free((void*)gr);

      gr=(Graphic*)malloc(sizeof(Graphic)*num);

      for (int i=0; i<num-1; i++)

       gr[i]=g[i];

      gr[num-1].built_once=false;

      gr[num-1].look.Init(page.hwndP,true);

      gr[num-1].show=false;

      free((void*)g);

      g=(Graphic*)malloc(sizeof(Graphic)*(num-1));

      for (int i=0; i<num-1; i++)

       g[i]=pr[i];

      free((void*)pr);

      pr=(Graphic*)malloc(sizeof(Graphic)*num);

      for (int i=0; i<num-1; i++)

       pr[i]=g[i];

      pr[num-1].built_once=false;

      pr[num-1].look.Init(page.hwndP,true);

      pr[num-1].show=false;

      free((void*)g);

      if (strlen(error.string)==0)

      {

       AddMessage(hWnd,IDC_HISTORY,vir.string,0);

      }

     }

    }

   }

   break;

   case IDC_ADD_SHOW:

   {

    String vir;

    GetDlgItemText(hWnd,IDC_F_X,vir.string,1024);

    if (strlen(vir.string)>0)

    {

     bool match=false;

     for (int i=0;i<num;i++)

     {

      if (strcmp(vir.string,built[i].string)==1)

       match=true;

     }

     if (match)

      MessageBox(hWnd,"Функція вже добавлена",0,0);

     if (match==false)

     {

      num++;

      

      String *a;

      a=(String*)malloc(sizeof(String)*(num-1));

      for (int i=0; i<num-1; i++)

       a[i]=built[i];

      free((void*)built);

      built=(String*)malloc(sizeof(String)*num);

      for (int i=0; i<num-1; i++)

       built[i]=a[i];

      built[num-1]=vir;

      free((void*)a);

      Graphic *g=(Graphic*)malloc(sizeof(Graphic)*(num-1));

      for (int i=0; i<num-1; i++)

       g[i]=gr[i];

      free((void*)gr);

      gr=(Graphic*)malloc(sizeof(Graphic)*num);

      for (int i=0; i<num-1; i++)

       gr[i]=g[i];

      gr[num-1].built_once=true;

      gr[num-1].look.Init(page.hwndP,true);

      gr[num-1].show=true;

      free((void*)g);

      g=(Graphic*)malloc(sizeof(Graphic)*(num-1));

      for (int i=0; i<num-1; i++)

       g[i]=pr[i];

      free((void*)pr);

      pr=(Graphic*)malloc(sizeof(Graphic)*num);

      for (int i=0; i<num-1; i++)

       pr[i]=g[i];

      pr[num-1].built_once=false;

      pr[num-1].look.Init(page.hwndP,true);

      pr[num-1].show=false;

      free((void*)g);

      

      if (strlen(error.string)==0)

       AddMessage(hWnd,IDC_HISTORY,vir.string,0);

      gr[num-1].Draw(page,false,num-1,0,xs,xe,ys,ye);

     }

    }

   }

   break;

  

  case IDC_DRAW_PROIZV:

   {

    int pos=SendDlgItemMessage(hWnd,IDC_HISTORY,LB_GETCURSEL,0,0);

    

    if (pos>=0 && pos<num)

    {

     if (pr[pos].show)

     {

      pr[pos].show=false;

      DrawTab(page,true,xs,xe,ys,ye);

      DrawAll(page);

      page.Show(page.hwndP);

     }

     else

     {

      pr[pos].show=true;

      if (pr[pos].built_once)

      {

       BitBlt(page.hMemDC,0,0,page.rc.right,page.rc.bottom,pr[pos].look.hMemDC,0,0,SRCAND);

       page.Show(page.hwndP);       

      }

      else

      {

       pr[pos].Draw(page,false,pos,1,xs,xe,ys,ye);

       pr[pos].built_once=true;

      }

     }

     if (pr[pos].show==true)

      SetDlgItemText(hWnd,IDC_DRAW_PROIZV,"Вилучити графік похідною");

     else

SetDlgItemText(hWnd,DRAW_PROIZV,"Побудувати графік похідною");

    }

    else

     MessageBox(hWnd,"Виберіть функцію",0,0);

   }

   break;

  case IDC_TABL:

   {

    char buf[10];

    GetDlgItemText(hWnd,IDC_X1,buf,10);

    xs=atoi(buf);

    GetDlgItemText(hWnd,IDC_X2,buf,10);

    xe=atoi(buf);

    GetDlgItemText(hWnd,IDC_Y1,buf,10);

    ys=atoi(buf);

    GetDlgItemText(hWnd,IDC_Y2,buf,10);

    ye=atoi(buf);

    if (xs>=xe || ys>=ye)

    {

     xs=ys=-10; xe=ye=10;

     MessageBox(hWnd,"Неправильні розміри таблиці",0,0);

    }

    else

    {

    DrawTab(page,true,xs,xe,ys,ye);

    for (int i=0; i<num; i++)

     if (gr[i].show)

      gr[i].Draw(page,true,i,0,xs,xe,ys,ye);

    }

    itoa(xs,buf,10);

    SetDlgItemText(hWnd,IDC_X1,buf);

    itoa(xe,buf,10);

    SetDlgItemText(hWnd,IDC_X2,buf);

    itoa(ys,buf,10);

    SetDlgItemText(hWnd,IDC_Y1,buf);

    itoa(ye,buf,10);

    SetDlgItemText(hWnd,IDC_Y2,buf);

    page.Show(page.hwndP);

   }

   break;

  case IDC_CALCULATE:

   {

    int pos=SendDlgItemMessage(hWnd,IDC_HISTORY,LB_GETCURSEL,0,0);

    if (pos>=0 && num>=pos)

    {

     char buf[128];

     GetDlgItemText(hWnd,IDC_X,buf,10);

     strcpy(::x.string,buf);

     sprintf(buf,"%f",Change(built[pos]));

     if (!def_error)

      SetDlgItemText(hWnd,IDC_F,buf);

     else

      SetDlgItemText(hWnd,IDC_F,"Помилка");

     def_error=false;

    }

    else

MessageBox(hWnd,"Виберітьфункцію",0,0);

   }

   break;

  case IDC_DELETE_FUNCTION:

   {

    int pos=SendDlgItemMessage(hWnd,IDC_HISTORY,LB_GETCURSEL,0,0);

    if (pos>=0 && num>=pos)

    {

     bool s=gr[pos].show;

     AddMessage(hWnd,IDC_HISTORY,NULL,2);

     for (int i=pos; i<num-1; i++)

     {

      built[i]=built[i+1];

      gr[i]=gr[i+1];

      pr[i]=pr[i+1];

     }

     num--;

     

     if (s)

      DrawTab(page,true,xs,xe,ys,ye);

     for (int i=0; i<num; i++)

      AddMessage(hWnd,IDC_HISTORY,built[i].string,1);

     DrawAll(page);

     page.Show(page.hwndP);

    }

    else

     MessageBox(hWnd,"Виберіть функцію",0,0);

   }

   break;

  case IDC_DELETE_GRAPHIC:

   {

    int pos=SendDlgItemMessage(hWnd,IDC_HISTORY,LB_GETCURSEL,0,0);

    

    if (pos>=0 && pos<num)

    {

     if (gr[pos].show)

     {

      gr[pos].show=false;

      DrawTab(page,true,xs,xe,ys,ye);

      DrawAll(page);

      page.Show(page.hwndP);

     }

     else

     {

      gr[pos].show=true;

      if (gr[pos].built_once)

      {

       BitBlt(page.hMemDC,0,0,page.rc.right,page.rc.bottom,gr[pos].look.hMemDC,0,0,SRCAND);

       page.Show(page.hwndP);       

      }

      else

      {

       gr[pos].Draw(page,false,pos,0,xs,xe,ys,ye);

       gr[pos].built_once=true;

      }

     }

     if (gr[pos].show==true)

       SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Вилучити графік");

      else

       SetDlgItemText(hWnd,IDC_DELETE_GRAPHIC,"Побудувати графік");

    }

    else

     MessageBox(hWnd,"Виберіть функцію",0,0);

   }

   break;

  }

  return 0;

 }

case WM_PAINT:

 {

  page.Show(page.hwndP);

  return 0;

 }

case WM_CLOSE:

 {

  page.Delete();

  EndDialog( hWnd, FALSE);

  return 0;

 }

}

return FALSE;

}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)

{

Init();

int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,(DLGPROC)DlgProc);

return ret;

}

Додаток В.

Блок-схема алгоритму

Рисунок 2.1- Блок-схема алгоритму функції Init

Рисунок 2.2- Блок-схема алгоритму функції AddMessage


Змн
.

Арк.

№ документа

Підпис

Дата

Аркуш

2

2015.КР.0501.405.15.00.00 ПЗ

Розробив

Деременда Н.І

Перевірила

Марціяш Г.Я

Н.контроль

Затвердив

Зміст

Розробка програми для побудови графіків

Літера

Аркушів

ОКС - 405

WinMain

Wndproc

GetDlgItemText

SendDlgItemMessage

DrawTab

AddMessage

Delete

Show

DrawAll

GetDC

DeleteDC

GetClientRect

Deleteobject

SendDlgItemMessage

Rectangle

SendDlgItemText

BitBlt

CreatePen

Init

DRAW

Line

GetClientRect

MoveToEx

CreateCompatibleDC

LineTo

BitBlt

Rectangle

MessageBox

Початок

hdc=GetDC(hwndP)

GetClientRect SelectObject

hBitmap=CreateCompatible..

SelectObject

SelectObject

if (!clear)

Ні

Так

Rectangle

SelectObject

BitBlt

Кінець

Початок

static int i;

Так

if (num==1);

i=0; num=0;

Ні

Ні

if (num==0);

Так

Так

SendDlgItemMessage(hWnd)…

Ні

if(gr[i1].show==true)

Так

SetDlgItemText(hWnd...

SetDlgItemText(hWnd...

Ні

If(pr[i-1]show...

Так

SetDlgItemText(hWnd...

SetDlgItemText(hWnd...

А

А

Ні

if (num==2);

Так

Так

SendDlgItemMessage(hWnd...

Ні

if (num==3);

Так

SendDlgItemMessage(hWnd...

Кінець

Так


 

А также другие работы, которые могут Вас заинтересовать

35266. Тема. Знаходження значення інтеграла по формулам НьютонаКотеса. 28.5 KB
  h void min {double bhSI; int in; cout Vvedite bn n ; cin b n; doublex=new double[n]; doubley=new double[n]; doubleH=new double[n]; h=b n; x[0]=; fori=0;i =n;i {x[i]=x[0]ih; y[i]=1 sqrt2x[i]x[i]3; } switchn {cse 4:{H[0]=0.
35267. Тема. Знаходження інтеграла за формулами прямокутників. 24 KB
  h void min {double bhSI; int in; cout Vvedite bn n ; cin b n; doublex=new double[n]; doubley=new double[n]; h=b n; x[0]=; fori=0;i =n;i {x[i]=x[0]ih; y[i]=1 sqrtx[i]x[i]1; } S=0.
35268. Тема. Знаходження інтегралу за формулами трапецій. 47.5 KB
  Знаходження інтегралу за формулами трапецій. навчитися знаходити значення інтегралу за формулами трапецій. Дан інтеграл – число розбивок формула трапецій Оцінка похибки: де 12.
35269. Метод Гауса рішення системи лінійних рівнянь складання алгоритму 34.5 KB
  Поставте задачу розв’язання системи лінійних рівнянь методом Гауса. Яка умова застосування методу Гауса. Скільки етапів вирішення системи лінійних рівнянь методом Гауса. Що називають прямим та зворотнім ходом методу Гауса...
35270. Тема. Знаходження інтегралу за формулами трапецій. 181 KB
  h void min {double bhSynI; int ni; cout Vvedite nijnii predel : ; cin ; cout Vvedite verhnii predel b: ; cout Vvedite verhnii predel b: ;; cin b; cout Vvedite n: ; cin n; doublex=new double [n]; doubley=new double [n]; h=b n; S=0; x[0]=; fori=1;i =n1;i {x[i1]=x[0]ih; y[i]=1 pow3x[i]x[i]0.5; S=Sy[i]; I=b nSy[0]y[n] 2; cout I= I; } } .
35271. Тема. Знаходження інтегралу за формулами трапецій. 22.5 KB
  h void min { int n; double bhT ; cout Enter bn n ; cin b n; h=b n; doublex=new double[n]; x[0]=; forint i=0;i =n;i {x[i]=x[0]ih;} doubley= new double [n]; for i=0; i =n; i { y[i]=1 sqrtx[i]x[i]0.
35272. Тема. Обчислення інтегралу по формулі Сімпсона. 26 KB
  Обчислення інтегралу по формулі Сімпсона. Навчитися обчислювати інтеграл по формулі Сімпсона; склаcти алгоритм. Обчислити інтеграл по формулі Сімпсона при заданому значенні 16 include iostrem. Які проста та узагальнена формули Сімпсона Сформулюйте ідею методу Якою повинна бути розбивка відрізку на частини Яка оцінка похибки методу Сімпсона Який ступінь точності методу Який зв’язок формули Сімпсона та НьютонаКотеса .
35273. Тема. Метод Крилова побудови власного багаточлена матриці. 36 KB
  h void min { int klj; double [3][3]b[3][3]y0[3]y1[3]y2[3]y3[3]y4[3]yn1yn2yn3yn4Sum1Sum2Sum3Sum4; double x1x2x3x4d0d1d2d3102030213132; cout Vvedite mtritsy endl; fork=0;k =3;k { forl=0;l =3;l cin b[k][l]; } cout Vvedite nylevou vektor endl; fork=0;k =3;k cin y0[k]; fork=0;k =3;k { forl=0;l =3;l { yn1=b[k][l]y0[l]; Sum1=Sum1yn1; } y1[k]=Sum1; } fork=0;k =3;k { forl=0;l =3;l { yn2=b[k][l]y1[l]; Sum2=Sum2yn2; } y2[k]=Sum2; } fork=0;k =3;k {...
35274. Тема: Масиви. Селективна обробка масивів Ціль роботи: вивчити роботу з масивом як зі складеним типом даних 369 KB
  Відповідно до індивідуального завдання розробити алгоритм ініціалізації масиву селективної обробки масиву. 7 Знайти суму позитивних чисел масиву Контрольні запитання 1.Які типи мови С можна і не можна вказувати як тип при оголошенні масиву 4.У яких випадках розмірність масиву при оголошенні можна не вказувати 5.