第6章 四则运算计算器
四则运算器(C语言)

#include<stdio.h>#include <stdlib.h> //需要用到的头文件#include <time.h> //包含日期时间处理头文件*/void main(){int x,y,all=0,r=0,e=0,result;char z;int m;printf("welcome caculator !\ninput q to end the caculator!\n");printf("1.addtest\n");printf("2.minustest\n");printf("3.multiplytest\n");printf("4.dividetest\n");printf("Please input the number from 1 to 4:\n"); //任意键进入scanf("%d",&m);srand( (unsigned)time( NULL ) ); /*随机数播种函数(产生一个以当前时间开始的随机种子)*/while ((z=getchar())!='q') //按q键(quit)退出{all++;x=rand()%50;y=rand()%50;if(m==1){printf("%d+%d=",x,y); //加法scanf("%d",&z);if (x+y==z) r++;else e++;}else if(m==2){ //减法printf("%d-%d=",x,y);scanf("%d",&z);if (x-y==z) r++;else e++;}else if(m==3){ //乘法printf("%d*%d=",x,y);scanf("%d",&z);if (x*y==z) r++;else e++;}else if(m==4){ //除法printf("%d/%d=",x,y);scanf("%d",&z);if (x/y==z) r++;else e++;}else//输入非法数字,输出错误printf("Errror!\n");result=100*r/all;//得分}printf("Y our grade is:%d\n",result);printf("all question number is %d,right is %d,error is %d\n",all,r,e); }#include<stdio.h>#include <stdlib.h>void main(){int a,b,x,y,all=0,r=0,e=0,g;char z;int m;printf("welcome !\ninput h to end the yunsuan!\n");printf("1.addtest\n");printf("2.minustest\n");printf("3.multiplytest\n");printf("4.dividetest\n");printf("请输入一个一到四的一个整数:\n"); //任意键进入scanf("%d",&m);while ((z=getchar())!='h') //按h键退出{all++;a=rand();b=rand();x=a%50;y=b%50;switch(m){case 1:{printf("%d+%d=",x,y); //加法scanf("%d",&z);if (x+y==z) r++;else e++;break;}case2:{ //减法printf("%d-%d=",x,y);scanf("%d",&z);if (x-y==z) r++;else e++;break;}case3:{ //乘法printf("%d*%d=",x,y);scanf("%d",&z);if (x*y==z) r++;else e++;break;}case4:{ //除法printf("%d/%d=",x,y);scanf("%d",&z);if (x/y==z) r++;else e++;break;}}g=100*r/all; //得分}printf("Y our grade is:%d\n",g);printf("all question number is %d,right is %d,error is %d\n",all,r,e);}。
四则运算练习小工具

四则运算练习小工具
四则运算练习器适合小学一、二年级学生四则运算的练习,可根据学生的学习进度设置计算的范围,以及自动判断对错,有声音提示。
程序以20道题为一组完成时自动计分。
定义方法
加法:把两个数合并成一个数的运算。
减法:在已知两个加数的和与其中的一个加数,求另--个Jm数的运算。
除法:已知两个因数的积与其中的一个因数,求另一个因数的运算。
乘法:求两个数乘积的运算。
1、一个数乘分数,是求这个数的几分之几是多少。
2、一个数乘整数,是求几个相同加数和的简便运算。
3、一个数乘小数,是求这个数的十分之几、百分之几、千分之几……是多少。
使用方法
本练习器操作简单,学生完全可以自己练习,无需家长帮助,它特别适用一年级学生学数起步巩固练习及二年级乘法口诀巩固训练。
增加了“24点大师”可以考查学生的应用能力,家长也可以参与其中,增添了乐趣。
C++课件案例三四则运算计算器

