我的个人项目作业错误及解决办法
一、控制台输入
错误——第一次测评时我的问题是控制台输入,代码如下:
Scanner s = new Scanner(System.in); //通过new Scanner(System.in)创建一个Scanner, //控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。 System.out.println("请输入要生成四则运算式的个数(0~1000):"); OperationalFormula = s.nextInt();//从操作台输入运算式的个数 System.out.println("请输入每个运算式包含的的运算符的个数(3~5):"); operator = s.nextInt();//从操作台输入运算符的个数
修改——而这样无法进行命令行输出,所以第一次测评后,我加了一个try—catch,代码如下:
try{ OperationalFormula=Integer.parseInt(args[0]); if(OperationalFormula>1002||OperationalFormula<0){ System.out.println("数值不符合要求,请重输"); } }catch(Exception e){ System.out.println("数值不符合要求,请重输1"); }
这样修改后,命令行可以输出,但是必须加上utf—8,换行后输入100,再换行才可以。原因是有用Scanner输入的中文提示。
二、编译错误,不支持utf—8和gbk编译
错误——第二次测评时我的问题是编译错误,不支持utf—8和gbk编译。找了大佬宇欣发现是测评程序必须是输入Java Main 100,然后程序运行结果输出到result文件里。
修改——把Scanner输入的中文提示删掉,Main文件改为代码如下:
import java.io.IOException; public class Main { public static void main(String args[]) { String[] questionList = new String[1001];//开了一个0~1001的数组,即长度为1001 int OperationalFormula=0;//定义了一个运算式个数 try { OperationalFormula = Integer.parseInt(args[0]);// 输入出题的运算式个数 } catch (Exception e) { System.out.println("请输入正整数作为参数"); } if(OperationalFormula>0){ Lib.makeQuestions(questionList, OperationalFormula); //调用Lib中的makeQuestions函数 try { Lib.Filefile(questionList, OperationalFormula); //调用Lib中的文件将结果输出到path里面 } catch(IOException ioe) { System.out.println("文件生成错误"); }//将makeQuestions中的OperationalFormula个运算式和结果输出到path文件里 } } }
这样修改后,即可成功符合要求命令行输出了。
三、偶尔出现超大数
错误——运行时偶尔会出现超级大的乘数。
修改——找了大佬晓真,多运行几次,排查后发现是大数都是出现在乘号后面。后来发现我的乘号后面的数的生成条件没有必要,直接注释掉就没有这种情况了,代码如下:
else if( QuestionOfOp[j] == '*') { // QuestionOfNum[j] = (int)(Math.random()*20); // QuestionOfNum[j+1] = (int)(Math.random()*100/QuestionOfNum[j]); }
原来的代码:
else if( QuestionOfOp[j] == '*') { QuestionOfNum[j] = (int)(Math.random()*20); QuestionOfNum[j+1] = (int)(Math.random()*100/QuestionOfNum[j]); }
四、偶尔出现负数
错误——运行时偶尔会出现负数。
修改——找了大佬晓真,多运行几次,排查后发现是负数都是出现在减号后面。后来发现我的减号后面的数的生成条件有误,改后的代码如下:
if( QuestionOfOp[j] == '-') { String dis = "" + QuestionOfNum[0]; for(int k=0; k<j; k++) dis = dis + QuestionOfOp[k] + QuestionOfNum[k+1]; int Num = calQuestion(dis); if(Num<0){ flag = false; break; } if(Num<=100){ QuestionOfNum[j+1] = (int)(Math.random()*Num); }else{ QuestionOfNum[j+1] = (int)(Math.random()*100); } }
原来的代码:
if( QuestionOfOp[j] == '-') { String dis = "" + QuestionOfNum[0]; for(int k=0; k<j; k++) dis = dis + QuestionOfOp[k] + QuestionOfNum[k+1]; int Num = calQuestion(dis); QuestionOfNum[j+1] = (int)(Math.random()*Num); }