一、需求分析(描述自己对需求的理解,以及后续扩展的可能性)

  • 实现一个命令行程序,要求:

    - 自动生成小学四则运算题目(加,减,乘,除)

    - 支持整数

    - 支持多运算符(比如生成包含100个运算符的题目)

    - 支持真分数

    - 统计正确率
  • 扩展需求

    - 文件:

    - 处理生成题目并输出到文件

    - 完成题目后从文件读入并判断

    - 多语言支持:简体中文繁體中文English

    - 生成题目去重

    本周完成进度 :可以进行除括号外的四则运算,可以生成100个运算符的题目,已经完成中缀转后缀以及后缀的计算,但还不能算出真分数。

二、设计思路(同时输出UML类图)

  • 首先要输入生成题目的数目m

    - 计算机根据输入的数目生成m道题

    - 每道题生成的数字要随机且在0~100之间

    - 生成的字符也要随机且字符数在1~100之间,字符不止加减乘除,还有括号
  • 用户输入值和计算机原本结果进行对比

    - 如果正确,则输出正确

    - 如果错误,则输出错误,正确答案为:输出答案,还应包括真分数计算
  • 答题结束后,计算机自动计算答题正确率

三、实现过程中的关键代码解释

  • 计算生成题目,不包括括号运算符
package CaculateSystem;
import java.util.Random; public class ProduceProblem {
public int ProduceProblem () {
String s = "";
Random shu = new Random();//每个运算式的随机数
int count = 1; //记录符号;
char[] operator = new char[]{'+', '-', '*', '/'};
int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
for (int j = 0; j < m; j++) {
int num = shu.nextInt(10);
s = s +" "+ num;
if (count < m) {
int c = shu.nextInt(4);
s = s +" "+ operator[c];
count++;
}
}
String [] str = s.split(" ");
System.out.println(s + "=");
Translate t = new Translate(str);
return t.flag;
}
}
  • 将中缀转换为后缀
