Создание Windows приложения с использованием Win API и библиотек классов MFC

Министерство образования  и науки РФ

Государственное образовательное  учреждение высшего профессионального  образования

«Ижевский государственный  технический университет»

Кафедра «Мехатронные системы»

 

 

 

 

 

 

 

 

 

Курсовая работа

Дисциплина: Информатика

Тема: «Создание Windows приложения с использованием Win API и библиотек классов MFC»

 

 

 

 

 

 

Выполнила:

студентка группы 3-35-1

Хабибуллина Р. Р.

 

Проверил:

преподаватель

Караваев Ю.Л.

 

Рецензент:

Лекомцев П.В.

 

 

 

 

 

 

Ижевск 2010

 

Содержание

 

Техническое задание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4

1.Разработка алгоритма. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5

    1. Разработка математического алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
    2. Разработка схемы алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
      1. Разработка схемы математического алгоритма. . . . . . . . . . . . . . . . . 6
      2. Разработка схемы общего алгоритма. . . . . . . . . . . . . . . . . . . . . . . . . .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. Математический алгоритм – вычисление площади интеграла 
  2. Общий алгоритм работы программы

 

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 – Продолжение




 

 



 


 


 

 




 


 



 


 

 


 

 

 

Рисунок 2 – Продолжение

 

 

 

 

 

 

 

 

 

1.2.2 Разработка схемы общего алгоритма

Общий алгоритм программы представлен на рисунке 3.


 




 


 


 

 

 


 

 


 

 


 


 

 


 

 

 


 

 


 


 

 


 


 

 


 

 

 

Рисунок 3 – Схема общего алгоритма  программы




 



 


 


 

 

 


 

 


 

 

 


 

 

 

 

 


 


 

 


 

 

 



 




 

 

 

 

 

                                                                                                                           

Рисунок 3 – Продолжение

2 Разработка Программы

 

Программа была разработана  в среде программирования

«Microsoft Visual Studio 2010», на языке программирования «С++».

Интерфейс программы разработан с использованием библиотеки классов MFC.

 

Содержание файла «KursovoyDlg.h» представлено на рисунке 4.

Содержание файла «KursovoyDlg.cpp»представлено на рисунке 5.

 

// 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(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()

 

 

// CKursovoyDlg dialog

 

 

 

 

CKursovoyDlg::CKursovoyDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(CKursovoyDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CKursovoyDlg::DoDataExchange(CDataExchange* pDX)

{

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(CKursovoyDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON3, &CKursovoyDlg::OnBnClickedButton3)

ON_BN_CLICKED(IDC_BUTTON2, &CKursovoyDlg::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON1, &CKursovoyDlg::OnBnClickedButton1)

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_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

 

// 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(UINT nID, LPARAM lParam)

{

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.GetSafeHdc()), 0);

 

// 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/2, rectClient.bottom);

pdc->LineTo(rectClient.right/2, rectClient.top);

pdc->LineTo(rectClient.right/2 - 2, rectClient.top + 5);

pdc->MoveTo(rectClient.right/2, rectClient.top);

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,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-1, 0);

pdc->LineTo(rectClient.right-1, rectClient.bottom-1);

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

//Объявление значений  Х и У предыдущей точки

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/step) + rectClient.right/2, double(-y_previous/step) + rectClient.bottom/2);

//Рисуется линия до текущей точки

pdc->LineTo(double(x_current/step) + rectClient.right/2, double(-y_current/step) + rectClient.bottom/2);

//Рисуется линия до следующей точки

pdc->LineTo(double(x_next/step) + rectClient.right/2, double(-y_next/step) + rectClient.bottom/2);

}

}

   

//Результат выставить  в область

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

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/step) + rectClient.right/2, double(-y_previous/step) + rectClient.bottom/2);

pdc->LineTo(double(x_current/step) + rectClient.right/2, double(-y_current/step) + rectClient.bottom/2);

pdc->LineTo(double(x_next/step) + rectClient.right/2, double(-y_next/step) + rectClient.bottom/2);

}

}

   

//Результат выставить  в область

pdc->SelectObject(oOld);

}

//=========================================================================================

 

 

 

//============================= Функции  перевода чисел в с.с ==============================

//Функция перевода передаваемой  строки с числом любой системы  счисления 

//и перевод её в число  десятеричной системы 

double CKursovoyDlg::lea_to_dec(CString lea)

{

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("Предупреждение"),MB_ICONEXCLAMATION | MB_OK);

break;

 

s=s+k*pow(6.0, L);

p:

L--;

}

if(st[0]=='-')

s=s*(-1);

 

return s;

}

 

//Функция перевода числа  десятеричной системы в число  любой системы счисления 

//и конвертирование его  в передаваемую строку

CString CKursovoyDlg::dec_to_leac(double A)

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("Предупреждение"), MB_ICONEXCLAMATION | MB_OK);

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_PIC1)

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::OnBnClickedButton3()

{

Check_error(); //Вызов функции проверки ошибок

Calculation();  //Вызов функции расчета

}

 

//Обработка кнопки "График"

void CKursovoyDlg::OnBnClickedButton2()

{

 

Рисунок 5 - Продолжение

      Check_error();

Graph();

}

 

//Обработка кнопки "Справка"

void CKursovoyDlg::OnBnClickedButton1()

{

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; //Нахождение координаты каждого промежутка