昨天做一个测试题题目如下:
需求:有一场编程比赛,六位评委打分,分数为整数,范围在0-100之间,
选手最后得分为去掉一个最高分和一个最低分的平均分。
分析:
1、已知多个数据,可利用数组进行存储数据
2、利用循环语句将输入的数据存入数组,并遍历进行判断。
3、对输入的数据进行判断是否符合要求,如不符合则给出提示,并重新当前循环的操作。
前面2项比较简单,问题是第三点,刚开始想了利用while语句去做,在外面设定变量进行提示当前次数,代码如下:
int [] arr=new int [6]; //创建数组接收数据
Scanner sc=new Scanner(System.in);
int i=0; //初始化语句
outer:
while(i<6){
System.out.println("请输入第"+(i+1)+"位评委打分:"); //给出提示
int grade=sc.nextInt(); //输入的评分
if((grade>100)||(grade<0)){
System.out.println("你输入的数据有误,请重新输入第"+(i+1)+"位评委打分:");
continue outer; //如果不符合,则跳过本次循环重新输入
}
arr[i]=grade; //将评分存入数组
i++;//条件控制语句
}
上面的代码最后实现情况如下:
请输入第1位评委打分:
87
请输入第2位评委打分:
88
请输入第3位评委打分:
899
你输入的数据有误,请重新输入第3位评委打分:
请输入第3位评委打分:
900
你输入的数据有误,请重新输入第3位评委打分:
请输入第3位评委打分:
87
请输入第4位评委打分:
78
请输入第5位评委打分:
67
请输入第6位评委打分:
88
委实尴尬,虽然我需要的功能达到了,但是提示这里出问题了,只要输入错误就会同时弹出两个提示
“你输入的数据有误,请重新输入第3位评委打分:
请输入第3位评委打分:”
而且这里我犯了一个很不好的习惯,没有对grade进行初始化值。当时也没意识到这个细节,然后啊丰指点了下,这个方法需要优化。
初步优化如下:
int [] arr=new int [6]; //创建数组接收数据
Scanner sc=new Scanner(System.in);
int grade=0;
int i=0; //初始化语句
while(i<6){
System.out.println("请输入第"+(i+1)+"位评委打分:"); //给出提示
grade=sc.nextInt();//输入的评分
if((grade>100)||(grade<0)){
System.out.println("你输入的数据有误,请重新输入第"+(i+1)+"位评委打分:");
grade=sc.nextInt();
}
arr[i]=grade;//将评分存入数组
i++;//条件控制语句
}
最后测试结果如下:
请输入第1位评委打分:
12
请输入第2位评委打分:
14
请输入第3位评委打分:
16
请输入第4位评委打分:
123
你输入的数据有误,请重新输入第4位评委打分:
126
请输入第5位评委打分:
128
你输入的数据有误,请重新输入第5位评委打分:
129
请输入第6位评委打分:
222
你输入的数据有误,请重新输入第6位评委打分:
222
原地爆炸了。。。这里可以看到虽然提示了,但是当我继续输入错误时,它会继续向下执行,拦不住我输入的错误数据。。。
**划重点,这里对循环语句的使用明显不理解,同时对if和while 语句的特点也没有了解透。。if语句是选择语句,当true时执行语句块,重新输入,只是执行这个步骤,但是并没有对后续的数据进行判断,除非本次循环结束,所以直接出错,我们需要的是如果为true,则重复当前操作,直到正确为止。所以应该用到循环体语句。
再次修正如下:
while(i<6){
System.out.println("请输入第"+(i+1)+"位评委打分:"); //给出提示
grade=sc.nextInt();//输入的评分
while((grade>100)||(grade<0)){
System.out.println("你输入的数据有误,请重新输入第"+(i+1)+"位评委打分:");
grade=sc.nextInt();
}
arr[i]=grade;//将评分存入数组
i++;//条件控制语句
}
将if语句改为了while循环语句,测试如下:
请输入第1位评委打分:
12
请输入第2位评委打分:
123
你输入的数据有误,请重新输入第2位评委打分:
123
你输入的数据有误,请重新输入第2位评委打分:
23
请输入第3位评委打分:
34
请输入第4位评委打分:
45
请输入第5位评委打分:
56
请输入第6位评委打分:
67
已经成功达到了我们想要需求,但在这里,我们会发现两个问题,
1、使用的while语句,初始化变量放在语句外面,执行完后变量还留存在内存中,占系统资源。
2、代码块比较杂乱,可读性一般。
所以最终使用for语句进行如下:
int [] arr=new int [6]; //创建数组接收数据
Scanner sc=new Scanner(System.in);
int grade=0;//初始化值
for(int i=0;i<6;i++) {
System.out.println("请输入第"+(i+1)+"位评委打分:"); //给出提示
grade=sc.nextInt(); //输入的评分
while((grade>100)||(grade<0)){ //进行判断
System.out.println("你输入的数据有误,请重新输入第"+(i+1)+"位评委打分:");
grade=sc.nextInt();
}
arr[i]=grade;//将评分存入数组
}
请输入第1位评委打分:
87
请输入第2位评委打分:
88
请输入第3位评委打分:
899
你输入的数据有误,请重新输入第3位评委打分:
899
你输入的数据有误,请重新输入第3位评委打分:
89
请输入第4位评委打分:
92
请输入第5位评委打分:
91
请输入第6位评委打分:
93
最后终于搞定,优化成功。
可能稍微对循环语句优有点了解的都不会选择第一种做法吧。。。
这次简单的优化也让我发现了自学时的不足之处,知道了具体语法的使用,但是不知道为什么这样用,以及他们之间的区别,非常好的一次启蒙课,感谢阿丰的指点,在今后的学习中得用心,不能只知道如何使用,还要知道为什么这样用!
最后让各位看官见笑了。。。