Разработка Windows - приложения "Калькулятор" с использованием MFC

Автор работы: Пользователь скрыл имя, 02 Апреля 2014 в 20:56, курсовая работа

Краткое описание

В данном курсовом проекте на тему «Разработка Windows-приложения «Калькулятор» с использованием MFC» критерием выполнения поставленной задачи является программный продукт, выполняющий все арифметические операции, как и в калькуляторе встроенному в Windows (в режиме «обычный»). Для разработки приложений была выбрана среда программирования Microsoft Visual Studio 2008.

Содержание

ВВЕДЕНИЕ……………………………………………...………………….5
1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РАЗРАБОТКИ WINDOWS-ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ MFC…………..….6
1.1. Общие сведения………………………………………………………..6
1.2. Библиотека MFC……………………………………………………...11
1.3. Проектирование приложений в среде Microsoft Visual C++………14
2. СПЕЦИФИКАЦИЯ ПРОГРАММЫ ……………….………………....20
2.1. Описание программы………………………………………………...20
2.2. Функциональное назначение………………………………………...20
2.3. Описание логической структуры приложения……………………..21
2.4. Требования к техническому обеспечению………………………….23
2.5. Установка и запуск программы……………………………………..23
2.6. Входные и выходные данные………………………………………..24
2.7. Тестирование программы……………………………………………24
ЗАКЛЮЧЕНИЕ………………………….………………………………..25
СПИСОК ЛИТЕРАТУРЫ…………………………………..…………….26
ПРИЛОЖЕНИЕ 1………………………………………..………………..27
ПРИЛОЖЕНИЕ 2……………………………………………..…………..28

Вложенные файлы: 1 файл

Курсовик ТП.docx

— 113.64 Кб (Скачать файл)

 

 

 

2. СПЕЦИФИКАЦИЯ  ПРОГРАММЫ

 

2.1 Описание программы

 

Windows-приложение «Калькулятор», разработано в среде программирования Microsoft Visual Studio 2008 на языке программирования C++ с использованием библиотеки MFC. Программа аналогична калькулятору Windows в режиме «обычный».

 

2.2 Функциональное назначение

 

При запуске программы открывается главное окно программы (рисунок 1).

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

 

Приложение Калькулятор предназначено для вычисления основных арифметических операций: сложение, умножение, деление, вычитание, извлечение квадратного корня. Также калькулятор содержит операцию добавления числа в ячейку памяти.

 

2.3 Описание логической структуры приложения

 

Приложение разработано в среде Microsoft Visual Studio 2008 и отвечает всем принципам объектно-ориентированного программирования. Оно создано на базе диалогового приложения.

Все вычисления выполнены в классе CalcDlg. Подробная спецификация классов приведена в таблице 1.

Таблица 1 – Спецификация классов приложения Calc.

Имя класса

Член класса

Способа доступа

Назначение

CalcDlg

Num0()

открытый

Добавление к отображаемому числу цифры 0

CalcDlg

Num1()

открытый

Добавление к отображаемому числу цифры 1

CalcDlg

Num2()

открытый

Добавление к отображаемому числу цифры 2

CalcDlg

Num3()

открытый

Добавление к отображаемому числу цифры 3

CalcDlg

Num4()

открытый

Добавление к отображаемому числу цифры 4

CalcDlg

Num5()

открытый

Добавление к отображаемому числу цифры 5

CalcDlg

Num6()

открытый

Добавление к отображаемому числу цифры 6

CalcDlg

Num7()

открытый

Добавление к отображаемому числу цифры 7

CalcDlg

Num8()

открытый

Добавление к отображаемому числу цифры 8

Продолжение таблицы 1

CalcDlg

Num9()

открытый

Добавление к отображаемому числу цифры 9

CalcDlg

ChangeSign()

открытый

Умножение аргумента на (-1)

CalcDlg

SetComma()

открытый

Добавление точки к отображаемому числу

CalcDlg

ClearE()

открытый

Очистка памяти от вычислений

CalcDlg

Clear()

открытый

Очистка отображаемого числа

CalcDlg

Division()

открытый

Операция деления

CalcDlg

Multiplication()

открытый

Операция умножения

CalcDlg

Subtraction()

открытый

Операция вычитания

CalcDlg

Addition()

открытый

Операция сложения

CalcDlg

OnRavno()

открытый

Завершение операции с несколькими аргументами

CalcDlg

OnSqrt()

открытый

Извлечение арифметического квадратного корня

CalcDlg

MemoryClear()

открытый

Очистка ячейки памяти

