软件工程 week 04
四则运算
一、摘要
作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266
git仓库地址:https://git.coding.net/kefei101/f4.git
结对成员:田佳欣 https://www.cnblogs.com/tianjx687/p/9933776.html
二、需求分析
通过对题目功能一、功能二、功能三的分析,我们共提取出以下6个需求:
1、对输入格式的判断,以及路径、提示功能的实现;
2、分别实现整数运算、整数小数运算;
3、分别实现不含括号的四则运算、含括号的四则运算;
4、对运算结果的处理分别实现保留三位小数、日常化;
5、分别实现答题计算、输出算式结果到指定txt文件;
6、分别实现表达式可重复的四则运算、表达式不重复的四则运算。
三、解题思路
我们共设计了6个类,如图:
Creat类:负责随机产生N条3个运算符,4个运算数的四则运算的式子。
Calculator类:负责计算答案。
MakeFile类:负责运算结果输出至控制台上,且保存到指定位置的txt文件中。
Symbol类:负责将产生的代表运算符的数字转换成对应的运算符。
(0:“+”;1:“-”;2:“*”;3:“/”)
Result类:负责处理不同功能要求的输出结果格式。
Main类:主类,负责接收控制台输入,并判断其输入格式,应实现的功能。
6个类的相互调用关系为:
比较重要的函数有:
Main类:main():判断输入格式以及路径、提示功能的实现,主要是逻辑。
Create类:createProblem(int n,int no):随机产生N个运算数为整数,不带括号的四则运算式子;createSm(int n):随机产生N个运算数为整数小数均可的,带有括号的四则运算式子。(n表示n个式子,no表示功能一二的选择)
Calculator类:algorithm(int[] var):计算运算数为整数,不带括号的式子具体计算算法;bracketsAlgo(int[] var):计算运算数整数小数均可 ,带括号的式子计提计算算法。(var[]代表将要存放的运算符)
MakeFile类:creatFile(int n,String filename):将N个四则运算式子输出并存放到指定文件夹。(n表示n个式子,filename表示指定txt文件路径)
Result类:treat(double res):实现不同功能对对输出结果的要求。
四、测试运行
1、输入格式错误:
2、功能一、功能二
3、功能三
五、重要代码展示
1、主方法main()测试:由于有足够的前期基础,逻辑这块没有多大难度,唯一有点难度的,就是会使用库方法获取项目路径。
1 /** 2 * Main主函数 3 * @param args args 4 */ 5 public static void main(String[] args){ 6 7 if(args.length==0){ 8 System.out.println("请进入小程序所在文件夹,并以正确的格式输入。"); 9 System.exit(1); //结束运行 10 } else if (args.length == 2) { 11 if (args[0].equals("-n")) { 12 if (args[1].matches("^[0-9]*$")) { 13 int num = Integer.parseInt(args[1]); 14 if (num < 0) { 15 System.out.println("题目数量必须是 正整数。"); 16 System.exit(1); //结束运行 17 }else{ 18 Create create = new Create(); 19 create.createProblem(num, 1); 20 } 21 } else { 22 System.out.println("题目数量必须是 正整数。"); 23 System.exit(1); //结束运行 24 } 25 } else if (args[0].equals("-c")) { 26 if (args[1].matches("^[0-9]*$")) { 27 int num = Integer.parseInt(args[1]); 28 if (num > 100 || num < 1) { 29 System.out.println("题目数量范围为1到100之间的正整数。"); 30 System.exit(1); //结束运行 31 }else { 32 Create create = new Create(); 33 create.createProblem(num, 2); 34 } 35 } else { 36 System.out.println("题目数量范围为1到100之间的正整数。"); 37 System.exit(1); //结束运行 38 } 39 } else { 40 System.out.println("输入格式错误!"); 41 System.exit(1); //结束运行 42 } 43 } 44 //f4 -c 题目总数 -f txt文件路径 45 else if (args.length == 4) { 46 String fileName = args[3]; 47 if (args[0].equals("-c") && args[2].equals("-f")) { 48 if (args[1].matches("^[0-9]*$")) { 49 int num = Integer.parseInt(args[1]); 50 if (num > 100 || num < 1) { 51 System.out.println("题目数量范围为1到100之间的正整数。"); 52 System.exit(1); //结束运行 53 }else { 54 MakeFile makeFile = new MakeFile(); 55 makeFile.creatFile(num, fileName); 56 } 57 } else { 58 System.out.println("题目数量范围为1到100之间的正整数。"); 59 System.exit(1); //结束运行 60 } 61 } else { 62 System.out.println("输入格式错误!"); 63 System.exit(1); //结束运行 64 } 65 } else { 66 System.out.println("输入格式错误!"); 67 System.exit(1); //结束运行 68 } 69 }
2、Create类中的createProblem(int n,int no)方法和createSm(int n)方法:这个两个方法中,我们认为操作数要求是整数,结果还需要四舍五入比较难处理。由于已经确定操作符和操作数个数,在其中分别根据功能的选择调用Calculator的algorithm(opNum)和bracketsAlgo(opNum)方法,将在此输入的用户答案与计算返回的答案比较,输出。总体来说,不算太难。
1 //产生n个式子 2 for(int i=0;i<n;i++) { 3 calculator = new Calculator(); 4 //初始化操作符类 5 for(int j=0;j<operatorCount;j++){ 6 opNum[j]=0; 7 } 8 //随机产生式子并计算结果 9 if(no==1) { 10 equation = calculator.algorithm(opNum); 11 }else if(no==2){ 12 equation = calculator.bracketsAlgo(opNum); 13 } 14 StringTokenizer stringTokenizer = new StringTokenizer(equation, "="); 15 ArrayList<String> list = new ArrayList<String>(); 16 while (stringTokenizer.hasMoreElements()) { 17 list.add(stringTokenizer.nextToken()); 18 } 19 //输出式子 20 System.out.println(list.get(0)); 21 //输入 22 System.out.print("?"); 23 Scanner scanner = new Scanner(System.in); 24 String ans = scanner.next(); 25 //判断输入是否与正确答案相符 26 if(ans.equals(list.get(1))){ 27 count++; 28 System.out.println("回答正确。"); 29 }else { 30 System.out.println("回答错误,正确答案是" + list.get(1) + "。"); 31 } 32 }