基本构想
我的想法是用map来哈希字符串,这样对每一个已经用过的算式进行散列标记,来达到去重的效果
要求
要求是低内聚高耦合,所以要写好几个类来进行封装,达到作用端口的多元化
co.java
package newp;
import java.util.Scanner;
public class co
{
public static void main(String [] args)
{
make_st mm = new make_st();
System.out.println("Please enter how many conut you want to practice:");
Scanner cin = new Scanner(System.in);
mm.n = cin.nextInt();
System.out.println("Please enter what mode you want to try:");
cin = new Scanner(System.in);
mm.mode = cin.nextInt();
mm.use();
}
}
make_st.java
package newp;
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
public class make_st
{
int num=0; //记录对的题数目
int n; //要出的题的数量
int mode; //对应每个类的出题模式
int cnt=0; //记录已经出题个数
Map<String,Integer> map = new HashMap<String,Integer>(); // 建立哈希表
panchong xx = new panchong();
void use()
{
String s=""; //准备哈希字符串
try (Scanner cin = new Scanner(System.in)) //异常尝试
{
while(cnt<n)
{
int ran1 = (int) (Math.random()*100); //操作数1
int ran2 = (int) (Math.random()*100); //操作数2
int ran3 = (int) (Math.random()*3); //随即加减
if(ran3==2&&ran1<ran2) //如果是减法而且第一个数小于第二个数
continue;
if(ran3==1&&ran1+ran2>100) //如果是加法而且第一个数+小于第二个数>100
continue;
if(ran3==1&&(mode == 0||mode == 2))
{
s=Integer.toString(ran1)+"+"+Integer.toString(ran2)+"=";
if(xx.judge(s,map)) //如果算式不存在
{
System.out.println(s);
int ans = cin.nextInt();
if(ans == ran1+ran2)
num++; //自加对题数目
cnt++; //出题数自加
}
}
if(ran3==2&&(mode == 1||mode == 2))
{
s=Integer.toString(ran1)+"-"+Integer.toString(ran2)+"=";
if(xx.judge(s,map))
{
System.out.println(s);
int ans = cin.nextInt();
if(ans == ran1-ran2)
num++;
cnt++;
}
}
}
}
System.out.print((double)(num*1.0/n)*100); //输出正确率
System.out.println('%');
}
}
panchong.java
package newp;
import java.util.Map;
class panchong
{
boolean judge(String s,Map<String,Integer> map)
{
if(map.get(s)==null&&s!="")
{
map.put(s,1); //建立映射
return true;
}
return false;
}
}