CalcDlg

MemoryRead()

открытый

Вставка числа из ячейки памяти

CalcDlg

MemorySave()

открытый

Сохранение числа в ячейку памяти

CalcDlg

MemoryPlus()

открытый

Добавление числа к числу в ячейки памяти

Продолжение таблицы 1

CalcDlg

OnChangeValue()

открытый

Изменение набранного числа в поле (дополнительная проверка). Синхронизация переменных

CalcDlg

OneOnX()

открытый

Нахождение обратной величины от числа

CalcDlg

OnInitDialog()

открытый

Инициализация переменных

CalcDlg

OnMinus()

открытый

Нажатие на клавишу «-»

CalcDlg

OnDiv()

открытый

Нажатие на клавишу «/»

CalcDlg

OnMult()

открытый

Нажатие на клавишу «*»

CalcDlg

OnPlus()

открытый

Нажатие на клавишу «+»


 

 

 

2.4 Требование к техническому обеспечению

 

Для работы с программой необходим персональный компьютер обладающий характеристиками: оперативная память не менее 256 Мбайт, свободное дисковое пространство не менее 2,16 Мбайт, монитор, мышь, клавиатура. Операционная система Windows XP, Vista, Seven.

 

2.5 Установка и запуск программы

 

Для работы с программой необходимо скопировать на жесткий диск файл Calc.exe. Запустить программу двойным щелчком левой кнопкой мыши.

 

 

2.6 Входные и выходные данные

 

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

 

2.7 Тестирование программы

 

Для тестирования работы калькулятора были подготовлены контрольные примеры представленные в таблице 2. Контрольные примеры запускались по очереди и ответы совпали с ожидаемыми.

 

Таблица 2 – Контрольные примеры для тестирования

Пример

Ожидаемый ответ

1+2=

3

2-1=

1

1-2=

-1

2*2=

4

2*(-1)

-2

1/2=

0,5

2/1=

2

Sqrt(4)=

2


 

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

 

ЗАКЛЮЧЕНИЕ

 

При выполнении данного курсового проекта было разработано Windows-приложение «Калькулятор» с использованием MFC, которое позволяет проводить арифметические вычисления, аналогичные windows калькулятору.

Калькулятор Windows является не самым простым приложением. Использование библиотеки MFC без применения функций API не дает возможность полностью повторить его интерфейс и функциональные возможности.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СПИСОК ЛИТЕРАТУРЫ

 

  1. Методические указания к выполнению курсового проекта по дисциплине «Технология программирования» для студентов специальности 230201.65, «Информационные системы и технологии»; Издательство ГОУВПО «СевКавГТУ», Ставрополь, 2008.
  2. Кейт Грегори «Использование Visual C++ 6.0», СПб, К.: издательский дом «Вильямс», 2008.
  3. А. Черносвитов «Visual C++ и MFC, курс MCSD для профессионалов», СПб.: Питер, 2009.
  4. К. Паппас, У. Мюррей «Полное руководство по Visual C++», Минск: ООО «Попурри», 2009.
  5. М. Луис «Visual C++ 6», М.: Лаборатория базовых знаний, 2008.
  6. С. Гилберт, Б. Маккарти «Программирование на Visual C++. Этюды профессионалов», К.: ДиаСофт, 2009.
  7. И.Ю. Баженова «Visual C++ 6.0. Уроки программирования», М.: Диалог-МИФИ, 2008.
  8. А.В. Фролов, Г.В. Фролов «Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT» в 2-х ч. (часть 1) (Библиотека системного программиста; т.24) М.: Диалог-МИФИ, 2009.
  9. А.В. Фролов, Г.В. Фролов «Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT» (часть 2) (Библиотека системного программиста; т.28) М.: Диалог-МИФИ, 2009.
  10. И.А. Цвиринько, В.Д. Коровина «Методические рекомендации по оформлению дипломных и курсовых проектов (работ)», Ставрополь: изд-во Сев-Кав ГТУ, 2000.

 

 

 

 

ПРИЛОЖЕНИЕ 1

 

Диаграмма классов

 

 

Рисунок П1 – Диаграмма классов приложения калькулятор

 

 

 

 

 

ПРИЛОЖЕНИЕ 2

 

Листинг программы

 

// CalcDlg.cpp : implementation file

 

#include "stdafx.h"

#include "Calc.h"

#include "CalcDlg.h"

#include "math.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

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

// CAboutDlg dialog used for App About

 

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

 

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

//}}AFX_VIRTUAL

 

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

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

// CCalcDlg dialog

 

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