本课件将介绍如何用C++编写一个能进行四则运算的计算器。我们将学习输入 和输出的基本原理、不同的数据类型、各种运算符,以及实现一个完整的计 算器的方法。
输入
接收用户输入
理解用户输入并将其用 于计算。
验证输入
确保输入符合预期的格 式与范围。
错误处理
处理无效的或错误的输 入,避免程序崩溃。
小结
学习了四则运算的 基本原理
掌握了输入、数据类型 和运算符的应用。
实现了一个简单的 计算器
了解了计算器的核心算 法和实现方法。
准备迈向更高级的 计算机编程
为进一步学习提供了扎 实的基础。
2
中缀表达式求值
将中缀表达式转换为后缀表达式,然后进行运算。
3
后缀表达式求值
根据后缀表达式的规则进行运算,并得到最终结果。
计算器核心算法
栈的应用
使用栈来实现表达式求值 的算法,保证运算符和操 作数的顺序。
递归思想
利用递归来处理嵌套的表 达式,实现复杂运算。
优先级与结合性
考虑运算符的优先级和结 合性,避免运算结果出现 错误。
数据类型
整数类型
用于存储整数,支持基本的算术运算。
浮点数类型
用于存储小数,支持精确的数学运算。
字符类型
用于存储单个字符,可以进行逻辑运算。
字符串类型
用于存储文本,支持字符串连接与比较。
运算符
1 加法 3 乘法2 减法4 除法计算器实现1
前缀表达式求值
根据前缀表达式的规则进行运算,并得到最终结果。
第6章 四则运算计算器

第6章四则运算计算器本章介绍的项目是大家十分熟悉的计算器,通过该项目的实践,我们将学习状态图的一些基本知识、C# 中方法的概念和应用以及键盘事件的运用,同时,训练编写一个略微复杂的Windows应用程序的设计思路。
为了使读者能够循序渐进地学习此类项目的设计,我们根据难度的不同,分为三个项目分别实现,首先完成项目一:整数的四则运算计算器,然后在此基础上完善,实现项目二:实数四则运算计算器,最后添加记忆功能,完成项目三:带记功能的实数四则运算计算器。
6.1 项目一:整数四则运算计算器设计6.1.1 工作目标终极目标:完成一个整数四则运算的计算器,界面如图6.1所示:图6.1 整数四则运算计算器促成目标:1.完成整数四则运算计算器整体设计——状态机分析;2.完成整数四则运算模块设计——流程分析;3.完成整数四则运算计算器的程序界面设计及属性设置;4.完成整数四则运算器的程序编码;5.对整数四则运算计算器进行必要的运行测试,如有错误进行调试修改。
6.1.2 工作任务工作任务一:构建计算器的状态图;工作任务二:设计程序模块的流程图;工作任务三:设计界面完成窗体及控件的属性设置;工作任务四:编写程序代码;工作任务五:测试软件,对错误进行调试修改。
6.1.3 工作任务一:构建计算器的状态图1、知识准备——状态图状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的。
状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。
状态机由状态组成,各状态由转移链接在一起。
状态是对象执行某项活动或等待某个事件时的条件。
转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。
图6.2描绘了状态机的各种元素。
图6.2 状态机的各种元素一个简单的编辑器可被视为有限的状态机,其状态为Empty(空)、Waiting for a command(等待命令)和Waiting for text(等待文本)。
四则运算计算器设计说明书

