学习java的踩坑记录1

  • 成员变量与局部变量的作用域问题

昨晚在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();	//	关流
	}
}

运行结果如下,感觉瞬间舒服了很多,特意来此记录,避免再犯:
在这里插入图片描述
写在结尾的话:学习困难重重,望互勉。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值