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

 

Зміст


1. Переваги використання MFC

2. Знаходження площі фігури методом трапеції

. Постановка задачі

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

Додаток


1. Переваги використання MFC


MFC - це базовий набір (бібліотека) класів, написаних на мові С + + і призначених для спрощення і прискорення процесу програмування для Windows. Бібліотека містить багаторівневу ієрархію класів, що налічує близько 200 членів. Вони дають можливість створювати Windows-додатки на базі об'єктно-орієнтованого підходу. З точки зору програміста, MFC являє собою каркас, на основі якого можна писати програми для Windows.

Бібліотека MFC розроблена для спрощення завдань, що стоять перед програмістом. Як відомо, традиційний метод програмування під Windows вимагає написання досить довгих і складних програм, що мають ряд специфічних особливостей. Зокрема, для створення тільки каркаса програми таким методом знадобиться близько 75 рядків коду. У міру ж збільшення складності програми її код може досягати справді неймовірних розмірів. Однак та ж сама програма, написана з використанням MFC, буде приблизно в три рази менше, оскільки більшість приватних деталей приховано від програміста.

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

Ще одним істотним перевагою MFC є спрощення взаємодії з прикладним програмним інтерфейсом (API) Windows. Будь-який додаток взаємодіє з Windows через API, який містить кілька сот функцій. Значний розмір API ускладнює спроби зрозуміти і вивчити його цілком. Часто навіть складно простежити, як окремі частини API пов'язані один з одним! Але оскільки бібліотека MFC об'єднує (як інкапсуляція) функції API у логічно організоване безліч класів, інтерфейсом стає значно легше управляти. Оскільки MFC являє собою набір класів, написаних на мові С + +, тому програми, написані з використанням MFC, повинна бути в той же час програмами на С + +. Для цього необхідно володіти відповідними знаннями. Для початку необхідно вміти створювати власні класи, розуміти принципи успадкування та вміти перевизначати віртуальні функції. Хоча програми, що використовують бібліотеку MFC, зазвичай не містять надто специфічних елементів з арсеналу С + +, для їх написання тим не менш потрібні солідні знання в даній області.

Зауваження. Невелике число класів, визначених у бібліотеці, не пов'язане безпосередньо з програмуванням під Windows. Це, зокрема, класи, призначені для створення рядків, управління файлами і обробки особливих ситуацій. Іноді звані класами загального призначення, вони можуть використовуватися як Windows-, так і не-Windows-додатками.

Головна частина бібліотеки MFC складається з класів, які використовуються для побудови компонентів програми. З кожним MFC-додатком зв'язується визначає його на верхньому рівні об'єкт theApp, що належить класу, похідного від CWinApp.

Як правило, структура програми визначається архітектурою Document-View (документ-вигляд). Це означає, що додаток складається з одного або декількох документів - об'єктів, класи яких є похідними від класу CDocument (клас "документ"). З кожним з документів пов'язані один або кілька обліко - об'єктів класів, похідних від CView (клас "вигляд") і визначають вигляд документа.

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

Класи CView, CFrameWnd, CDialog і всі класи елементів управління успадковують властивості та поведінку свого базового класу CWnd ("вікно"), що визначає по суті Windows-вікно. Цей клас у свою чергу є спадкоємцем базового Ласса CObject ("об'єкт").

Одна з труднощів у розумінні принципів пристрою MFC-приложения, полягає в тому, що об'єкти, з яких воно будується, успадковують властивості та поведінку всіх своїх предків, тому необхідно знати базові класи.


2. Знаходження площі фігури методом трапеції


Чисельне інтегрування (історична назва: (чисельна) квадратура) - обчислення значення певного інтеграла (як правило, наближене), засноване на тому, що величина інтеграла чисельно дорівнює площі криволінійної трапеції, обмеженої віссю абсцис, графіком інтегрований функції і відрізками прямих x = a і x = b, де a і b - межі інтегрування.

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

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



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

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

