出题系统

又完善了一下,更好用了

代码如下:
class Nums
{
public double GetTrue(){return True;}
public double GetFalse() {return False;}
public int GetCurrent() {return Current;}
public int GetMAX() {return MAX;}

public void SetMAX(int MAX) 
{
	this.MAX=MAX;
	this.arr=new int[MAX][4];
}

public void AddTrue() {True+=1;}
public void AddFalse() {False+=1;}
public void AddCurrent() {Current++;}


public void CalculateAccuracy()
{
	System.out.println("正确率:"+(True/MAX*100)+"%");
}


private double True=0;
private double False=0;
private int MAX=0;
private int Current=0;

public int[][] arr;

}

class judge
{
//判断题目是否重复
public static boolean judge1(int num1,int num2,Nums n)
{
int flag=1;
for(int i=0;i<n.GetCurrent();i++)
{
if(n.arr[i][0]num1&&n.arr[i][1]num2)
{
flag=0;
}
}
if(flag==1)
return true;
else
{
return false;
}
}

//判断是否满足运算
public static boolean judge2(int num1,int num2,int sign,Nums n)
{
	if(sign==1)
	{
		if(num1<num2)
			return false;
	}
	if(sign==2)
	{
		if(num1*num2>=1000)
			return false;
	}
	if(sign==3)
	{
		if(num2==0||num1%num2!=0)
			return false;
	}
	return true;
}


//判断相邻运算是否相同
public static boolean judge3(int sign,Nums n)
{
	if(n.GetCurrent()==0)
		return true;
	if(sign==n.arr[n.GetCurrent()-1][2])
	{
		return false;
	}
	return true;
}

public static boolean judge4(int sign,Nums n)
{
	if(n.GetCurrent()==0)
		return true;
	else if(n.GetCurrent()==1)
		if(n.arr[n.GetCurrent()-1][2]==sign)
			return false;
	else if(n.GetCurrent()==2)
		if(n.arr[n.GetCurrent()-1][2]==sign||n.arr[n.GetCurrent()-2][2]==sign)
			return false;
	else if(sign==n.arr[n.GetCurrent()-1][2]||sign==n.arr[n.GetCurrent()-2][2]||sign==n.arr[n.GetCurrent()-3][2])
		return false;
	return true;
}

}

public class 平常练习 {

static Nums n=new Nums();

//出题系统

//判断是否相等子方法
static void Equal(int num,int ans,Nums n)
{
	double f=0.000001;
	if(ans-num<f)
	{
		n.AddTrue();
		System.out.println("回答正确");
	}
	else
	{
		System.out.println("回答错误,正确答案:"+ans);
		n.AddFalse();
	}
}



//生成随机数并生成题目
static void CreateQuestion(Scanner sc)
{
	System.out.print("请输入您要生成的题目数量:");
	int MAX=sc.nextInt();
	n.SetMAX(MAX);
	
	while(n.GetCurrent()!=n.GetMAX())
	{
		Random ran=new Random();
		int num1=ran.nextInt(100);
		int num2=ran.nextInt(100);
		int sign=ran.nextInt(4);
		if(!judge.judge1(num1,num2,n))
		{
			continue;
		}
		if(!judge.judge2(num1,num2,sign,n))
		{
			continue;
		}
		if(!judge.judge3(sign,n))
		{
			continue;
		}
		if(!judge.judge4(sign, n))
		{
			continue;
		}
		//满足题目不重复,运算规则合法,相邻运算不重复,某一运算不能连续五次不出现之后,将数据赋值给数组
		n.arr[n.GetCurrent()][0]=num1;
		n.arr[n.GetCurrent()][1]=num2;
		n.arr[n.GetCurrent()][2]=sign;
		
		switch(sign)
		{
		case 0:
		{
			System.out.print("第"+(n.GetCurrent()+1)+"道题目:"+num1+"+"+num2+"=");
			int num=sc.nextInt();
			Equal(num,num1+num2,n);
			break;
		}
		case 1:
		{
			System.out.print("第"+(n.GetCurrent()+1)+"道题目:"+num1+"-"+num2+"=");
			int num=sc.nextInt();
			Equal(num,num1-num2,n);
			break;
		}
		case 2:
		{
			System.out.print("第"+(n.GetCurrent()+1)+"道题目:"+num1+"*"+num2+"=");
			int num=sc.nextInt();
			Equal(num,num1*num2,n);
			break;
		}
		case 3:
		{
			System.out.print("第"+(n.GetCurrent()+1)+"道题目:"+num1+"/"+num2+"=");
			int num=sc.nextInt();
			Equal(num,num1/num2,n);
			break;
		}
		}
		n.AddCurrent();
	}
	
	n.CalculateAccuracy();
}


public static void main(String[] args)
{
	Scanner sc=new Scanner(System.in);
	CreateQuestion(sc);
}

}

posted @ 2025-10-08 15:46  暗神酱  阅读(6)  评论(0)    收藏  举报