结队成员:陈欣容、孙奇文
1.要求:
四则运算2,可控制下列参数:
是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数。
2.思路:
1.存储结构:构建一个表达式类,私有属性为一个字符串数组,即将一个表达式拆成若干字符串,每个操作数和操作符都视为一个字符串。若需生成多个表达式则用类创建一个对象数组。
2.生成一个表达式的实现过程:
1)随机生成一个2-10的整数number表示操作数的数量;
2)随机选择该表达式操作数全为整数或全为分数;
3)若全为整数则判断是否要出现负数(用户输入控制),然后随机生成number个操作数,若操作数为分数则会生成一个分数字符串,格式为:“[a/b]” ,负数格式为“[-4]”;
4)判断是否有乘除法(输入控制),若有则随机生成number-1个含有+-*÷的操作符,若无则只有+-两种操作符;
5)用表达式类创建对象,将上述生成的操作数及操作符合成一个完整的表达式如 “9*5+6÷3=”;
6)若用户输入有括号(即ifKuoHao参数为1),则根据表达式字符串数组的长度随机出两个位置填入一对括号,如 “9*5+6÷3=”这个表达式,该字符串数组长度为8,则随机生成整数k,范围是0-7,再判断k/2的值是否为偶数,若不为偶数则将k/2+1即为表达式数组插入右括号的位置(因为操作数的位置下标为偶数,如6的下标为4),例如,就上述表达式而言,若生成的k值为7,7/2=3,3+1=4,所以生成右括号的位置为4,即在“6”和“÷”之间添加右括号,再在k-3的位置后添加左括号,所以最终表达式为“9*(5+6)÷3=”;
7)若ifKuoHao参数为2,则在第5)步结束。
3.源代码:
import java.util.*;public class MathHomeWork2 {
public static int choose,from,to,operNum,ifFuShu,number,ifKuoHao,ifChengChu;
public static int randomArr[]=new int[10];
public static Random ran=new Random();
public static char randomCh[]={'+','-','*','÷'};
public static Formular formu[];
@SuppressWarnings({ "resource" })
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("题目个数:");
number=in.nextInt();
System.out.println("数字范围(从小到大输入两个正整数):");
from=in.nextInt();
to=in.nextInt();
System.out.println("是否有乘除法(1有2无):");
ifChengChu=in.nextInt();
System.out.println("是否有括号(1有2无):");
ifKuoHao=in.nextInt();
System.out.println("是否有负数(1有2无):");
ifFuShu=in.nextInt();
formu=new Formular[number];
for(int i=0;i<number;i++){
formu[i]=new Formular();
choose=ran.nextInt(2)+1;
operNum=ran.nextInt(9)+2;
formu[i]=creaFormula(choose,operNum,ifChengChu,ifKuoHao);
if(formu[i]==null)
i--;
}
showFormulas(formu);
}
//生成分数
public static String creaFenShu(){
int a=0,b=0;
while(a>=b){
a=randomNum(from,to,2);
b=randomNum(from,to,2);
}
int fenshu[]={a,b};
fun1(fenshu);
String s="["+a+"/"+b+"]";
return s;
}
//生成表达式
public static Formular creaFormula(int choose,int nums,int ifChengChu,int ifKuoHao){
Formular formu=new Formular();
char operator[]=new char[nums-1];
if(ifChengChu==1){
for(int i=0;i<operator.length;i++){
int n=ran.nextInt(4);
operator[i]=randomCh[n];
}
}
else{
for(int i=0;i<operator.length;i++){
int n=ran.nextInt(2);
operator[i]=randomCh[n];
}
}
if(choose==1){
for(int i=0;i<nums;i++){
randomArr[i]=randomNum(from,to,ifFuShu);
}
for(int i=0;i<nums-1;i++){
formu.push(""+randomArr[i]);
formu.push(""+operator[i]);
}
formu.push(""+randomArr[nums-1]);
formu.push("=");
}
else if(choose==2){
String fenshu[]=new String[nums];
for(int i=0;i<nums;i++){
fenshu[i]=creaFenShu();
}
for(int i=0;i<nums-1;i++){
formu.push(""+fenshu[i]);
formu.push(""+operator[i]);
}
formu.push(""+fenshu[nums-1]);
formu.push("=");
}
else
return null;
if(ifKuoHao==1){
int k=ran.nextInt(2*nums);
k/=2;
if(k%2!=0) k++;
formu.insert(k+3,")");
formu.insert(k,"(");
}
//处理表达式,给负数加括号
for(int i=0;i<formu.size();i++){
String s=formu.get(i);
if(s.indexOf('-')!=-1&&s.length()>1){
s="["+s+"]";
}
formu.set(i,s);
}
return formu;
}
//打印表达式
public static void showFormulas(Formular f[]){
int len=f.length;
for(int i=0;i<len;i++){
System.out.print("No."+(i+1)+": ");
f[i].show();
System.out.print(" ");
}
}
//约分函数
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 int randomNum(int fromA,int toB,int ifFuShu){
int x=ran.nextInt(toB)+fromA+1;
if(ifFuShu==1){
boolean ifFushu=ran.nextBoolean();
if(ifFushu)
x=x-2*x;
}
return x;
}
}
class Formular{
private Vector<String> formular;
public Formular(){
formular=new Vector<String>();
}
public void push(String x){
formular.addElement(x);
}
public String get(int i){
if(formular!=null&&i>=0&&i<formular.size()){
return formular.get(i);
}
else return null;
}
public void set(int i,String x){
if(formular!=null&&i>=0&&i<formular.size()){
formular.set(i,x);
}
else return;
}
public void insert(int i,String x){
if(formular!=null&&i>=0&&i<formular.size()){
formular.insertElementAt(x,i);
}
else return;
}
public void add(int i,String x){
if(formular!=null&&i>=0&&i<formular.size()){
formular.add(i,x);
}
else return ;
}
public void delete(int i){
if(formular!=null&&i>=0&&i<formular.size()){
formular.removeElementAt(i);
}
else return ;
}
public void show(){
for(int i=0;i<formular.size();i++){
System.out.print(formular.get(i));
}
}
public int size(){
if(formular!=null)
return formular.size();
else return -1;
}
}