计算机科学与技术学部
C++课程设计
题 目科学计算器
学 部计算机科学与技术
班 级计科1103
指 导 教 师李军
姓 名刘明
学 号11430421817667
20##年6月27日
摘 要
计算器的产生和发展是建立在电子计算机基础之上的。硬件方面,自1946年第一台电子计算机诞生以来,计算机技术的发展可谓日新月异,从庞大的只能在实验室里供研究使用的计算机到如今能适应不同环境满足不同需求的各种各样的计算机;运算速度从每秒几千次到每秒几百亿次;处理器从焊有上百万个电子管的大的惊人的电子板到只有指甲大小的集成电路;现在计算机在硬件方面的发展已达到了每三个月更新换代一次的惊人速度。软件方面,也已从机器语言、汇编语言、高级语言发展到现如今的第四代语言——非结构化、面向对象、可视化的语言。
在这个计算器里面,我们实现了简单的四则运算以及更高功能的科学计算,它的外观简洁美观,使人们能快捷简单的操作。能准确的得到计算结果,大大减少了数字计算所需要的时间,为人们的生活带来便利。此系统在Windows 7环境下,使用VC++ 6.0进行编写。
简单计算器包括双目运算和单目运算功能,双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,阶乘,倒数,进制转换等运算。可对其输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。并且包含清除,退格功能等。我们所做的计算器其功能较Windows 7下的计算器还是很不够多,没有其菜单的实现功能项,没有其小巧的标准计算器。
关键词: 计算器;运算;VC++等
课程设计任务分配表:
表1 分配信息表
课程设计成绩表:
表2 成绩表
采用的类的数据类型:
class CCalculatorDlg : public CDialog
{
public:
void clean_aliter();
CString OLD_ANSWER;
void out_change(int system);
CCalculatorDlg(CWnd* pParent = NULL); // standard constructor
int Sel,EndSel; //定义输入或插入时光标的位置
int Expr_pos; //词法分析表达式时,标记当前字符位置
int OS_pos ; //操作数栈顶位置
int old_pos; //历史表达式的位置
int old_head; //历史表达式数组中最最前位置
int old_back; //历史表达式数组中最最后位置
int error_mark; //标记表达式错误
int parentheses_count; //记录表达式中括号的个数
double operand_Stack[200]; //操作数栈
CString old_expression[20]; //表达式历史记录
void getword(WordType & w_type ,Operator& Fun_Ope,int system); //词法分析函数
int getword16(); int getword10(); int getword8(); int getword2();
//将用字符表示的N(2,8,10,16)进制转为浮点型
void E_AddSub(); //加减 void T_MulDiv(); //乘除
void F_Power(); //乘方 void L_Function(); //函数
void H_Digit(); //数字 void Factorial(); //阶乘
void P_expression(); //括号 void compute(Operator Op); //计算
void error(int ); //错误标记函数 void clean_all(); //清空表达式和计算结果
protected:
HICON m_hIcon;
DECLARE_MESSAGE_MAP()
};
程序中所用到相关专业知识:
类,对象数组,友元函数,继承与派生,指针, 枚举,,数栈,算法
目 录
前 言. 1
第一章 系统需求. 2
1.1 简介说明. 2
1.1.1 系统要求. 2
1.1.2 具体任务. 2
1.1.3 研究目的. 2
1.2 设计分析. 3
1.2.1 可行性分析. 3
1.2.2 需求分析. 3
1.2.3设计结构. 3
1.3 开发环境. 3
1.3.1 运行环境. 3
1.3.2 开发工具. 3
1.3.3 关于Visual C++ 6.0 4
第二章 系统设计. 5
2.1功能说明. 5
2.1.1 系统总体功能分析. 5
2.1.2 系统功能. 5
2.1.3课程设计内容. 6
2.2设计大概. 6
2.2.1设计思路. 6
2.2.2控件定义. 7
2.2.3 变量的定义以及初始化. 8
第三章 系统实现. 9
3.1窗体设计. 9
3.1.1设计步骤. 9
3.1.2控件定义. 9
3.1.3一部分操作截图. 10
3.2 程序核心代码. 11
3.2.1数字键和字母键核心代码. 11
3.2.2计算类型函数的核心代码. 11
3.2.3 提示错误的核心代码. 13
3.2.4进制转换的核心代码. 14
3.2.5八进制单选按钮消息响应函数代码. 16
3.2.6二进制单选按钮消息响应函数. 17
第四章 系统运行. 20
4.1测试以及运行界面. 20
4.1.1 程序主界面测试. 20
4.1.2运行的计算结果. 20
4.1.3转换进制计算. 21
4.2 测试. 22
4.2.1测试研究与选择. 22
4.2.2测试环境. 22
总 结. 23
参考文献. 24
前 言
Visual C++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。为了方便计算,我们编写了计算器。
本报告在李军老师的指导下,并且形成了比较完善的体系,本设计报告具体包含以下内容:第一章直接介绍了基于C++语言,熟悉Visual 6.0的开发环境和C++控制台方式的调试和运行,使学生熟悉Visual C++ 6.0更自然。以及我们编程的背景与意义及目的,主要介绍我们编写这个程序用来做什么。第二章介绍了我们编程的怎么去做,设计时的一些想法。第三章介绍了我们编程实用的一些技术与核心代码,设计时的具体做法。第四章介绍我们运行时的一些具体操作,以及我们给出的总结与参考文献。
本程序编写一个程序来实现算术计算器。通过数组和指针以及枚举来存放输入的每一数字或运算符号函数的记录(包括1、2、3等数字,+、--、*、等运算符号)中。通过一些单击按钮实现一些标准与科学的操作混合运算,然后显示出结果。
本报告由刘明、凡力强、舒照月编写,由李军老师对全报告进行修改,以及很多同学以及网络朋友提供帮助,在此表示感谢。
由于水平有限,不当之处在所难免,恳请读者批评指正。
编 者
2012.6
第一章 系统需求
1.1 简介说明
1.1.1 系统要求
1、用C++语言实现程序设计;
2、利用MFC进行相关信息处理;
3、画出总模块的流程图;
4、系统的各个功能模块要求用函数的形式实现;
5、界面友好(良好的人机互交),程序要有注释;
1.1.2 具体任务
1、定义以及初始化,输入0~9,A~F,运算符等信息;
2、输入简单的运算符计算式,并显示出计算结果;
3、画出总流程图;
4、编写代码;
5、程序分析与调试;
1.1.3 研究目的
1、熟悉掌握基于对话框的程序编写;
2、熟练掌握放置控件及control 工具条的使用;
3、掌握控件摆放的基本方法,熟练掌握Dialog 的使用;
4、熟悉建立对话框步骤;
5、了解CBUTTON类的实用;
6、巩固并加深学生对C++语言程序设计知识的理解;
7、培养学生面向对象的程序设计思想,与其认识面向过程和对象的区别;
8、进一步掌握和应用VC++ 6.0集成开发环境;
9、提高运用C++语言解决实际问题的能力;
10、初步掌握开发小型实用软件的基本方法,能独立设计、实践操作;
11、掌握书写程序设计开发文档的能力(书写课程设计实验报告);
1.2 设计分析
1.2.1 可行性分析
伴随着经济全球化,计算机的普及发展,软件行业在社会占着举足轻重的作用。我们在学校生活中常会遇到一些繁杂的数值运算,我们必须要用到科学计算器,所以便着手开发了这个计算器程序,既紧随科技发展的前沿,又方便了我们的生活,具有一定的现实意义。
1.2.2 需求分析
本软件主要用于计算机Windows XP以上的用户使用,这次课程设计一般是实现简单计算器的功能。需要程序实现:加减乘除,开方,平方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算,二、八、十、十六进制的转换等。
1.2.3设计结构
第一章主要介绍了我们做这个课程设计目地是做什么。
第二章主要介绍了我们怎么去设计这个课程报告以及编程。
第三章主要介绍了我们实现代码的关键性技术与源码段的介绍。
第四章主要介绍了我们做这个程序的运行结果与一些运算的截图。
1.3 开发环境
1.3.1 运行环境
(1) Windows 7 64位/XP 32位系统
(2) Visual C++ 6.0(中文版)编译环境
1.3.2 开发工具
C++语言
1.3.3 关于Visual C++ 6.0
Visual C++ 6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以利用该开发环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。Visual C++6.0不仅包括编辑器,还包括许多有用组件,通过这些组件的协同工作,可以在Visual C++6.0集成环境中轻松地完成创建源文件、编辑资源以及对程序的编译、连接和调试等各项工作。VC++6.0是Windows 95/98、XP或Windows NT下的一个应用程序,本身对软件没有特殊要求。就是说它对环境的要求与Windows 95/98、Windows NT的要求是一致的。VC++6.0系统可以在一张CD盘上,也可以在“Visual Studio (Visual C++、Visual Foxpro)”等产品的第一张CD盘上。一般都有一个VC的自动安装程序,也可以执行VC++6.0目录下的Setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。
在安装好VC6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行Setup.exe安装程序,安装程序会检测当前系统安装VC6.0的组件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要与一般的应用软件一样,有以下两种启动方式:
(1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual C++6.0中文版”子菜单中的“Microsoft Visual C++6.0中文版”程序。
(2)用户也可以使用命令行启动VC,单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入C:\program Files\Microsoft Visual Studio\VC98\VC6.exe(按默认盘符和路径安装即可)。
第二章 系统设计
2.1功能说明
2.1.1 系统总体功能分析
此程序采用VC++编写,是一个基于对话框的应用程序,当用户在对话框点击相应按钮时,先执行输出按钮对应字符串,用户可以在对话框上选择相应地科学计算操作按钮,通过程序内相关代码完成相应地科学计算功能。
它的设计按软件工程的方法进行,系统具有良好的界面,必要的交互信息,简约的美观效果。使用人员能快捷简单地进行操作,即可单机按钮进行操作,也可直接通过键盘输入。即时准确地获取所需要的计算结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定帮助。
其具体的功能有:
(1)运算更加简介。
(2)两个对话框,一个显示输入数据,另一个显示计算结果。
(3)实现计算求和,求平均的功能。
(4)计算功能基本上是用系统内部函数。
(5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点以0开头等不正常现象。(6)“CE”按钮可以清除所有已输出的数据从头计算。
我们在学习生活中,常会遇到一些繁杂的数值运算,这时候我们就必须用到科学计算器,所以便着手开发了这个计算器程序,以便用于自己的学习工作。要计算功能有以下几个方面:加法,减法,乘法,除法,求幂,求模,求和,求平均,求平方根,求三角函数,进制换算等。
2.1.2 系统功能
1、十进制数的加、减、乘、除、乘方、取模等简单计算。
2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运算。
3、以角度、弧度两种方式实现上述部分函数,梯度没有提供。
4、不同进制有不同的运算方式。
5、判断输入输出的正确性。
2.1.3课程设计内容
课题名称:计算器的实现
基本说明:我们实现了一个标准计算器的运算以及科学计算器的运算的集成,使其较之:方便、快捷、轻松,看上去美观大方,少了切换的繁琐操作,并且我们做的更加简约。
2.2设计大概
2.2.1设计思路
所编写的计算器是基于对话框的程序,能够进行加减乘除的运算,开方,立方,三角函数,反三角函数,阶乘,求和,求平均,进制转换运算等功能,仿照Windows 自带的计算器进行编写,如图2.2.1;
2.2.2控件定义
如表2.2.2(只列举一部分控件)
2.2.3 变量的定义以及初始化
int Sel,EndSel; //定义输入或插入时光标的位置
int Expr_pos; //词法分析表达式时,标记当前字符位置
int OS_pos ; //操作数栈顶位置
int old_pos; //历史表达式的位置
int old_head; //历史表达式数组中最最前位置
int old_back; //历史表达式数组中最最后位置
int error_mark; //标记表达式错误
int parentheses_count; //记录表达式中括号的个数
double operand_Stack[200]; //操作数栈
CString old_expression[20]; //表达式历史记录
//以上为定义部分,以下为初始化部分
Sel=0; //输入的光标位置
EndSel=0; //插入光标的位置
Expr_pos = 0; //当前字符的位置
OS_pos = 0 ; //操作数栈顶位置
old_pos=old_head=old_back=0;//历史表达式的位置
error_mark=0; //表达式错误
parentheses_count=0; //括号的个数
OLD_ANSWER = _T(""); //初始化
第三章 系统实现
3.1窗体设计
3.1.1设计步骤
利用MFC AppWinzard生成计算器应用程序框架具体步骤如下:
(1)执行VC++ 6.0程序,选择文件——新建命令,转到工程选项卡,选择MFC AppWizard(exe)选项,然后在工程名称输入名字,一般以C开头,也可以自定义,位置路径自定义。
(2)单击确定,弹出MFC 应用程序向导-步骤1对话框。选中单选按钮基本对话框,单击完成即可,如图所示:
3.1.2控件定义
(1)为控件添加成员变量已经在系统设计里面列举出,这里就不再重复;
(2)为控件添加消息,查看-类向导命令,转到Message Maps选项卡,为控件添加BN_CLICKED消息,单击确定即可,具体哪些控件这里就不再详细介绍了。
3.1.3一部分操作截图
图3.1.3相关实现的截图
图.3.1.2添加消息的截图
3.2 程序核心代码
3.2.1数字键和字母键核心代码
void CCalculatorDlg::OnNumberKey(UINT nID) //按键输入
{
m_Edit.GetSel(Sel,EndSel); //得到输入框的光标位置
switch(nID)
{// 在光标位置插入按钮表示的字符, 在输入框插入相应的数值
case IDC_0:{ m_expression.Insert(Sel,"0");break;}
case IDC_1:{ m_expression.Insert(Sel,"1");break;}
case IDC_2:{ m_expression.Insert(Sel,"2");break;}
case IDC_3:{ m_expression.Insert(Sel,"3");break;}
case IDC_4:{ m_expression.Insert(Sel,"4");break;}
case IDC_5:{ m_expression.Insert(Sel,"5");break;}
case IDC_6:{ m_expression.Insert(Sel,"6");break;}
case IDC_7:{ m_expression.Insert(Sel,"7");break;}
case IDC_8:{ m_expression.Insert(Sel,"8");break;}
case IDC_9:{ m_expression.Insert(Sel,"9");break;}
case IDC_A:{ m_expression.Insert(Sel,"A");break;}
case IDC_B:{ m_expression.Insert(Sel,"B");break;}
case IDC_C:{ m_expression.Insert(Sel,"C");break;}
case IDC_D:{ m_expression.Insert(Sel,"D");break;}
case IDC_E:{ m_expression.Insert(Sel,"E");break;}
case IDC_F:{ m_expression.Insert(Sel,"F");break;}
}
Sel++; //光标后移
UpdateData(FALSE);
m_Edit.SetSel(Sel,Sel); //更新输入框光标后移位置
UpdateData(FALSE);
}
3.2.2计算类型函数的核心代码
void CCalculatorDlg::compute(Operator Op)
{ //根据操作计算类型,计算结果
switch(Op)
{
case OpAdd:
{ operand_Stack[OS_pos-2]+=operand_Stack[OS_pos-1];OS_pos--;break;}
case OpSubtract:
{ operand_Stack[OS_pos-2]-=operand_Stack[OS_pos-1];OS_pos--;break;}
case OpMultiply:
{ operand_Stack[OS_pos-2]*=operand_Stack[OS_pos-1];OS_pos--;break;}
case OpDivide:
{ if(operand_Stack[OS_pos-1]==0) {error(5); break;}
else
{operand_Stack[OS_pos-2]/=operand_Stack[OS_pos-1];
OS_pos--; break;
}}
case OpMod:
{ if(operand_Stack[OS_pos-1]==0) {error(5); break;}
else
{ __int64 temp=0;
temp = (__int64)(operand_Stack[OS_pos-2]/operand_Stack[OS_pos-1]);
operand_Stack[OS_pos-1]*=temp;
operand_Stack[OS_pos-2]-=operand_Stack[OS_pos-1];
OS_pos--; break;} }
case OpPower:
{ operand_Stack[OS_pos-2] = pow(operand_Stack[OS_pos-2],operand_Stack[OS_pos-1]);
OS_pos--;break;}
case OpLog:
{ operand_Stack[OS_pos-1]=log10(operand_Stack[OS_pos-1]);break;}
case OpLn:
{ operand_Stack[OS_pos-1]=log(operand_Stack[OS_pos-1]);break;}
case OpSqrt:
{ operand_Stack[OS_pos-1]=sqrt(operand_Stack[OS_pos-1]);break;}
case OpExp:
{ operand_Stack[OS_pos-1] = exp(operand_Stack[OS_pos-1]);
break;}
case OpSin:
{ if(m_Radio2 ==0) operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180;
operand_Stack[OS_pos-1] = sin(operand_Stack[OS_pos-1]);
break;}
case OpCos:
{ if(m_Radio2 ==0) operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180;
operand_Stack[OS_pos-1] = cos(operand_Stack[OS_pos-1]);
break;}
case OpTan:
{ if(m_Radio2 ==0) operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180; operand_Stack[OS_pos-1] = tan(operand_Stack[OS_pos-1]); break;}
case OpAsin:
{ if(operand_Stack[OS_pos-1]>1||operand_Stack[OS_pos-1]<-1)
{ error(9); return ;}
operand_Stack[OS_pos-1] = asin(operand_Stack[OS_pos-1]);
if(m_Radio2 ==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break;}
case OpAcos:
{ if(operand_Stack[OS_pos-1]>1||operand_Stack[OS_pos-1]<-1)
{ error(9); return ;}
operand_Stack[OS_pos-1] = acos(operand_Stack[OS_pos-1]);
if(m_Radio2 ==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break; }
case OpAtan:
{ operand_Stack[OS_pos-1] = atan(operand_Stack[OS_pos-1]);
if(m_Radio2 ==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break; }
case OpFactorial:
{ if(OS_pos<=0) { error(1); return ;}
long k;
k =(long) operand_Stack[OS_pos-1];
if(k < operand_Stack[OS_pos-1])
{ error(8); return ;}
__int64 temp =1;
for(long i=1; i<=k ;i++)
{ temp *= i; //operand_Stack[OS_pos-1] *=i; }
/* m_result.Format(_T("%I64X"),temp);
UpdateData(FALSE);
MessageBox("sdfsd");*/
operand_Stack[OS_pos-1]=(double)temp;
break;
}
}
3.2.3 提示错误的核心代码
void CCalculatorDlg::error(int error_type) //错误类型
{ //错误处理
switch(error_type)
{
case 1: {m_result="错误:缺少操作数!";break;}
case 2: {m_result="错误:括号不匹配!";break;}
case 3: {m_result="错误:函数名不正确!!";break;}
case 4: {m_result="错误:非法输入!!";break;}
case 5: {m_result="错误:出现除数为零!!";break;}
case 6: {m_result="错误:函数缺少括号!!";break;}
case 7: {m_result="错误:缺少运算符!!";break;}
case 8: {m_result="错误:阶乘操作数不是整数!!";break;}
case 9: {m_result="asin和acos函数计算必须在[-1,1]内!!";break;}
}
error_mark=1; }
3.2.4进制转换的核心代码
void CCalculatorDlg::getword(WordType & w_type ,Operator& Fun_Ope,int system) //进制转为浮点型
{// 词法分析器, 参数w_type ,Fun_Ope,system分别表示 单词类型,操作运算类型,进制类型
int t=m_expression.GetLength();
if(t<=0) {error(4); return ;} //表达式为空则返回
if(Expr_pos
{//当前字符为数字则 转换为浮点数压入操作数栈
if((Expr_pos+1)
{//根据传来的进制类型,把字符串表示的数字转换为浮点数
case 0: { if(!getword16()) {error(4); return ;} break;}
case 1: { if(!getword10()) {error(4); return ;} break;}
case 2: { if(!getword8()) {error(4); return ;} break;}
case 3: { if(!getword2()) {error(4); return ; }break;}
default: {error(4); return ;}
}
w_type = Tynum; //单词类型为数字
return;
}
if(m_expression[Expr_pos]>='a'&& m_expression[Expr_pos]<='z')
{/*当前字符为字母则 ,把字母串保存到str中 */
char str[100]="";
int i=0;
while(Expr_pos
{ str[i]=m_expression[Expr_pos];
i++;
Expr_pos++; }
if(Expr_pos>=t) {error(3); w_type = TyFun; return ;}
//表达式结束,则报错
/*
*** 以下if else 语句为匹配字符串***
*/
if(strcmp(str,"ln")==0){Fun_Ope=OpLn;}
else if(strcmp(str,"log")==0){Fun_Ope=OpLog;}
else if(strcmp(str,"sqrt")==0){Fun_Ope=OpSqrt;}
else if(strcmp(str,"exp")==0){Fun_Ope=OpExp;}
else if(strcmp(str,"sin")==0){Fun_Ope=OpSin;}
else if(strcmp(str,"cos")==0){Fun_Ope=OpCos;}
else if(strcmp(str,"tan")==0){Fun_Ope=OpTan;}
else if(strcmp(str,"asin")==0){Fun_Ope=OpAsin;}
else if(strcmp(str,"acos")==0){Fun_Ope=OpAcos;}
else if(strcmp(str,"atan")==0){Fun_Ope=OpAtan;}
//else if(m_expression[Expr_pos]=='('){w_type = TyFun;}
else {error(3);w_type = TyFun; return ;}
//匹配不到函数单词,报错
w_type = TyFun; return ;
}
switch(m_expression[Expr_pos])
{/* 当前字符为操作运算符,则设置单词类型,和操作运算 */
case '+': { Fun_Ope=OpAdd; Expr_pos++; w_type=oper; break;}
case '-': { Fun_Ope=OpSubtract; Expr_pos++;w_type=oper;break;}
case '*': { Fun_Ope=OpMultiply; Expr_pos++;w_type=oper; break;}
case '/': { Fun_Ope=OpDivide; Expr_pos++; w_type=oper;break;}
case '^': { Fun_Ope=OpPower; Expr_pos++; w_type=oper;break;}
case '(': { Fun_Ope=Left_par; Expr_pos++; w_type=oper;break;}
case ')': { Fun_Ope=Right_par; Expr_pos++; w_type=oper;break;}
case '%': { Fun_Ope=OpMod; Expr_pos++; w_type=oper;break;}
default: {error(4); return ;}//其他字符都为非法字符,报错
} }
else if(Expr_pos==t)w_type=TyEnd; //表达式已结束,返回
else {error(4); return ;}
}
3.2.5八进制单选按钮消息响应函数代码
void CCalculatorDlg::OnOctal() //八进制单选按钮消息响应函数
{
// TODO: Add your control notification handler code here
WordType type ;
Operator Ope;
CString result;
int system;
system = m_Radio1;
m_Radio1 = 2 ;
if(OLD_ANSWER.GetLength()>0) m_expression = OLD_ANSWER;
UpdateData(FALSE);
getword(type,Ope,system);
if(type==Tynum&&(!error_mark)&&(Expr_pos==m_expression.GetLength()))
{
out_change(m_Radio1);
result = m_result;
clean_all();
m_expression = m_result = result;
UpdateData(FALSE)
Sel = m_expression.GetLength();
m_Edit.SetSel(Sel,Sel);
UpdateData(FALSE);
}
else
{
Expr_pos = 0;
OS_pos = 0 ;
error_mark=0;
parentheses_count=0;
m_result = _T("");
}
m_2.EnableWindow(TRUE);
m_3.EnableWindow(TRUE);
m_4.EnableWindow(TRUE);
m_5.EnableWindow(TRUE);
m_6.EnableWindow(TRUE);
m_7.EnableWindow(TRUE);
m_8.EnableWindow(FALSE);
m_9.EnableWindow(FALSE);
m_A.EnableWindow(FALSE);
m_B.EnableWindow(FALSE);
m_C.EnableWindow(FALSE);
m_D.EnableWindow(FALSE);
m_E.EnableWindow(FALSE);
m_F.EnableWindow(FALSE);
m_PI.EnableWindow(FALSE);
}
3.2.6二进制单选按钮消息响应函数
void CCalculatorDlg::OnBinary() //二进制单选按钮消息响应函数
{
// TODO: Add your control notification handler code here
//E_AddSub();
WordType type ;
Operator Ope;
CString result;
int system;
system = m_Radio1;
m_Radio1 = 3 ;
if(OLD_ANSWER.GetLength()>0) m_expression = OLD_ANSWER;
UpdateData(FALSE);
getword(type,Ope,system);
if(type==Tynum&&(!error_mark)&&(Expr_pos==m_expression.GetLength()))
{
out_change(m_Radio1);
result = m_result;
clean_all();
m_expression = m_result = result;
UpdateData(FALSE);
Sel = m_expression.GetLength();
m_Edit.SetSel(Sel,Sel);
UpdateData(FALSE);
}
else
{
Expr_pos = 0;
OS_pos = 0 ;
error_mark=0;
parentheses_count=0;
m_result = _T("");
}
m_2.EnableWindow(FALSE);
m_3.EnableWindow(FALSE);
m_4.EnableWindow(FALSE);
m_5.EnableWindow(FALSE);
m_6.EnableWindow(FALSE);
m_7.EnableWindow(FALSE);
m_8.EnableWindow(FALSE);
m_9.EnableWindow(FALSE);
m_A.EnableWindow(FALSE);
m_B.EnableWindow(FALSE);
m_C.EnableWindow(FALSE);
m_D.EnableWindow(FALSE);
m_E.EnableWindow(FALSE);
m_F.EnableWindow(FALSE);
m_PI.EnableWindow(FALSE);
}
第四章 系统运行
4.1测试以及运行界面
4.1.1 程序主界面测试
4.1.2运行的计算结果
4.1.3转换进制计算
4.2 测试
4.2.1测试研究与选择
测试过程中要判断是否成功,要分析程序界面的变化和计算数据的结果是否正确以及各功能键是否能正常实用。(梯度不能实用)
4.2.2测试环境
测试系统:Windows 7 64位
测试工具:Visual Studio C++ 6.0(中文版)
总 结
经过多番测试,得出结论为设计的计算器能够完成功能描述内容中的全部功能。经过几个星期的VC++课程设计,我们顺利完成该课程设计,并收获良多。我们大体总结了以下几点:
基本功要过硬,不能马虎经常犯的小错误。提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。
要善于查找资料,提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么,这些问题这要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自己的头脑来完成它了。
要善于思考,程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足,并使其更加人性化。
这次课程设计让我们学到了很多,不仅巩固了MFC程序设计知识,而且也培养了我们的动手能力,令我们的创造性思维得到拓展。期待今后有更多类似的锻炼机会。
通过这次课程设计,可以明显的感觉到它弥补了课程教学的和实验中知识的深度和广度方面的不足,也让我们进一步掌握了面向对象程序设计的基本方法和编程技巧,同时也巩固所学理论知识,似然花费了不止一点点的时间和精力,不过那确实挺值得的,既让我们认识到自己知识方面的缺陷,又培养了我独立分析问题、解决问题的能力。
课程设计是需要大量时间去动手练习才能体验到它的内涵的,同时还需要用心地投入,时间和情感花下去之后,的确感受到有所收获,增加了对编程的兴趣。通过这次课程设计,掌握了对话框的相关操作,也体会到书写代码一定要仔细,有时候一小点拼写错误会浪费很多调试程序的时间,再有一点就是要好好学习英语,对编程有很大帮助。总之,这次课程设计学到了很多,通过实践真正的做到了学有所用。
参考文献
[1] 郑阿奇,Visual C++实用教程(第三版),北京:电子工业出版社,2000
[2] 严华峰,Visual C++课程设计案例精编,北京:中国水利水电出版社,2002