Нехай на відрізку [а; b] осі Ох задана безперервна функція f, не міняє на ньому знака. Фігуру, обмежену графіком цієї функції, відрізком [а; b] та прямими х = а і х = b (рис. 1), називають криволінійною трапецією. Різні приклади криволінійних трапецій наведені на малюнках 1, а -д



Для обчислення площ криволінійних трапецій застосовується наступна теорема:

Теорема. Якщо f - безперервна й невід'ємна на відрізку [а; b] функція, a F - її Первісна на цьому відрізку, то площа S відповідної криволінійної трапеції (рис. 2) дорівнює приростові первісної на відрізку [а; b] тобтоS=F(b)-F(a). Доказ. Розглянемо функцію S (х), визначену на відрізку [а; b]. Якщо а <x ? b, то S (х) - площа тієї частини криволінійної трапеції, яка розташована лівіше вертикальної прямої, що проходить через точку М (х; 0) (рис. 2, а). Якщо х = а, то S (а) = 0. Відзначимо, що S (b) = S (S - площа криволінійної трапеції).


Доведемо,що


S'(x)=f(x). (2)


За означенням необхідно довести, що

при (3)

З'ясуємо геометричний сенс чисельника ? S (х). Для простоти розглянемо випадок ?X> 0. Оскільки ? S (х) = S (х + ? х) - S (х), то ? S (х) - площа фігури, заштрихованої на рисунку 2, б. Візьмемо тепер прямокутник тій же площі ? S (x), що спирається на відрізок [х; х + ? х] (рис. 2, в). У силу безперервності функції f верхня сторона прямокутника перетинає графік функції в деякій точці з абсцисою з ? [х; х + ? х] (в іншому випадку цей прямокутник або міститься в частині криволінійної трапеції над відрізком [х; x + ?x], або містить її; відповідно його площа буде менше або більше площі ? S (X)). Висота прямокутника дорівнює f (с). За формулою площі прямокутника маємо ? S (x) = f (с) ? х, звідки (Ця формула вірна і при ? х <0.) Оскільки точка з лежить між х і х + ?x; то з прагне до х прі. Так як функція f неперервна, при. Отже, при. Формула (2) доказана.Ми отримали, що S є Первісна для f. Тому в силу основного властивості первісних для всіх х ? [а; b] маємо:


S(x) = F(x)+C,


де С - деяка постійна, a F - одна з первісних для функції f. Для знаходження З підставимо х = а: F (a) + C = S (a) = 0, звідки C =- F (a). Отже, S (x) = F (x)-F (a). (4) Оскільки площа криволінійної трапеції дорівнює S (b), підставляючи х = b у формулу (4), отримаємо:

=S(b)=F(b)-F(a).


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

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



Похибка апроксимації на кожному відрізку:


де


Повна формула трапецій в разі поділу всього проміжку інтегрування на відрізки однакової довжини h:


де


Похибка формули трапецій:


де


3. Постановка задачі


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

демонстрація базової функції та функції в загальному вигляді з можливістю зміни параметрів A, B, C, D.

збереження поточних параметрів у файлі з наступним завантаженням.

Діалогове вікно з зазначенням відомостей про програму і автора.

Виклик вікна установки параметрів A, B, C, D повинен проводитися за допомогою меню, кнопки на панелі інструментів, і клавішами швидкого виклику

Підписи шкали осей координат і точки центру осей координат.

Друк отриманого графіка.

Обчислення площі отриманої фігури даним методом.

Базова функція: y=1/x2

Загальний вигляд: Y=A/(Bx+C)2+D

Метод обчислення: метод трапецій


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


1.Visual C++ и MFC. Программирование для Windows NT и Windows 95. А. Мешков, Ю. Тихонов.

2.Самоучитель Visual C++ 6. Н. Секунов.

.Арчер, Visual C++ .NET. Библия пользователя. : Пер. с англ. - М.: Издательский дом "Вильямс", 2003.