package CaculateSystem;
import java.util.Stack; public class Translate extends Judge{
int flag;
public Translate (String[] args) {
Stack<String> z = new Stack<String>();
String jieguo = "";
String t = "";
for (int i = 0; i < args.length; i++) {
switch (args[i]) {
case "(":
z.push(args[i]);
break;
case "+":
case "-":
while(z.empty() != true) {
t = z.pop();
if (t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case "*":
case "/":
while(z.empty() != true) {
t = z.pop();
if (t.equals("+") || t.equals("-") || t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case ")":
while (z.empty()== false) {
t = z.pop();
if (t.equals("(")) {
break;
} else {
jieguo = jieguo + t + " ";
}
}
break;
case" ":
break; default:
jieguo = jieguo + args[i] + " ";
break;
} } while (z.empty() == false) {
jieguo = jieguo + z.pop() + " ";
}
String [] str = jieguo.split(" ");
Count py = new Count(str);
int answer = py.answer;
flag = A(answer);
} public Translate() { }
}
  • 后缀计算(不包括真分数)
package CaculateSystem;

import java.util.Stack;
public class Count{
int answer;
public Count (String[] args) {
Stack<String> z = new Stack<String>();
int num1,num2,d;
for(int i=0;i<args.length;i++) {
switch (args[i]){
case"+":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1+num2;
z.push(String.valueOf(d));
break;
case"-":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1-num2;
z.push(String.valueOf(d));
break;
case"*":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1*num2;
z.push(String.valueOf(d));
break;
case"/":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1/num2;
z.push(String.valueOf(d));
break;
case"":
case" ":
break; default:
z.push(args[i]);
break;
}
}
while (z.empty() == false) {
answer = Integer.valueOf(z.pop());
}
}
}

四、测试方法

五、运行过程截图

六、代码托管地址

https://gitee.com/wpywbb/20175225zyr

七、遇到的困难及解决方法

1.最开始看题目时觉得挺简单的,不就是四则运算吗,后来才发现要一大堆程序,而对于自己这样的菜鸡,就不知道从哪里开始,无从下手。

解决方法:因为程序太多了,所以我们把程序分为了生成题目、中缀转后缀、后缀计算、比较结果、计算正确率四个部分,然后再对每一个部分进行分析,这样环环相扣,一点一点地解决程序。

2.在生成题目时要求随机生成计算符,对这个陌生的问题一筹莫展。

解决方法:小伙伴提议可以用数字来代替运算符,用03分别代表加减乘除,然后随机生成03的数就先当于随机生成运算符。

3.中缀转后缀是全新的知识,刚开始接触时什么都不懂,看老师的教程也不明白。

解决方法:在网上查找关于相关知识,了解到了关于栈的一些用法:还通过看别人写的程序从而进一步了解中缀转后缀的过程。

     栈名.pop()表示将栈顶元素弹出
栈名.push(x)表示将x压入栈中

八、对结对的小伙伴做出评价(重点指出需要改进的地方)

  首先我应该进行自我反省,由于学识浅薄,我成了一个拖油瓶,很多都是在小伙伴的帮助下完成的。我的小伙伴很棒,他总是能总领全局,遇见程序首先将它剖析成几个部分,然后再挨个解决,他总是能在我无助的时候帮助我,让我在绝望的时候还能看到希望,和他结对很愉快。

九、总结

本次编程对我来说真的是一次很难忘的经历,最开始接触时真的无从下手,只能干瞪眼,在脑子里一堆浆糊,后来还是在小伙伴带领下将程序划分为几个部分,然后挨个击破,把每个部分要解决的都写出来,所以还是实践出真知,不管怎么想,还是应该多动手,有些东西写着写着可能就出来了,所以应该加强实践能力。选择结对是非常明智的,因为我自己不会的可以找小伙伴讨论,也许小伙伴也不会,那我们就共同解决、共同进步,虽然实验还未完成,但我希望我们能够保持这种状态,完成任务。

十、参考引用

http://www.cnblogs.com/math/p/se-tools-001.html

http://www.cnblogs.com/vertextao/p/6593339.html

http://www.cnblogs.com/Vivian517/p/8762830.html

https://blog.csdn.net/newgrammer/article/details/757522

https://en.wikipedia.org/wiki/Polish_notation

《java程序设计》结对编程-四则运算(第一周-阶段总结)的更多相关文章

  1. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  2. 20165232 2017-2018-2《Java程序设计》结对编程一 第一周总结

    20165232 2017-2018-2<Java程序设计>结对编程一 第一周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...

  3. 20165219 2017-2018-2《Java程序设计》结对编程一 第一周总结

    20165219 2017-2018-2<Java程序设计>结对编程一 第一周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...

  4. 20165205 2017-2018-2《Java程序设计》结对编程一 第一周总结

    20165205 2017-2018-2<Java程序设计>结对编程一 第一周总结 需求分析 对输入的算式进行计算,要求满足一下条件: 支持整数运算,如2+5,47+7865. 支持多运算 ...

  5. 王译潇20162314 实验报告三plus结对编程四则运算第一阶段

    北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...

  6. Java结对编程四则运算一周小结

    Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...

  7. 20165325 2017-2018-2 《Java程序设计》结对编程_第一周:四则运算

    一.码云链接 项目名称FAO 码云链接 二.需求分析 实现一个命令行程序: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确 ...

  8. 20172306 2018-2019 《Java程序设计与数据结构》第一周学习总结

    20172306 2018-2019 <Java程序设计与数据结构(下)>第一周学习总结 教材学习内容总结 第一章 概述 (程序=数据结构+算法 软件=程序+软件工程) 1.1 软件质量 ...

  9. 20172306《Java程序设计与数据结构》第一周总结

    20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...

  10. 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算

    20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...

随机推荐

  1. 目标检测网络之 Mask R-CNN

    Mask R-CNN 论文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:170 ...

  2. 投票wchat

    https://jingyan.baidu.com/article/0964eca27d3c8d8285f5363f.html 打开微信,进入“通讯录”,如下图中1对应位置. 2 在微信中“添加好友” ...

  3. jdk8的特性stream().map()

    转: https://blog.csdn.net/sanchan/article/details/70753645 java8的optional的使用: http://www.jdon.com/ide ...

  4. 浅谈python函数签名

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方 ...

  5. elasticsearch-head安装及启动

    head是用于监控Elasticsearch状态的客户端插件,包括数据可视化,增删改查工具,es语句的可视化等等. 5.0之后的安装方式如下: git clone git://github.com/m ...

  6. JAVA记录-SpringMVC集成redis

    1.redis.properties #主机地址 redis.host=127.0.0.1 #端口号 redis.port=6379 #当池内没有返回对象时,最大等待时间毫秒数 redis.pool. ...

  7. 【JUC】CopyOnWriteArrayList

    写入时复制(CopyOnWrite) 什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进 ...

  8. Codeforces 954 E. Water Taps

    http://codeforces.com/problemset/problem/954/E 式子变成Σ xi*(ti-T)=0 sum0表示>=T的ai*ti之和 sum1表示<T的ai ...

  9. Tomcat8.5配置https启动报空指针错误

    tomcat8.5版本和tomcat8.0有了很大的区别,默认的server.xml中https的配置方式也有了变化: <Connector port="8443" prot ...

  10. OBS 录制视频 自己留存

    1. 下载安装 软件下载地址:https://github.com/jp9000/obs-studio/releases/download/19.0.2/OBS-Studio-19.0.2-Full- ...