: CDialog(CCalcDlg::IDD, pParent)

MemoryIndicator(_T(""))

{

//{{AFX_DATA_INIT(CCalcDlg)

m_Value = 0.0;

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

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

}

 

void CCalcDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CCalcDlg)

DDX_Text(pDX, IDC_VALUE, m_Value);

//}}AFX_DATA_MAP

DDX_Text(pDX, IDC_EDIT1, MemoryIndicator);

DDX_Control(pDX, IDC_VALUE, m_EDIT);

}

 

BEGIN_MESSAGE_MAP(CCalcDlg, CDialog)

//{{AFX_MSG_MAP(CCalcDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_EN_CHANGE(IDC_VALUE, OnChangeValue)

ON_BN_CLICKED(IDC_PLUS, OnPlus)

ON_BN_CLICKED(IDC_RAVNO, OnRavno)

ON_BN_CLICKED(IDC_MINUS, OnMinus)

ON_BN_CLICKED(IDC_MULT, OnMult)

ON_BN_CLICKED(IDC_DIV, OnDiv)

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_DIV2, &CCalcDlg::OnSqrt)

ON_BN_CLICKED(IDC_DIV3, &CCalcDlg::OneOnX)

ON_BN_CLICKED(IDC_DIV5, &CCalcDlg::Clear)

ON_BN_CLICKED(IDC_DIV18, &CCalcDlg::MemorySave)

ON_BN_CLICKED(IDC_DIV9, &CCalcDlg::MemoryRead)

ON_BN_CLICKED(IDC_DIV16, &CCalcDlg::MemoryClear)

ON_BN_CLICKED(IDC_DIV7, &CCalcDlg::MemoryPlus)

ON_BN_CLICKED(IDC_DIV21, &CCalcDlg::ChangeSign)

ON_BN_CLICKED(IDC_DIV4, &CCalcDlg::Num1)

ON_BN_CLICKED(IDC_DIV22, &CCalcDlg::SetComma)

ON_BN_CLICKED(IDC_DIV6, &CCalcDlg::Num2)

ON_BN_CLICKED(IDC_DIV19, &CCalcDlg::Num3)

ON_BN_CLICKED(IDC_DIV8, &CCalcDlg::Num4)

ON_BN_CLICKED(IDC_DIV17, &CCalcDlg::Num5)

ON_BN_CLICKED(IDC_DIV10, &CCalcDlg::Num6)

ON_BN_CLICKED(IDC_DIV11, &CCalcDlg::Num7)

ON_BN_CLICKED(IDC_DIV12, &CCalcDlg::Num8)

ON_BN_CLICKED(IDC_DIV13, &CCalcDlg::Num9)

ON_BN_CLICKED(IDC_DIV20, &CCalcDlg::Num0)

ON_BN_CLICKED(IDC_DIV14, &CCalcDlg::ClearE)

END_MESSAGE_MAP()

 

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

// CCalcDlg message handlers

 

BOOL CCalcDlg::OnInitDialog()

{

CDialog::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)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

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

 

    m_Point_Flag=0;

StartOperation=0;

m_MemoryValue=0.0;

CommaFlag=false;

   

return TRUE;  // return TRUE  unless you set the focus to a control

}

 

void CCalcDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::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 CCalcDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

 

SendMessage(WM_ICONERASEBKGND, (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

{

CDialog::OnPaint();

}

}

 

// The system calls this to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CCalcDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

 

void CCalcDlg::OnChangeValue()

{

// TODO: If this is a RICHEDIT control, the control will not

// send this notification unless you override the CDialog::OnInitDialog()

// function and call CRichEditCtrl().SetEventMask()

// with the ENM_CHANGE flag ORed into the mask.

 

// TODO: Add your control notification handler code here

// CString tmp="                \0";

  //  int is_find=0;

 

UpdateData(true);

 

}

 

void CCalcDlg::OnPlus() ///Нажатие на кнопку "+"

{

// TODO: Add your control notification handler code here

    UpdateData(true);

m_Value_1=m_Value;

m_Value=0.0;

UpdateData(false);

    Type_Operation='+';

StartOperation=1;

}

 

void CCalcDlg::OnRavno() ///Нажатие на кнопку "="

{

// TODO: Add your control notification handler code here

 

    UpdateData(true);

   

switch(Type_Operation)

{

   case '+':Addition(); break;

       case '-':Subtraction(); break;

       case '*':Multiplication(); break;

   case '/':Division(); break;

}

    StartOperation=0;

UpdateData(false);

 

}

 

void CCalcDlg::Addition() ////Сложение

   if (StartOperation)

   m_Value_2=m_Value;

   else m_Value_1=m_Value;

   m_Value=m_Value_1+m_Value_2;

  

}

 

