首页 > 技术文章 > 软件工程个人作业01 100以内四则运算自动答题系统(含整数和真分数)

Zhanghaonihao 2017-03-02 19:46 原文

import java.util.Scanner;

public class Yunsuan {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in); 
		int t=1,n=0;
		while(t!=0)
		{
			System.out.println("请选择:  1.整数运算    2.分数运算    0.退出");
			t=sc.nextInt();
			switch(t)
			{
			case 1:{zhengshu();
				break;
			}
			case 2:{fenshu();
			break;
			}
			
		}
		
	}
	}
	//化简分数;求最大公约数
	public static int simple(int a,int b)
	{
		int c=0;
		if(a>b)
		{		
			while(a!=b)
			{
				c=a-b;
				if(b>=c)
				{
					a=b;
					b=c;
				}
				if(c>b)
				{
					a=c;
				}
			}
			return a;
		}
		else
		{
			while(a!=b)
			{
				c=b-a;
				if(a>=c)
				{
					b=a;
					a=c;
				}
				if(c>a)
				{
					b=c;
				}
				
			}
			return a;
		}
	}
	
	//求最小公倍数
	public static int gongbei(int a,int b)
	{
		int t=simple(a,b);
		return a*b/t;
	}
	
	//整数运算
	public static void zhengshu()
	{
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入题目数量:");
		int n=sc.nextInt();
		String a[]={"+","-","*","/"};
		int b[]=new int [n]; 
		int c[]=new int [n];
		int d[]=new int [n];
		for(int i=0;i<n;i++)
		{
			b[i]=(int) (Math.random()*100);    //产生随机数
			c[i]=(int) (Math.random()*100);
			d[i]=(int) (Math.random()*4);
			boolean f = false;
			for(int j=i-1;j>=0;j--)
			{
				if(b[i]==b[j]&&c[i]==c[j]&&d[i]==d[j])
				{
					f = true;
					break;			
				}
			}
			if(f == true||(d[i]==1&&b[i]<c[i])||(d[i]==3&&c[i]==0))  //限制不能重复,当为减法的时候,被减数大于减数,当为除法,被除数不为0
				i--;
			else
				{
				   System.out.print("第"+(i+1)+"题"+": "+b[i]+" "+a[d[i]]+" "+c[i]+" =");
				   String q=sc.next();      
				   String w1=""+(b[i]+c[i]);    //将数化为String类型
				   String w2=""+(b[i]-c[i]);
				   String w3=""+(b[i]*c[i]);
				   String w4=""+(b[i]/c[i]);
				   
				   if(d[i]==0&&q.equals(w1))
					   System.out.println("恭喜你,回答正确!");
				   else if(d[i]==0&&!(q.equals(w1)))
					   System.out.println("回答错误! 正确结果为:"+w1);
				   
				   if(d[i]==1&&q.equals(w2))
					   System.out.println("恭喜你,回答正确!");
				   else if(d[i]==1&&!(q.equals(w2)))
					   System.out.println("回答错误! 正确结果为:"+w2);
				   
				   if(d[i]==2&&q.equals(w3))
					   System.out.println("恭喜你,回答正确!");
				   else if(d[i]==2&&!(q.equals(w3)))
					   System.out.println("回答错误! 正确结果为:"+w3);
				  
				   if(d[i]==3)
				   {
					   if((b[i]%c[i]==0&&q.equals(w4)))
					   {
						   System.out.println("恭喜你,回答正确!");
					   }
					   else if(b[i]%c[i]!=0)
					   {
						   int t=simple(b[i],c[i]);
						   b[i]/=t;c[i]/=t;
						   w4=""+b[i]+"/"+c[i];
						   if(q.equals(w4))
						   {
							   System.out.println("恭喜你,回答正确!");
						   }
					   }
				   }
				   else if(d[i]==3)
					   System.out.println("回答错误! 正确结果为:"+w4);
				   
				}
			
		}
	}
	public static void fenshu()
	{
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入题目数量:");
		int n=sc.nextInt();
		String a[]={"+","-","*","/"};
		int b1[]=new int [n]; 
		int b2[]=new int [n];
		int c1[]=new int [n];
		int c2[]=new int [n];
		int d[]=new int [n];
		for(int i=0;i<n;i++)
		{
			b1[i]=(int) (Math.random()*100);  //产生随机数
	        b2[i]=(int) (Math.random()*100);
			c1[i]=(int) (Math.random()*100);
			c2[i]=(int) (Math.random()*100);
			
			d[i]=(int) (Math.random()*4);
			boolean f = false;
			for(int j=i-1;j>=0;j--)
			{
				if(b1[i]==b1[j]&&b2[i]==b2[j]&&c1[i]==c1[j]&&c2[i]==c2[j]&&d[i]==d[j])//查重
				{
					f=true;
		            break;
				}		
			}
			if(f==true||(b1[i]>=b2[i])||(c1[i]>=c2[i])||(b2[i]==0)||(c2[i]==0)||(b1[i]==0)||(c1[i]==0))//分子大于分母,都不为0
			{
				i--;
			}
			else
			{
				int t1=simple(b1[i],b2[i]);
				int t2=simple(c1[i],c2[i]);
				b1[i] /= t1;               //都化为最简
				b2[i] /= t1;
				c1[i] /= t2;
				c2[i] /= t2;
				
				
				int t=gongbei(b2[i],c2[i]);   //最小公倍数
				int y1=t/b2[i];             //最小公倍数除以分母
				int y2=t/c2[i];
				b1[i]*=y1;   //同分后的分子
				c1[i]*=y2;   //同分后的分子
				
				int p1=b1[i]+c1[i];
				int p2=b1[i]-c1[i];
				if(d[i]==0&&p1>=t)
				{
					i--;
					continue;
				}
				else if(d[i]==1&&p2<=0)
				{
					i--;
					continue;
				}
				else if(d[i]==2&&((b1[i]/y1)*(c1[i]/y2)>=b2[i]*c2[i]))   //乘除的时候按同分前的分子,分母计算
				{
					i--;
					continue;
				}	
				else if(d[i]==3&&((b1[i]/y1*c2[i])>=(b2[i]*c1[i]/y2)))
				{
					i--;
					continue;
				}	
				else
				{
					System.out.print("第"+(i+1)+"题:   "+"("+(b1[i]/y1)+"/"+b2[i]+")"+" "+a[d[i]]+" "+"("+(c1[i]/y2)+"/"+c2[i]+")"+" "+"=");
					String q=sc.next();         
					if(d[i]==0)
					{
						int t3=simple(p1,t);
						p1 /=t3;
						t /=t3;
						String w1=""+p1+"/"+t;
						if(q.equals(w1))
							System.out.println("恭喜你,回答正确!");
						else
							System.out.println("回答错误! 正确结果为:"+w1);
					}
					else if(d[i]==1)
					{
						int t3=simple(p2,t);
						p2 /=t3;
						t /=t3;
						String w1=""+p2+"/"+t;
						if(q.equals(w1))
							System.out.println("恭喜你,回答正确!");
						else
							System.out.println("回答错误! 正确结果为:"+w1);
					}
					else if(d[i]==2)
					{
						b1[i] /=y1;
						b1[i] *=(c1[i]/y2);
						b2[i] *=c2[i];
						int t3=simple(b1[i],b2[i]);
						b1[i] /=t3;
						b2[i] /=t3;
						String w1=""+b1[i]+"/"+b2[i];
						if(q.equals(w1))
							System.out.println("恭喜你,回答正确!");
						else
							System.out.println("回答错误! 正确结果为:"+w1);
					}
					else if(d[i]==3)
					{
						b1[i] /=y1;
						b1[i] *=c2[i];
						b2[i] *=c1[i];
						int t3=simple(b1[i],b2[i]);
						b1[i] /=t3;
						b2[i] /=t3;
						String w1=""+b1[i]+"/"+b2[i];
						if(q.equals(w1))
							System.out.println("恭喜你,回答正确!");
						else
							System.out.println("回答错误! 正确结果为:"+w1);
					}
				}
			}
		}
	}

}

设计思想

1.设置几个数组,将随机产生的100以内数存入其中,在一个数组里分别存入加减乘除,利用产生的三以内的整数,确定运算符号;

2.添加限制,将产生负数,和上面的算式相同的排除掉,重新产生随机数。

3.计算出结果,与输入的结果进行比较。

4.在计算真分数的时候,先计算出分子和分母的最大公约数,将式子化简,进行加法运算的时候,先求出两个数的分母的最小公倍数,

进行同分,让分子进行加减,由于不能有假分数,将两个分子相加大于最小公倍数的排除,重新产生随机数,由于结果也是分数形式,只能用String类型的,

将计算的结果转化成String类型,String q=“”+分子+"/"+分母;再将结果与之比较

 

运行截图

  

没按预期时间完成的主要原因是不能清楚地理解题目的意思,老是改,是不是真分数包括带分数,来回的改。

基础还是不太扎实,有时还会对逻辑关系分不清。

推荐阅读