.Харви Дейтел, Как программировать на Си++: Пер. с англ. - М.: Издательский дом "Вильямс", 2000.

.А.Мешков, Visual C++ и MFC: Пер. с англ. - К.: Издательский дом "Folio", 2001.


Додаток А


Код програми


kDoc.h : interface of the CKDoc class

#if !defined(AFX_KDOC_H__088FB134_0943_485C_A307_8B5322257D22__INCLUDED_)

#define AFX_KDOC_H__088FB134_0943_485C_A307_8B5322257D22__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000CKDoc : public CDocument

{: // create from serialization only();_DYNCREATE(CKDoc)

// Attributes:

//CString String;A;B;C;D;a;b;

// Operations:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CKDoc):BOOL OnNewDocument();void Serialize(CArchive& ar);

//}}AFX_VIRTUAL

// Implementation:~CKDoc();

#ifdef _DEBUGvoid AssertValid() const;void Dump(CDumpContext& dc) const;

#endif:

// Generated message map functions:

//{{AFX_MSG(CKDoc)

// 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()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif!defined(AFX_KDOC_H__088FB134_0943_485C_A307_8B5322257D22__INCLUDE)

// kDoc.cpp : implementation of the CKDoc class

//

#include "stdafx.h"

#include "k.h"

#include "kDoc.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILEchar THIS_FILE[] = __FILE__;

#endif

// CKDoc_DYNCREATE(CKDoc, CDocument)_MESSAGE_MAP(CKDoc, CDocument)

//{{AFX_MSG_MAP(CKDoc)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP_MESSAGE_MAP()

// CKDoc construction/destruction::CKDoc()

{

}::~CKDoc()

{

}CKDoc::OnNewDocument()

{(!CDocument::OnNewDocument())FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)TRUE;

}

// CKDoc serializationCKDoc::Serialize(CArchive& ar)

