课堂结队作业:二维数组(1)
结队成员;陈欣容,孙奇文
1.要求:写一个能自动生成三十道小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算、题目避免重复、可定制出题的数量。
2.思路:
1)产生随机数choose,1或2,1表示生成整数表达式,2表示生成分数表达式,并用一个字符串数组存储表达式便于打印输出(长度由用户输入);
2)用一个字符数组存储“+ - * ÷”等符号,取符号则生成随机数0-3;
3)若choose为1,random生成两个整数作为表达式的左操作数和右操作数,并随机产生操作符;
4)若choose为2,random生成四个整数分别作为左操作数的分子分母和右操作数的分子分母;
5)用两个函数对生成的分数约分;
6)调用System.out.println()函数打印,用PrintWriter和FileWriter将生成的表达式数组写入文件;
3.代码:
import java.util.*;import java.io.*;public class MathHomework {
public static int choose;
public static int randomArr[]=new int[2];
public static Random ran=new Random();
public static char randomCh[]={'+','-','*','÷','/'};
public static String formula[];
@SuppressWarnings({ "unused", "resource" })
public static void main(String[] args) throws IOException{
String fileName="homework.txt";
Scanner in=new Scanner(System.in);
FileWriter fw=new FileWriter(fileName);
PrintWriter out=new PrintWriter(fw);
if(fw==null){
System.out.println("文件打开失败!");
}
int number;
System.out.println("题目个数:");
number=in.nextInt();
formula=new String[number];
for(int i=0;i<number;i++){
choose=ran.nextInt(2)+1;
formula[i]=creaFormula(choose);
if(formula[i]==null)
i--;
}
showFormula(formula);
//写入文件
int len=formula.length;
for(int i=0;i<len;i++){
out.println("No."+(i+1)+": "+formula[i]);
}
fw.close();
out.close();
}
public static String creaFormula(int x){
if(x==1){
String s="";
randomNums(randomArr);
int k=ran.nextInt(4);
s=s+randomArr[0]+randomCh[k]+randomArr[1]+"=";
return s;
}
else if(x==2){
String s="";
randomNums(randomArr);
fun1(randomArr);
s=s+"("+randomArr[0]+"/"+randomArr[1]+")";
randomNums(randomArr);
fun1(randomArr);
int k=ran.nextInt(4);
s=s+randomCh[k]+"("+randomArr[0]+"/"+randomArr[1]+")"+"=";
return s;
}
else
return null;
}
public static void showFormula(String s[]){
int len=s.length;
for(int i=0;i<len;i++){
System.out.println("No."+(i+1)+": "+s[i]);
}
}
//约分函数
public static void fun1(int x[]){
int k=fun2(x[0],x[1]);
x[0]=x[0]/k;
x[1]=x[1]/k;
}
//求分子分母最大公约数
public static int fun2(int x,int y){
int min,i;
if(x>y) min=x;
else
min=y;
for(i=min;i>=1;i--){
if(x%i==0&&y%i==0){
break;
}
}
return i;
}
public static void randomNums(int x[]){
x[0]=ran.nextInt(20)+1;
x[1]=ran.nextInt(20)+1;
}
}