课堂测试,要求写出一个可以自动随机生成自定义数量、格式、是否带乘除、是否有括号运算的小学四则运算题目,老师出题时边给我们理了一下思路,将这一整个题分成三部分完成,首先要求生成数量固定数量的题目,相对于直接实现后面这部分是较简单的:
首先对于random函数,static double random() 这是一个默认方法,不接受任何参数,他用于返回一个随机数,随机数的范围是0.0=<Math.random<1.0。
对于我们题目要求的随机生成四则运算,形如a+b=? 、a-b=?、a*b=?、a/b=?,这样的,这里的随机要求随机数字,同时符号也要求随机。对于数字的随机可以定义一个两个数将random()的返回值赋值给这两个数,因为random函数返回值小于1.0所以我们在给他乘以数字时的他的返回值控制在这个数到0之间。
运算中的加减乘除号,可以用Switch来解决,random随机返回数字,将这个数字赋值,然后在case语句中进行选择。返回打印的
同上返回数字这里需要注意一点:random返回数是随机的也就是会返回浮点数和整数,在返回数字哪里我们可以不做要求,但在控制符号哪里必须要求是整数,否则返回值不可控导致无法对case开关做出反应,所以在下面的返回数中要将其强制转换成整形数据。
以下是程序:
for(i=0;i<20;i++)
{
int a1=(int)(Math.random()*100);
int a2=(int)(Math.random()*100);
string s=" ";
int a=(int)(Math.random()*4);
switch
{
case 1:s="+";System.out.print(s);break;
case 2:s="-";System.out.print(s);break;
case 3:s="*";System.out.print(s);break;
case 4:s="/";System.out.print(s);break;
}
System.out.println(a1+s+a2+"= ,");
}
进而老师要求可以打印出想要数量可以控制,这个只需要将for循环中跳出的20改成一个由用户输入数据的变量就行了,
在下一阶段中要求:1.可以定制操作数的个数。在这块我将输出设置成了双循环,外部的循环控制一共需要打印处的题目个数,内部循环是控制打印每一道题中数字的多少,在内部循环中定义了一个int型变量,在内不循环中有random函数给这个变量赋值成随机数,然后循环n次,每次打印数字完后在打印符号,符号另设置一个函数,在内循环中调用这个函数n-1次,完成后进行一次外循环在进入内循环如此重复打印出所有式子。
数值范围控制在这里直接将random函数后面要乘的数定义成一个可输入的变量在程序执行之前提示用户输入最大数值取值即可。
public static void chuti2(int N,int l,int x2,int x3,int x4)
{
int[] ra=new int[x2];
int j;
for(int i=0;i<N;i++)
{ int a=kuohao();
int a1=a;
int a3=kuohao1(x2);
if((i>l&&(i%l==0))||i==l)
{
System.out.println();}
for(j=0;j<x2;j++)
{
ra[j]=(int)(Math.random()*x3);
if(x4==1)
{
if(a==1) {
System.out.print("(");
System.out.print(ra[j]);
a=0;
}
else
System.out.print(ra[j]);
}
else {
System.out.print(ra[j]);}
if(j==a3&&a1==1) {
System.out.print(")");a=0;}
if(j<(x2-1))
fuhao2();
}
System.out.print("= ,");
}
}
我将这个也设置成了一个函数,其中还包括了是否选择有乘除法和每一行有多少式子的控制,实在是否选择有乘除法这一项中,我将符号的选择分成两个函数,一个函数是打印出所有符号,另一个智能打印出加减,在选择时调用即可,
public static void fuhao2()
{
String s="";
int a=(int)(Math.random()*2)+1;//这里的2是令a只能=1或2选择也会受限制,所以还有一种调用方法是将这里的2定义成一个变量让他输入在输入时用if条件控制他是2还是4在传到random函数中,在进行选择这样就只用写一次比较方便。
switch(a)
{
case 1:s="+";break;
case 2:s="-";break;
case 3:s="*";break;
case 4:s="/";break;
}
System.out.print(s);
}
最后是关于加括号,这里我直接写到了循环输出的那个函数中,思路就是:先定义一个变量让这个变量a有一个值,在内循环开始是判断这个值是否符合你想加括号的条件如果属于那就先打印一个右括号然后打印数据打印符号,到这里右括号的问题解决了,接下来就是左括号的问题了,左括号这里有一个前提条件就是你右括号已经打印出来了,所以我们这里要先判断有括号是否打印,判断第一个变量的a值是否是多少然后就是左括号打印的位置,这时我们在给一个随机数这个随机数与内循环的次数有关,必须要在内循环结束之前。所以给随机数是我们就控制它的条件不能大与内循环的次数,给出随机数然后打印括号,还有一点就是我将这个a的随机数返回值定义在了内循环外面外循环里面,也就是说这个程序他在打印每个式子时他就已经确定好了这个式子要不要加括号,所以为了防止每次内循环都会打印出一个右括号,我在打右括号完后就将a赋值为0,到这里就有一个问题了打印左括号时必须要判断a的值,所以在开始我们还要将a的值赋给另一个变量b,这样前面的a判断后就可以赋值为0,后面的左括号就可以用b判断了,有关a的随机数值和上面返回是一样的这里就不再写了。到此整个程序就写完了,在有些地方还有不足比如括号如果有只能是从开头开始,还有一个式子最多只有一个括号。程序还不是很好:下面这是整个原程序代码。
package com.helloworld;
import java.util.Scanner;
import java.util.*;
public class check {
public static void main(String[] args)
{
System.out.println("请输入生成数量");
Scanner r=new Scanner(System.in);
int N=r.nextInt();
System.out.println("请输入一行有多少数:");
Scanner sc=new Scanner(System.in);
int l=sc.nextInt();
System.out.println("请选择是否有乘除法:1/0(是/否)");
Scanner sc1=new Scanner(System.in);
int x=sc1.nextInt();
System.out.println("请输入操作数个数:");
Scanner sc2=new Scanner(System.in);
int x2=sc2.nextInt();//操作数个数
System.out.println("请输入操作数取到的最大:");
Scanner sc3=new Scanner(System.in);
int x3=sc3.nextInt();
System.out.println("请选择是否随机加入括号:1/0(是/否)");
Scanner sc4=new Scanner(System.in);
int x4=sc4.nextInt();
if(x==1)chuti1(N,l,x2,x3,x4);
else if(x==0) chuti2(N,l,x2,x3,x4);
}
public static void chuti1(int N,int l,int x2,int x3,int x4)
{
int[] ra=new int[x2];
int j;
for(int i=0;i<N;i++)
{ int a=kuohao();
int a1=a;
int a3=kuohao1(x2);
if((i>l&&(i%l==0))||i==l)
{
System.out.println();}
for(j=0;j<x2;j++)
{
ra[j]=(int)(Math.random()*x3);
if(x4==1)
{
if(a==1) {
System.out.print("(");
System.out.print(ra[j]);
a=0;
}
else
System.out.print(ra[j]);
}
else {
System.out.print(ra[j]);}
if(j==a3&&a1==1) {
System.out.print(")");a=0;}
if(j<(x2-1))
fuhao1();
}
System.out.print("= ,");
}
}
public static int kuohao1(int x2)
{
int i=(int)(Math.random()*x2);
if(i==0)return i+2;
if(i==x2)return i--;
else return i;
}
public static void fuhao1()
{
String s="";
int a=(int)(Math.random()*4)+1;
switch(a)
{
case 1:s="+";break;
case 2:s="-";break;
case 3:s="*";break;
case 4:s="/";break;
}
System.out.print(s);
}
public static int kuohao()
{
int a=(int)(Math.random()*2);
return a;
}
public static void chuti2(int N,int l,int x2,int x3,int x4)
{
int[] ra=new int[x2];
int j;
for(int i=0;i<N;i++)
{ int a=kuohao();
int a1=a;
int a3=kuohao1(x2);
if((i>l&&(i%l==0))||i==l)
{
System.out.println();}
for(j=0;j<x2;j++)
{
ra[j]=(int)(Math.random()*x3);
if(x4==1)
{
if(a==1) {
System.out.print("(");
System.out.print(ra[j]);
a=0;
}
else
System.out.print(ra[j]);
}
else {
System.out.print(ra[j]);}
if(j==a3&&a1==1) {
System.out.print(")");a=0;}
if(j<(x2-1))
fuhao2();
}
System.out.print("= ,");
}
}
public static void fuhao2()
{
String s="";
int a=(int)(Math.random()*2)+1;
switch(a)
{
case 1:s="+";break;
case 2:s="-";break;
case 3:s="*";break;
case 4:s="/";break;
}
System.out.print(s);
}
}
在这次课堂测试中老师在给我们题目是就已经从易到难给我们提前分好了模块先实现啥在实现啥,如果单给第三次的要求很多可能无从下手,从这次题目也学到了很多:
在写一道题目的时候可以把它先简化,然后将它常出现的需要数据很多次的先单独设置成一个函数,这样写的时候只用调用就不用来回写一遍麻烦而且复杂。