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

C#成绩册程序开发求助:读取文本文件计算学生平均成绩

C#成绩册程序:从文本文件读取并计算学生平均成绩

我来帮你拆解这个问题,其实核心就是字符串解析+数据计算这两步,咱们一步步来解决。先理清楚需求:你需要读取每行格式为ID || 名 || 姓 || 成绩的文本,其中成绩是10组「得分,满分」的交替数据(比如示例里的27,30就是第一组得分27、满分30),最终要计算学生的平均成绩。


第一步:定义学生数据结构

先创建一个Student类来存储学生的所有信息,这样处理起来更清晰:

public class Student
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // 存储每组成绩的得分和满分
    public List<(int Score, int MaxScore)> Scores { get; set; }
    // 计算平均得分率(所有得分/满分的平均值,转成百分比)
    public double AverageScoreRate => Scores.Any() 
        ? Scores.Average(s => (double)s.Score / s.MaxScore) * 100 
        : 0;
    // 另一种:计算所有得分的平均分(不考虑满分差异)
    public double AverageRawScore => Scores.Any() 
        ? Scores.Average(s => s.Score) 
        : 0;
}

第二步:读取并解析文本文件

接下来编写读取文件、解析每行数据的方法。这里要注意几个容易踩坑的关键点:

  • 分隔符是||(双竖线前后各有一个空格),不能直接用Split('|')
  • 成绩字符串末尾有个.,需要先去掉再分割
  • 要处理可能的异常(比如文件不存在、数据格式错误)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class GradeBookProcessor
{
    public List<Student> LoadStudentsFromFile(string filePath)
    {
        var students = new List<Student>();
        
        if (!File.Exists(filePath))
        {
            Console.WriteLine($"错误:文件 {filePath} 不存在!");
            return students;
        }

        foreach (var line in File.ReadLines(filePath))
        {
            // 跳过空行
            if (string.IsNullOrWhiteSpace(line))
                continue;

            // 按指定分隔符分割每行数据,自动移除空元素
            var parts = line.Split(new[] {" || "}, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length != 4)
            {
                Console.WriteLine($"警告:行格式错误,已跳过:{line}");
                continue;
            }

            var student = new Student
            {
                Id = parts[0].Trim(),
                FirstName = parts[1].Trim(),
                LastName = parts[2].Trim(),
                Scores = new List<(int, int)>()
            };

            // 处理成绩字符串:去掉末尾的点,再按逗号分割
            var scoreStr = parts[3].TrimEnd('.').Trim();
            var scoreParts = scoreStr.Split(',', StringSplitOptions.RemoveEmptyEntries);
            
            // 验证成绩数量:10组需要20个数值(得分、满分交替)
            if (scoreParts.Length != 20)
            {
                Console.WriteLine($"警告:学生 {student.Id} 的成绩数量错误,已跳过该学生成绩");
                students.Add(student);
                continue;
            }

            // 两两分组,解析得分和满分
            for (int i = 0; i < scoreParts.Length; i += 2)
            {
                if (int.TryParse(scoreParts[i], out int score) && int.TryParse(scoreParts[i+1], out int maxScore))
                {
                    // 确保满分不为0,避免除以0错误
                    if (maxScore > 0)
                        student.Scores.Add((score, maxScore));
                    else
                        Console.WriteLine($"警告:学生 {student.Id} 的第 {(i/2)+1} 组满分无效,已跳过");
                }
                else
                {
                    Console.WriteLine($"警告:学生 {student.Id} 的第 {(i/2)+1} 组成绩格式错误,已跳过");
                }
            }

            students.Add(student);
        }

        return students;
    }
}

第三步:调用示例

你可以这样使用上面的处理器,快速验证功能:

class Program
{
    static void Main(string[] args)
    {
        var processor = new GradeBookProcessor();
        var students = processor.LoadStudentsFromFile("students.txt");

        foreach (var student in students)
        {
            Console.WriteLine($"学生ID:{student.Id}");
            Console.WriteLine($"姓名:{student.FirstName} {student.LastName}");
            Console.WriteLine($"平均得分率:{student.AverageScoreRate:F2}%");
            Console.WriteLine($"原始得分平均分:{student.AverageRawScore:F2}");
            Console.WriteLine("---");
        }
    }
}

关键注意点说明

  • 分隔符处理:一定要用Split(new[] {" || "}, StringSplitOptions.RemoveEmptyEntries),因为你的分隔符是带空格的双竖线,直接按单个|分割会得到空字符串和空格,影响后续解析。
  • 成绩字符串清理:末尾的.必须去掉,否则分割后最后一个元素会是60.(比如示例里的),导致解析失败。
  • 异常防护:用int.TryParse代替int.Parse,避免因为数据格式错误导致程序崩溃;同时检查满分是否大于0,防止计算平均分的时候出现除以0的异常。
  • 两种平均分:我在Student类里写了两种平均成绩的计算方式,你可以根据需求选择:
    • AverageScoreRate:计算得分率的平均值(比如每组得分/满分后取平均,再转成百分比),适合不同满分的成绩对比。
    • AverageRawScore:直接计算所有得分的平均值,适合满分相同的情况。

内容的提问来源于stack exchange,提问作者Toby Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:54