软工随堂小测——四则运算

我说的都队

031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛


一、算法流程

二、算法功能

  • 能对0--10之间的整数进行四则运算(加减乘除)
  • 程序能接收用户输入的整数答案,并判断对错
  • 支持真分数的四则运算
  • 程序结束时,统计出答对、答错的题目数量。

三、算法分析

类CaculatorView: UI界面的加载,程序的主体框架,对运算式的正确答案以及用户给定的答案进行检验,并返回检验结果。

类Equation: 随机成成运算式,并返回

类Caculate: 对给定的运算式,计算出结果并返回

类MatchAnswer: 对用户的输入答案与正确答案进行检验,并返回检验结果

类Fraction: 实现真分数的四则运算

/**
 * 程序的UI界面,对用户的输入输出进行判定运算,并给出相应的提示
 * 程序的主框架,调用了其他类封装好的静态方法
 * @author 陈燊
 *
 */
public class CaculatorView extends JFrame implements ActionListener {

	/** 窗口的宽度 */
	public static final int WIDTH = 810;
	/** 窗口的高度 */
	public static final int HEIGTH = 500;//窗口的高度
	
	//swing部件的定义
	.
	.
	.

	private StringBuffer equationStrs = new StringBuffer();//表达式的字符串缓冲区
	private StringBuffer resultStrs = new StringBuffer();//用户给定答案的字符串缓冲区
	private StringBuffer matchOutputStrs = new StringBuffer();//检测结果的字符串缓冲区

	private String[] userResult = new String[100];//用户给定的答案
	private String[] rightResult = new String[100];//运算式的正确答案
	private String[] expression = new String[100];//随机生成的表达式
	private int ensureNumber;//运算式的题量
		
	/**
	 * CaculatorView的构造方法
	 */
	public CaculatorView() {
		
		//设置标题和大小
		this.setTitle("运算器");
		this.setSize(WIDTH,HEIGTH);
		
		//swing部件的初始化
		.
		.
		.
		
		//生成表达式的数据初始化方法
		Equation.createEquation();
		
	}
	
	public static void main(String[] args) throws IOException{
		new CaculatorView();
	}
	
