1、Windows程序设计报告书(2013) 科学计算器的的设计 —windows窗体应用程序 1 目 录 1 选题原因及理由 3 2 设计思想及框架 3 一. 主体功能 3 二. 开发环境 3 3相关表格和流程图 4 一. 系统功能表 4 二. 系统流程图 5 4设计特点及关键算法 5 5 测试结果及测试分析.................................................6 6设计总结...................
2、7 7附录(源代码)...................................................8 3 计算器的设计与实现 1 选题原因及理由 我们在学习生活中,常会遇到一些繁杂的数值运算,这时候我们就必须用到科学计算器, 所以便着手开发了这个计算器程序,以便用于自己的学习工作。要计算功能有以下几个方面:加法,减法,乘法,除法,求幂,求e的指数次方,求平方根,求Sin,求Cos,求Tan及其反函数等。 也可达到以下目的: 1、巩固并加深学
3、生对C++语言程序设计知识的理解; 2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别; 3、进一步掌握和应用VC++ 2008集成开发环境; 4、提高运用C++语言解决实际问题的能力; 5、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的窗体应用系统; 6、掌握书写程序设计开发文档的能力。 2 设计思想及框架 课题名称:高级计算器的实现 说明:实现一个计算器。 要求: 1)用“计算器”的标准视图执行简单的计算。 2)用其科学型视图执行高级的科学计算。 一.主体功能 1、十进制数的加、减、乘、除、乘方、取模等简单计算。
4、2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运算。 3、以角度、弧度两种方式实现上述部分函数。 二. 开发环境 VC++ 2008 3 相关表格和流程图 一. 系统功能表 表3-1 系统功能表 序号 文件名 主要功能 备注 1 + 加法求和 两个操作数 2 - 减法求差 两个操作数 3 * 乘法求积 两个操作数 4 / 除法求商 两个操作数 5 x√ 求x次方根 两个操作数 6 ^ 求x的y次幂 两个操作数 7 . 小数点 8 Sin 求正弦 一个操作
5、数 9 Cos 求余弦 一个操作数 10 Tan 求正切 一个操作数 11 acsin 反正弦 一个操作数 12 accos 反余弦 一个操作数 13 actan 反正切 一个操作数 14 ln 求对数 一个操作数 15 C 清除当前操作数 16 = 等于 17 CE 寄存器清零 18 x-y 科学计数法 一个操作数 1) 假设执行操作“+”,先输入一个数,再输入“+”,再输入另一个数,最后输入“+”。整个功能“+
6、就执行完毕。 2) 执行操作“Sin”,先输入一个数,在输入“Sin”,整个功能“Sin”就执行完毕。 二. 系统流程图 加法 减法 乘法 除法 求幂 求x次方根 寄存器清零 开方 正弦 余弦 对数 输入第二个操作数 显示结果 结束 开始 输入第一个操作数 选择一种计算方法 图3-1 系统流程图 4 设计特点及关键算法 此次的高级计算器设计利用了windows窗体程序的多
7、样性和程序实现的实用性,巧妙地展现了c++程序语言的面向对象性,程序简洁但却功能齐全。 关键算法为实现加减乘除等算法以及各种正弦余弦函数和科学计数法等,最主要是本计算器可以以角度和弧度两种度量方法进行计算。 5 程序结果及测试分析 经测试标准型计算器,进行简单的四则运算,结果均正确,如图5-1所示。 图5-1 四则运算测试结果图 测试科学型计算器,进行sin,cos,tan,log,ln,等运算,结果均正确,求sin90`(如图5-2所示)。 图5-2 求sin90测试结果图 6 设计总结 通过几个星期的准备,总算把程序
8、设计给完成了。 刚开始,可以说是完全没有头绪,于是上网查,觉得计算器这个题目不错。找到了些与我选定的题目相关的资料,再对照书本进行编写,测试,最后得到我这次课程设计所需要的代码. 通过科学计算器的设计这一课题的设计和实现,我对简单的C++语言编程有了进一步的认识,对windows窗体应用程序更加熟练了,也对Microsoft Visual C++ 2008这个软件的操作更加熟练了一些。 回顾此次的课题设计,我学到了很多东西不仅巩固了书本的知识并且与实践相结合提高具体操作能力,在设计的过程中发现自己的不足,有些知识掌握的不够牢靠,通过这次的课题设计之后我把前面所学的知识又重新温故了一遍。
9、 同时,在老师和同学身上我学到了很多非常实用的知识,在此对给过我帮助的同学和老师表示由衷的感谢! 附 录 源程序清单 #include "stdafx.h" #include "Calculator.h" #include "CalculatorDlg.h" #include "ExpressionSolver.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAbout
10、Dlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::
11、DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CCalculatorDlg 对话框 CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) , m_IsScientific(0) , m_IsRad
12、FALSE) , m_nIndex(-2) { m_Font.CreatePointFont(15,_T("微软雅黑")); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); for (UINT i = 0; i<= 19; i++) m_PreviousExpression[i] = _T(""); } void CCalculatorDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(p
13、DX, IDC_EDIT1, EditBox1); DDX_Radio(pDX, IDC_RADIO1, m_IsRad); } BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_SQRT, &CCalculatorDlg::OnBnClickedSqrt) ON_BN_CLICKED(IDC_EQUAL, &CCalculatorDlg::OnBnClickedEqual) O
14、N_BN_CLICKED(IDC_ADDE, &CCalculatorDlg::OnBnClickedAdde) ON_BN_CLICKED(IDC_ADDPI, &CCalculatorDlg::OnBnClickedAddpi) ON_BN_CLICKED(IDC_ARCSIN, &CCalculatorDlg::OnBnClickedArcsin) ON_BN_CLICKED(IDC_ARCCOS, &CCalculatorDlg::OnBnClickedArccos) ON_BN_CLICKED(IDC_ARCTAN, &CCalculatorDlg::OnBnClic
15、kedArctan) ON_BN_CLICKED(IDC_SIN, &CCalculatorDlg::OnBnClickedSin) ON_BN_CLICKED(IDC_COS, &CCalculatorDlg::OnBnClickedCos) ON_BN_CLICKED(IDC_LOG, &CCalculatorDlg::OnBnClickedLog) ON_BN_CLICKED(IDC_LN, &CCalculatorDlg::OnBnClickedLn) ON_BN_CLICKED(IDC_MULTISQRT, &CCalculatorDlg::OnBnClicked
16、Multisqrt) ON_BN_CLICKED(IDC_TAN, &CCalculatorDlg::OnBnClickedTan) ON_BN_CLICKED(IDC_EF, &CCalculatorDlg::OnBnClickedEf) ON_BN_CLICKED(IDC_LEFTBRACKET, &CCalculatorDlg::OnBnClickedLeftbracket) ON_BN_CLICKED(IDC_RIGHTBRACKET, &CCalculatorDlg::OnBnClickedRightbracket) ON_BN_CLICKED(IDC_7, &C
17、CalculatorDlg::OnBnClicked7) ON_BN_CLICKED(IDC_8, &CCalculatorDlg::OnBnClicked8) ON_BN_CLICKED(IDC_9, &CCalculatorDlg::OnBnClicked9) ON_BN_CLICKED(IDC_4, &CCalculatorDlg::OnBnClicked4) ON_BN_CLICKED(IDC_5, &CCalculatorDlg::OnBnClicked5) ON_BN_CLICKED(IDC_6, &CCalculatorDlg::OnBnClicked6)
18、 ON_BN_CLICKED(IDC_1, &CCalculatorDlg::OnBnClicked1) ON_BN_CLICKED(IDC_2, &CCalculatorDlg::OnBnClicked2) ON_BN_CLICKED(IDC_3, &CCalculatorDlg::OnBnClicked3) ON_BN_CLICKED(IDC_0, &CCalculatorDlg::OnBnClicked0) ON_BN_CLICKED(IDC_DOT, &CCalculatorDlg::OnBnClickedDot) ON_BN_CLICKED(IDC_TENPOW,
19、 &CCalculatorDlg::OnBnClickedTenpow) ON_BN_CLICKED(IDC_DIVISION, &CCalculatorDlg::OnBnClickedDivision) ON_BN_CLICKED(IDC_MUTIPLY, &CCalculatorDlg::OnBnClickedMutiply) ON_BN_CLICKED(IDC_MINUS, &CCalculatorDlg::OnBnClickedMinus) ON_BN_CLICKED(IDC_ADD, &CCalculatorDlg::OnBnClickedAdd) ON_BN_C
20、LICKED(IDC_POW, &CCalculatorDlg::OnBnClickedPow) ON_BN_CLICKED(IDC_CLEAR, &CCalculatorDlg::OnBnClickedClear) ON_BN_CLICKED(IDC_BACKSPACE, &CCalculatorDlg::OnBnClickedBackspace) ON_BN_CLICKED(IDC_UP, &CCalculatorDlg::OnBnClickedUp) ON_BN_CLICKED(IDC_RADIO1, &CCalculatorDlg::OnBnClickedRadio1)
21、 ON_BN_CLICKED(IDC_RADIO2, &CCalculatorDlg::OnBnClickedRadio2) ON_BN_CLICKED(IDC_CLEARALL, &CCalculatorDlg::OnBnClickedClearall) ON_BN_CLICKED(IDC_DOWN, &CCalculatorDlg::OnBnClickedDown) END_MESSAGE_MAP() // CCalculatorDlg 消息处理程序 BOOL CCalculatorDlg::OnInitDialog() { CDialog::OnIni
22、tDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu
23、LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_
24、hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回TRUE } void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam)
25、
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的MFC 应用程序,
// 这将由框架自动完成。
void CCalculatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast
26、 = 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; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //
27、当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCalculatorDlg::OnQueryDragIcon()
{
return static_cast
28、 { // TODO: 在此添加控件通知处理程序代码 m_IsScientific = 0; // 按下“=”,默认不用科学计数法 CString str_in; UpdateData(TRUE); EditBox1.GetWindowText(str_in); m_nIndex = -1; for( int i = 19; i >= 1; i-- ) m_PreviousExpression[i] = m_PreviousExpression[ i - 1 ]; m_PreviousExpression[0] = str_in; // 将当前输入
29、的表达式存入m_PreviousExpression[0] CExpressionSolver ex( str_in, m_IsRad ); int nValid = ex.solve(); if ( nValid != 0) { MessageBox(ex.GetErrorTips()); } else { CString sResult; double dResult = ex.GetResult(); if ( fabs(dResult) < 1e-16) // 若结果绝对值小于e-16,令其为 dResult =
30、 0; sResult.Format( _T("%.16g"), dResult ); EditBox1.SetWindowText(sResult); UpdateData(FALSE); } } // 向文本框添加指定文字 void CCalculatorDlg::AddToEditBox(CString szText) { CString str_in; UpdateData(TRUE); EditBox1.GetWindowText(str_in); str_in.Append( szText ); EditBox1.SetWind
31、owText(str_in); UpdateData(FALSE); } void CCalculatorDlg::OnBnClickedSqrt() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("√"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedAdde() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("e"); AddToEditBox(str); } void CCalculato
32、rDlg::OnBnClickedAddpi() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("π"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedArcsin() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("arcsin"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedArccos() { // TODO: 在此添加控件通知处理程序
33、代码 CString str = _T("arccos"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedArctan() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("arctan"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedSin() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("sin"); AddToEditBox(str)
34、 } void CCalculatorDlg::OnBnClickedCos() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("cos"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedLog() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("log"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedLn() { // TODO:
35、 在此添加控件通知处理程序代码 CString str = _T("ln"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedMultisqrt() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("x√"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedTan() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("tan"); AddToEdit
36、Box(str); } void CCalculatorDlg::OnBnClickedEf() { // TODO: 在此添加控件通知处理程序代码 if ( m_nIndex != -1 ) // 如果之前没有按过等号,则不执行 return; m_IsScientific = ~m_IsScientific; CString str_in; UpdateData(TRUE); EditBox1.GetWindowText(str_in); CExpressionSolver ex( str_in, m_IsRad ); int nVali
37、d = ex.solve(); if ( nValid != 0) { MessageBox(ex.GetErrorTips()); } else { CString sResult; double dResult = ex.GetResult(); if (fabs(dResult) < 1e-16) // 若结果绝对值小于e-16,令其为 dResult = 0; if (m_IsScientific) sResult.Format( _T("%.15e"), dResult ); else sResu
38、lt.Format( _T("%.16g"), dResult ); EditBox1.SetWindowText(sResult); UpdateData(FALSE); } } void CCalculatorDlg::OnBnClickedLeftbracket() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("("); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedRightbracket() { // TODO: 在此添加控件通
39、知处理程序代码 CString str = _T(")"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked7() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("7"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked8() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("8"); AddToEditBox(str); } void C
40、CalculatorDlg::OnBnClicked9() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("9"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked4() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("4"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked5() { // TODO: 在此添加控件通知处理程序代码 CStri
41、ng str = _T("5"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked6() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("6"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked1() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("1"); AddToEditBox(str); } void CCalculatorDlg::
42、OnBnClicked2() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("2"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked3() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("3"); AddToEditBox(str); } void CCalculatorDlg::OnBnClicked0() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("0"
43、); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedDot() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("."); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedTenpow() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("* 10^"); AddToEditBox(str); } void CCalculatorDlg::OnBn
44、ClickedDivision() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("/"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedMutiply() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("*"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedMinus() { // TODO: 在此添加控件通知处理程序代码 CString
45、 str = _T("-"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedAdd() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("+"); AddToEditBox(str); } void CCalculatorDlg::OnBnClickedPow() { // TODO: 在此添加控件通知处理程序代码 CString str = _T("^"); AddToEditBox(str); } void CCalculatorDlg
46、OnBnClickedClear() { // TODO: 在此添加控件通知处理程序代码 CString str; str.Format(_T("0")); EditBox1.SetWindowText(str); UpdateData(FALSE); } void CCalculatorDlg::OnBnClickedBackspace() { // TODO: 在此添加控件通知处理程序代码 CString str; UpdateData(TRUE); EditBox1.GetWindowText(str); str.Delete( s
47、tr.GetLength()-1, 1 ); EditBox1.SetWindowText(str); UpdateData(FALSE); } void CCalculatorDlg::OnBnClickedRadio1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); } void CCalculatorDlg::OnBnClickedRadio2() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); } void CCalculatorDlg::OnBnCl
48、ickedUp() { // TODO: 在此添加控件通知处理程序代码 m_nIndex++; if ( m_nIndex == -1) { m_nIndex--; return; } if ( m_nIndex > 19) m_nIndex = 19; if ( m_PreviousExpression[m_nIndex].GetLength() == 0 ) m_nIndex--; EditBox1.SetWindowText(m_PreviousExpression[m_nIndex]); UpdateData(FALSE);
49、 } void CCalculatorDlg::OnBnClickedClearall() { // TODO: 在此添加控件通知处理程序代码 CString str; // 清空显示 str.Format(_T("")); EditBox1.SetWindowText(str); UpdateData(FALSE); m_nIndex = -2; // 初始化各个值 m_IsScientific = 0; for (UINT i = 0; i<= 19; i++) m_PreviousExpression[i] = _T(""); } void CCalculatorDlg::OnBnClickedDown() { // TODO: 在此添加控件通知处理程序代码 m_nIndex--; if ( m_nIndex < 0) { m_nIndex++; return; } EditBox1.SetWindowText(m_PreviousExpression[m_nIndex]); UpdateData(FALSE); } 15