{(ar.IsStoring())

{

//сохранение<< A;<< B;<< C;<< D;<< a;<< b}

{

//загрузка>> A;>> B;>> C;>> D;>> a;>> b;}

}

// CKDoc diagnostics

#ifdef _DEBUGCKDoc::AssertValid() const

{::AssertValid();

}CKDoc::Dump(CDumpContext& dc) const

{::Dump(dc);

}

#endif //_DEBUG

// kView.cpp : implementation of the CKView class

#include "stdafx.h"

#include "k.h"

#include "math.h"

# include <windows.h>

#include "kDoc.h"

#include "kView.h"

#include "Const.h"

#include "Color.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILEchar THIS_FILE[] = __FILE__;

#endif

// CKView_DYNCREATE(CKView, CView)_MESSAGE_MAP(CKView, CView)

//{{AFX_MSG_MAP(CKView)_COMMAND(ID_PARAMETRES_CONSTANTS, OnParametresConstants)_COMMAND(ID_PARAMETRES_COLOUR, OnParametresColour)

//}}AFX_MSG_MAP

// Standard printing commands_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)_MESSAGE_MAP()::CKView()

{

// TODO: add construction code here

}::~CKView()

{

}CKView::PreCreateWindow(CREATESTRUCT& cs)

{// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT csCView::PreCreateWindow(cs);}

// CKView drawingCKView::OnDraw(CDC* pDC)

{rect;* pDoc = GetDocument();_VALID(pDoc);(&rect);pDC -> MoveTo(rect.right/2,0);-> LineTo(rect.right/2,rect.bottom); // ось oy

pDC -> TextOut(rect.right/2+10,rect.top,"y");

pDC -> MoveTo(0,rect.bottom/2);-> LineTo(rect.right,rect.bottom/2); // ось ox

pDC -> TextOut(rect.right-10,rect.bottom/2-20,"x");-> TextOut(rect.right/2-10,rect.bottom/2+3,"0"); // начало координат 0-> MoveTo(rect.right/2,0);-> LineTo(rect.right/2-5,rect.top+12); // верхняя левая стрелка-> MoveTo(rect.right/2,0);-> LineTo(rect.right/2+5,rect.top+12); //верхняя правая стрелка-> MoveTo(rect.right,rect.bottom/2);-> LineTo(rect.right-12,rect.bottom/2-5); //правая верхняя стрелка-> MoveTo(rect.right,rect.bottom/2);-> LineTo(rect.right-12,rect.bottom/2+5); //правая нижняя стрелка

//устанавливаем отрезки

char S[30];k=0;(int q=0;q<600;q++)

{= q+40;++;(k,S,10);

// левая часть оси ox

pDC -> MoveTo(rect.right/2-q,rect.bottom/2);-> LineTo(rect.right/2-q,rect.bottom/2-3);-> LineTo(rect.right/2-q,rect.bottom/2+5);-> TextOut(rect.right/2-q-3,rect.bottom/2+8,S); //выводим цифры

pDC -> TextOut(rect.right/2-q-6,rect.bottom/2+8,"-"); //выводим минус

// правая част оси ох-> MoveTo(rect.right/2+q,rect.bottom/2);-> LineTo(rect.right/2+q,rect.bottom/2-3);-> LineTo(rect.right/2+q,rect.bottom/2+5);-> TextOut(rect.right/2+q-3,rect.bottom/2+8,S); //âûâîäèì öèôðû

//верхняя часть оси оу-> MoveTo(rect.right/2,rect.bottom/2-q);-> LineTo(rect.right/2-3,rect.bottom/2-q);-> LineTo(rect.right/2+4,rect.bottom/2-q);-> TextOut(rect.right/2-16,rect.bottom/2-q-8,S); //âûâîäèì öèôðû

//нижняя часть оси оу-> MoveTo(rect.right/2,rect.bottom/2+q);-> LineTo(rect.right/2-3,rect.bottom/2+q);-> LineTo(rect.right/2+4,rect.bottom/2+q);-> TextOut(rect.right/2-16,rect.bottom/2+q-8,S); //âûâîäèì öèôðû-> TextOut(rect.right/2-19,rect.bottom/2+q-8,"-"); //âûâîäèì "-"

}

//рисуем сетку

CPen GridPen(PS_SOLID, 1, RGB(200, 200, 200));>SelectObject(&GridPen);( q=0;q<600;q++)

{= q+40;-> MoveTo(rect.right/2-q,rect.bottom/2);-> LineTo(rect.right/2-q,rect.bottom/2-600);-> LineTo(rect.right/2-q,rect.bottom/2+600);-> MoveTo(rect.right/2+q,rect.bottom/2);-> LineTo(rect.right/2+q,rect.bottom/2-600);-> LineTo(rect.right/2+q,rect.bottom/2+600);-> MoveTo(rect.right/2,rect.bottom/2-q);-> LineTo(rect.right/2-600,rect.bottom/2-q);-> LineTo(rect.right/2+600,rect.bottom/2-q);-> MoveTo(rect.right/2,rect.bottom/2+q);-> LineTo(rect.right/2-600,rect.bottom/2+q);-> LineTo(rect.right/2+600,rect.bottom/2+q);

}AxisPen(PS_SOLID, 1, RGB(225, 0, 0));>SelectObject(&AxisPen);

//рисуем график

double A=1,B=1,C=0,D=0;d,x,y, yy,xx;

//правая часть

for(x=-100;x<0;x+=0.1)

{=1/ pow(x,2);=y*40;=x*40;-> SetPixel(rect.right/2-d,rect.bottom/2-y,RGB(255,0,0)); // устанавливаем точки графика(x==-100)

{xx=d;=y;;}-> MoveTo(rect.right/2-xx,rect.bottom/2-yy);-> LineTo(rect.right/2-d,rect.bottom/2-y); //соединяем точки графика=d;=y;

}=0;y=0;

//левая часть

for(x=0;x<100;x+=0.1)

{=1/ pow(x,2);=y*40;=x*40;-> SetPixel(rect.right/2-d,rect.bottom/2-y,RGB(255,0,0)); // устанавливаем точки графика(x==0)

{xx=d;=y;;}-> MoveTo(rect.right/2-xx,rect.bottom/2-yy);-> LineTo(rect.right/2-d,rect.bottom/2-y);=d;=y;

}

//вычисляем площадь фигуры

double a=-10,b=10,i;Sum=0,h,n=100,l;Q;=(b-a)/n;(i=1;i<n;i++)

{= a+i*h;(l==0)continue;=pow((B*l + C),2);= Sum + A/(d)+D;

}= h*((A/(pow((B*a + C),2)) + A/(pow((B*b + C),2)))/2+Sum);(Q,S,10);-> TextOut(rect.left+10,rect.top+4,"Площадь фигуры:");-> TextOut(rect.left+10,rect.top+20,S);GridDarkPen(PS_SOLID, 1, RGB(0,255, 0));>SelectObject(&GridDarkPen);

//считываем значения переменных и перерисовываем график

itoa(pDoc -> A, S, 10);= pDoc -> A;(pDoc -> B, S, 10);= pDoc -> B;(pDoc -> C, S, 10);= pDoc -> C;(pDoc -> D, S, 10);= pDoc -> D;

//D=D*163,33;(x=-100;x<0;x+=0.1)

{= A/pow((B*x+C),2)+D;=y*40;=x*40;-> SetPixel(rect.right/2-d,rect.bottom/2-y,RGB(0,0,255));

{xx=d;=y;;}-> MoveTo(rect.right/2-xx,rect.bottom/2-yy);-> LineTo(rect.right/2-d,rect.bottom/2-y);=d;=y;

}(x=0;x<100;x+=0.1)

{= A/pow((B*x+C),2)+D;=y*40;=x*40;-> SetPixel(rect.right/2-d,rect.bottom/2-y,RGB(0,0,255));(x==0)

{xx=d;=y;;}-> MoveTo(rect.right/2-xx,rect.bottom/2-yy);-> LineTo(rect.right/2-d,rect.bottom/2-y);=d;=y;

}

//вычисляем площадь новой фигуры

if(pDoc -> a>pDoc -> b)

{=pDoc -> b;=pDoc -> a;}

{=pDoc -> a;=pDoc -> b;}=(b-a)/n;(A<0) A = A*(-1);(i=1;i<n-1;i++)

{= a+i*h;(l==0)continue;= Sum + A/(pow((B*l + C),2))+D;

}= h*((A/(pow((B*a + C),2)) + A/(pow((B*b + C),2)))/2+Sum);(Q,S,10);-> TextOut(rect.left+10,rect.top+4,"Ïëîùàäü ôèãóðû:");-> TextOut(rect.left+10,rect.top+20,S);

// TODO: add draw code for native data here

}

// CKView printingCKView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparationDoPreparePrinting(pInfo);

}CKView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add extra initialization before printing

}CKView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add cleanup after printing

}

// CKView diagnostics

#ifdef _DEBUGCKView::AssertValid() const

{::AssertValid();

}CKView::Dump(CDumpContext& dc) const

{::Dump(dc);

}* CKView::GetDocument() // non-debug version is inline

{(m_pDocument->IsKindOf(RUNTIME_CLASS(CKDoc)));(CKDoc*)m_pDocument;

}

#endif //_DEBUG

// CKView message handlersCKView::OnParametresConstants()

{dlg;result = dlg.DoModal();(result == IDOK) {* pDoc = GetDocument();_VALID(pDoc);-> A = dlg.m_A;-> B = dlg.m_B;-> C = dlg.m_C;-> D = dlg.m_D;-> a = dlg.m_a;-> b = dlg.m_b;();

}

}

функція файл графік шкала

Додаток Б


Вікно програми





Зміст 1. Переваги використання MFC 2. Знаходження площі фігури методом трапеції . Постановка задачі Список використаної літератури Додаток

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