import java.util.Scanner;
class Student{
private String studentNumber;
private String studentName;
//将分数初始化为-1,避免为0时产生的歧义
private int markForMaths=-1;
private int markForEnglish=-1;
private int markForScience=-1;
private int people;
public void Student(String studentNumber,String studentName){
this.studentNumber=studentNumber;
this.studentName=studentName;
}
public String getNumber(){
return studentNumber;
}
public String getName(){
return studentName;
}
public void enterMarks(int markForMaths,int markForEnglish,int markForScience){
this.markForMaths=markForMaths;
this.markForEnglish=markForEnglish;
this.markForScience=markForScience;
}
public int getMathsMark(){
return markForMaths;
}
public int getEnglishMark(){
return markForEnglish;
}
public int getScienceMark(){
return markForScience;
}
public void setPoeple(int people){
this.people=people;
}
public double calculateAverageMark(){
return (markForMaths+markForEnglish+markForScience)/people;
}
}
public class TestStudent extends Student{
public static void main(String[] args){
//动态初始化,由系统分配默认值
String[] arr1 =new String[100];//studentNumber
String[] arr2 =new String[100];//studentName
int[] arr3 =new int[100];//maths
int[] arr4 =new int[100];//english
int[] arr5 =new int[100];//science
Scanner sc = new Scanner(System.in);
System.out.println("要录入成绩的学生人数为(不超过100人):");
int people = sc.nextInt();
Student stu = new Student();
stu.setPoeple(people);
for(int q=1;q<=people;q++){
//数据覆盖
System.out.println("请输入第"+q+"个学生的编号");
String number = sc.next();
arr1[q]=number;
System.out.println("请输入第"+q+"个学生的姓名");
String name = sc.next();
arr2[q]=name;
System.out.println("请输入第"+q+"个学生的数学成绩");
int maths = sc.nextInt();
arr3[q]=maths;
System.out.println("请输入第"+q+"个学生的英语成绩");
int english = sc.nextInt();
arr4[q]=english;
System.out.println("请输入第"+q+"个学生的科学成绩");
int science = sc.nextInt();
arr5[q]=science;
}
for(int q=1;q<=people;q++){
//数组遍历,取出数据
stu.Student(arr1[q],arr2[q]);
stu.enterMarks(arr3[q], arr4[q], arr5[q]);
System.out.println("第"+q+"个学生的编号为:"+stu.getNumber());
System.out.println("第"+q+"个学生的姓名为:"+stu.getName());
System.out.println("第"+q+"个学生的平均成绩为:"+stu.calculateAverageMark());
}
}
}
nextLine()未成功读取数据分析
1.案例
从图中可以看出,控制台直接跳过了第二次sc.nextLine()的输入。
2.原因分析
- nextLine()方法是读取一整行,以一个回车符作为结束标记停止扫描。
- next() / nextInt()方法是,读取到第一个结束符【空格、回车、Tab键】作为结束标记停止扫描。
- next() / nextInt() 他们不会取走结束符号,把他们留在缓冲区;而nextLine()方法取走当前扫描行第一个非结束符之后、回车符之前的整行内容作为字符串进行返回,也就是可能会取走空格等,遇到回车结束【并不会取走回车】
- 所以最开始的代码中,第二个nextLine()方法开始扫描的时候,它会优先读到残留在缓冲区的回车符,进而直接结束扫描,返回,自然我就没办法输入我的数据了。
3.解决方案
必要的知识:nextLine()不能放在in.nextInt()代码段后面,否则nextLine()会读入"\n"字符,但"\n"并不会成为返回的字符。
方案一:如果没必要读取空格的话,就不使用nextLine()方法,使用next()方法读取一个连续不间断的字符串。
方案二:有必要读取空格的话,使用nextLine()方法接收你想输入的字符串之前,额外执行一次nextLine()方法把残留的回车符拿掉,这样再执行nextLine()方法就可以正常地输入并接收自己想要输入的数据了。