Coding.net原码仓库地址:https://git.coding.net/caoying/FourArithmeticOperation.git
一.前言
其实对于我个人来说,这次作业还是很有难度的。首先,我自己代码能力薄弱;另外,我是主要学前端,对后端Java开发语言其实很不熟悉,虽然之前上过Java课可怎么上的、上的怎么样其实自己也心知肚明。最后一点,就是思路和算法,其实如果换做学ACM和后端的同学来说,这个应该不在话下,但对于我来说,实际上是比较难的。归根到底,还是自己学的太浅。所以我这些天以来,先是把大家的博客仔仔细细的看了一遍,动笔记录别人的想法和点子;然后自己边看Java书,边百度,边尝试写代码。因为我有很多不懂的地方,所以也看了很多查了很多,甚至自己把好久不用的过期的myeclipse删掉重下并自己摸索着破解来写Java代码。总而言之,这次作业是边学边完成的。
二.需求分析
根据作业要求,使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的命令行软件开发。
软件基本功能要求如下:
1.程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
2.每个练习题至少要包含2种运算符。同时根据小学生的特点,练习题在运算过程中不得出现负数与非整数。
3.练习题生成好后,将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,文件目录与程序目录一致。
三.功能设计
基本功能:输入运算式数的个数,输入每个运算术式的运算符的数量;输出四则运算式,输出结果。
四.设计实现
基本思路:1.运算式里的数用Math.random()函数生成随机数;
2.运算符“+,-,*,÷”用数组存,用Math.random()函数生成随机数来访问数组下标从而生成;
3.运算式式子、个数、结果用自己定义的makeQuestions()函数生成。
五.算法详解
1.运算数的生成
我的思路是利用数组、for循环和Math.random()函数来生成运算数。
int QuestionOfNum[] = new int[6];//运算式里的数的最多个数 for(int i=0; i<OperationalFormula; i++){//i从1循环到运算式个数为止 QuestionOfNum[0] = (int)(Math.random()*100); }
2.运算符的生成
我的思路是利用数组来存放运算符的个数和四个运算符,再用Math.random()函数生成随机运算符。
char QuestionOfOp[] = new char[5];//运算式里运算符的最多个数 char[] op = new char[] {'+', '-', '*', '÷'};//数组存放运算符
生成的运算符代码例子:
QuestionOfOp[j] = op[ (int)(Math.random()*1)];
3.运算式的生成
String question = "" + QuestionOfNum[0]; for(int j=0; j<ops; j++){ question = question + QuestionOfOp[j] + QuestionOfNum[j+1];
} question = question + "=" + result(question); System.out.println(question); questionList[i] = question; //生成运算式
4.计算运算结果
Main.java中:
Lib.makeQuestions(questionList, OperationalFormula, operator); //调用Lib中的makeQuestions函数
Lib.java中:
for(int i=0; i<OperationalFormula; i++){ QuestionOfNum[0] = (int)(Math.random()*100);//生成运算式的数是随机的 for(int j=0; j<ops; j++){ if( QuestionOfOp[j-1]=='+') QuestionOfOp[j] = op[ (int)(Math.random()*1)]; else QuestionOfOp[j] = op[ (int)(Math.random()*3)]; QuestionOfNum[j+1] = (int)(Math.random()*50); //运算符为加时生成的随机运算符和运算式的数的个数 if( QuestionOfOp[j] == '-') { String dis = "" + QuestionOfNum[0]; int Num = result(dis); QuestionOfNum[j+1] = (int)(Math.random()*Num); for(int k=0; k<j; k++) dis =dis + QuestionOfOp[k] + QuestionOfNum[k+1]; } //运算符为减时生成的随机运算符和运算式的数的个数 else if( QuestionOfOp[j] == '*') { QuestionOfNum[j] = (int)(Math.random()*20); QuestionOfNum[j+1] = (int)(Math.random()*100/QuestionOfNum[j]); } //运算符为乘时生成的随机运算符和运算式的数的个数 else if( QuestionOfOp[j] == '÷') { QuestionOfNum[j+1] = (int)(Math.random()*10); QuestionOfNum[j] = QuestionOfNum[j+1]* (int)(Math.random()*10); } //运算符为除时生成的随机运算符和运算式的数的个数 }//加减乘除
5.输出运算结果
Main.java中:
try { Lib.Filefile(questionList, OperationalFormula, path); //调用Lib中的文件将结果输出到path里面 s.close(); } catch(IOException ioe) { System.out.println("文件生成错误"); }//将makeQuestions中的OperationalFormula个运算式和结果输出到path文件里
Lib.java中:
static public void Filefile(String[] questionList, int OperationalFormula, String path) throws IOException{ FileOutputStream f = new FileOutputStream(new File(path));
PrintStream output = new PrintStream(f);
for(int i=0; i<OperationalFormula; i++){ output.println(questionList[i]);
}
output.println("2016012102"); output.close(); }//将makeQuestions中的OperationalFormula个运算式和结果输出到path文件里
六.测试运行
myeclipse运行的结果以及将学号、生成的n道练习题、正确答案输出到文件“result.txt”的结果:
七.项目总结
1.我码代码的过程其实还比较困难和漫长,我是先看了其他同学的博客,了解同学们的解题思路和方法,然后尝试自己一点点去写。写的时候我百度了很多具体的函数实现方法,首先是将问题按照功能设计拆分成一小部分一小部分(就是“设计实现”),然后对这些一小部分一小部分进行编码去实现,一点点来一个功能一个要求的来实现。
2.项目主要是完成了基本功能,至于附加的扩展功能还需要继续努力实现。
3.通过做这个项目,我又重新拾起了Java,迫使我去多看、去思考、去码代码,促进了自身的学习。
八.PSP展示
其实在这个项目实现中,码代码和写博客(报告)的时间是与预估时间差别最大的。前者主要原因是我自身码代码能力弱,思路不清晰;后者主要原因是需要整理的东西太多,梳理起来有些久和乱。其他虽然大多久于预估时间,但是大概和预估时间差不了多少。总之,辛苦很多,收获很多。