1、GitHub地址:https://github.com/3116004700/ruanjiangongcheng
2、项目需求:
  • 生成的题目中计算过程不能产生负数(完成)
  • 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。(完成)
  • 程序一次运行生成的题目不能重复,生成的题目存入执行程序的当前目录下的Exercises.txt文件(完成)
  • 每道题目中出现的运算符个数不超过3个(完成)
  • 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件(完成)
  • 程序应能支持一万道题目的生成。(完成)
  • 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计。(完成)
3、解题思路描述:

​ 拿到这个项目首先想到的是和上一个项目的区别,都会涉及到IO的输出,因为Java里面IO的相关方法使用起来比较简便,所以两次的实现语言都是Java。

​ 这次的项目有几个要注意的地方:四则表达式的生成,要保证随机;项目要求结果不能为负数;要判断答案中的对错,并且统计数量。这些问题的解决办法会在后面详细说明,这里就不多赘述了。

4、设计实现过程:

​ 整个项目总共有7个类,每个类里面有不同的方法。(类列表如下图)

基本的方法是GetCalculation类里面的Get_Calculation()方法,这个方法生成了最基本的算术表达式。GetSymbol类是main()所在的类,用来启动函数。

​ 主要类之间具体的调用过程:

5、代码说明:
因为代码的量比较大,所以只是展示一部分关键代码,完整的代码可以去GitHub自行查看。

思路:这只是生成算数表达式的代码的一部分,整个的算术表达式分成了很多种情况,要解决的问题就是将随机得到的数字和运算符拼接成一个完整的、格式统一的算术表达式。其实这个只需要字符串的拼接就行了,真正的问题是如何保证得到的表达式的结果不为负数。这里使用的方法就是利用运算符的下标位置进行判断,因为只有减号才会出现负数,所以在减号出现的表达式里都会对减号之前的数值和减号之后的数值进行比较,如果前者小于后者,那么舍弃这个算式,重新生成新的算式。


public static String Get_Calculation1(int m) {
String strings=String.valueOf(Getnum.Get_num(m))+" "+GetSymbol.Get_Symbol()+" "+String.valueOf(Getnum.Get_num(m))+" "+"=";
String answer=null;
String string =strings.replaceAll(" ", "");
String[] news=string.split("\\-|\\=|\\+|\\×|\\÷");
int a=Integer.parseInt(news[0]);
int b=Integer.parseInt(news[1]);
if(string.contains("-")) {
if(a<b) {
return Get_Calculation1(m);
}
else {
answer=String.valueOf(GetResult.Num_sub_Num(a, b));
return strings+"&"+answer;
}
}
if (string.contains("+")) {
answer=String.valueOf(GetResult.Num_add_Num(a, b));
return strings+"&"+answer;
}
if (string.contains("×")) {
answer=String.valueOf(GetResult.Num_mul_Num(a, b));
return strings+"&"+answer;
}else {
answer=GetResult.Num_div_Num(a, b);
return strings+"&"+answer;
}
}
public static String Get_Calculation2(int m) {
String strings=String.valueOf(Getnum.Get_num(m))+" "+GetSymbol.Get_Symbol()+" "+Getnum.Get_Frac(m)+" "+"=";
String string =strings.replaceAll(" ", "");
String[] string1=string.split("\\+|\\-|\\×|\\÷|\\=");
String answer=null;
int n=Integer.parseInt(string1[0]);
String string2=string1[1];
if(string.contains("-")) {
answer=GetResult.Num_sub_Fra(n, string2);
if (answer.contains("-")) {
return Get_Calculation2(m);
}
else if (!answer.contains("-")) {
return strings+"&"+answer;
}
}
if(string.contains("+")) {
answer=GetResult.Num_add_Fra(n, string2);
return strings+"&"+answer;
}
if (string.contains("×")) {
answer=GetResult.Num_mul_Fra(n, string2);
return strings+"&"+answer;
}
else {
answer=GetResult.Num_div_Fra(n, string2);
return strings+"&"+answer;
}
}

检查答案正误的方法:

思路:因为之前得到算数表达式的时候对格式严格要求了,所以在判断正误的时候就简单了很多,题目文件中的内容和答案文件中的内容就只是差了答案这一部分,所以在判断正误的时候readline每一行,并且进行比较,把equals的结果记录下来就是最终需要统计的数据。

package Com.software;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner; public class Check {
WriteStringToFile ws = new WriteStringToFile();
void checkAnswer(File exercises,File answers) throws IOException{ BufferedReader br_e = new BufferedReader(new FileReader(exercises));
BufferedReader br_a = new BufferedReader(new FileReader(answers)); String line_e = null;
String line_a = null;
File fileGrade = new File("Grade.txt");
int numTrue = 0;
int numFalse = 0;
if(fileGrade.exists())fileGrade.delete();
while((line_e = br_e.readLine()) != null && (line_a = br_a.readLine()) != null){
if(!line_e.equals(line_a)){
ws.writeToFile("Grade.txt", line_e);
ws.writeToFile("Grade.txt", "\n"); // System.out.println(line_e);
numFalse++;
}else{
numTrue++;
}
}
br_e.close();
br_a.close();
String resultCheck = "一共做错"+numFalse+"道,做对"+numTrue+"道。";
// System.out.println("共有"+num+"道错题");
ws.writeToFile("Grade.txt", resultCheck);
}
}