void CCalcDlg::OnMinus() ///Нажатие на кнопку "-"

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_Value_1=m_Value;

m_Value=0.0;

UpdateData(false);

   

 

    Type_Operation='-';

StartOperation=1;

}

 

void CCalcDlg::Subtraction() ///Вычитание

{

    if (StartOperation)

   m_Value_2=m_Value;

   else m_Value_1=m_Value;

   m_Value=m_Value_1-m_Value_2;

 

}

 

void CCalcDlg::OnMult()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_Value_1=m_Value;

m_Value=0.0;

UpdateData(false);

   

 

    Type_Operation='*';

StartOperation=1;

}

 

void CCalcDlg::Multiplication()

{

     if (StartOperation)

   m_Value_2=m_Value;

   else m_Value_1=m_Value;

   m_Value=m_Value_1*m_Value_2;

}

 

void CCalcDlg::OnDiv()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_Value_1=m_Value;

m_Value=0.0;

UpdateData(false);

   

 

    Type_Operation='/';

StartOperation=1;

}

 

void CCalcDlg::Division()

{

    if (StartOperation)

   m_Value_2=m_Value;

   else m_Value_1=m_Value;

 

   if (m_Value_2)

   m_Value=m_Value_1/m_Value_2;

    else

{

AfxMessageBox("Деление на 0");

    m_Value_2=1;

}

}

 

double CCalcDlg::GetNumberDrob() /// получить степень остатка

{

 

UpdateData(true);

double buffer = m_Value; 

 

double i=0;

while((int)buffer!=buffer)

{

   buffer*=10;

  i=i+1;

}

return i;

 

}

 

void CCalcDlg::OnSqrt()///Нажатие на кнопку Sqrt = квадратный корень

{

    UpdateData(true);

m_Value_1=m_Value;

    m_Value = 0.0;

if (m_Value_1<0)

{

        AfxMessageBox("Недопустимый аргумент функции");

}

else

m_Value=sqrt(m_Value_1);

UpdateData(false);

 

}

 

void CCalcDlg::OneOnX() ////Операция нажатия на 1/x

{

UpdateData(true);

m_Value_1=m_Value;

    m_Value = 0.0;

if (m_Value_1==0)

{

        AfxMessageBox("Деление на ноль");

}

else

m_Value=1/m_Value_1;

UpdateData(false);

 

 

}

 

void CCalcDlg::Clear() ////Очистить все

{

m_Value= m_Value_1 = m_Value_2=0.0;

StartOperation  = 0;

    UpdateData(false);

 

 

// TODO: Add your control notification handler code here

}

 

void CCalcDlg::MemorySave() ////Записать в память

{

UpdateData(true);

if (m_Value)

MemoryIndicator = "M";

else

MemoryIndicator = "";

m_MemoryValue = m_Value;

 

UpdateData(false);

 

// TODO: Add your control notification handler code here

}

 

void CCalcDlg::MemoryRead()  ////Прочитать память

{

if (MemoryIndicator=="M")

{

m_Value = m_MemoryValue;

UpdateData(false);

}

}

 

void CCalcDlg::MemoryClear()  /////Очистить число в памяти

{

m_MemoryValue = 0.0;

MemoryIndicator = "";

UpdateData(false);

 

}

 

void CCalcDlg::MemoryPlus()    ////Добавить в память

{

if (m_MemoryValue==0)

{

MemorySave();

}

else

{

     UpdateData(true);

m_MemoryValue+= m_Value;    

}

 

}

 

void CCalcDlg::ChangeSign()  /////Изменить  знак на противоположный

{

UpdateData(true);

if (m_Value!=0)

 

    m_Value = m_Value*(-1);

UpdateData(false);

 

}

 

void CCalcDlg::Num1() ///цифра 1

{

//////Надо определить целое  число или нет 

 

       CString buffer_str;

   m_EDIT.GetWindowTextA(buffer_str);

   buffer_str.AppendChar('1');

   m_EDIT.SetWindowTextA(buffer_str);

 

    UpdateData(true);

UpdateData(false);

}

 

void CCalcDlg::SetComma() /////Поставить запятую

{

       CString buffer_str;

   m_EDIT.GetWindowTextA(buffer_str);

   buffer_str.AppendChar('.');

Информация о работе Разработка Windows - приложения "Калькулятор" с использованием MFC