
任务1源码在Github的仓库主页链接地址:
需求分析:
功能设计:
基本功能:
设计实现:
利用Visio进行流程图的绘制,具体流程图如下:其中ContentToTxt(将结果写入文件) Main(主程序可以从命令行接收参数) ReversePolish (逆波兰表达式) RandomEquation(产生等式) (运行后产生的结果)
测试运行:
核心代码:
1) 随机产生等式模块:为了看起来整洁,去掉了测试过程中注释掉的打印输出部分。等式生成是将生成的数字与运算符依次拼接,之后加上等号构成等式,在构建过程中去除运算符只有一种的情况、分母为0的情况,分子分母有余数的情况。
1 public class RandomEquation {
2 public static String randomEquation (){
3
4 // Previous expressions
5
6 String sBefore = new String();
7
8 // The later expression
9
10 String sLater = new String();
11 char[] equation;
12 int k = 6;
13 int n;
14 int m;
15 int j;
16 int i;
17 int[] number;
18 char[] symbol;
19 number = new int[k];
20 symbol = new char[k];
21 equation = new char[2 * k];
22 char[] cSymbol = {'+','-','*','÷'};
23 Random random = new Random();
24
25 // Generating operator
26
27 for(i = 0;i<(int)(Math.random()*3)+3;i++){
28 int index = Int(cSymbol .length);
29 char resultChar = cSymbol[index];
30 symbol[i] = resultChar;
31
32 }
33 for(m = 0;m < i;m++){
34 if(symbol[i - 1] != symbol[m]){
35 break;
36 }
37 }
38
39 /*
40 * Removal of only one operator
41 * If the last symbol is the same as the previous one, the last one generates a symbol at random.
42 */
43
44 if(m == i){
45 do{
46 int index = Int(cSymbol.length);
47 char resultChar = cSymbol[index];
48 symbol[i - 1] = resultChar;
49 }while(symbol[i - 1] == symbol[i - 2]);
50 }
51
52 // Generating number
53
54 for(j = 0;j < i + 1;j++){
55
56 int num = (int)(Math.random()*100);
57 number[j] = num;
58
59 }
60
61 // Generating equation
62
63 for(n = 0;n < i;n++){
64 sBefore += String.valueOf(number[n])+String.valueOf(symbol[n]);
65 }
66 sBefore += String.valueOf(number[i]);
67
68 // Save symbols and numbers into a equation array
69
70 for(n = 1;n < 2 * i;n = n+2){
71
72 equation[n] = symbol[(n - 1) / 2];
73 }
74 for(n = 0;n < 2 * j - 1;n = n+2){
75
76 equation[n] = (char)number[(n + 1) / 2];
77
78 }
79
80 // The removal ÷ denominator is 0 and the molecular denominator is incompatible
81
82 for(n = 1;n < i + j && n + 1 < i + j;n = n + 2){
83 if(equation[n] == '÷'){
84 if(equation[n + 1]==0){
85 do{
86 int num2 = (int)(Math.random()*100);
87 equation[n + 1] = (char)num2;
88 }while(equation[n + 1] == 0);
89 }
90 else if((int)equation[n - 1] % (int)equation[n + 1]!=0 || (int)equation[n - 1]<(int)equation[n + 1]){
91 do{
92
93 int num2 = (int)(Math.random()*100) + 1;
94 equation[n + 1] = (char)num2;
95 if(equation[n + 1] == 0){
96 do{
97 int num3 = (int)(Math.random()*100);
98 equation[n + 1] = (char)num3;
99 }while(equation[n + 1] == 0);
100 }
101
102 }while((int)equation[n - 1] % (int)equation[n + 1]!= 0 || (int)equation[n - 1]<(int)equation[n + 1]);
103 }
104
105 }
106
107
108 }
109 // The equation after excluding special circumstances
110
111 for(n = 0;n < i+j && n + 1 < i + j;n = n + 2){
112
113 sLater += String.valueOf((int)equation[n]);
114 sLater += String.valueOf(equation[n + 1]);
115
116 }
117 sLater += String.valueOf((int)equation[i + j - 1]);
118 sLater += String.valueOf('=');
119
120 return sLater;
121 }
122
123 } 2)逆波兰模块借鉴这位博主的写法,并在理解的基础上进行了代码的加工。当中间结果小于0或者a%b!=0时,利用return跳出该函数,并在下边的模块中利用返回值进行等式的重新生成。
1 public static int calcInt(int a, int b, String stmp)
2 {
3 int res = 0;
4 char s = stmp.charAt(0);
5 switch (s) {
6 case '+': {
7 res = a + b;
8 break;
9 }
10 case '-': {
11 res = a - b;
12 if(res < 0){
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 return -1;
25 }
26 break;
27 }
28 }
29 return res;
30 } 3)结果写入文件模块,由于随机产生等式,所以需要一直将该等式保存到字符串里,并对该字符串进行逆波兰求解,否则若随机产生式子randomEquation(),之后又利用ReversePolish(randomEquation()))产生的随机等式的结果,这样会出现等式计算结果与最终运算结果不匹配的情况。在该模块中利用返回值的不同进行结果的保存,若返回值为-1或者大于用户输入的结果值result,就将i的值自减,这样就相当于重新产生符合条件的式子。
1 for(int i = 0;i < questionAmount;i++){
2
3 String randoms = randomEqual.randomEquation();
4 final boolean existed = versePolish(randoms) != -1 && versePolish(randoms) < 500;
5 if(existed){
6
7 tToTxt(strFilePath,String.valueOf(randomsversePolish(randoms)));
8 tToTxt(strFilePath,String.valueOf("n"));
9 }else{
10 i--;
11 }
12 } 总结:
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 |
转载于:.html
本文发布于:2024-01-30 22:26:48,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170662480923270.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |