1 #include <stdio.h> 2 #include <stdlib.h> 3 main() 4 { 5 printf(" 欢迎使用四则运算练习软件 "); 6 printf(" 说明:如果进行分数运算,用户需输入最简(约分后)的答案!! "); 7 printf(" 格式为 5/6 "); 8 Chioce(); 9 } 10 //---------------------------------------------------------------------------------------------------- 11 Chioce() 12 { 13 int ch1=0; 14 printf(" 1.整数运算 2.分数运算 请选择:"); 15 scanf("%d",&ch1); 16 if(ch1==1) 17 { 18 ZhengShuYunSuan(); 19 } 20 FenShuYunSuan(); 21 return 0; 22 } 23 //--------------------------------------------------------------------------------------------------- 24 ZhengShuYunSuan() //整数运算 25 { 26 int ranswer=0; //正确答案 27 int uanswer=0; //用户输入的答案 28 int t=0,n=0,m=0; //临时变量 29 char op; //运算类别 30 int num1=0; //操作数1 31 int num2=0; //操作数2 32 int ch=1,count=0; 33 34 while(1) 35 { 36 if(count==10) 37 { 38 printf(" 在10道练习里你做对了%d题! ",n); 39 printf(" 1.继续练习 2.退出 请选择:"); 40 scanf("%d",&ch); 41 if(ch==2) 42 { 43 printf(" 谢谢使用!"); 44 exit (0); 45 } 46 47 count=0; 48 n=0; 49 Chioce(); 50 } 51 srand(time(NULL)); //初始化随机数 52 num1=rand()%10; //取0-9之间的随机数 53 num2=rand()%10; 54 m=rand()%4+1; 55 switch(m) 56 { 57 case 1: 58 op='+'; 59 break; 60 case 2: 61 op='-'; 62 break; 63 case 3: 64 op='*'; 65 break; 66 case 4: 67 op='/'; 68 break; 69 } //加入一条防止"不够减"的语句,当选择减法且num1小于num2时不够减 70 //不够减的时候,用临时变量交换两个操作数 71 if((op=='-') && (num1<num2)) 72 { 73 t=num1; 74 num1=num2; 75 num2=t; 76 } 77 //防止"除数为0"的程序漏洞 78 //当num2被随机取值到0时,就将num2强制置为1 79 //做除法时,将num1的值强制赋值给num1*num2,防止不能整除 80 if(op=='/') 81 { 82 if(num2==0) 83 { 84 num2=1; 85 } 86 num1=num1*num2; 87 } //防止num1不能被num2整除的语句 88 //输出测试题本身、提示用户输入 89 printf(" %d%c%d=",num1,op,num2); 90 while(!(scanf("%d",&uanswer))) 91 { 92 printf(" 非法输入,请重新输入答案:"); 93 fflush(stdin); 94 } 95 //程序计算正确结果 96 switch(op) 97 { 98 case '+': ranswer=num1+num2; break; 99 case '-': ranswer=num1-num2; break; 100 case '*': ranswer=num1*num2; break; 101 case '/': ranswer=num1/num2; break; 102 } 103 if(uanswer==ranswer) 104 { 105 printf(" 做对了! "); 106 n++; //正确题数加1 107 } 108 else 109 { 110 printf(" 做错了! "); 111 } 112 count++; //题数加1 113 } 114 return 0; 115 } 116 //-------------------------------------------------------------------------------------------------- 117 FenShuYunSuan() //真分数 118 { 119 int a=0,b=0,c=0,d=0; //分别为第一、二个分数的分子分母 120 int x=0,y=0,z=0,ux=0,uy=0,uz=0; //系统运算的结果和用户输入的结果 121 int n=0,t=0,i=0,m=0; 122 char op,uop; 123 int ch=0,count=0; 124 125 while(1) 126 { 127 if(count==10) 128 { 129 printf(" 在10道练习里你做对了%d题! ",n); 130 printf(" 1.继续练习 2.退出 请选择:"); 131 scanf("%d",&ch); 132 if(ch==2) 133 { 134 exit (0); 135 } 136 137 count=0; 138 n=0; 139 Chioce(); 140 } 141 srand(time(NULL)); //获取四个随机整数 142 a=rand()%10+1; 143 b=rand()%10+1; 144 c=rand()%10+1; 145 d=rand()%10+1; 146 147 148 149 if(a>b) //两个if保证分数为真分数,即分母大于分子 150 { 151 t=a; 152 a=b; 153 b=t; 154 } 155 if(c>d) 156 { 157 t=c; 158 c=d; 159 d=t; 160 } 161 srand(time(NULL)); 162 m=rand()%4+1; //随机获取运算符 163 switch(m) //确定运算符后系统直接计算答案 164 { 165 case 1: 166 op='+'; 167 x=a*d+b*c; 168 y=b*d; 169 break; 170 171 case 2: 172 op='-'; 173 if((a*d<b*c) && (a!=c)) //if是避免两分数相减是得到的结果是负数 174 { 175 t=a; 176 a=c; 177 c=t; 178 t=b; 179 b=d; 180 d=t; 181 } 182 x=a*d-b*c; 183 y=b*d; 184 break; 185 186 case 3: 187 op='*'; 188 x=a*c; 189 y=b*d; 190 break; 191 192 case 4: 193 op='/'; 194 x=a*d; 195 y=b*c; 196 break; 197 } 198 199 if(x>y) //将系统得到的结果进行约分到最简式 200 { 201 i=y; 202 } 203 else 204 { 205 i=x; 206 } 207 208 while(i>1) 209 { 210 if((x%i==0)&&(y%i==0)) 211 { 212 x=x/i; 213 y=y/i; 214 continue; 215 } 216 i--; 217 } 218 printf(" %d/%d %c %d/%d=",a,b,op,c,d); 219 if(y==1) //提示用户输入答案是分三种情况,1.分母为1时用户要输入一个整数 220 { //2.分子分母相同时用户要输入一个整数 221 z=x; //3.分子分母不同时用户要输入一个分数的格式--(12/13) 222 while(!(scanf("%d",&uz))) //4.并且判断答案的对错 223 { 224 printf(" 非法输入,请重新输入答案:"); 225 fflush(stdin); 226 } 227 if(z==uz) 228 { 229 printf(" 答对了!!"); 230 n++; 231 } 232 else 233 { 234 printf(" 答错了!!"); 235 } 236 } 237 else if(x==y) 238 { 239 z=1; 240 241 while(!(scanf("%d",&uz))) 242 { 243 printf(" 非法输入,请重新输入答案:"); 244 fflush(stdin); 245 } 246 if(z==uz) 247 { 248 printf(" 答对了!!"); 249 n++; 250 } 251 else 252 { 253 printf(" 答错了!!"); 254 } 255 256 } 257 else 258 { 259 260 while(!(scanf("%d%c%d",&ux,&uop,&uy))) 261 { 262 printf(" 非法输入,请重新输入答案:"); 263 fflush(stdin); 264 } 265 if((x==ux)&&(y==uy)) 266 { 267 printf(" 答对了!!"); 268 n++; 269 } 270 else 271 { 272 printf(" 答错了!!"); 273 } 274 } 275 count++; 276 } 277 }
本次按老师的要求,把真分数的功能添加进去了,老师要求的是和运算,但为了方便,我将加减乘除都添加进去了,即菜单2,菜单1和第一次的博客实现的功能一样。真分数的运算不能说是很难,就是分数在约分时会有点困难,还有最后答案是一个分数还是整数也要判断,再提示用户输入。