Разработка Windows - приложения "Калькулятор" с использованием MFC
Курсовая работа, 02 Апреля 2014, автор: пользователь скрыл имя
Краткое описание
В данном курсовом проекте на тему «Разработка 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 не дает возможность полностью повторить его интерфейс и функциональные возможности.
СПИСОК ЛИТЕРАТУРЫ
- Методические указания к выполнению курсового проекта по дисциплине «Технология программирования» для студентов специальности 230201.65, «Информационные системы и технологии»; Издательство ГОУВПО «СевКавГТУ», Ставрополь, 2008.
- Кейт Грегори «Использование Visual C++ 6.0», СПб, К.: издательский дом «Вильямс», 2008.
- А. Черносвитов «Visual C++ и MFC, курс MCSD для профессионалов», СПб.: Питер, 2009.
- К. Паппас, У. Мюррей «Полное руководство по Visual C++», Минск: ООО «Попурри», 2009.
- М. Луис «Visual C++ 6», М.: Лаборатория базовых знаний, 2008.
- С. Гилберт, Б. Маккарти «Программирование на Visual C++. Этюды профессионалов», К.: ДиаСофт, 2009.
- И.Ю. Баженова «Visual C++ 6.0. Уроки программирования», М.: Диалог-МИФИ, 2008.
- А.В. Фролов, Г.В. Фролов «Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT» в 2-х ч. (часть 1) (Библиотека системного программиста; т.24) М.: Диалог-МИФИ, 2009.
- А.В. Фролов, Г.В. Фролов «Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT» (часть 2) (Библиотека системного программиста; т.28) М.: Диалог-МИФИ, 2009.
- И.А. Цвиринько, В.Д. Коровина «Методические рекомендации по оформлению дипломных и курсовых проектов (работ)», Ставрополь: изд-во Сев-Кав ГТУ, 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);
}