写入文件的IO 方法:

思路:为了保证程序多次运行时生成文件里的内容会一直刷新,所以每次程序运行都会删掉之前的文件,重新建立一个新的文件来存储题目和答案。

package Com.software;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class WriteStringToFile {
public void writeToFile(String filePath,String string){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath,true);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//true表示在文件末尾追加
try {
fos.write(string.getBytes());
// fos.write("\n".getBytes());
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} }
6、测试运行:
控制台输入:

生成文件:

代码覆盖率:

7、PSP表格:
PSP2.1 Personal Software Process Stages 预估耗时(分钟****) 实际耗时(分钟****)
Planning 计划 10 5
· Estimate · 估计这个任务需要多少时间 800 1200
Development 开发 480 630
· Analysis · 需求分析 (包括学习新技术) 60 30
· Design Spec · 生成设计文档 60 80
· Design Review · 设计复审 (和同事审核设计文档) 30 45
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 30 60
· Coding · 具体编码 120 360
· Code Review · 代码复审 30 45
· Test · 测试(自我测试,修改代码,提交修改) 120 120
Reporting 报告 120 120
· Test Report · 测试报告 60 30
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 1200 1610
8、项目小结:

​ 这个项目最大的一个特点不是项目本身,而是项目的开发模式,结对编程是之前没有接触过的一种编程方式,也是以后工作可能会经常使用的一种开发模式。这次的项目与乐滔同学一起完成,分工方面乐滔同学完成了项目的四则表达式的生成部分(其中包含了对各种运算符的判断问题以及括号的添加位置和结果的非负性保证)和答案的生成部分,我主要完成的是文件的IO读写操作(之前乐滔同学在写的时候使用的控制台输出),以及最后的答案判断问题。代码数量方面乐滔同学编写的代码要远远大于我编写的代码数量。问题探讨方面只要体现在对于四则表达式生成方法以及答案判断正误的部分,双方各自表达了自己的观点,每个人负责自己的部分,遇到的困难解决起来也就方便了很多。

Java实现四则运算---任路乾,乐滔的更多相关文章

  1. 【转】java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  2. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...

  3. Java架构师之路:JAVA程序员必看的15本书

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  4. Java工程师修炼之路(校招总结)

    Java工程师修炼之路(校招总结) 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易, ...

  5. Java工程师修炼之路(从小白到BAT的两年学习历程)

    ​ 作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...

  6. java架构师之路:推荐的15本书

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  7. 入坑Java的自学之路

    # 入坑Java的自学之路 ## 基础知识 - 编程语言:Java python c- 基本算法- 基本网络知识 tcp/ip http/https- 基本的设计模式 ------ ## 工具方面 - ...

  8. 四则运算 Java 姚康友,黎扬乐

    github项目传送门:https://github.com/yaokangyou/arithmetic 项目要求 功能列表 [完成] 使用 -n 参数控制生成题目的个数 [完成] 使用 -r 参数控 ...

  9. Java踩坑之路

    陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一 ...

随机推荐

  1. 【C++】

    C++声明function后面加上等于0(=0)何解? https://zhidao.baidu.com/question/1446181256925153340.html

  2. PHP redis client封装

    config1.inc.php if (!isset($_REQUEST['pageName']) || $_REQUEST['pageName'] != 'txl-app-test') { $CON ...

  3. 将自己数据转化为cifar10支持的lmdb

    大家都知道,在caffe里面,要运行cifar10的例子就得先由cifar10的数据库.由于caffe为了提高运行效率,减少磁盘寻道时间等,统一了数据接口(lmdb,leveldb). 首先,看一下c ...

  4. [Z] 用GDB调试程序

    原文:http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工 ...

  5. linux shell find

     find /  -ctime +365 ! -name "*.bat" -exce rm -rf {} \;

  6. 解决“在上下文中找不到 owin.Environment 项”

    网站发布到虚拟空间后,提示以下错误:在上下文中找不到 owin.Environment 项",百度了好长时间都没有解决.最后在web.config中添加以下配置. <system.we ...

  7. linux查找目录下的所有文件中是否含有某个字符串 <zhuan>

    查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...

  8. 高并发下redis缓存穿透问题解决方案

    一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...

  9. /etc/rc5.d/s991local: line25: eject:command not found错误

      使用虚拟机安装centos出现错误,原因是我使用的镜像是最小级别的,没有图形化界面,只有终端窗口 有人用vmware安装minimal centos报错/etc/rc5.d/s99local : ...

  10. shell编程——sed用法之参数详解

    sed格式: sed 参数 '正则表达式' 文件名 sed的常见参数有以下几种: 1.-n, --quiet, --silent 取消自动打印模式 不加n默认打印整个文件: [root@localho ...