	/**
	 * 所有数据的重置
	 * @param flag
	 * flag为true,表示点击了重置按钮,则numberText清空
	 * flag为false,表示点击了确定按钮,则numberText不清空
	 */
	void resetDatas(boolean flag) {
		if (flag) {
			numberText.setText("");
		}
		equationInput.setText("");
		answerInput.setText("");
		matchAnswer.setText("");
		ensureNumber = 0;
		equationStrs.delete(0, equationStrs.length());
		resultStrs.delete(0, resultStrs.length());
		matchOutputStrs.delete(0, matchOutputStrs.length());
		userResult = new String[100];
		rightResult = new String[100];
		expression = new String[100];
		MatchAnswer.setRightNums(0);
		MatchAnswer.setWrongNums(0);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		String button = e.getActionCommand();
		if (button.equals("确认")) {
			resetDatas(false);
			String numberStr = numberText.getText();
			
			if (numberStr.length() != 0) {
				
				/**
				 * 对输入题量进行判断,上限为100题,如果超出或则小于等于0题,都会给出相应提示
				 * 当输入正确时,把输入转化为int型保存在ensureNumber里
				 */
				if ((Integer.parseInt(numberStr) > 100) || (Integer.parseInt(numberStr) <= 0)) {
					JOptionPane.showMessageDialog(null, "题量最多为100题!请重新输入!", "提示", JOptionPane.INFORMATION_MESSAGE);
				} else {
					ensureNumber = Integer.parseInt(numberStr);
				}
			} else {
				JOptionPane.showMessageDialog(null, "请先输入题量!", "提示", JOptionPane.INFORMATION_MESSAGE);
			}
			
			for (int i = 0; i < ensureNumber; i ++) {
				
				/**
				 * 调用Equation类的getEquation()生成表达式方法
				 * 并把生成的表达式保存在expression数组里面
				 */
				expression[i] = Equation.getEquation();
				equationStrs.append("题" +  (i + 1) + ": " + expression[i] + "\n");
		  
				/**
				 * 调用Calculate类的getAnswer()方法
				 * 计算出运算式的答案并保存在rightResult数组里面
				 */
		        rightResult[i] = Calculate.getAnswer(expression[i]);
		        resultStrs.append("题" +  (i + 1) + ": " + rightResult[i] + "\n");
			}
			equationInput.setText(equationStrs.toString());			
		} else if (button.equals("确认答案")) {
			String numberStr = numberText.getText();
			
			/**
			 * 对输入进行判断,当题量或则表达式未生成时,给出相应错误提示
			 */
			if (numberStr.length() == 0) {
				JOptionPane.showMessageDialog(null, "请先输入题量!", "提示", JOptionPane.INFORMATION_MESSAGE);
			} else if(ensureNumber == 0) {
				JOptionPane.showMessageDialog(null, "请先生成表达式!", "提示", JOptionPane.INFORMATION_MESSAGE);
			} else {
				userResult = answerInput.getText().split("\n");
				
				/**
				 * 对用户给定的答案数量进行判断
				 * 当答案数小于或大于运算式的数量时,给出相应错误提示
				 */
				if (userResult.length < ensureNumber) {
					JOptionPane.showMessageDialog(null, "答案数量过少,请给出正确数量的答案!", "提示", JOptionPane.INFORMATION_MESSAGE);
				} else if (userResult.length > ensureNumber) {
					JOptionPane.showMessageDialog(null, "答案数量过多,请给出正确数量的答案!", "提示", JOptionPane.INFORMATION_MESSAGE);
				} else {
					
					/**
					 * 调用MatchAnswer类的match()方法,对用户给定的答案进行检验
					 * 并把检验结果保存到matchOutputStrs字符缓冲区里
					 * 给出正确和错误的答案数
					 */
					for (int i = 0; i < ensureNumber; i ++) {
						matchOutputStrs.append(MatchAnswer.match(rightResult[i], userResult[i]));
					}
					matchOutputStrs.append("\n共有 " + ensureNumber + " 题运算式\n");
					matchOutputStrs.append("正确答案: " + MatchAnswer.getRightNums() + "题\n");
					matchOutputStrs.append("错误答案: " + MatchAnswer.getWrongNums() + "题\n");
					if (MatchAnswer.getRightNums() == ensureNumber) {
						matchOutputStrs.append("厉害了我的哥!你答对了所有题目!\n");
					} else if (MatchAnswer.getRightNums() == 0) {
						matchOutputStrs.append("一题都没答对。。。小学校长想你了!");
					} else {
						matchOutputStrs.append("谢谢参与,欢迎再次挑战!");
					}
					matchAnswer.setText(matchOutputStrs.toString());
				}
			}
		} else if (button.equals("重置")) {
			/**
			 * 清空所有文本框,以及所有数据
			 */
			resetDatas(true);
		}	
		
	}

}

四、程序运行流程GIF图演示

五、单元测试

  • 分数加减法的单元测试

  • 答案检验的单元测试

六、结果测试

测试样例一:答案全部正确

测试样例二:答案全部错误

测试样例三:部分正确部分错误

七、组员分工和Git提交记录

  • 陈 燊(031402304)图形化界面输入、比较结果并输出

  • 陈齐民(031402203)程序流图、main函数

  • 黄炜伟(031402209)生成计算题

  • 郑扬涛(031402233)计算结果

  • 胡心颖(031402337)分数的加减乘除

  • 许玲玲(031402342)单元测试

  • 王婷婷(031402341)博客编写

八、Github项目记录

九、分支合并记录

posted @ 2016-12-03 11:15  王婷婷007  阅读(532)  评论(13编辑  收藏  举报