题目啊:
像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”,
要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、题目避免重复、可定制出题的数量。
附加内容:
可以控制下列参数: 是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数; 除法有无余数。
思路:
首先确定要出的题目数也就是i,然后循环 i 遍下边的算法来出题,如果最大要出十个数的运算即需要人为确定一个最大的位数也
就是n,n是大于等于2小于等于10的。然后再要求用户输入要出的题目的数值范围循环也就是numLowBound和numhighBound遍选取随机数。确定是否执行除法的模块
如果不执行除法模块则随机其余三种运算,再确定是否要加括号及几对。最后判断加减有无负数; 除法有无余数。总之多次利用范
围选择以及模块的调用。
其中
数量:amout 乘除法:mulAndDiv 下限:numLowBound 上限:numHighBound 是否有负数:neviNum 是否有余数:0remainder
代码啊:
1 package 四则运算; 2 //马建宁写于2017.3.8周三下午 3 import java.math.*; 4 import java.util.Scanner; 5 public class caculate2 6 { 7 public static void main(String args[]) 8 { 9 mathOperation P = new mathOperation(); 10 P.SetValue(); 11 P.output(); 12 P.ProduceRandom(); 13 P.Output(); 14 } 15 } 16 17 class mathOperation 18 { 19 private int[] firNum = new int[100]; 20 private int[] secNum = new int[100]; 21 private int[] operNum = new int[100]; 22 private int index; 23 private int amout; 24 private int mulAndDiv; 25 private int numLowBound; 26 private int numHighBound; 27 private int neviNum; 28 private int remainder; 30 public mathOperation() 31 { 32 for(int i=0;i < 100;i++) 33 { 34 firNum[i] = -1; 35 secNum[i] = -1; 36 } 37 mulAndDiv = 1; 38 numLowBound = 1; 39 numHighBound = 99; 40 neviNum = 0; 41 remainder = 0; 42 index = 0; 43 amout = 100; 44 } 45 46 //设置是否有乘除法 47 public void set_mulAndDiv(int n) 48 { 49 mulAndDiv = n%2; 50 } 51 52 //设置是否有负数 53 public void set_neviNum(int n) 54 { 55 neviNum = n%2; 56 } 57 58 //设置是否有余数 59 public void set_remainder(int n) 60 { 61 remainder = n%2; 62 } 63 64 //设置计算下限 65 public void set_numLowBound(int n) 66 { 67 if(n < 0) 68 { 69 System.out.println("下限为负值!恢复为1"); 70 numLowBound = 1; 71 } 72 else 73 { 74 numLowBound = n; 75 } 76 } 77 //设置计算上限 78 public void set_numHighBound(int n) 79 { 80 if(n < 0) 81 { 82 System.out.println("上限为负值!恢复为1"); 83 numHighBound = 99; 84 } 85 else 86 { 87 numHighBound = n; 88 } 89 } 90 91 //设置用户要求产生题目的数量 92 public void set_amout(int n) 93 { 94 if(n >= 1 && n <= 100) 95 amout = n; 96 else 97 System.out.println("对不起,您设置的题目量已经超出本程序的运行能力之外!"); 98 } 99 100 public void SetValue() 101 { 102 int amoutValue;//题目的数量 103 int mulAndDivValue;//乘除法的状态值 104 int numLowBoundValue;//下限 105 int numHighBoundValue;//上限 106 int neviNumValue;//负数 107 int remainderValue;//是否有余数 108 System.out.println("hello word!"); 109 110 111 Scanner sc = new Scanner(System.in); 112 System.out.println("请规定产生题目的数量:(限制范围在1到100之间)"); 113 amoutValue = sc.nextInt(); 114 set_amout(amoutValue); 115 116 System.out.println("请规定数值的下限:(限制范围在1到100之间)"); 117 numLowBoundValue = sc.nextInt(); 118 set_numLowBound(numLowBoundValue); 119 120 System.out.println("请规定数值的上限:(限制范围在1到100之间)"); 121 numHighBoundValue = sc.nextInt(); 122 set_numHighBound(numHighBoundValue); 123 124 System.out.println("请规定是否有乘除法(0代表没有1代表有)"); 125 mulAndDivValue = sc.nextInt(); 126 set_mulAndDiv(mulAndDivValue); 127 128 System.out.println("请规定减法的结果是否有负数(0代表没有1代表有)"); 129 neviNumValue = sc.nextInt(); 130 set_neviNum(neviNumValue); 131 132 if(mulAndDivValue == 1) 133 { 134 System.out.println("请规定除法结果是否有余数(0代表没有1代表有)"); 135 remainderValue = sc.nextInt(); 136 set_remainder(remainderValue); 137 } 138 139 } 140 141 142 //查重 143 public boolean RepCheck(int leftNum,int rightNum,int mNum) 144 { 145 boolean flag = true;//初始为没有重复的题目 146 for(int i = 0;i < index;i++) 147 { 148 if(firNum[i] == leftNum && secNum[i] == rightNum && operNum[i] == mNum) 149 { 150 flag = false; 151 break; 152 } 153 } 154 return flag; 155 } 156 157 //生产符合要求的随机数 158 public void ProduceRandom() 159 { 160 161 boolean f = false; 162 while(index <= amout-1) 163 { 164 int leftNum = (int)(Math.random()*(numHighBound-numLowBound+1))+numLowBound;//生成左操作数 165 int rightNum = (int)(Math.random()*(numHighBound-numLowBound+1))+numLowBound;//生成右操作数 166 int mNum = (int)(Math.random()*4)+1;//随机取1234也就是加减乘除的随机选择 167 168 //如果不允许产生乘除就产生加减 169 if(mNum == 3 && mulAndDiv == 0) 170 mNum = 1; 171 if(mNum == 4 && mulAndDiv == 0) 172 mNum = 2; 173 174 //控制负数的产生 175 if(mNum == 2 && neviNum == 0) 176 { 177 int midNum; 178 if(leftNum < rightNum) 179 { 180 midNum = leftNum; 181 leftNum = rightNum; 182 rightNum = midNum; 183 } 184 } 185 186 187 //控制余数的产生 188 if(mNum == 4 && mulAndDiv == 1 && remainder == 0) 189 { 190 int midNum; 191 if(leftNum < rightNum) 192 { 193 midNum = leftNum; 194 leftNum = rightNum; 195 rightNum = midNum; 196 } 197 leftNum = leftNum/rightNum * rightNum; 198 } 199 200 201 f = RepCheck(leftNum,rightNum,mNum); 202 203 204 if(f == true) 205 { 206 firNum[index] = leftNum; 207 secNum[index] = rightNum; 208 operNum[index] = mNum; 209 index++; 210 } 211 } 212 } 213 214 //输出记录结果的数组 215 public void Output() 216 { 217 for(int i = 0;i < amout;i++) 218 { 219 System.out.print(firNum[i]); 220 if(operNum[i] == 1) 221 System.out.print("+"); 222 if(operNum[i] == 2) 223 System.out.print("-"); 224 if(operNum[i] == 3) 225 System.out.print("*"); 226 if(operNum[i] == 4) 227 System.out.print("/"); 228 System.out.println(secNum[i]); 229 230 } 231 } 232 233 public void output() 234 { 235 System.out.println("amout "+amout+"mulAndDiv "+mulAndDiv+"numLowBound "+numLowBound+ 236 "numHighBound "+numHighBound+"neviNum "+neviNum+"remainder "+remainder); 237 } 238 }
截图:
日期和任务 | 听课(单位min) | 编程序单位min) | 总计单位min) |
周一 | 110 | 50 | 160 |
周二 | 0 | 0 | |
周三 | 180 | 180 | |
周四 | 50 | 50 | |
周五(三月十号) | 90 | 90 | |
周六 | 120 | 120 | |
周日 | 0 | 0 | |
周总记 | 110 | 490 | 600 |
日期 |
开始 时间 |
结束 时间 |
中断 时间 |
净时间 | 活动 | 备注 |
周一 | 14点 | 16点 | 10分钟 | 110min | 上课 | 认真听讲 |
七点 | 八点 | 10分钟 | 50min | 看书编程回顾上课 | 复习 | |
周三 | 14:30 | 18:00 | 30min | 180min | 写程序浏览专业网站 | 查资料编程加中途休息 |
周四 | 14:30 | 15;30 | 10min | 50min | 写程序 | 查资料加写程序 |
周五 | 12:00 | 13:30 | 90min | 整理程序及上传 | 上传博客园加整理代码 | |
周六 |
15:00 |
17:00 | 120 | 查阅别人程序 | 查漏补缺 |