一.程序设计思想
1.还是在主函数中设置一些变量,来控制功能的实现。定义两个方法operationInt与operationComp,分别实现简单运算与混合运算。
2.在operationInt函数中,先定义四个数组,分别储存计算式的第一个数字、符号转化中间变量,符号和第二个数字。然后随机产生变量,在此过程中,需要先判断是否有乘除法,最后将产生的随机数储存在数组中。在随机生成后,开始依次判断,设置变量T,当有一方不满足题意,改变T的值,从而使这组随机数重新生成。然后判断除法是否有余数,所有计算式是否有重复,在判断计算式是否有重复时,需要考虑到加法与乘法的特殊性。接下来就是打印,利用循环,在输出算式后,要做一个计算算式结果的过程,判断符号然后对第一和第二个数做处理就行了,然后判断客户输入是否和正确结果相同,相同时,变量R递加,最后输出R,即为正确个数;
3.在operationComp函数中,要实现混合运算,先定义两个数组,一个储存混合运算的数字,一个储存混合运算的字符,然后输出时,一个数字,一个字符的输出,这样就构成了一个混合运算式。在随机对两数组赋值时,要考虑到除号后边的数字不能为0,切除号前后数字相除后不能有余。计算时,先要依次判断是否有乘除号,有的话先计算乘除号前后的数字,然后将结果赋值给符号后的数字,赋值符号前的数字为0,两个数字之间的符号赋给前一个符号,最后只剩下加减法时,还是按章刚才的原理以此计算将结果赋给后一个数,最后结果即为数组最后一个,同理判断客户输入是否和正确结果相同,相同时,变量R递加,最后输出R,即为正确个数。
二。程序源代码
1 // 2 //信1405-1班20142973魏垚 3 //四则运算03 4 5 import java.util.Scanner; 6 7 public class Four_Operation_03 { 8 9 static Scanner in=new Scanner(System.in); 10 11 public static void main(String[] args) { 12 // TODO Auto-generated method stub 13 14 System.out.print("请选择: 1.混合运算; 2.简单运算。 "); 15 int k=in.nextInt(); 16 System.out.print("请选择: 计算范围: "); 17 int numF=in.nextInt(); //numF:计算范围 18 System.out.print("2.请选择是否有乘除法: "); 19 System.out.print("(1):是 (2):否 "); 20 int ccYN=in.nextInt(); //ccYN:是否有乘除法 21 if(k==1) 22 { 23 operationComp(numF,ccYN); 24 } 25 else if(k==2) 26 { 27 operationInt(numF,ccYN); 28 } 29 } 30 31 //简单运算 32 public static void operationInt(int a1,int a2) 33 { //计算范围 乘除法 负数 34 int a4=5;//打印数量 35 int fir[]=new int[a4];//第一个数 36 int mid[]=new int[a4]; //符号转化的中间变量 37 char fh[]=new char[a4];//符号 38 int sec[]=new int[a4];//第二个数 39 40 int T;//控制重新生成随机数的变量 41 42 for(int i=0;i<a4;i++) 43 { 44 T=0; 45 46 //随机产生 47 fir[i]=(int)(Math.random()*a1); 48 mid[i]=(int)(Math.random()*a1); 49 if(a2==2) 50 { 51 mid[i]=mid[i]%2; 52 if(mid[i]==0)fh[i]='+'; 53 if(mid[i]==1)fh[i]='-'; 54 } 55 if(a2==1) 56 { 57 mid[i]=mid[i]%4; 58 if(mid[i]==0)fh[i]='+'; 59 if(mid[i]==1)fh[i]='-'; 60 if(mid[i]==2)fh[i]='*'; 61 if(mid[i]==3)fh[i]='/'; 62 } 63 sec[i]=(int)(Math.random()*a1); 64 if(fh[i]=='/') 65 { 66 while(sec[i]==0) 67 { 68 sec[i]=(int)(Math.random()*a1); 69 } 70 if(fir[i]%sec[i]!=0) 71 { 72 T=1; 73 } 74 } 75 76 //是否重复 77 for(int j=i-1;j>=0;j--) 78 { 79 if(fh[i]==fh[j]) 80 { 81 //判断数字有无相同 82 if(fir[i]==fir[j]&&sec[i]==sec[j]) 83 T=1; 84 //加法与乘法前后数字也不能都相同 85 if(fh[i]=='+'||fh[i]=='/') 86 { 87 if(fir[i]==sec[j]&&sec[i]==fir[j]) 88 T=1; 89 } 90 } 91 } 92 if(T==1)i--; 93 } 94 95 //打印 96 int R=0; 97 for(int m=0;m<a4;m++) 98 { 99 System.out.print(fir[m]); 100 System.out.print(fh[m]); 101 System.out.print(sec[m]); 102 System.out.print("="); 103 int r1=in.nextInt(); 104 int r2=0; 105 106 if(fh[m]=='+') 107 { 108 r2=fir[m]+sec[m]; 109 } 110 if(fh[m]=='-') 111 { 112 r2=fir[m]-sec[m]; 113 } 114 if(fh[m]=='*') 115 { 116 r2=fir[m]*sec[m]; 117 } 118 if(fh[m]=='/') 119 { 120 r2=fir[m]/sec[m]; 121 } 122 if(r1==r2) 123 R++; 124 } 125 System.out.print("正确题目个数:"+R); 126 } 127 128 //混合运算 129 public static void operationComp(int b1,int b2) 130 { //计算范围 乘除法 负数 131 // int b4=5;//打印数量 132 int num[]=new int[5]; //混合运算的数字部分 133 char fuh[]=new char[4]; //混合运算的符号部分 134 int mid1; //符号中间转换变量 135 System.out.print("请输入混合运算复杂度: "); 136 int numope=in.nextInt(); 137 int R=0;//统计计算正确题目个数 138 for(int k=0;k<5;k++) 139 { 140 for(int j=0;j<4;j++) 141 { 142 mid1=(int)(Math.random()*100); 143 if(b2==1) //有无乘除法 144 { 145 if(mid1%4==0) 146 fuh[j]='+'; 147 if(mid1%4==1) 148 fuh[j]='-'; 149 if(mid1%4==2) 150 fuh[j]='*'; 151 if(mid1%4==3) 152 fuh[j]='/'; 153 } 154 if(b2==2) 155 { 156 if(mid1%2==0) 157 fuh[j]='+'; 158 if(mid1%2==1) 159 fuh[j]='-'; 160 } 161 } 162 for(int i=0;i<5;i++) 163 { 164 num[i]=(int)(Math.random()*b1); 165 if(i>0) 166 { 167 if(fuh[i-1]=='/') 168 { 169 while(num[i]==0) 170 { 171 num[i]=(int)(Math.random()*b1);//除号后不能有0 172 } 173 if(num[i-1]%num[i]!=0) 174 { 175 i=i-2; 176 } 177 } 178 } 179 } 180 181 //打印 182 int N=0; 183 for(int n=0;n<numope-1;n++) 184 { 185 System.out.print(num[n]); 186 System.out.print(fuh[n]); 187 N++; 188 } 189 System.out.print(num[N]); 190 System.out.print("= "); 191 192 //计算 193 for(int js=0;js<numope-1;js++) 194 { 195 if(fuh[js]=='*'||fuh[js]=='/') 196 { 197 if(fuh[js]=='*') 198 num[js+1]=num[js]*num[js+1]; 199 if(fuh[js]=='/') 200 num[js+1]=num[js]/num[js+1]; 201 num[js]=0; 202 if(js>0) 203 fuh[js]=fuh[js-1]; 204 if(js==0) 205 fuh[js]='+'; 206 207 } 208 } 209 210 for(int js1=0;js1<numope-1;js1++) 211 { 212 if(fuh[js1]=='+') 213 num[js1+1]=num[js1]+num[js1+1]; 214 if(fuh[js1]=='-') 215 num[js1+1]=num[js1]-num[js1+1]; 216 } 217 218 int innum=in.nextInt(); 219 if(innum==num[numope-1]) 220 R++; 221 } 222 System.out.print("正确题目个数:"+R); 223 } 224 }
三。程序运行截图
四.问题
程序没有实现括号。
五.时间记录日志
日期 | 开始时间 | 结束时间 | 中断时间(min) | 净时间(min) | 活动 | 备注 |
3.21 | 8.00 | 9.50 | 10 | 100 | 上课 | |
3.30 | 4.30 | 5 | 55 | 简单构思,初步完成简单运算的框架 | ||
3.23 | 2.30 | 3.35 | 20 | 35 | 解决简单运算部分的计算问题 | |
8.00 | 8.30 | 10 | 20 | 优化下午的代码部分 | ||
3.26 | 9.30 | 11.00 | 30 | 60 | 解决混合运算产生的问题,构思怎样计算混合运算 | |
4.00 | 7.00 | 30 | 150 | 优化上午的代码,着重解决计算混合运算的问题 | ||
六.缺陷记录日志
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3.23 | 1 | 编码 | 编译 | 10 | |
描述:变量R在循环结构中的位置一直出错,导致编译时结果不符合设想 | |||||
3.26 | 2. | 编码 | 编译 | 2 | |
描述:在书写混合运算部分时,因为多个循环结构及if语句的嵌套,导致代码结尾的括号总是出现错误 | |||||
3. | 编码 | 编译 | 5 | ||
描述:由于混合计算的部分整数数组与符号数组的区间不同,赋值及输出时都要考虑循环越界问题 | |||||
4. | 编码 | 编译 | 30 | ||
描述:在一开始的混合运算计算结果的构思中,总是出现循环出不去,导致死循环,后来更改思路,重新编码 | |||||