软件工程导论项目之小学生四则运算出题软件

要求:

  • 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
  • 每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
  • 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
  • 当程序接收的参数为4时,以下为一个输出文件示例。
  • 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号数必须大于2对,且不得超过运算符的个数。
  • 扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数

Coding.net源码仓库地址:

                  https:https://git.dev.tencent.com/Cathy_Yang/arithmetic_.git

                  ssh:[email protected]:Cathy_Yang/arithmetic_.git

测试步骤:

1.进入src文件夹

2.在命令行输入javac -encoding utf-8 *.java

3.回车再输入java Main 1000

4.回车,将会在src同级目录下产生result.txt

项目结构:

  • 项目主要是参考的学姐的代码,由四个类构成。
  • Main.java负责对输入数据进行判断,并产生文件;CreateFile.Java负责文件在指定路径的生成,并随机选择每次生成哪种运算式(包括简单四则运算、有括号的四则运算、真分数的加减运算),直到达到输入要求的运算式即可;每次生成运算式都要执行GenFormula.java类,该类提供了三种运算式对应的三个方法simple(),properFraction() 和 brackets() 方法,
  • 其中在simple() 方法中为了避免在运算过程和结果中出现负数出现,在产生运算符时有限制条件,即:减号后仅允许加号,防止负数出现以及除号后仅允许乘号与加号,防止负数;在brackets() 方法中为了生成括号,先以一定概率生成左括号,再随机生成与之配对的右括号;在properFraction() 方法中为了保证随时都是真分数,每次配对生成分子或者相加减的时候都要进行是否是真分数的判断(判断方法在Calculator.java类中)。
  • 最后一个类为Calculator.java,其中的eval() 函数直接可以用来计算字符串结果的计算,省了很多事,其他的方法每个都只有几行,非常简洁易懂,学姐就是历害啊 (ง •̀_•́)ง,然后我把学姐之前写的分数相加和相减的两个方法结合成了一个方法,因为我发现他们代码重复度很高,只有一行不一样,所以写成一个方法可以减少更多的代码,而在GenFormula.java类中的真分数生成方法中正好一直有一个 key[] 标记作为运算符的下标标记,正好可以作为Calculator类中判断是相加还是相减的参数。

参考博客:

  1. 大一没有好好学Java,现在做项目基本上都忘完了。使用Random()函数创建随机数,形成操作数。Ⅰ:调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。Ⅱ:Random random = new Random(); random.nextInt(n)的取值范围是[0,n)。java中有两种random函数,详见博客:https://www.cnblogs.com/ningvsban/p/3590722.html。
  2. Java中强制转换格式:int   n = Integer.parseInt(args[0]);
  3. 创建文件的方法之一,例:在上一级路径中创建名为“result.txt”的文件,最后记得关闭。
  4. FileWriter类和BufferedWriter区别与用法:https://blog.csdn.net/Jerry_CSDN_YZR/article/details/71124206
  5. String.valueOf()函数的用法:https://blog.csdn.net/springk/article/details/6414017
  6. 使用函数计算式子的值:https://www.cnblogs.com/liu-fei-fei/p/5623017.html,https://blog.csdn.net/msyqmsyq/article/details/52954833
  7. Math.abs(x)=|x|,该函数用于求绝对值:https://zhidao.baidu.com/question/167319873.html
  8. 利用git上传项目到coding上的步骤:https://www.cnblogs.com/gdfhp/p/5889168.html,过程中太多bug了,心累。coding中文件的在线删除和新建:https://segmentfault.com/a/1190000000726192

PSP:

PSP2.1

任务内容

计划共完成需要的时间(h)

实际完成需要的时间(h)

Planning

计划

0.5

0.5

·        Estimate

·   估计这个任务需要多少时间,并规划大致工作步骤

0.1

0.1

Development

开发

35

37

·        Analysis

·         需求分析 (包括学习新技术)

4

5

·        Design Spec

·         生成设计文档

1

1

·        Design Review

·         设计复审 (和同事审核设计文档)

0.5

0

·        Coding Standard

·         代码规范 (为目前的开发制定合适的规范)

1

3

·        Design

·         具体设计

0.5

0.5

·        Coding

·         具体编码

32

35

·        Code Review

·         代码复审

0.5

0.5

·        Test

·         测试(自我测试,修改代码,提交修改)

3

4

Reporting

报告

0.2

0.2

·         Test Report

·         测试报告

0.1

0.1

·         Size Measurement

·         计算工作量

0

0

·         Postmortem & Process Improvement Plan

·         事后总结, 并提出过程改进计划

0.1

0.1

简单总结:

     这次主要是花了大部分时间理解学姐的博客和代码,所以并没有花太多时间,要是自己动手写所有的代码可能要花两倍的时间吧,主要还是大一学JAVA没有扎实学好,现在是很后悔,不过有什么办法捏,只有现在好好学了。学姐的博客和代码都条理清晰,代码的注释也多,看起来非常易懂,以后我自己做项目写博客也会学习学习学姐的。通过这个项目还是捡起来了很多Java的知识,感觉还是很有收获的,希望下次能自己亲手敲出来一个完整的项目,那样成就感肯定会更高吧,加油加油。

猜你喜欢

转载自blog.csdn.net/yigexuaoxiannv/article/details/88428117