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. django之上传图片

    上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...

  2. dbf 命令 及数据类型

    left()函数只能截取左边几位字符,截取中间字符用SUBSTR() SUBSTR(cExpression, nStartPosition [, nCharactersReturned]) dbf u ...

  3. Git(三):Git 使用规范流程

    转:http://www.ruanyifeng.com/blog/2015/08/git-use-process.html 团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 否则,每个人 ...

  4. UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢

    实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAsync 3,LoadSceneAsync 其它未经测试 此问题的提出是由于一 ...

  5. spring 采用编程式事务

    1.getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() ...

  6. 判断当前Selection是否为prefab

    [判断当前Selection是否为prefab] PrefabUtility.GetPrefabParent(target) == null && PrefabUtility.GetP ...

  7. winfrom 循环播放图片

    没啥新东西了,就是遍历和匹配文件名然后获取对象,放到picturebox里面 选中listview中想要查看的图片,然后点击查看按钮,进行↓代码. if (listView1.SelectedItem ...

  8. Github 使用的Markdown语言

    简介 官方站点:http://daringfireball.net/projects/markdown/syntax 中文介绍:http://www.worldhello.net/gotgithub/ ...

  9. spring4-2-bean配置-3-自动装配

  10. c++ std::unordered_set

    std::unordered_set template < class Key, // unordered_set::key_type/value_type class Hash = hash& ...