四则运算第二篇

题目啊:

像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”,

要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、题目避免重复、可定制出题的数量。

附加内容:

可以控制下列参数: 是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数; 除法有无余数。

思路:

首先确定要出的题目数也就是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 查阅别人程序 查漏补缺
原文地址:https://www.cnblogs.com/ever1961211/p/6527748.html