1、微机上机报告 01. 12 1 用 C编写计算器程序 一 、计算器介绍 1. 计算器主界面 1.1、 计算器 打开 运行后界面如下所示: 1.2 主界面 的说明 主界面主要由 三部分组成: 文本框: 用于 数据的输入 ( 可由下面的按钮 或 键盘输入 ), 以及计 算结果的输出; 基本计算 区: 主要 可用于 数字的 输入 以及简单的 加减乘除的计算,还有 可用于 清楚 文本框 的 数据; 数学函数计算区 : 主用可 实现基本常用的数学函数的计算 , 包括常用的 三角函数和反三角函数以及 e 指数 、开平方和以 e 和 10为微机上机报告 01. 12 2 底 对数 的计算。 2.计算器 的操
2、作说明及 注意 事项 2.1、 基本操作 : 使用 计算器 进行 基本数据计算 时通过 键盘及 基本计算 区的按钮输入 数据 ,然后根据计算需要点击 “+、 -、 *、 /”按钮 ,然后点击 ”=”按钮得出计算结果 。若 需使用函数计算时,可先输入数据,然后点击对应使用函数的按钮即可得出 结果 。特别的 , 对于三角函数的计算时, 可点击 单选框 “ 弧度制 ” 、 “ 角度制 ” 以实现弧度制及角度制数据的三角计算。 2.2、 注意事项 : 使用 除法计算时 应注意不能 使被除数为 0, 否则会出错:出现 此错误时只需点击确定 即可 继续之前的计 算。 在 使用三角函数时应 先 确定所输入的
3、数据是角度 制 还是弧度制 的 数据,否则 计算器 会跳出提醒框 , 如下 所示 :微机上机报告 01. 12 3 而 计算 反 三角函数 时 只能计算弧度制数据得到角度制结果: 在使用 常用函数进行计算时应特别注意所输入的数应满足函数的定义域,使函数有意义,否则会出错: 另 注 : 当所得数据很小时会 以 科学计数法的形式输出:微机上机报告 01. 12 4 其中 e-002 即表示 10-2。 二 、 MFC 编程的实现 1. 计算器主界面 的 设计 1.1、 建立对话框 1. 启动 Visual C+ 6.0集成开发环境 2. 创建对话框类型 应用程序 在 【 工程 】 选项卡 中选择
4、【 MFC AppWizard】 应用程序类型 ,工程文件名为 Calculator。 单击确定后选择 【 基本对话 】 建立 基本对话框应用程序。 1.2、添加 控件,设计界面 界面 设计如下 所示 : 微机上机报告 01. 12 5 2. 控件 ID及变量 控件 : ID: IDC_NUM1 IDC_NUM2 IDC_NUM3 IDC_NUM4 IDC_NUM5 消息函数 : OnNum1 OnNum2 OnNum3 OnNum4 OnNum5 控件 : ID: IDC_NUM6 IDC_NUM7 IDC_NUM8 IDC_NUM9 IDC_NUM12 消息函数 : OnNum6 OnNu
5、m7 OnNum8 OnNum9 OnNum12 控件 : ID: IDC_NUM10 IDC_ADD IDC_SUBTRACT IDC_MULPTIPLY IDC_DIVISION 消息 函数 : OnNum10 OnAdd OnSubtract OnMulptiply OnDivision 控件 : ID: IDC_EQUAL IDC_BACKSPACE IDC_CLEAR1 IDC_Exit 消息函数 : OnEqual OnBackspace OnClear1 OnExit 微机上机报告 01. 12 6 控件 : ID: IDC_RADIO1 IDC_RADIO2 IDC_SIN I
6、DC_ARCSIN IDC_COS IDC_TAN 消息函数 : OnRadio1 OnRadio2 OnSin OnArcsin OnCos OnTan 控件 : ID: IDC_ARCCOS IDC_ARCTANV IDC_EXP IDC_SQRT IDC_LN IDC_LOG 消息函数 : OnArccos OnArctan OnExp OnSqrt OnLn OnLog 编辑 框为 IDC_EDIT1,定义 类型为 CEdit 的 变量 m_Edit1. 3. 程序代码的实现 3.1、 定义变量 1) 向 CalculatorDlg.h 的 CCalculatorDlg 类 定义中添加
7、 public 型变量: 2) 在 CalculatorDlg.cpp 中 定义四个全局变量; 3) 控件 函数代码 的实现 数字 输入按钮下函数的实现 以下是 数字键 的函数的代码 ,其余 以此类推 void CCalculatorDlg:OnNum1() / TODO: Add your control notification handler code here CString t; GetDlgItem(IDC_NUM1)-GetWindowText(t); /获取按钮的数字 t=Num+t; /字符串连接 m_Edit1.SetWindowText(t);/在 编辑框中显示 Num=
8、t; double result=0;/存放结果数据 ,赋初值 0,得出结果后清 0 int control=0; /用于判断是何种运算 ,注意得出结果后清 0 const double pi=3.14159265358979323846; /圆周率的值 int math=0; /用于区分弧度制和角度制 CString Num; /用于按钮输入数字的连 接的连接 微机上机报告 01. 12 7 退格键 及清屏键 函数代码的实现 void CCalculatorDlg:OnBackspace() /退格 Num=Num.Left(Num.GetLength()-1); /使 Num的 长度减 1
9、 m_Edit1.SetWindowText(Num); void CCalculatorDlg:OnClear1() /清楚屏幕 / TODO: Add your control notification handler code here m_Edit1.SetSel(0,-1); m_Edit1.ReplaceSel(“ “); Num= ; result=0; control=0; UpdateData(FALSE); 计算 的 实 现 , 按钮 下程序代码的实现: void CCalculatorDlg:OnAdd() /加法运算 / TODO: Add your control n
10、otification handler code here char cs30; double add; m_Edit1.GetWindowText(cs,30); add=atof(LPCTSTR)cs); switch(control) /每次 计算之前 前 进行之前的运算 case 0: result=add;break; /第一个数应存储 case 1: result=result+add;break; case 2: result=result-add;break; case 3: result=result*add;break; case 4: if(add=0) MessageB
11、ox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); 微机上机报告 01. 12 8 Num= ; control=0; /control 赋 初值 return; else result=result/add;break; control=1; char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; UpdateData(FALSE); void CCalculatorDlg:OnSubtract() /减法
12、运算 / TODO: Add your control notification handler code here char cs30; double sub; m_Edit1.GetWindowText(cs,30); sub=atof(LPCTSTR)cs); switch(control) /每次 计算之前 前 进行之前的运算 case 0: result=sub;break; /第一个数应存储 case 1: result=result+sub;break; case 2: result=result-sub;break; case 3: result=result*sub;brea
13、k; case 4: if(sub=0) MessageBox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; /control 回到初值 return; else result=result/sub;break; 微机上机报告 01. 12 9 control=2; char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; void CCalculatorDlg:OnMulp
14、tiply() /乘法运算 / TODO: Add your control notification handler code here char cs30; double sub; m_Edit1.GetWindowText(cs,30); sub=atof(LPCTSTR)cs); switch(control) /每次 计算之前 前 进行之前的运算 case 0: result=sub;break; /第一个数应存储 case 1: result=result+sub;break; case 2: result=result-sub;break; case 3: result=resu
15、lt*sub;break; case 4: if(sub=0) MessageBox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; /control 回到初值 return; else result=result/sub;break; control=3; char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; 微机上机报告 01. 12 10 void CCalculat
16、orDlg:OnDivision() /除法运算 / TODO: Add your control notification handler code here char cs30; double sub; m_Edit1.GetWindowText(cs,30); sub=atof(LPCTSTR)cs); switch(control) /每次 计算之前 前 进行之前的运算 case 0: result=sub;break; /第一个数应存储 case 1: result=result+sub;break; case 2: result=result-sub;break; case 3:
17、result=result*sub;break; case 4: if(sub=0) MessageBox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; /control 回到初值 return; else result=result/sub;break; control=4; char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; 等于 的实现 void CCalcula
18、torDlg:OnEqual() /等于 的实现 微机上机报告 01. 12 11 / TODO: Add your control notification handler code here char cs30,seq50; double equal; switch(control) case 1: m_Edit1.GetWindowText(cs,30); equal=atof(LPCTSTR)cs); result=result+equal; _gcvt(result,50,seq); m_Edit1.SetWindowText(seq); Num= ; result=0; contr
19、ol=0; break; case 2: m_Edit1.GetWindowText(cs,30); equal=atof(LPCTSTR)cs); result=result-equal; _gcvt(result,50,seq); m_Edit1.SetWindowText(seq); Num= ; result=0; control=0; break; case 3: m_Edit1.GetWindowText(cs,30); equal=atof(LPCTSTR)cs); result=result*equal; _gcvt(result,50,seq); m_Edit1.SetWin
20、dowText(seq); Num= ; result=0; control=0; break; case 4: 微机上机报告 01. 12 12 m_Edit1.GetWindowText(cs,30); equal=atof(LPCTSTR)cs); if(equal=0) MessageBox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; /control 回到初值 return; else result=result/equal; _gcv
21、t(result,50,seq); m_Edit1.SetWindowText(seq); Num= ; result=0; control=0; break; 以下是角度制 和弧度制 的 实现代码 void CCalculatorDlg:OnRadio2() /角度制 / TODO: Add your control notification handler code here math=2; void CCalculatorDlg:OnRadio1() /弧度制 / TODO: Add your control notification handler code here math=1;
22、数学函数 的 实现 , 以下 给出 和 的 程序代码 , 其余函数依此类推即可得到: void CCalculatorDlg:OnSin() /正弦函数计算的实现 微机上机报告 01. 12 13 / TODO: Add your control notification handler code here char cs30; double sub; m_Edit1.GetWindowText(cs,30); sub=atof(LPCTSTR)cs); switch(control) /先进行判断之前是否有简单运算 case 0: break; case 1: sub=result+sub;
23、break; case 2: sub=result-sub;break; case 3: sub=result*sub;break; case 4: if(sub=0) MessageBox(“除数不能为 0!请重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; /control 回到初值 return; else sub=result/sub;break; switch(math) case 0: MessageBox(“计算三角函数前请选择单位制 !“);return;
24、 case 1: break; case 2: sub=(sub*pi)/180;break; result=sin(sub); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; UpdateData(FALSE); 微机上机报告 01. 12 14 void CCalculatorDlg:OnArcsin() /arcsin 函数计算的实现 / TODO: Add your control notification handler code here char cs30; double s
25、ub; m_Edit1.GetWindowText(cs,30); sub=atof(LPCTSTR)cs); switch(control) /先进行判断之前是否有简单运算 case 0: break; case 1: sub=result+sub;break; case 2: sub=result-sub;break; case 3: sub=result*sub;break; case 4: if(sub=0) MessageBox(“除数不能为 0!请 重新输入 .“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed)
26、; Num= ; control=0; /control 回到初值 return; else sub=result/sub;break; if(sub1|sub-1) MessageBox(“所输入的数超出 arcsin函数的定义域 ,请重新输入 !“); char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; return; switch(math) case 0: break; case 1: break; 微机上机报告 01. 12 15 case 2: MessageBox(“计算反三角函数时请选择弧度制 !“
27、);return; result=asin(sub); result=(result*180)/pi; char ed50; _gcvt(result,50,ed); m_Edit1.SetWindowText(ed); Num= ; control=0; UpdateData(FALSE); 三 、 心得体会 此次 微机上机 编程中,我原本打算完成那 20 道题目的 集合的程序 , 并已有了初步的整体规划,且已完成了主程序及前两小题的设计工作。但是 由于 此工程包含内容太多,每一题的方法都不尽相同,加之时间紧( 这是 由于 11号 还有考试,故 在 完成前两题的工作后已是 11 号 晚上了)
28、 ,因而放弃原来计划,改为 编程制作建议计算器 。 由于有之 前的编程经历 ,在编程计算器的过程中较为顺利,故而 只 用一天的时间就编完成。在 编程 的过程中 除少量借鉴网络资源的计算器编程外,绝大部分均是 本人通查阅编程书籍 和 自己思考完成的。 在 编程过程中最难实现的是 加减乘除 和等号之间已输入数据的 存放 和 修改 ,以及各个操作之间的相互影响,故而我在 文档中 将所有的加减乘除以及等号全部写出。 每个函数之间的相互 联系以及如何处理好这些联系是这部分代码的核心思想。 另外 在常用数学函数的 实现中 ,应特别注意判断各个函数的定义域的问题 ,以及出现错误后的处理 和之前数据的处理问题,这微机上机报告 01. 12 16 是这部分代码的主要问题 。 这两个 问题 是变成过程中工作量最大 、 时间消耗最多的部分 , 也是修改完善最多的部分,更是此程序最核心的 部分 。 由于时间 紧,在刚开始设计计算器 之时 所形成的一些想法在实际编程的 过程中 没有来得及实现。这让 我 体会到了编程工作的不 易 , 更 让我感受到了编程工作的严谨。每一部分之间都有很强的联系 , 而且在越深入的思考和编程后会发现这种联系会越来越紧密,因而,正确理顺各部分的关系,以及处理好这些关系是最重要的问题。