You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:50