关于循环体语句的运用小结

昨天做一个测试题题目如下:
需求:有一场编程比赛,六位评委打分,分数为整数,范围在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

最后终于搞定,优化成功。
可能稍微对循环语句优有点了解的都不会选择第一种做法吧。。。
这次简单的优化也让我发现了自学时的不足之处,知道了具体语法的使用,但是不知道为什么这样用,以及他们之间的区别,非常好的一次启蒙课,感谢阿丰的指点,在今后的学习中得用心,不能只知道如何使用,还要知道为什么这样用!

最后让各位看官见笑了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值