加减乘除四则运算
个人项目实战-四则混合运算
coding.net源码地址 :https://git.dev.tencent.com/qyj814/fours.git
一.实验要求
基本任务:
使用java编程语言,独立完成一个3到5个运算符的四则运算练习的软件。
软件基本功能要求如下:
- 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
- 每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
- 当程序接收的参数为4时,以下为一个输出文件示例。
2018010203
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
软件附加功能要求如下:(请有余力的同学完成)
- 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号数必须大于2对,且不得超过运算符的个数。
- 扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。
二.操作步骤
首先,分析题意,做基本的需求分析,总体设计等;其次,根据详细设计编写代码并进行测试;最后,上传文件到coding.net上。
三.代码分析
主要文件
1.创建整数核心代码
public string[] createproblem(){ random random = new random(); int operatorcount =3 + random.nextint(3); //随机操作符的个数(3-5个) int operand[] = new int[operatorcount + 1]; //操作数个数 int[] operatorindex = index(operatorcount, 4, random); for(int i = 0; i < operatorcount + 1; i++){ operand[i] = random.nextint(101);//随机生成(0-100)之间的数 } string formula = stitchingformula(operatorcount, operand, operatorindex); //计算结果 calculator calculator = new calculator(); int res = calculator.algorithm(formula); string formulares[] = new string[2]; if (res > 0){ formulares[0] = formula; formulares[1] = string.valueof(res); }else { return createproblem(); } return formulares; }
2.创建分数核心代码
public string[] createproblem(){ random random = new random(); int operatorcount = 1 + random.nextint(3); //操作符的个数(1-3)个 createinteger create = new createinteger(); int[] operatorindex = create.index(operatorcount,2, random); //操作符的下标 //生成第一个操作数 int[] coprimenumber1 = createcoprimenumbers(random); int x = coprimenumber1[0]; int y = coprimenumber1[1]; string s = x + "/" + y; for(int i=0; i < operatorcount; i++){ //生成剩下的操作数 int[] coprimenumber = createcoprimenumbers(random); int numx = coprimenumber[0]; int numy = coprimenumber[1]; string currentopreator = operator[operatorindex[i]]; if(currentopreator.equals("+")){ //加法 int count = 0; if(x * numy + y * numx > y * numy) { numx = y - x - 1; numy = y; if(numx <= 0) numx = 1; numy = 2 * y; } x = x * numy + y * numx; y = y * numy; int greatfactor = greatfactor(numx,numy); numx /= greatfactor; //最终结果化简 numy /= greatfactor; } else { //减法 if(x * numy - y * numx < 0){ numx = x -1; numy = y; if(numx <= 0) numx = 1; numy = 2*y; } x = x * numy - y * numx; y = y * numy; int greatfactor = greatfactor(numx,numy); numx /= greatfactor; //最终结果化简 numy /= greatfactor; } string num = numx + "/" + numy; s += currentopreator + num; } int greatfactor = greatfactor(x,y); x /= greatfactor; //最终结果化简 y /= greatfactor; string res = shamtoproperfraction(x, y); s += "="; string formulares[] = {s, res}; return formulares; }
3.计算核心代码
private int calculate(int a, int b, string stmp) { //计算a stmp b的值 int res = 0; //存结果 char s = stmp.charat(0); switch (s) { case '+': { res = a + b; break; } case '-': { res = a - b; //产生负数就不合格 break; } case '*': { res = a * b; break; } case '÷': { if(b==0) return -1; else if(a%b!=0) //产生小数就不合格 return -2; else res = a / b; break; } } return res; }
4.生成问题并输出到文件核心代码
public void generateproblem(int num) throws ioexception { //项目根目录生成文件 file file = new file("./result.txt"); if(file.exists()) { file.delete(); file.createnewfile(); } fileoutputstream fileoutput = new fileoutputstream(file); printstream fileprintstream = new printstream(fileoutput); random random = new random(); createfraction createfraction = new createfraction(); createinteger createinteger = new createinteger(); string[] problem = new string[2]; fileprintstream.println("2017012454"); for(int i = 1; i <= num; i++){ int choose = random.nextint(2); //选择生成分数还是整数 if (choose == 0){ problem = createinteger.createproblem(); }else { problem = createfraction.createproblem(); // problem = createinteger.createproblem(); } outputfile(problem, fileprintstream); // system.out.println(i); } fileoutput.close(); fileprintstream.close(); system.out.println("文件创建成功 "); }
四.psp分析
psp2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
planning | 计划 | 3 | 5 |
estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | ||
development | 开发 | 60 | 83 |
analysis | 需求分析 (包括学习新技术) | ||
design spec | 生成设计文档 | ||
design review | 设计复审 (和同事审核设计文档) | ||
coding standard | 代码规范 (为目前的开发制定合适的规范) | ||
design | 具体设计 | ||
coding | 具体编码 | ||
code review | 代码复审 | ||
test | 测试(自我测试,修改代码,提交修改) | ||
reporting | 报告 | 5 | 7 |
test report | 测试报告 | ||
size measurement | 计算工作量 | ||
postmortem & process improvement plan | 事后总结, 并提出过程改进计划 |
五.心得体会
这个项目我用了两个周末四天,外加两周内零零散散的时间,一共用了八十多个小时,即使这样,我的代码还是有很多不足,比如说:生成整数问题时例子太少(由于本人实在写不下去了,都快写吐了);生成分数问题时,一部分定义成了不太随机了,因为生成随机数的范围太小,所以生成问题时不满足条件的情况太多了,while循环一直卡着,所以我就索性定义成了不随机的。要说我这两周写代码以来最大的体会,就是自己知识还是不足,遇到不懂的问题就得上网去查,一查又浪费了很多时间;写出来的代码也不是准确的,debug又花好多时间;总而言之,做完项目让我觉得我要好好学习了。
上一篇: 10分钟学会发送邮件到指定邮箱
下一篇: 孔雀东南飞