四则运算计算器设计说明书一、设计目标本次计算器的程序设计,通过使用JAVA中的AWT包和Swing包的类库设计图形界面的计算器。
此计算器能够完成加减乘除的四则混合运算。
利用面向对象程序设计的思想,将各个组件的事件响应分别用不同的方式表达出来,并且使用了图形界面中的事件委托机制来处理事件响应。
二、设计流程1.分析该计算器需要完成的功能。
用户能够完成添加负号的四则混合运算,开方,取倒数,并且计算器能够自动识别运算符的优先级,根据用户输入的运算表达式,自动计算出相应的结果。
同时还完成了计算器中C按钮清屏功能和Backspace退格键。
2. 考虑异常处理。
(1)当输入的表达式中出现除零的操作,显示框将显示“Infinity(无穷大)”。
(2)当输入的表达式错误时,将弹出提示框显示“表达式错误请重新输入”(3)当计算器的显示文本框里为没有输入内容时直接点击等号按钮3. 编码实现计算器的功能。
(1)新建相关的文件。
(2)引入JAVA中相关的包。
(3)定义相关的变量,创建相关组件,并对组件的属性进行设置。
(4)对所创建的组件进行布局,完成界面的实现。
(5)为各个组件添加事件监听器。
(6)重写事件接口ActionListener的方法public voidactionPerformed(ActionEvent e)。
(7)为各个组件编写事件代码,完成每个按钮的不同功能。
三、程序截图四、程序代码import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;public class Calc extends JFrame implements ActionListener { JPanel topPanel = null;JPanel midPanel = null;JPanel bottomPanel = null;JTextField tResult = null;JButton backspaceButton = null;JButton ceButton = null;JButton cButton = null;JButton button1 = null;JButton button2 = null;JButton button3 = null;JButton button4 = null;JButton button5 = null;JButton button6 = null;JButton button7 = null;JButton button8 = null;JButton button9 = null;JButton button0 = null;JButton buttonDiv = null;JButton buttonPlus = null;JButton buttonMinus = null;JButton buttonMul = null;JButton buttonSqrt = null;JButton buttonMod = null;JButton buttonPM = null;JButton buttonX = null;JButton buttonPoint = null;JButton buttonEquals = null;StringBuffer str = new StringBuffer();boolean isDouble = false;// 是否为实数int opFlag = -1;static double t1 = 0, t2 = 0, t3 = 0, result = 0;static int opflag1 = -1, opflag2 = -1, flag = 0, resflag = 1;int preOp, currentOp = 0;// 标准位double op1 = 0, op2 = 0;// 操作数double n3;// 取得屏幕对象Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 取得屏幕的宽度int width = screenSize.width;// 取得屏幕的高度int heigth = screenSize.height;public Calc() {tResult = new JTextField("0.");tResult.setColumns(26);tResult.setHorizontalAlignment(JTextField.RIGHT);topPanel = new JPanel();topPanel.add(tResult);backspaceButton = new JButton("Backspace");backspaceButton.addActionListener(this);ceButton = new JButton("CE");ceButton.addActionListener(this);cButton = new JButton("C");cButton.addActionListener(this);midPanel = new JPanel();midPanel.add(backspaceButton);midPanel.add(ceButton);midPanel.add(cButton);bottomPanel = new JPanel(new GridLayout(4, 5, 3, 3));button7 = new JButton("7");button7.addActionListener(this);bottomPanel.add(button7);button8 = new JButton("8");button8.addActionListener(this);bottomPanel.add(button8);button9 = new JButton("9"); button9.addActionListener(this); bottomPanel.add(button9);buttonDiv = new JButton("/"); buttonDiv.addActionListener(this); bottomPanel.add(buttonDiv);buttonSqrt = new JButton("sqrt"); buttonSqrt.addActionListener(this); bottomPanel.add(buttonSqrt);button4 = new JButton("4"); button4.addActionListener(this); bottomPanel.add(button4);button5 = new JButton("5"); button5.addActionListener(this); bottomPanel.add(button5);button6 = new JButton("6"); button6.addActionListener(this); bottomPanel.add(button6);buttonMul = new JButton("*"); buttonMul.addActionListener(this); bottomPanel.add(buttonMul);buttonMod = new JButton("%"); buttonMod.addActionListener(this); bottomPanel.add(buttonMod);button1 = new JButton("1"); button1.addActionListener(this); bottomPanel.add(button1);button2 = new JButton("2"); button2.addActionListener(this); bottomPanel.add(button2);button3 = new JButton("3"); button3.addActionListener(this); bottomPanel.add(button3);buttonMinus = new JButton("-");buttonMinus.addActionListener(this);bottomPanel.add(buttonMinus);buttonX = new JButton("1/x");buttonX.addActionListener(this);bottomPanel.add(buttonX);button0 = new JButton("0");button0.addActionListener(this);bottomPanel.add(button0);buttonPM = new JButton("+/-");buttonPM.addActionListener(this);bottomPanel.add(buttonPM);buttonPoint = new JButton(".");buttonPoint.addActionListener(this);bottomPanel.add(buttonPoint);buttonPlus = new JButton("+");buttonPlus.addActionListener(this);bottomPanel.add(buttonPlus);buttonEquals = new JButton("=");buttonEquals.addActionListener(this);bottomPanel.add(buttonEquals);this.setLayout(new BorderLayout());this.add(topPanel, "North");this.add(midPanel, "Center");this.add(bottomPanel, "South");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(310, 225);this.setResizable(false);// 设置窗体出现在屏幕的中央this.setLocation((width - this.getWidth()) / 2,(heigth - this.getHeight()) / 2);this.setVisible(true);}/*** @param args*/public static void main(String[] args) {new Calc();}@Overridepublic void actionPerformed(ActionEvent e) {String s = e.getActionCommand().trim();if (s.equals("CE")) {// 如果是CE则清除文本框tResult.setText("0.");} else if (s.equals("Backspace")) {if (!tResult.getText().trim().equals("0.")) {// 如果文本框中有内容if (str.length() != 1 && str.length() != 0) {tResult.setText(str.delete(str.length() - 1, str.length()).toString());} else {tResult.setText("0.");str.setLength(0);}}op2 = Double.parseDouble(tResult.getText().trim());} else if (s.equals("C")) {// 如果是C删除当前计算tResult.setText("0.");op1 = op2 = 0;str.replace(0, str.length(), " ");preOp = currentOp = 0;} else if (s.equals("1/x")) {// 如果按键为1/x则将文本框中的数据为它的倒数String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + 1 / dtemp);} else if (s.equals("sqrt")) {// 如果按键为sqrt则将文本框中的内容求平方根String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + Math.sqrt(dtemp));} else if (s.equals("+")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 1;op2 = 0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 1;switch (currentOp) {case 1:op1 += op2;tResult.setText("" + op1);break;case 2:op1 -= op2;tResult.setText("" + op1);break;case 3:op1 *= op2;tResult.setText("" + op1);break;case 4:op1 /= op2;tResult.setText("" + op1);break;}}} else if (s.equals("-")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 2;// op1=op2;op2=0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 2;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("*"))// *{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 3;// op1=op2;op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 3;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("/"))// /{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 4;// op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 4;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("="))// ={if (currentOp == 0) {str.setLength(0);tResult.setText("" + op2);} else {str.setLength(0);currentOp = preOp;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}currentOp = 0;op2 = 0;}} else if (s.equals(".")) {isDouble = true;if (tResult.getText().trim().indexOf('.') != -1);else {if (tResult.getText().trim().equals("0")) {str.setLength(0);tResult.setText((str.append("0" + s)).toString());}// else// if(tResult.getText().trim().equals("")){}//如果初时显示为空则不做任何操作else {tResult.setText((str.append(s)).toString());}}} else if (s.equals("0"))// 如果选择的是"0"这个数字键{if (tResult.getText().trim().equals("0.")) {} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());}} else if (s.equals("%"))// 如果选择的是"0"这个数字键{} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());if (currentOp == 0)op1 = op2;}}}。
汇编语言课程设计_四则运算计算器设计

目录1 设计目的 (1)2 概要设计 (1)2.1 系统总体分析 (1)2.2 主模块框图及说明 (2)3 详细设计 (3)3.1 主模块及子模块说明 (3)3.2 各模块详细设计 (3)3.2.1 判定运算符模块设计 (3)3.2.2取运算数模块 (3)3.2.3计算模块 (4)3.2.4结果处理模块 (5)3.2.5输出模块 (5)3.2.6错误处理模块 (6)4 程序调试 (7)4.1 运行界面分析 (7)4.2 调试过程及分析 (7)5 心得体会 (8)5.1 设计体会 (8)5.2 系统改进 (8)参考文献 (10)附录 (11)实现加减乘除四则运算的计算器1 设计目的汇编语言是继机器语言后出现的计算机程序设计语言,是计算机所能提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特征并能够直接控制硬件的惟一语言。
因而了解之一语言的特性,并熟练掌握这一语言并应用于开发中便是计算机专业学生所必需掌握的技能之一。
本课程设计通过加减乘除四则运算计算器的设计,增强对于汇编语言寄存器、指令、伪指令、中断等的理解。
可通过编写的汇编程序完成基本的加减乘除四则运算。
主要功能:能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:C:\tasm>js 3+252 概要设计2.1 系统总体分析四则运算计算器应当实现对用户输入表达式的处理。
根据用户输入的表达式,完成加减乘除四则运算。
程序自动判定表达式输入,并完成对于输入的16进制数的转换,同时计算结果并以10进制数输出。
对于异常情况程序应当进行处理,保证程序的正确运行。
设计一个计算器,在DOS界面下输入<程序名> <表达式>可直接输出运算结果。
例如在DOS界面中输入JS 3+6,可直接输出9。
程序接受16进制数输入,以十进制数输出运算结果。
对于输出错误情况,程序自动给出错误提示,若输入的格式有误,程序给出“JS <Expression> [10]”(即输入样例)提示,若输入的表达式有误,程序给出“Error in expression !”(即表达式错误)提示。
汇编语言课程设计四则运算计算器

*******************实践教学*******************兰州理工大学技术工程学院2013年春季学期汇编语言实训课程设计题目:四则运算计算器专业班级:计算机科学与技术姓名:___郭利强_____学号: 11730108指导教师:刘树群成绩:计算机科学与技术专业(11级)汇编语言实训课程设计任务书题目:四则运算计算器班级: 11计算机科学与技术1班学生姓名:郭利强学号: 11730108 题目类型:软件工程(R)指导教师:刘树群一.题目简介四则运算计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
得到软件工程的综合训练,提高解决实际问题的能力。
二.设计任务1、查阅文献资料,一般在5篇以上;2、要求可以进行四则运算;3、完成软件结构设计和算法设计;4、完成系统的软件开发和测试工作;5、撰写设计说明书;6、做好答辩工作。
三.主要内容、功能及技术指标1、实现功能及指标:①使用Win32的窗口程序模式,实现四则运算程序的设计与开发;②界面友好。
2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求做什么。
在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。
3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。
4、上机前程序静态检查:上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。
简单WINDOWS小程序设计——四则运算计算器

简单WINDOWS小程序设计——四则运算计算器实验一:简单WINDOWS小程序——四则运算计算器题目基本要求:创建一个Windows程序,在文本框中输入两个整数,按“计算”按钮后输出这两个整数的和、差、积、商。
程序运行范例参见所提供的范例。
程序设计的具体要求如下:(1)用户在两个文本框中输入2个整数后单击“计算”按钮,可在标签框中显示计算结果。
(2)要求计算结果标签框中的内容分行显示(3)当除数输入为0以及输入的是非数值时,观察程序的运行状态,为什么?程序提示:(1)每个一在窗体中的控件都应该是一个对象,其中name属性为该控件在程序中的名字。
(不能使用汉字)(2)文本框控件为:Textbox,其中text属性即为用户输入的文本,其类型为字符串类型(3)字符串String 为系统已经定义的一个类,其中有很多可以直接使用的方法,如:字符串连接、字符串复制等等。
(4)通过文本框输入的数据类型是字符串,并不能直接用于数值计算,同理,计算之后的结果也不能直接显示在文本框或者标签中,需要转换!相关代码和使用到的方法如下:int.Parse(txtNumber1.Text)//将字符串txtNumber1.Text转换为相应的整数,不考虑字符串输入错误,不能转换为整数的情况。
int x = 5;txtNumber1.Text =x.ToString();//将整数转换成字符串并赋值给文本框的text属性。
(5)和C语言一样,在C#/C++中,整数和整数相除仍然得整数。
(6)要分行显示,可以使用回车,但它是转义字符,为\n,比如:string s1=”abc”+”\n”+”efg”,可以实现字母的分行显示(7)所谓文本框清空,也就是文本框的text属性值为空串。
也可以使用clear()事件(8)在Windows窗体程序中,经常使用label控件(标签)完成显示和输出,属性text 用于显示,类型为字符串。
(9)C#中,类的全部属性和方法定义都是放在类中的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章四则运算计算器本章介绍的项目是大家十分熟悉的计算器,通过该项目的实践,我们将学习状态图的一些基本知识、C# 中方法的概念和应用以及键盘事件的运用,同时,训练编写一个略微复杂的Windows应用程序的设计思路。
为了使读者能够循序渐进地学习此类项目的设计,我们根据难度的不同,分为三个项目分别实现,首先完成项目一:整数的四则运算计算器,然后在此基础上完善,实现项目二:实数四则运算计算器,最后添加记忆功能,完成项目三:带记功能的实数四则运算计算器。
6.1 项目一:整数四则运算计算器设计6.1.1 工作目标终极目标:完成一个整数四则运算的计算器,界面如图6.1所示:图6.1 整数四则运算计算器促成目标:1.完成整数四则运算计算器整体设计——状态机分析;2.完成整数四则运算模块设计——流程分析;3.完成整数四则运算计算器的程序界面设计及属性设置;4.完成整数四则运算器的程序编码;5.对整数四则运算计算器进行必要的运行测试,如有错误进行调试修改。
6.1.2 工作任务工作任务一:构建计算器的状态图;工作任务二:设计程序模块的流程图;工作任务三:设计界面完成窗体及控件的属性设置;工作任务四:编写程序代码;工作任务五:测试软件,对错误进行调试修改。
6.1.3 工作任务一:构建计算器的状态图1、知识准备——状态图状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的。
状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。
状态机由状态组成,各状态由转移链接在一起。
状态是对象执行某项活动或等待某个事件时的条件。
转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。
图6.2描绘了状态机的各种元素。
图6.2 状态机的各种元素一个简单的编辑器可被视为有限的状态机,其状态为Empty(空)、Waiting for a command(等待命令)和Waiting for text(等待文本)。
事件Load file(装载文件)、Insert text(插入文本)、Insert character(插入字符)和Save and quit(保存并退出)导致了状态机中的转移。
下面的图6.3描绘了编辑器的状态机。
图6.3 编辑器的状态机状态机最多地用于建立对象在其生命期内的行为模型。
当对象具有依赖于状态的行为时,尤其需要使用状态机。
可能具有状态机的对象包括:类、子系统、用例、接口(以声明实现该接口的对象必须满足的状态)和协议(以声明实现该协议的对象必须满足的状态)。
并非所有对象都需要有状态机。
如果对象的行为很简单,只是存储或检索数据,那么该对象的行为就与状态无关,它的状态机也没有多少用处。
2、整数四则运算计算器的状态图设计仔细分析计算器的状态变化,可以发现,计算器整体上有四个状态组成:接受第1个操作数、接受第2个操作数、输出计算机结果和出错。
而接受第1或第2个操作数的状态中又包含了接受数字的状态和接受+、-、×、/、=五种运算符状态两种情况,把这些状态表达成状态图,如图6.4到6.6所示。
图6.4 整数四则运算计算器的顶层状态图以上状态图描述了这样一个可循环的过程:首先系统进入输入第一个操作数的状态,如果此时继续输入数字,则系统保持当前状态,直到输入运算符,接收第一个操作数的状态结束,进入下一个状态——接收第二个操作数,这一状态也一直保持到输入一个运算符时结束,这时,运算符不一定是“=”号,也可以是+、-、×、/中的一个,无论是哪一个运算符,程序都先计算出结果并显示。
接下去,如果用户输入+、-、×、/中的一个运算符,则把前一次运算的结果作为第一个操作数,开始下一轮计算;如果用户输入数字,则将前一次运算的结果丢弃,开始新一轮的计算。
输入或运算中出现溢出或其它错误,则系统进入“ERROR”状态。
以上描述的是顶层的状态图,它还需要进行一些细化,主要是在接收第一个或第二个操作数的过程中接收的是操作数中的第一个数字还是第一个以后的数字,程序的处理会有所不同,因为如果是第一个数字,直接显示就行,但如果是第一个以后的数字,则应该跟在前面的数字后面显示,所以还应该把上图中接收操作数的两个状态进一步分解。
图6.5 初始/接受第一个操作数的分解子状态图图6.6 接受第二个操作数的分解子状态图状态图很清楚地说明了计算器的状态以及触发状态改变的事件,结合本章学习的方法的相关知识,编写计算器程序有了一个比较清楚的思路:首先可以编写一个方法InitMembers(),对计算器的状态进行初始化,另外编写两个方法Numbers_Click()和Operators_Click():前者用来处理接收到数字时计算器所做的工作,后者用来处理接收到运算符时,程序应当做出的正确反映,而具体接到的是哪一个数字或运算符可以考虑采用按钮的单击事件,通过参数传递给上述的两个方法。
此外,通过状态图还可以分析出当输入第1个操作数时,必须判断一下输入的是一个数字还有第1个以后的数字,所以程序中需要定义一个bool类型的变量bNumBegins,其初值为true,当输入一个数字之后就将它置为false,直到计算出结果后再置为true,准备进行下一轮的计算。
这里,有一点必须特别给予说明,由于该计算器的功能是比较简单的,所以暂时不考输入操作数是负数和情况。
6.1.4工作任务二:设计程序模块的流程图1.知识准备——方法方法(method)又常称为函数(function),是实现可以由对象或类执行的计算或操作。
一般而言,可以把一个程序中多次用到的某个任务,如常用的计算定义为方法,以便反复调用。
在前面的章节中曾经应用过的MessageBox类的Show、Math的Pow都是方法,方法是类的成员。
1)实例方法和静态方法C#的方法有实例方法和静态方法之分。
所谓的实例方法是指通过对象名调用的方法,也是本章应用到的方法。
静态方法与类关联,而不是与对象关联,定义静态方法时要使用static关键字,访问静态方法时要使用类名,而不是对象名。
2)方法定义的格式实例方法定义的格式化为:修饰符返回类型方法名(形参列表){声明和语句}静态方法定义的格式为:修饰符static 返回类型方法名(形参列表){声明和语句}其中“返回类型”指定该方法返回的值的类型。
如果方法无返回值,则返回类型为void;“方法名”是一个有效的标识符;“形参列表”中的“形参”是“形式参数”的简称,“形参列表”是一个可选项,指定方法的参数,如果有多个参数,可以用逗号分隔,每个参数与声明变量的方法一样,都是指定数据类型和参数名。
即使没有参数,括号也不能省略。
方法返回类型如果不是 void,则方法可以使用 return 关键字来返回值,如果语句中return 关键字的后面是与返回类型匹配的值,则该语句将该值返回给方法调用方。
return 关键字还会停止方法的执行。
如果返回类型为 void,则可使用没有值的 return 语句来停止方法的执行。
如果没有 return 关键字,方法执行到代码块末尾时即会停止。
具有非 void 返回类型的方法才能使用 return 关键字返回值。
2.整数四则运算计算器的程序流程图程序思路的大体框架基本清楚后,我们可以来构建计算器及其主要方法的流程图,以便根据流程图写出程序代码。
程序总流程图如图6.7所示。
图6.7 整数计算器程序总流程图图6.8 Numbers_Click()方法的流程图图6.9 Operators_Click()方法的流程图上述Operators_Click()方法的流程图在理解上会比较困难。
首先我们要考虑清楚,当新一轮计算开始时,第一次输入一个运算符(+、-、×、/中的一个),程序是不能进行计算的,因为此时只有一个操作数,只有当输入第二个操作数之后,第二次输入一个运算符(+、-、×、/或者=),才能进行四则运算,所以在Operators_Click()方法中对运算符的处理应当推迟一步,也就是说,本次输入的运算符应该保存起来(流程图中保存在cOperator中),而程序当前处理的是前一次输入的运算符,之后把运算的结果存入第一个操作数,以便开始新一轮的计算。
这里还有一个小问题,既然对运算符的处理是推迟一步进行的,那么在程序初始化的时候,应给运算符赋一个初值,作为第一个运算符的前一个运算符,那么初值应当是什么呢?试想,程序最开始时,用户输入一个操作数和一个运算符(+、-、×、/中的一个),由于此时不进行加、减、乘、除的四则计算,程序所做的工作只是保存运算符,并将输入的数放入存放第一操作数的变量中,所以初值不能是+、-、×、/中的一个,而只能是“=”。
6.1.5工作任务三:设计界面完成窗体及控件的属性设置首先创建一个Windows应用程序,命名为Cacle1,在窗体上添加一个文本框控件和15个按钮控件,设计程序界面如图6.10所示,图6.10 程序界面设计窗体、控件及相关属性如表6.1所示。
表6.1 控件属性表6.1.6工作任务四:编写程序代码在编写代码之前我们再来考虑一个问题,我们开发的这个计算器,用鼠标点单击各按钮时,触发了按钮的Click事件,通过编写按钮的单击事件我们可以实现数字或运算符的输入,但是为了提高输入的速度,许多人喜欢使用键盘进行操作,那么我们的计算器可不可以用键盘来操作呢,答案是肯定的,但我们需要为编写增加相关的键盘事件。
1.知识准备——键盘事件当用户按键盘键时,Windows 窗体提供两个事件,而当用户松开键盘键时,Windows 窗体提供一个事件。
1)KeyDown 事件发生一次;2)KeyPress事件,当用户按住同一个键时,该事件可以发生多次;3)当用户松开键时,KeyUp 事件发生一次。
我们用下表对三个事件进行说明:表6.2 键盘事件说明Windows 窗体将键盘输入标识为由按位 Keys 枚举表示的虚拟键代码。
使用 Keys 枚举,可以综合一系列按键以生成单个值。
可通过处理 KeyDown 或 KeyUp 事件来检测大多数物理按键操作。
如果通过组合按键得到一个字符,则可以通过处理 KeyPress 事件来检测该字符。
Keys枚举类包含用于处理键盘输入的常数。
键由键值标识,键值是由键代码和一组修饰符共同组成的一个整数值。
键值的左边四个数字包含键代码(与 Windows 虚拟键代码一样)。
键值的右边四个数字包含 SHIFT、CONTROL 和 ALT 键的修饰符位。
这里我们举例小部分Keys成员,供大家参考,如表6.3所示:表6.3 Keys枚举类部分成员在本项目中,我们采用文本框的key_Down事件,接收来自数字键盘的事件,其它的键盘事件有兴趣的读者可以自己添加。