222wan

导航

JAVA学习-四则运算的优化

在这一节中要对上次写的用random函数的应用生成的四则运算程序进行优化,要求是需要实现在线答题,并且可以给出题目的答案讲错题存起来,可以进行错题重做,还要给出错题率以及相同题目做错的次数。同时要实现超大数据的加减。

将上次的代码改改,吧实现的地方改成方法然后进行调用,这里我上次写的时候用的就是方法但不太全面这次略微小改一下,改成方法的目的是为了后续这个程序变得更加复杂的时候我们的逻辑思路不会受到代码杂乱的影响,要是全写在一个主函数估计出现错误的时候你调试疯了都找不到bug。

对于后面要求的超大数据相互运算以及浮点数的运算的这些属于数据类型的问题比起整个代码的逻辑来说较为简单所以放到最后,我们先用int数据将代码逻辑先通顺的写下来。

分析一下思路,上个程序已经将每道题目都打印出来了,在这里要实现的就是算出每道题的答案,与输入进行对比,然后错的存入到arraylist数组中再计算出错题率然后打印出错题以及答案。

再上一个题中已经实现了打印出题目,我在上一个题目中讲每一道题的数字部分和符号部分分别存到两个数组中去,所以这里就比较好运算,先构造一个函数将这两个数组传进来,在函数中用for循环先提出数字部分的第一个然后if条件判断符号是+-*/在与下一个数字进行运算,将他传到新数组去,这里就是计算答案的函数。

构造一个输入函数,在上一个函数结束时调用输入答案函数这样就能实现边出题边作答,传进来的数字与答案数组进行对比正确就继续错误打印出”答错了!“然后调用函数将错误的题目全部存入ArrayList数组中,方便后续打印出错题。

在打印题目函数中调用存错题的函数,传入两个数组,用字符串相加的方式将数字转化成字符串存进arrarlist数组中。

最后构造一个函数遍历数组。

对于要进行超大数字的运算在计算机中int型占32位long型占64位在输入时long型最大输入10位数无法免租无限大数字的需求,在JAVA中提供一个BigInteger类,支持大整数的加减乘除运算,它类似一个int、char、double这样的数据类型 ,用法与其他数据类型相似,唯一不一样的是他的运算需要用到特定的add、multiuly、相应的函数进行加减乘除,所以我们在程序中将所有int型数据重新定义成BigInteger型运算用相应的函数进行运算即可。还有一点BigInteger函数调用需要加上import java.math.BigInteger;

下面是源代码:

package com.helloworld;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.*;

public class suan {
static ArrayList<String> arr=new ArrayList<String>();
public static void main(String[] args)
{

System.out.println("请输入生成数量");
Scanner r=new Scanner(System.in);
int N=r.nextInt();
System.out.println("请输入一行有多少数:");
Scanner sc=new Scanner(System.in);
int l=sc.nextInt();
System.out.println("请选择是否有乘除法:1/0(是/否)");
Scanner sc1=new Scanner(System.in);
int x=sc1.nextInt();
System.out.println("请输入操作数个数:");
Scanner sc2=new Scanner(System.in);
int x2=sc2.nextInt();//操作数个数
System.out.println("请输入操作数取到的最大:");
Scanner sc3=new Scanner(System.in);
BigInteger x3=sc3.nextBigInteger();
BigDecimal x7=new BigDecimal("1000000000000000000");
System.out.println("请选择是否随机加入括号:1/0(是/否)");
Scanner sc4=new Scanner(System.in);
int x4=sc4.nextInt();//加括号
chuti1(x,N,l,x2,x3,x4);
if(mistick()==1)bianli();//输出错题

int i=0;
}
public static void chuti1(int x, int N,int l,int x2,BigInteger x3,int x4)
{
BigInteger[] ra1=new BigInteger[x2];
BigInteger[] ra=new BigInteger[x2];
String[] rb=new String[x2-1];
String[] rb1=new String[x2-1];
int j;
BigInteger[] an=new BigInteger[N];
for(int i=0;i<N;i++)
{
String s6=" ";

if((i>l&&(i%l==0))||i==l)
{
System.out.println();
}
for(j=0;j<x2;j++)
{
ra1[j]=ra[j]=calulate(x3);
System.out.print(ra[j]);
if(j<(x2-1))
{
rb1[j]=rb[j]=fuhao1(x);

System.out.print(rb[j]);
}
}
System.out.print("= ,");
an[i]=answer(ra,rb,x2);
int p1=judge(an,i,dati());//判断返回值是否正确的,
if(p1==1) System.out.println("回答错误!");
save(an,ra1,rb1,i,p1,x2);

} mistick1(N);//判断错误率的
}
public static BigInteger calulate(BigInteger x3)//随机大数字
{
BigInteger a=new BigInteger(64,new Random());//(int)(Math.random()*x3)+999999999;
return a;
}
public static void save(BigInteger an[],BigInteger ra1[],String rb1[],int i,int p1,int x2)//保存
{
if(p1==1) {
arr.add(string(ra1,rb1,x2)+"="+an[i]);}
}
public static String string(BigInteger ra1[],String rb1[],int x2)//保存
{
int i;
int j=0;
String s1="";
for(i=0;i<x2;i++)
{

if(j==0) {s1=s1+ra1[i];j=1; }
if(j==1&&i!=x2-1) {s1=s1+rb1[i];j=0;}
if(i==x2-1)j=0;
}
return s1;
}
public static int mistick()
{
System.out.println("是否选择查看错题1/0(是/否):");
Scanner s7=new Scanner(System.in);
int a=s7.nextInt();
return a;
}
public static void bianli()
{
int i;
for(i=0;i<arr.size();i++)
{
System.out.println(arr.get(i));
}
}
public static void mistick1(int N)
{
double a=arr.size()*1.0/N;
System.out.println("错误率为:"+a);
//System.out.println(arr.size());
}
public static String fuhao1(int x)
{
String s="";
int p=4;
if(x==1)
{p=4;}
else
{p=2;}
int a=(int)(Math.random()*p)+1;

switch(a)
{
case 1:s="+";break;
case 2:s="-";break;
case 3:s="*";break;
case 4:s="/";break;
}

return s;

}
public static BigInteger dati()
{

BigInteger a;
Scanner s4=new Scanner(System.in);
a=s4.nextBigInteger();
return a;
}
public static int judge(BigInteger an[],int i,BigInteger a)
{
int n=0;
if(an[i]!=a)
{


return 1;
}
else
return 0;
}
public static BigInteger answer( BigInteger ra[],String rb[],int x2)
{
int i,j;
for(i=0;i<x2-1;i++)
{
switch(rb[i])
{
case "+":ra[i+1]=ra[i+1].add(ra[i]);break;
case "-":ra[i+1]=ra[i].subtract(ra[i+1]);break;
case "*":ra[i+1]=ra[i].multiply(ra[i+1]);break;
case "/":ra[i+1]=ra[i].divide(ra[i+1]);break;
}

}

return ra[i];
}


}

 

posted on 2022-09-19 17:10  角落的蘑菇  阅读(59)  评论(0编辑  收藏  举报