C#多学生成绩记录程序开发求助:存储学生名称时报错
修正你的C#学生成绩录入程序
我来帮你搞定这个程序的问题,先梳理下你代码里的几个关键错误,然后给出完整的修正版本:
主要问题分析
- 数组初始化错误:你创建了固定长度为6的
Student数组,但没有用到用户输入的学生数量n,而且数组里的每个Student对象都是null,直接调用addGrade会触发空引用异常。 - 逻辑混淆:你把学生ID字符串
studentId转成double传给addGrade,这完全不符合逻辑——addGrade是用来存成绩的,学生ID应该作为每个学生的标识单独存储。 - 无循环处理逻辑:你硬编码了索引0到6的操作,既无法适配用户输入的不同学生数量,还会因为数组长度6导致索引6越界。
- 缺少输出逻辑:没有实现按你要求的格式输出学生的成绩和平均分。
- 类型不安全的集合:
ArrayList会导致装箱拆箱,换成泛型List<double>更安全高效。
修正后的完整代码
using System; using System.Collections.Generic; namespace Question_Two { class Program { static void Main(string[] args) { Console.WriteLine("Input the number of students: "); // 增加输入验证,避免非数字输入报错 if (!int.TryParse(Console.ReadLine(), out int studentCount)) { Console.WriteLine("Invalid input! Please enter a number."); return; } // 根据用户输入的数量创建Student数组 Student[] students = new Student[studentCount]; // 循环处理每个学生 for (int i = 0; i < studentCount; i++) { // 实例化当前学生对象,避免空引用 students[i] = new Student(); string studentId = $"Student #{i + 1}"; Console.WriteLine($"\nEnter grades for {studentId}:"); // 录入5门成绩 for (int j = 0; j < 5; j++) { Console.Write($"Enter Grade{j + 1}: "); // 验证成绩输入是否有效 if (!double.TryParse(Console.ReadLine(), out double grade)) { Console.WriteLine("Invalid grade! Please enter a number."); j--; // 重新输入当前成绩 continue; } students[i].AddGrade(grade); } } // 按指定格式输出所有学生记录 Console.WriteLine("\n----------------------------------------"); Console.WriteLine("Student #...... Grade1..... Grade2..... Grade3..... Grade4..... Grade5..... Average"); Console.WriteLine("----------------------------------------"); for (int i = 0; i < studentCount; i++) { string studentId = $"Student #{i + 1}"; double[] grades = students[i].GetGrades(); double average = students[i].GetAverage(); // 格式化输出,保证对齐 Console.WriteLine($"{studentId,-15} {grades[0],-10} {grades[1],-10} {grades[2],-10} {grades[3],-10} {grades[4],-10} {average:F2}"); } } } public class Student { // 用泛型List<double>替代ArrayList,类型更安全 private List<double> _grades = new List<double>(); // 添加成绩的方法 public void AddGrade(double val) { _grades.Add(val); } // 获取所有成绩的方法,方便输出 public double[] GetGrades() { return _grades.ToArray(); } // 计算平均分的方法,增加空集合判断避免除以0 public double GetAverage() { if (_grades.Count == 0) return 0; double sum = 0; foreach (double grade in _grades) { sum += grade; } return sum / _grades.Count; } } }
关键改进点说明
- 输入验证:用
int.TryParse和double.TryParse处理用户输入,避免程序因无效输入崩溃。 - 循环逻辑:外层循环处理每个学生,内层循环录入5门成绩,完全适配用户输入的学生数量。
- 对象实例化:在循环中为每个
Student数组元素实例化对象,解决空引用问题。 - 学生标识处理:用
Student #{i+1}生成每个学生的ID,和成绩逻辑分离。 - 格式化输出:用
-和F2格式字符串保证输出对齐,平均分保留两位小数。 - 类型安全:替换
ArrayList为List<double>,避免装箱拆箱,同时增加GetGrades方法方便获取所有成绩用于输出。 - 异常防护:在计算平均分前判断成绩集合是否为空,避免除以0的错误。
内容的提问来源于stack exchange,提问作者Sir Dog Man Thing
相关产品推荐
相关产品推荐

