上节答案:B
本章节主要针对前面所学内容进行练习
5 - 1:编程练习
小伙伴们,请根据所学知识,参考注释,将代码编辑器中代码补充完整,实现成绩加分功能。
功能描述:为指定成绩加分,直到分数大于等于 60 为止,输出加分前和加分后的成绩,并统计加分的次数。
运行效果:
任务
温馨提示: 先试着自己独立完成,木有思路了也表着急。在后面 3 个小节中, @laurenyang 将分别讲解本小节练习的解析思路、优化的方案以及如何通过Eclipse的调试功能辅助代码开发
public class HelloWorld {
public static void main(String[] args) {
// 变量保存成绩
int score = 53;
// 变量保存加分次数
int count = 0;
//打印输出加分前成绩
// 只要成绩小于60,就循环执行加分操作,并统计加分次数
//打印输出加分后成绩,以及加分次数
}
}
5 - 2:编程练习解析
编程练习
功能描述:为指定成绩加分,直到分数大于等于60分为止,输出加分和加分后的成绩,并统计加分的次数。
功能描述:
做法:首先我们新建一个Java项目:
点下面的Finish,接着我们去创建一个Java类:
指定包名、名称,点Finish:
完成后我们在回忆一下,这次编程练习的功能是:为指定的成绩进行加分的操作,直到分数大于等于60分为止。输出的是加分前的成绩和加分后的成绩,并统计加分的次数。步骤:1、定义一个变量,用来保存加分的次数;2、使用循环为成绩加分;3、每次执行循环加分操作加一分,并且统计加分的次数。
现在我们实现以下代码:
package com.imooc;
/*
* 功能是:为指定的成绩进行加分的操作,直到分数大于等于60分为止。
* 输出的是加分前的成绩和加分后的成绩,并统计加分的次数。
* 步骤:
* 1、定义一个变量,用来保存加分的次数;
* 2、使用循环为成绩加分;
* 3、每次执行循环加分操作加一分,并且统计加分的次数。
*/
public class Demo01 {
public static void main(String[] args) {
int score = 53;//假定初始成绩为53分
int count = 0;//用来统计加分的次数
System.out.println("加分前的成绩:" + score);//输出加分前的成绩
while(score < 60) {//只要成绩小于60,就一直加分
score++;//每次循环加一分
count++;//统计次数
}
System.out.println("加分后的成绩:" + score);
System.out.println("共加了" + count + "次!");
}
}
运行一下,可以看出它的效果。
5 - 3:编程练习优化
实现完以后,我们可以看一下,它是否有一些不足的地方。
我们可以看到,这里的score是程序已经给定的,不是我们人为自己输入的,我们如何可以自己输入考试信息呢?
在Java中,它提供了一个Scanner工具类,来获取用户输入的值。怎么实现,在下面代码中会说:
package com.imooc;
import java.util.Scanner;//导入java.util.Scanner句末分号
/*
* 功能是:为指定的成绩进行加分的操作,直到分数大于等于60分为止。
* 输出的是加分前的成绩和加分后的成绩,并统计加分的次数。
* 步骤:
* 1、定义一个变量,用来保存加分的次数;
* 2、使用循环为成绩加分;
* 3、每次执行循环加分操作加一分,并且统计加分的次数。
*
* 使用Scanner工具类来获取用户输入的成绩信息
* Scanner类位于java.util包中,使用时需要导入此包
* 步骤:
* 1、导入java.util.Scanner
* 2、创建Scanner对象(只有创建Scanner对象,我们才能够获取用户输入的数据)
* 3、接受并保存用户的值
*/
public class Demo01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//创建Scanner对象
System.out.println("请输入考试成绩信息");
int score = input.nextInt();//这里把53改成input.nextInt(),input与20行等号前面的是一样的
int count = 0;//用来统计加分的次数
System.out.println("加分前的成绩:" + score);//输出加分前的成绩
while(score < 60) {//只要成绩小于60,就一直加分
score++;//每次循环加一分
count++;//统计次数
}
System.out.println("加分后的成绩:" + score);
System.out.println("共加了" + count + "次!");
}
}
运行一下发现,我们输入数字时,是在请输入考试成绩信息的下面那一行输入的,要是想在同一行输入,就把请输入考试成绩信息前面println的ln去掉,ln就是line,就是运行完当前行后,自动转到下一行。
5 - 4:使用Eclipse调试程序
所谓的调试,就是找到程序的问题所在,找到问题出现的地方并加以修改。我们可以通过IDE工具中的断点调试功能。
比如把上面的程序while后面score<60改成score<=60再运行程序,出现了这样的情况:
请输入考试成绩信息
53
加分前的成绩:53
加分后的成绩:61
共加了8次!
这里说分数大于等于60分为止不是61分,这时候,我们可以根据程序运行结果判断问题出现在了哪里,我们可以在程序出现问题的地方添加断点,程序在运行到端点的时候会停止,我们可以在此处进行调试,一步一步的运行。现在我们假设,它在循环的地方出现了错误,我们可以在while最前面的地方鼠标双击,这里就多了一个点:
程序在运行到这个位置时会自动停止,我们可以进行一步一步的调试。现在,在工具栏上有一个Debug的按钮,点击以后,程序正常的执行,我们依然输入53,回车
然后进入Debug视图,我们看到,当它运行到我们所设置断点的位置时,程序并没有接着往下执行。接着我们可以点击工具栏上的Step Over进行单步执行(每行代码一条一条执行):
点以以后,他会执行当前行代码,这时我们可以看这边:
还是点击Step Over,score变成了54,count是0:
接着点Step Over:
count加一。
这样一直点,就有可能发现错误在哪里了。
5 - 5:进阶联系
编写Java程序,实现接受3个班级个4名学员的Java成绩,然后计算每个学员的平均分。
按照老师写法,写出来是这样:
package com.imooc;
import java.util.Scanner;
/*
* 功能:实现接受3个班级个4名学员的Java成绩,然后计算每个学员的平均分
* 知识点:二重循环、外层控制班级数量,内层控制班级中学员的数量
*/
public class Demo02 {
public static void main(String[] args) {//如何加入main方法呢,简单来讲,直接输入main,然后按alt+/,回车就可以了
int classNum = 3;//班级数量
int stuNum = 4;//学生数量
double sum = 0;//总分
double avg = 0;//平均分
//现在我们要手动输入成绩,所以需要Scanner
Scanner input = new Scanner(System.in);
for(int i = 1;i <= classNum;i++) {//外层控制班级数量
System.out.println("***请输入第" + i + "个班级的成绩***");
for(int j = 1;j <= stuNum;j++) {//内层控制班级中学员的数量
System.out.println("请输入第" + j + "个学员的成绩");
int score = input.nextInt();
sum = sum + score;//累加求和
}
avg = sum / stuNum;//计算平均分
System.out.println("第" + i + "个班级学生的平均分为:" + avg);
}
}
}
但是运行出来有点问题:
可以看到第二个班级平均分不对,输入了4个不超过100的分数,平均分为什么超过了100呢?那么这里我们可以用断点调试来检查哪里出现了错误。
如何检查上面已经说过了,经过检查,这里的问题是在外层循环时,每次必须要把sum清零才行(sum = 0;),这样就没有问题了。
经验总结:
1、通过分析,明确需求
2、整理相关知识点
3、梳理实现流程
4、借助断点跟踪解决问题