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
相关产品推荐
相关产品推荐

