利用Visio进行流程图的绘制,具体流程图如下:其中ContentToTxt(将结果写入文件) Main(主程序可以从命令行接收参数) Polish(逆波兰表达式) Randomequal(产生等式) result.txt(运行后产生的结果)
1) 随机产生等式模块:为了看起来整洁,去掉了测试过程中注释掉的打印输出部分。等式生成是将生成的数字与运算符依次拼接,之后加上等号构成等式,在构建过程中去除运算符只有一种的情况、分母为0的情况,分子分母有余数的情况。
1 public static String randomequal() 2 { 3 String s=new String();//之前的表达式 4 String s1=new String();//之后的表达式 5 char equal[]; 6 int i,j,m,n,k=6; 7 8 int number[]; 9 char symbol[]; 10 number=new int[k]; 11 symbol=new char[k]; 12 equal=new char[2*k]; 13 14 char[] c ={'+','-','*','/'}; 15 Random random=new Random(); 16 //生成符号 17 for(i=0;i<(int)(Math.random()*3)+3;i++)//3~5个运算符 18 { 19 int index=random.nextInt(c.length); //得到一个随机下标 20 char resultChar=c[index]; 21 symbol[i]=resultChar; 22 23 } 24 for(m=0;m<i;m++) 25 { 26 if(symbol[i-1]!=symbol[m]) 27 { 28 break; 29 } 30 } 31 //去除只有一种运算符的情况 32 if(m==i)//最后一个与前几个相同,最后一个随机生成一个符号 33 { 34 do 35 { 36 int index=random.nextInt(c.length); //得到一个随机下标 37 char resultChar=c[index]; 38 symbol[i-1]=resultChar; 39 } 40 while(symbol[i-1]==symbol[i-2]); 41 } 42 //生成数字 43 for(j=0;j<i+1;j++)//4~6个数字 44 { 45 46 int num=(int)(Math.random()*100);//生成数字0~100 47 number[j]=num; 48 49 } 50 51 52 //产生等式 53 for(n=0;n<i;n++) 54 { 55 s+=String.valueOf(number[n])+String.valueOf(symbol[n]); 56 57 //System.out.println(s); 58 } 59 s+=String.valueOf(number[i]); 60 61 //将符号与数字存入char equal数组中 62 for(n=1;n<2*i;n=n+2) 63 { 64 65 equal[n]=symbol[(n-1)/2]; 66 67 } 68 for(n=0;n<2*j-1;n=n+2) 69 { 70 71 equal[n]=(char)number[(n+1)/2]; 72 73 74 } 75 76 //去掉除法中分母为0的情况以及分子分母除不尽的情况 77 for(n=1;n<i+j&&n+1<i+j;n=n+2) 78 { 79 if(equal[n]=='/') 80 { 81 if(equal[n+1]==0) 82 { 83 do{ 84 int num2=(int)(Math.random()*100); 85 equal[n+1]=(char)num2; 86 } 87 while(equal[n+1]==0); 88 } 89 else if((int)equal[n-1]%(int)equal[n+1]!=0||(int)equal[n-1]<(int)equal[n+1]) 90 { 91 do{ 92 //生成数字0~100 93 int num2=(int)(Math.random()*100)+1; 94 equal[n+1]=(char)num2; 95 if(equal[n+1]==0) 96 { 97 do{ 98 int num3=(int)(Math.random()*100); 99 equal[n+1]=(char)num3; 100 } 101 while(equal[n+1]==0); 102 } 103 104 }while((int)equal[n-1]%(int)equal[n+1]!=0||(int)equal[n-1]<(int)equal[n+1]); 105 } 106 107 } 108 109 110 } 111 //之后的等式 112 for(n=0;n<i+j&&n+1<i+j;n=n+2) 113 { 114 115 s1+=String.valueOf((int)equal[n]); 116 s1+=String.valueOf(equal[n+1]); 117 118 } 119 s1+=String.valueOf((int)equal[i+j-1]); 120 s1+=String.valueOf('='); 121 return s1; 122 }
2)逆波兰模块借鉴这位博主的写法,并在理解的基础上进行了代码的加工。当中间结果小于0或者a%b!=0时,利用return跳出该函数,并在下边的模块中利用返回值进行等式的重新生成。 http://blog.csdn.net/u010485491/article/details/51483720
1 public static int calcInt(int a, int b, String stmp) { 2 int res = 0; 3 char s = stmp.charAt(0); 4 switch (s) { 5 case '+': { 6 res = a + b; 7 break; 8 } 9 case '-': { 10 res = a - b; 11 if(res<0) 12 { 13 return -1; 14 } 15 break; 16 } 17 case '*': { 18 res = a * b; 19 break; 20 } 21 case '/': { 22 res = a / b; 23 if(a%b!=0) 24 { 25 return -1; 26 } 27 break; 28 } 29 } 30 return res; 31 }
3)结果写入文件模块,由于随机产生等式,所以需要一直将该等式保存到字符串里,并对该字符串进行逆波兰求解,否则若随机产生式子randomequal(),之后又利用polish(randomequal())产生的随机等式的结果,这样会出现等式计算结果与最终运算结果不匹配的情况。在该模块中利用返回值的不同进行结果的保存,若返回值为-1或者大于用户输入的结果值result,就将i的值自减,这样就相当于重新产生符合条件的式子。
1 for(i=0;i<amount;i++) 2 { 3 4 String randoms=randomequal(); 5 if(polish(randoms)!=-1&&polish(randoms)<result) 6 { 7 8 contentToTxt(str,String.valueOf(randoms+polish(randoms))); 9 contentToTxt(str,String.valueOf("n")); 10 } 11 else 12 { 13 i--; 14 } 15 }
总结:
PSP:
PSP2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 20 | 25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 20 | 25 |
Development | 开发 | 360 | 418 |
Analysis | 需求分析 (包括学习新技术) | 10 |
10 |
Design Spec | 生成设计文档 | 10 | 8 |
Design Review | 设计复审 (和同事审核设计文档) | 10 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 30 | 35 |
Coding | 具体编码 | 240 | 280 |
Code Review | 代码复审 | 20 | 25 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 25 |
Reporting | 报告 | 20 | 27 |
Test Report | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 5 | 12 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 10 | 10 |
参与评论
手机查看
返回顶部