Создание Windows приложения с использованием Win API и библиотек классов MFC
Министерство образования и науки РФ
Государственное образовательное учреждение высшего профессионального образования
«Ижевский государственный технический университет»
Кафедра «Мехатронные системы»
Курсовая работа
Дисциплина: Информатика
Тема: «Создание Windows приложения с использованием Win API и библиотек классов MFC»
Выполнила:
студентка группы 3-35-1
Хабибуллина Р. Р.
Проверил:
преподаватель
Караваев Ю.Л.
Рецензент:
Лекомцев П.В.
Ижевск 2010
Содержание
Техническое задание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
1.Разработка алгоритма. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
- Разработка математического алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
- Разработка схемы алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
- Разработка схемы математического алгоритма. . . . . . . . . . . . . . . . . 6
- Разработка схемы общего алгоритма. . . . . . . . . . . . . . . . . . . . . . . . . .7
2.Разработка Программы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.Вычислительный эксперимент. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
Заключение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
Список литературы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
Приложение А. Руководство оператора. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Приложение Б. Руководство программиста. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Техническое задание
Разработать алгоритм и программу вычисления площади, ограниченной двумя кривыми, заданными вариантом индивидуального задания для интервала, определяемого пользователем в диалоговом режиме. Интерфейс программы разработать с использованием MFC. Предусмотреть проверку ввода данных на корректность и графическое отображение заданных функций. Предусмотреть в программе вызов справки.
Программа разрабатывается на языке «С++»
Вариант задания представлен в таблице 1.
Основание системы счисления входных данных |
6 |
Основание системы счисления выходных данных |
16 |
Функция 1 |
y=A*x+B |
Функция 2 |
y=A*x2*cos(B*x+C) |
Метод интегрирования |
Симпсона |
Таблица 1 – Вариант задания
Введение
Данный программный продукт разработан в среде программирования
«Microsoft Visual Studio 2010», на языке программирования «С++». Интерфейс программы разработан с использованием библиотеки классов MFC.
MFC (Microsoft Foundation Classes) – это библиотека классов, написанных на языке C++. MFC является оболочкой для Win32 API и содержит многоуровневую иерархию классов. Не все функции Win32 API включены в MFC. Однако эта библиотека классов охватывает большую часть функциональных возможностей Windows, и предоставляет разработчику ряд дополнительных механизмов для проектирования и создания программных продуктов.
На вершине иерархии MFC находится единственный базовый класс – CObject. Все остальные классы библиотеки MFC можно условно разбить на две группы: производные и не производные от него.
Разработанная программа предназначена для расчёта площади, ограниченной двумя исходными функциями: y=A*x+B и y=A*x2*cos(B*x+C) и границами интегрирования, вводимыми пользователем в диалоговом режиме, соответствующими заданным системам счисления.
В программе предусмотрены:
- расчёт площади, ограниченной
исходными функциями и
- построение графиков
функций и границ
- ввод и вывод данных
в различных система
- вызов справки.
1 Разработка алгоритма
Алгоритм данной программы состоит из двух частей:
- Математический алгоритм – вычисление площади интеграла
- Общий алгоритм работы программы
1.1Разработка математического алгоритма
Метод Симпсона относится к методам численного интегрирования. Суть метода заключается в приближении подынтегральной функции на отрезке [a,b] интерполяционным многочленом второй степени P2(x), т.е. приближение графика функции на отрезке параболой. Графическое отражение метода представлено на рисунке 1.
Рисунок 1 – Графическое отражение метода — аппроксимация функции f (x) (синий график) квадратичным полиномом P (x) (красный).
На отрезке [a, b] формула Симпсона имеет вид:
где величина шага, а границы отрезков, x0=a; xN=b.
1.2 Разработка схемы алгоритма
1.2.1 Разработка схемы
Схема алгоритма программы,
считающей площадь, ограниченную двумя
исходными функциями и
Рисунок 2 – Схема алгоритма программы, которая считает площадь, ограниченную двумя исходными функциями и границами интегрирования
Рисунок 2 – Продолжение
Рисунок 2 – Продолжение
1.2.2 Разработка схемы общего алгоритма
Общий алгоритм программы представлен на рисунке 3.
Рисунок 3 – Схема общего алгоритма программы
Рисунок 3 – Продолжение
2 Разработка Программы
Программа была разработана в среде программирования
«Microsoft Visual Studio 2010», на языке программирования «С++».
Интерфейс программы разработан с использованием библиотеки классов MFC.
Содержание файла «KursovoyDlg.
Содержание файла «KursovoyDlg.
// KursovoyDlg.h : header file
//
#pragma once
//Задание констант pi, x_start, x_end
const double pi = 3.141592653;
const double x_start = (-5)*pi;
const double x_end = 5*pi;
// CKursovoyDlg dialog
class CKursovoyDlg : public CDialogEx
{
// Construction
public:
CKursovoyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_KURSOVOY_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
protected:
void DrawAxis(CDC *pdc, RECT rect);
void FillRect(CDC *pdc, RECT rect);
void DrawBorder(CDC *pdc, RECT rect);
void DrawGraph(CDC *pdc, RECT rect);
void DrawGraph2(CDC *pdc, RECT rect);
void DrawLim(CDC *pdc, RECT rect);
public:
CString STA;
CString STB;
CString STC;
CString STa;
CString STb;
Рисунок 4 - Содержание файла «KursovoyDlg.h»
CString STn;
CString STS;
double A;
double B;
double C;
double a;
double b;
double n;
double S;
void Check_error();
void Calculation();
void Graph();
double func1 (double x);
double func2 (double x);
double lea_to_dec(CString lea);
CString dec_to_leac(double A);
afx_msg void OnBnClickedButton3();
afx_msg void OnBnClickedButton2();
afx_msg void OnBnClickedButton1();
};
Рисунок 4 – Продолжение
// KursovoyDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Kursovoy.h"
#include "KursovoyDlg.h"
#include "afxdialogex.h"
#include "math.h"
#include "afxwin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(
{
CDialogEx::DoDataExchange(pDX)
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CKursovoyDlg dialog
CKursovoyDlg::CKursovoyDlg(
: CDialogEx(CKursovoyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_
}
void CKursovoyDlg::DoDataExchange(
{
CDialogEx::DoDataExchange(pDX)
DDX_Text(pDX, IDC_EDIT1, STA);
DDX_Text(pDX, IDC_EDIT2, STB);
DDX_Text(pDX, IDC_EDIT3, STC);
DDX_Text(pDX, IDC_EDIT4, STa);
Рисунок 5 - Содержание файла «KursovoyDlg.cpp»
DDX_Text(pDX, IDC_EDIT5, STb);
DDX_Text(pDX, IDC_EDIT6, STn);
DDX_Text(pDX, IDC_EDIT7, STS);
}
BEGIN_MESSAGE_MAP(
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON3, &CKursovoyDlg::
ON_BN_CLICKED(IDC_BUTTON2, &CKursovoyDlg::
ON_BN_CLICKED(IDC_BUTTON1, &CKursovoyDlg::
END_MESSAGE_MAP()
// CKursovoyDlg message handlers
BOOL CKursovoyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_
pSysMenu->AppendMenu(MF_
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
STA="1.0";
STB="1.0";
STC="1.0";
STa="1.0";
STb="3.0";
STn="100.0";
STS="0.0";
A=0.0;
B=0.0;
C=0.0;
a=0.0;
b=0.0;
n=0.0;
S=0.0;
UpdateData(false); //Выставить значения в окно
Рисунок 5 - Продолжение
return TRUE; // return TRUE unless you set the focus to a control
}
void CKursovoyDlg::OnSysCommand(
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CKursovoyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CKursovoyDlg::OnQueryDragIcon(
{
return static_cast<HCURSOR>(m_hIcon);
}
//============================ Функции для построения графиков ============================
//Построение осей координат
void CKursovoyDlg::DrawAxis(CDC *pdc, RECT rectClient)
{
//Создание карандаша (сплошной, толщина = 2 пикселя , цвет темно-синий)
CPen pen(PS_SOLID,2,RGB(0,0,100));
//Привязка карандаша к нашей области
CGdiObject *oOld = pdc->SelectObject(&pen);
Рисунок 5 - Продолжение
pdc->MoveTo(0, rectClient.bottom/2);
pdc->LineTo(rectClient.right, rectClient.bottom/2);
pdc->LineTo(rectClient.right - 5, rectClient.bottom/2 + 2);
pdc->MoveTo(rectClient.right, rectClient.bottom/2);
pdc->LineTo(rectClient.right - 5, rectClient.bottom/2 - 2);
pdc->MoveTo(rectClient.right/
pdc->LineTo(rectClient.right/
pdc->LineTo(rectClient.right/2 - 2, rectClient.top + 5);
pdc->MoveTo(rectClient.right/
pdc->LineTo(rectClient.right/2 + 2, rectClient.top + 5);
//Результат выставить в область
pdc->SelectObject(oOld);
}
//Закрашивание области
void CKursovoyDlg::FillRect(CDC *pdc, RECT rectClient)
{
//Создание карандаша (сплошной, толщина = 1000 пикселей (чтобы хватило на нашу область), цвет белый)
CPen pen(PS_SOLID,1000,RGB(255,255,
//Привязка карандаша к нашей области
CGdiObject *oOld = pdc->SelectObject(&pen);
pdc->MoveTo(0, rectClient.bottom/2);
pdc->LineTo(rectClient.right, rectClient.bottom/2);
//Результат выставить в область
pdc->SelectObject(oOld);
}
//Перерисовка черной рамки по контуру области
//При закраске области исчезает рамка - перерисовываем её
void CKursovoyDlg::DrawBorder(CDC *pdc, RECT rectClient)
{
//Создание карандаша (сплошной, толщина = 1 пиксель, цвет черный)
CPen pen(PS_SOLID,1,RGB(0,0,0));
//Привязка карандаша к нашей области
CGdiObject *oOld = pdc->SelectObject(&pen);
pdc->MoveTo(0, 0);
pdc->LineTo(rectClient.right-
pdc->LineTo(rectClient.right-
pdc->LineTo(rectClient.left, rectClient.bottom-1);
pdc->LineTo(rectClient.left, rectClient.top);
//Результат выставить в область
pdc->SelectObject(oOld);
}
//Рисование пределов
void CKursovoyDlg::DrawLim(CDC *pdc, RECT rectClient)
{
//Создание карандаша (пунктирный, толщина = 1 пиксель, цвет черный)
CPen pen(PS_DASH,1,RGB(0,0,0));
//Привязка карандаша к нашей области
CGdiObject *oOld = pdc->SelectObject(&pen);
//шаг = ширине пикчер контрола (для корректного рисования единичного отрезка)
double STEP = x_end - x_start;
pdc->MoveTo(rectClient.right/2 + ((rectClient.right/STEP)*a), 0);
pdc->LineTo(rectClient.right/2 + ((rectClient.right/STEP)*a), rectClient.bottom);
pdc->MoveTo(rectClient.right/2 + ((rectClient.right/STEP)*b), 0);
Рисунок 5 - Продолжение
pdc->LineTo(rectClient.right/2 + ((rectClient.right/STEP)*b), rectClient.bottom);
//Результат выставить в область
pdc->SelectObject(oOld);
}
//Построение 1 графика
//CDC *pdc - указатель на контекст устройства
//RECT - область нашего пикчер контрола (rectClient)
void CKursovoyDlg::DrawGraph(CDC *pdc, RECT rectClient)
{
//Создание карандаша (сплошной, толщина = 2 пикселя, цвет красный)
CPen pen(PS_SOLID,2,RGB(255,0,0));
//Привязка карандаша к нашей области
CGdiObject *oOld = pdc->SelectObject(&pen);
double x_current = x_start; //Начальное значение текущего Х
double step = (x_end - x_start)/rectClient.right; //
double y_start = func1(x_start); //Начальное значение У
pdc->MoveTo(0, double(-y_start/step) + rectClient.bottom/2); //
while(x_current < x_end)
{
//Проходим все значения по оси ОХ
x_current += step;
double y_current = func1(x_current);
//Если точка графика
функции попала в нашую
if(y_current<((x_end-x_start)/
{
//Объявление значений Х и У предыдущей точки
double x_previous = x_current - step;
double y_previous = func1(x_previous);
//Объявление значений Х и У следующей точки
double x_next = x_current + step;
double y_next = func1(x_next);
//Курсор перемещается в место предыдущей точки
pdc->MoveTo(double(x_previous/
//Рисуется линия до текущей точки
pdc->LineTo(double(x_current/
//Рисуется линия до следующей точки
pdc->LineTo(double(x_next/
}
}
//Результат выставить в область
pdc->SelectObject(oOld);
}
//Построение 2 графика
void CKursovoyDlg::DrawGraph2(CDC *pdc, RECT rectClient)
{
CPen pen(PS_SOLID,2,RGB(0,0,255));
CGdiObject *oOld = pdc->SelectObject(&pen);
double x_current = x_start;
Рисунок 5 - Продолжение
double step = (x_end - x_start)/rectClient.right;
double y_start = func2(x_start);
pdc->MoveTo(0, double(-y_start/step) + rectClient.bottom/2);
while(x_current < x_end)
{
x_current += step;
double y_current = func2(x_current);
if(y_current<((x_end-x_start)/
{
double x_previous = x_current - step;
double y_previous = func2(x_previous);
double x_next = x_current + step;
double y_next = func2(x_next);
pdc->MoveTo(double(x_previous/
pdc->LineTo(double(x_current/
pdc->LineTo(double(x_next/
}
}
//Результат выставить в область
pdc->SelectObject(oOld);
}
//============================
//============================
//Функция перевода
//и перевод её в число десятеричной системы
double CKursovoyDlg::lea_to_dec(
{
char *st = new char[50]; //задание длины строки st
size_t convertedCharsw = 0; //задание необходимого параметра convertedCharsw
wcstombs_s(&convertedCharsw, st, 50, lea, _TRUNCATE ); //конвертирование (взято с msdn)
double s, k;
int N, N_cl, L;
s = 0; //Конечное значение числа в 10й системе = 0
N_cl = 0; //Число символов целой части обнуляем
N = strlen(st) - 1; //общее кол-во символов = длине строки минус заключительный 0
if(st[0]=='-')
N = strlen(st) - 2;
for (int i=0; st[i]!='.'; i++) //выяснение кол-ва символов целой части
N_cl++;
L = N_cl - 1;
if(st[0]=='-')
{L = N_cl - 2;}
//Объявление L как числа символов целой части. Причина:
// исходное число = 1258.12
// N_cl = 4
Рисунок 5 - Продолжение
// L = 3
// B = основание системы счисления искомого числа
// целая часть получаемого числа = 1*B^L (L=3) (программный декремент L) +
// + 2*B^L (L=2) (программный декремент L) + 5*B^L (L=1) (программный декремент L) +
// + 8*B^L (L=0). Далее нахождение символа '.' (точка), обнуление и декремент L
// дробная часть получаемого числа = 1*B^L (L=-1) (программный декремент L) +
// + 2*B^L (L=-2)
int o;
o=0;
//при наличии символа '-' - резервируем место для него и начинаем сичтать не с 0го, а с 1го
if(st[0]==L'-')
o=1;
for (int i=o; st[i]!='\0'; i++)
{
//toupper - превращает строчные символы в заглавные
switch (toupper(st[i]))
{
case '0': k=0; break;
case '1': k=1; break;
case '2': k=2; break;
case '3': k=3; break;
case '4': k=4; break;
case '5': k=5; break;
case '6': k=6; break;
case '7': k=7; break;
case '8': k=8; break;
case '9': k=9; break;
case '.': L=0; goto p;
}
//Вызов окна с ошибкой
if(k>=6)
{
MessageBox(_T("Введенные значения
не соответствует указанной системе счисления."),_T("
break;
}
s=s+k*pow(6.0, L);
p:
L--;
}
if(st[0]=='-')
s=s*(-1);
return s;
}
//Функция перевода числа десятеричной системы в число любой системы счисления
//и конвертирование его в передаваемую строку
CString CKursovoyDlg::dec_to_leac(doub
{
double cur = abs(A);
double cur_cl1;
double cur_dr;
unsigned long long int cur_cl;
int j;
cur_dr = modf(cur, &cur_cl1); //дробное значение cur уйдет в cur_dr, а целое
Рисунок 5 - Продолжение
в cur_cl1
cur_cl = cur_cl1; ///преобразование double cur_cl1 в long long int cur_cl
char st[50]; //инициируем массив из символов типа char
//присваивание каждому элементу st знака "пробел"
int p=49;
while (p>=0)
{
st[p]=NULL;
p--;
}
//j - переменная для постановки числа в ячейку массива
//изначально j=-1, т.к. даже при 1 цифре в числе j увеличится, превращаясь
//в j=0 и выполняя перевод целой части
j = -1;
//Нахождение количества символов в числе
while (cur_cl>0)
{
cur_cl=cur_cl/16;
j++;
}
cur_cl=cur; //До этой строки cur_cl==0, поэтому снова его задаем
//если число отрицательное - добавляем j, резервируя место впереди числа для '-'
if (A<0)
j++;
int flagj=j;
//Перевод целой части
while(j>=0)
{
int rem = cur_cl % 16;
//Если остаток > системы счисления, то вызов окна об ошибке
if(rem>=16)
{
MessageBox(_T("Введенные значения
не соответствует указанной системе счисления."),_T("
break;
}
//в зависимости от остатка - присваивание числа элементу массива
switch (rem)
{
case 0: st[j]='0'; break;
case 1: st[j]='1'; break;
case 2: st[j]='2'; break;
case 3: st[j]='3'; break;
case 4: st[j]='4'; break;
case 5: st[j]='5'; break;
case 6: st[j]='6'; break;
case 7: st[j]='7'; break;
case 8: st[j]='8'; break;
case 9: st[j]='9'; break;
case 10: st[j]='A'; break;
case 11: st[j]='B'; break;
case 12: st[j]='C'; break;
case 13: st[j]='D'; break;
case 14: st[j]='E'; break;
case 15: st[j]='F'; break;
}
cur_cl = cur_cl - rem;
cur_cl = cur_cl / 16;
j--;
}
Рисунок 5 - Продолжение
//устанавливаем символ '.' сразу после найденного числа
st[flagj+1]='.';
if(cur_dr==0.0)
{
st[flagj+2]='0';
goto p1; //если дробной части нет - то переход в конец, без расчета дробной части
}
//перевод дробной части
double cur_temp = cur_dr;
double cur_temp2;
long int cur_temp3;
j = flagj+1;
for (int i=0; i<15; i++)
{
j++;
cur_temp = cur_temp * 16;
cur_temp = modf(cur_temp, &cur_temp2);
cur_temp3 = cur_temp2;
switch (cur_temp3)
{
case 0: st[j]='0'; break;
case 1: st[j]='1'; break;
case 2: st[j]='2'; break;
case 3: st[j]='3'; break;
case 4: st[j]='4'; break;
case 5: st[j]='5'; break;
case 6: st[j]='6'; break;
case 7: st[j]='7'; break;
case 8: st[j]='8'; break;
case 9: st[j]='9'; break;
case 10: st[j]='A'; break;
case 11: st[j]='B'; break;
case 12: st[j]='C'; break;
case 13: st[j]='D'; break;
case 14: st[j]='E'; break;
case 15: st[j]='F'; break;
}
}
p1:
//если число отрицательное - постановка знака '-' перед числом
if (A<0)
st[0]='-';
CString leac;
leac.Empty(); //делаем строку leac пустой
leac = st;
return leac;
}
//============================
//========================= Обработка
функции построения графика ===
void CKursovoyDlg::Graph()
{
UpdateData(true);
A = lea_to_dec(STA);
Рисунок 5 - Продолжение
B = lea_to_dec(STB);
C = lea_to_dec(STC);
a = lea_to_dec(STa);
b = lea_to_dec(STb);
//Основные функции
инициализации области (IDC_
CWnd *pPic = GetDlgItem(IDC_PIC1);
CWindowDC dc(pPic);
RECT rect;
pPic->GetClientRect(&rect);
FillRect(&dc,rect);
DrawAxis(&dc,rect);
DrawBorder(&dc, rect);
DrawGraph(&dc,rect);
DrawGraph2(&dc,rect);
DrawLim(&dc,rect);
}
//============================
//========================= Обработка функции, проверяющей на ошибки ======================
void CKursovoyDlg::Check_error()
{
UpdateData(true);
a = lea_to_dec(STa);
b = lea_to_dec(STb);
n = lea_to_dec(STn);
if(a>b)
{
MessageBox(_T("Предел интегрирования слева должен быть меньше предела интегрирования справа"),_T("Ошибка"), MB_ICONERROR | MB_OK);
return;
}
if(n<0)
{
MessageBox(_T("Количество точек разбиения не может быть отрицательным числом"),_T("Ошибка"), MB_ICONERROR | MB_OK);
return;
}
}
//============================
//============================
//Обработка кнопки "Расчет"
void CKursovoyDlg::
{
Check_error(); //Вызов функции проверки ошибок
Calculation(); //Вызов функции расчета
}
//Обработка кнопки "График"
void CKursovoyDlg::
{
Рисунок 5 - Продолжение
Check_error();
Graph();
}
//Обработка кнопки "Справка"
void CKursovoyDlg::
{
CAboutDlg HelpWindow; //Создание объекта класса CAboutDlg (окно справки)
HelpWindow.DoModal(); //Вызов окна справки
}
//============================
//============================
//Возвращает значение функции 1
double CKursovoyDlg::func1(double x)
{
x = A*x + B;
return x;
}
//Возвращает значение функции 2
double CKursovoyDlg::func2(double x)
{
x = A*x*x*cos(B*x + C);
return x;
}
//============================
//============================
void CKursovoyDlg::Calculation()
{
UpdateData(true);
A=lea_to_dec(STA);
B=lea_to_dec(STB);
C=lea_to_dec(STC);
a=lea_to_dec(STa);
b=lea_to_dec(STb);
n=lea_to_dec(STn);
int i;
double x,x1,x2, //Координаты и пределы интегрирования
f_0,f_N, //Значение функций в крайних точках
L, //Длина отрезка интегрирования
h, //Диаметр разбиения
Sum1,Sum2,S; //Сумма значений
L=b-a; //Нахождение длины отрезка интегрирования
h=L/n; //Расчет диаметра разбиени
x=a; //Присваивание значение начала интегрирования
Sum1=0; //Обнуление счетчика суммы значений функций
for(i=0;i<n-1;i++) //Расчет суммы значений функций
{
x=x+h; //Нахождение координаты каждого промежутка