项目源码地址:https://git.coding.net/cuixh998/week2homework2.git
目录中的result.txt文件见测试效果。
1.需求分析
软件基本功能要求如下:
Ⅰ程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
Ⅱ每个练习题至少要包含2种运算符。所出的练习题在运算过程中不得出现负数与非整数。
Ⅲ练习题生成好后,将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
软件附加功能要求如下:
Ⅰ支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。
Ⅱ扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可)。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。
2.功能设计
Ⅰ基本功能:满足软件基本功能要求的前提下,实现四则运算的功能,并能够将题目输出到文本文件中。
Ⅱ扩展功能:可以生成可以真分数的运算表达式,且分数可以自动化简。
3.设计实现
编码过程中只用了一个类,通过调用不同的方法处理问题,实现程序的功能。
4.算法详解
部分代码如下,加入了一些注释,主要是采用了边生成边计算的方法。
1 flag=0;//上一个符号为乘除,赋值1 2 temp=0;//存储乘除多项式临时结果 3 int count=0;//目前在计算的是第count+1个多项式 4 for(i=0;i<number-1;i++) {//第一次循环,确定乘除号两边的数字 5 if(fh[i]==3||fh[i]==4) { 6 if(flag==0&&fh[i]==4) { 7 czs[i]=1+(int)(Math.random()*99); 8 while(judge(czs[i])==false){ 9 czs[i]=1+(int)(Math.random()*99); 10 } 11 czs[i+1]=1+(int)(Math.random()*99); 12 while(czs[i]%czs[i+1]!=0) { 13 czs[i+1]=1+(int)(Math.random()*99); 14 } 15 flag=1; 16 temp=czs[i]/czs[i+1]; 17 } 18 else if(flag==0&&fh[i]==3){ 19 czs[i]=1+(int)(Math.random()*99); 20 czs[i+1]=1+(int)(Math.random()*99); 21 flag=1; 22 temp=czs[i]*czs[i+1]; 23 } 24 else if(flag==1&&fh[i]==3) { 25 czs[i+1]=1+(int)(Math.random()*99); 26 temp*=czs[i+1]; 27 } 28 else { 29 czs[i+1]=1+(int)(Math.random()*99); 30 while(temp%czs[i+1]!=0) { 31 czs[i+1]=1+(int)(Math.random()*99); 32 } 33 temp/=czs[i+1]; 34 } 35 } 36 else if(flag==1&&(fh[i]==1||fh[i]==2)){//初始化 37 ans[count++]=temp; 38 flag=0; 39 temp=0; 40 } 41 } 42 if(flag==1) {//若最后一个符号为乘除 43 ans[count++]=temp; 44 flag=0; 45 temp=0; 46 } 47 int finans=0;//最终结果 48 count=0; 49 for(i=0;i<number-1;i++) {//第二次循环,确定加减号两边的数字,并计算最终结果 50 if(fh[i]==1||fh[i]==2) { 51 if(i==0) { 52 czs[i]=1+(int)(Math.random()*99); 53 finans=czs[i]; 54 } 55 else if(i==number-2) { 56 if(fh[i-1]==1||fh[i-1]==2) { 57 czs[i]=1+(int)(Math.random()*99); 58 if(finans==0&&fh[i-1]==2) { 59 fh[i-1]=1; 60 } 61 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 62 while(finans<0) { 63 finans=finans+czs[i]+czs[i]; 64 czs[i]=1+(int)(Math.random()*99); 65 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 66 } 67 } 68 // 69 czs[i+1]=1+(int)(Math.random()*99); 70 if(finans==0&&fh[i]==2) { 71 fh[i]=1; 72 } 73 finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]); 74 while(finans<0) { 75 finans=finans+czs[i+1]+czs[i+1]; 76 czs[i+1]=1+(int)(Math.random()*99); 77 finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]); 78 } 79 } 80 else { 81 if(fh[i-1]==1||fh[i-1]==2) { 82 czs[i]=1+(int)(Math.random()*99); 83 if(finans==0&&fh[i-1]==2) { 84 fh[i-1]=1; 85 } 86 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 87 while(finans<0) { 88 finans=finans+czs[i]+czs[i]; 89 czs[i]=1+(int)(Math.random()*99); 90 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 91 } 92 } 93 } 94 } 95 else { 96 if(i==0) { 97 while(fh[i+1]==3||fh[i+1]==4) { 98 i++; 99 if(i==number-2) { 100 break; 101 } 102 } 103 finans=ans[count++]; 104 } 105 else { 106 finans=(fh[i-1]==1)?finans+ans[count++]:finans-ans[count++]; 107 if(finans<0) { 108 fh[i-1]=1; 109 finans=finans+ans[count-1]+ans[count-1]; 110 } 111 if(i>=number-2) { 112 break; 113 } 114 while(fh[i+1]==3||fh[i+1]==4) { 115 i++; 116 if(i>=number-2) { 117 break; 118 } 119 } 120 } 121 } 122 }
5.测试运行
结果如图。
6.部分代码片段
首先是建立一个数组,其中包含0到100的所有素数,同时,通过数组满足程序基本功能的限制,即 3到5的随机数,最多5个操作数,乘除多项式结果,最多2个,最多四个运算符,符号若存在不同则改为1,并先行随机生成,再让符号保证不相同并随机替换。
1 public static void work(int x) { 2 // int sushu[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; 3 // int length=sushu.length; 4 int number=3+(int) (Math.random()*3); 5 int[] czs=new int[5]; 6 int[] ans=new int[2]; 7 int[] fh=new int[4]; 8 int i; 9 int flag=0; 10 int temp; 11 for(i=0;i<number-1;i++) { 12 fh[i]=1+(int) (Math.random()*4); 13 if(fh[i]!=fh[0]) { 14 flag=1; 15 } 16 } 17 if(flag==0) { 18 while((temp=1+(int) (Math.random()*4))!=fh[0]) { 19 fh[(int) (Math.random()*(number-1))]=temp; 20 break; 21 } 22 }
7.总结
编程前:因为自己的java基础不好,有一种畏难心理,小心谨慎的分析项目需求以及如何一步步去实现它,而且需要使用java语言,必须拾起课本重新走一遍,压力挺大的,总觉得自己做不好。
编程过程中:可以说是困难重重了,接二连三的问题扑面袭来,主要体现在哪里?1.编码严重不足,动手能力没有得到充分的锻炼,导致“眼高手低”。2.java基础差,不断的去翻书,去百度,去请教舍友大佬们。3.项目经验不足,不是很熟悉整个流程,仅保留在书本方面的知识。
测试阶段:一步一步去检查,测试,报错之后一点点找原因,让人头大,甚至想回炉重造,干脆重新弄算了,但也得到了舍友的很大帮助,有时就是这样,或许自己发现不了的问题,在别人眼里,一看就能看出来。怎么说呢,最终成功运行的时候挺激动的,感觉增加了自己的经验,心里边有了些自信,多了些动力,也是打算多做一些java的题来提高自己的编码能力了。
8.PSP展示