- 成员变量与局部变量的作用域问题
昨晚在51自学网看java的视频教程,学习了录入学生的各科成绩并按排序输出。但是我输入的总是会多出一些成绩的数据,当时仔细检查了代码,感觉没什么问题。后来重点看了下拼接成绩的代码,感觉也没问题。百思不得骑姐。
停下来,抽根烟缓缓。。。。。
猛然间注意到视频中的变量是声明在循环体中的,这尼玛啊,然后就想起了变量还有作用域这么一回事儿,愰然大悟。
特在此记录,避免以后再入这类坑。
话不多说,先上烂菜:
注意变量:String stuInfo = "";的位置。
package practice;
import java.util.Scanner;
public class StudentAchievement { // Achievement:成绩
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入学生人数:");
int stuNum = in.nextInt(); // 学生人数
System.out.println("请输入课程数目:");
int courseNum = in.nextInt(); // 课程数目
String[] course = new String[courseNum]; // 课程
String[] stuName = new String[stuNum]; // 学生姓名
int[][] score = new int[stuNum][courseNum]; // 定义一个数组来保存学生分数
int[] scoreSum = new int[stuNum]; // 定义一个数组来存放总分
int[] avgScore = new int[stuNum]; // 定义一个数组来存放平均分
String[] infomation = new String[stuNum];
String stuInfo = ""; // 局部变量(之前放在全局变量中,导致成绩重复)
/*
* 录入并保存课程
*/
for (int i = 0; i < course.length; i++) { // 定义循环,将课程名称保存在数组中
System.out.println("请定义第" + (i + 1) + "门课程是什么:");
course[i] = in.next(); // 保存课程
}
/*
* 录入学生
*/
for (int i = 0; i < stuNum; i++) { // 定义循环,将学生姓名保存在数组中
System.out.println("请输入第" + (i + 1) + "个学生的姓名:");
stuName[i] = in.next(); // 保存输入的学生姓名
}
/*
* 录入成绩
*/
for (int i = 0; i < stuNum; i++) { // 利用循环来录入学生的成绩
int sum = 0;
for (int j = 0; j < courseNum; j++) {
System.out.println("请输入" + stuName[i] + "的" + course[j] + "成绩:");
score[i][j] = in.nextInt();
sum += score[i][j]; // 将学生的成绩累加保存在变量中
stuInfo += score[i][j] + "\t"; // 先将学生的成绩先保存在字符串中
}
scoreSum[i] = sum; // 保存学生的总成绩到数组中
avgScore[i] = sum / courseNum; // 求出学生的平均分并保存在数组中
infomation[i] = stuName[i] + "\t" + stuInfo + scoreSum[i] + "\t" + avgScore[i]; // 将学生姓名和成绩保存在一个数组中
}
/*
* 对学生总分进行倒序排序
*/
for (int i = 0; i < stuNum - 1; i++) {
for (int j = 0; j < stuNum - 1; j++) {
if (scoreSum[j] < scoreSum[j + 1]) {
int temp = scoreSum[j];
String str = infomation[j];
scoreSum[j] = scoreSum[j + 1];
infomation[j] = infomation[j + 1];
scoreSum[j + 1] = temp;
infomation[j + 1] = str;
}
}
}
/*
* 打印列表标题
*/
System.out.print("姓名\t");
for (int i = 0; i < course.length; i++) {
System.out.print(course[i] + "\t");
}
System.out.print("总成绩\t" + "平均分\t" + "排行\t");
System.out.println();
for (int i = 0; i < stuNum; i++) {
System.out.println(infomation[i] + "\t第" + (i + 1) + "名");
}
in.close(); // 关流
}
}
来来来,先看看吃完后的结果吧:
这特么是有毒吧。。。。居然成这样了,不行,得改。
研究了好久(其实都是浪了时间),终于发现了问题所在,赶紧排毒:
package practice;
import java.util.Scanner;
public class StudentAchievement { // Achievement:成绩
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入学生人数:");
int stuNum = in.nextInt(); // 学生人数
System.out.println("请输入课程数目:");
int courseNum = in.nextInt(); // 课程数目
String[] course = new String[courseNum]; // 课程
String[] stuName = new String[stuNum]; // 学生姓名
int[][] score = new int[stuNum][courseNum]; // 定义一个数组来保存学生分数
int[] scoreSum = new int[stuNum]; // 定义一个数组来存放总分
int[] avgScore = new int[stuNum]; // 定义一个数组来存放平均分
String[] infomation = new String[stuNum];
/*
* 录入并保存课程
*/
for (int i = 0; i < course.length; i++) { // 定义循环,将课程名称保存在数组中
System.out.println("请定义第" + (i + 1) + "门课程是什么:");
course[i] = in.next(); // 保存课程
}
/*
* 录入学生
*/
for (int i = 0; i < stuNum; i++) { // 定义循环,将学生姓名保存在数组中
System.out.println("请输入第" + (i + 1) + "个学生的姓名:");
stuName[i] = in.next(); // 保存输入的学生姓名
}
/*
* 录入成绩
*/
for (int i = 0; i < stuNum; i++) { // 利用循环来录入学生的成绩
int sum = 0;
String stuInfo = ""; // 局部变量(之前放在全局变量中,导致成绩重复)
for (int j = 0; j < courseNum; j++) {
System.out.println("请输入" + stuName[i] + "的" + course[j] + "成绩:");
score[i][j] = in.nextInt();
sum += score[i][j]; // 将学生的成绩累加保存在变量中
stuInfo += score[i][j] + "\t"; // 先将学生的成绩先保存在字符串中
}
scoreSum[i] = sum; // 保存学生的总成绩到数组中
avgScore[i] = sum / courseNum; // 求出学生的平均分并保存在数组中
infomation[i] = stuName[i] + "\t" + stuInfo + scoreSum[i] + "\t" + avgScore[i]; // 将学生姓名和成绩保存在一个数组中
}
/*
* 对学生总分进行倒序排序
*/
for (int i = 0; i < stuNum - 1; i++) {
for (int j = 0; j < stuNum - 1; j++) {
if (scoreSum[j] < scoreSum[j + 1]) {
int temp = scoreSum[j];
String str = infomation[j];
scoreSum[j] = scoreSum[j + 1];
infomation[j] = infomation[j + 1];
scoreSum[j + 1] = temp;
infomation[j + 1] = str;
}
}
}
/*
* 打印列表标题
*/
System.out.print("姓名\t");
for (int i = 0; i < course.length; i++) {
System.out.print(course[i] + "\t");
}
System.out.print("总成绩\t" + "平均分\t" + "排行\t");
System.out.println();
for (int i = 0; i < stuNum; i++) {
System.out.println(infomation[i] + "\t第" + (i + 1) + "名");
}
in.close(); // 关流
}
}
运行结果如下,感觉瞬间舒服了很多,特意来此记录,避免再犯:
写在结尾的话:学习困难重重,望互勉。。。。。。