From b542599144c5ff0d592ad895aca20eba89d05751 Mon Sep 17 00:00:00 2001 From: suifengwudong Date: Wed, 13 Aug 2025 12:00:04 +0800 Subject: [PATCH] program.cs completed --- Homework/Program.cs | 387 ++++++++++++++++++++++++++++---------------- 1 file changed, 251 insertions(+), 136 deletions(-) diff --git a/Homework/Program.cs b/Homework/Program.cs index b728a41..4476cbf 100644 --- a/Homework/Program.cs +++ b/Homework/Program.cs @@ -1,51 +1,69 @@ // See https://aka.ms/new-console-template for more information using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; namespace StudentManagementSystem { - // 成绩等级枚举 + // 成绩 public enum Grade { - // TODO: 定义成绩等级 F(0), D(60), C(70), B(80), A(90) - - } - - // 泛型仓储接口 + A, + B, + C, + D, + F + }; + + // 接口 public interface IRepository { - // TODO: 定义接口方法 - // Add(T item) - // Remove(T item) 返回bool - // GetAll() 返回List - // Find(Func predicate) 返回List - + // 定义接口方法 + public void Add(T item); + public bool Remove(T item); + public List GetAll(); + public List Find(Func predicate); } - // 学生类 + // Student类 public class Student : IComparable { - // TODO: 定义字段 StudentId, Name, Age - - + // 属性 + public string? StudentId; + public string? Name; + public int Age; + + // 构造函数 public Student(string studentId, string name, int age) { - // TODO: 实现构造方法,包含参数验证(空值检查) - + try + { + if (string.IsNullOrEmpty(studentId)||string.IsNullOrEmpty(name)) + { + throw new ArgumentNullException("studentId or name can not be null or empty"); + } + StudentId = studentId; + Name = name; + Age = age; + } + catch (ArgumentNullException ex) + { + Console.WriteLine($"Error: {ex.Message}"); + } } public override string ToString() { - // TODO: 返回格式化的学生信息字符串 - + return $"StudentId: {StudentId}, Name: {Name}, Age: {Age}"; } - // TODO: 实现IComparable接口,按学号排序 - // 提示:使用string.Compare方法 + // 实现IComparable接口 public int CompareTo(Student? other) { - + if (other == null || other.StudentId == null) return 1; + if (StudentId == null) return -1; + return StudentId.CompareTo(other.StudentId); } public override bool Equals(object? obj) @@ -59,111 +77,161 @@ public override int GetHashCode() } } - // 成绩类 + // 成绩 public class Score { - // TODO: 定义字段 Subject, Points - - + public string? Subject; + public double Points; + public Score(string subject, double points) { - // TODO: 实现构造方法,包含参数验证 - + try + { + if (string.IsNullOrEmpty(subject)) + { + throw new ArgumentNullException(nameof(subject), "Subject cannot be null or empty"); + } + Subject = subject; + Points = points; + } + catch (ArgumentNullException ex) + { + Console.WriteLine($"Error: {ex.Message}"); + } } public override string ToString() { - // TODO: 返回格式化的成绩信息 - + return $"Subject: {Subject}, Points: {Points}"; } } // 学生管理类 public class StudentManager : IRepository { - // TODO: 定义私有字段存储学生列表 - // 提示:使用List存储 - + private List students = []; public void Add(Student item) { - // TODO: 实现添加学生的逻辑 - // 1. 参数验证 - // 2. 添加到列表 - + if (item == null) throw new ArgumentNullException(nameof(item), "Student cannot be null"); + students.Add(item); } public bool Remove(Student item) { - // TODO: 实现Remove方法 - + if (item == null) throw new ArgumentNullException(nameof(item), "Student cannot be null"); + return students.Remove(item); } public List GetAll() { - // TODO: 返回学生列表的副本 - + return new List(students); } public List Find(Func predicate) { - // TODO: 使用foreach循环查找符合条件的学生 - + List newList = []; + foreach (var student in students) + { + if (predicate(student)) + { + newList.Add(student); + } + } + return newList; } - // 查找年龄在指定范围内的学生 + // 根据年龄范围查找学生 public List GetStudentsByAge(int minAge, int maxAge) { - // TODO: 使用foreach循环和if判断实现年龄范围查询 - + try + { + if (minAge < 0 || maxAge < 0 || minAge > maxAge) + { + throw new ArgumentException("Invalid age range"); + } + return Find(s => s.Age >= minAge && s.Age <= maxAge); + } + catch (ArgumentException ex) + { + Console.WriteLine($"Error: {ex.Message}"); + return []; + } } } // 成绩管理类 public class ScoreManager { - // TODO: 定义私有字段存储成绩字典 - // 提示:使用Dictionary>存储 - + private Dictionary> studentScores = []; public void AddScore(string studentId, Score score) { - // TODO: 实现添加成绩的逻辑 - // 1. 参数验证 - // 2. 初始化学生成绩列表(如不存在) - // 3. 添加成绩 - + if (string.IsNullOrEmpty(studentId)) throw new ArgumentNullException(nameof(studentId), "StudentId cannot be null or empty"); + if (score == null) throw new ArgumentNullException(nameof(score), "Score cannot be null"); + if (!studentScores.ContainsKey(studentId)) + { + studentScores[studentId] = []; + } + studentScores[studentId].Add(score); } public List GetStudentScores(string studentId) { - // TODO: 获取指定学生的所有成绩 - + if (string.IsNullOrEmpty(studentId)) throw new ArgumentNullException(nameof(studentId), "StudentId cannot be null or empty"); + List scores = []; + if (studentScores.ContainsKey(studentId)) + { + scores = studentScores[studentId]; + } + return scores; } public double CalculateAverage(string studentId) { - // TODO: 计算指定学生的平均分 - // 提示:使用foreach循环计算总分,然后除以科目数 - + var scores = GetStudentScores(studentId); + if (scores.Count == 0) return 0.0; + double totalPoints = 0.0; + foreach (var score in scores) + { + totalPoints += score.Points; + } + return totalPoints / scores.Count; } - // TODO: 使用模式匹配实现成绩等级转换 + // 成绩转换 public Grade GetGrade(double score) { - + switch (score) + { + case >= 90: + return Grade.A; + case >= 80: + return Grade.B; + case >= 70: + return Grade.C; + case >= 60: + return Grade.D; + default: + return Grade.F; + } } public List<(string StudentId, double Average)> GetTopStudents(int count) { - // TODO: 使用简单循环获取平均分最高的学生 - // 提示:可以先计算所有学生的平均分,然后排序取前count个 - + var averages = new List<(string StudentId, double Average)>(); + foreach (var studentId in studentScores.Keys) + { + double average = CalculateAverage(studentId); + averages.Add((studentId, average)); + } + averages.Sort((x, y) => y.Average.CompareTo(x.Average)); // 降序排序 + return averages.GetRange(0, Math.Min(count, averages.Count)); // 返回前count个学生 } public Dictionary> GetAllScores() { - return new Dictionary>(scores); + return new Dictionary>(studentScores); } } @@ -172,12 +240,20 @@ public class DataManager { public void SaveStudentsToFile(List students, string filePath) { - // TODO: 实现保存学生数据到文件 - // 提示:使用StreamWriter,格式为CSV try { - // 在这里实现文件写入逻辑 - + if (students == null || string.IsNullOrEmpty(filePath)) + { + throw new ArgumentNullException("Students list or file path cannot be null or empty"); + } + // csv文件格式 + using (StreamWriter writer = new StreamWriter(filePath)) + { + foreach (var student in students) + { + writer.WriteLine($"{student.StudentId},{student.Name},{student.Age}"); + } + } } catch (Exception ex) { @@ -187,85 +263,124 @@ public void SaveStudentsToFile(List students, string filePath) public List LoadStudentsFromFile(string filePath) { - List students = new List(); - - // TODO: 实现从文件读取学生数据 - // 提示:使用StreamReader,解析CSV格式 + var students = new List(); try { - // 在这里实现文件读取逻辑 - + if (string.IsNullOrEmpty(filePath)) + { + throw new ArgumentNullException(nameof(filePath), "File path cannot be null or empty"); + } + using (StreamReader reader = new StreamReader(filePath)) + { + string? line; + while ((line = reader.ReadLine()) != null) + { + var parts = line.Split(','); + if (parts.Length == 3 && int.TryParse(parts[2], out int age)) + { + students.Add(new Student(parts[0], parts[1], age)); + } + } + } } catch (Exception ex) { Console.WriteLine($"读取文件时发生错误: {ex.Message}"); } - return students; } - } - // 主程序 - class Program - { - static void Main(string[] args) + // 主程序 + class Program { - Console.WriteLine("=== 学生成绩管理系统 ===\n"); - - // 创建管理器实例 - var studentManager = new StudentManager(); - var scoreManager = new ScoreManager(); - var dataManager = new DataManager(); - - try + static void Main(string[] args) { - // 1. 学生数据(共3个学生) - Console.WriteLine("1. 添加学生信息:"); - studentManager.Add(new Student("2021001", "张三", 20)); - studentManager.Add(new Student("2021002", "李四", 19)); - studentManager.Add(new Student("2021003", "王五", 21)); - Console.WriteLine("学生信息添加完成"); - - // 2. 成绩数据(每个学生各2门课程) - Console.WriteLine("\n2. 添加成绩信息:"); - scoreManager.AddScore("2021001", new Score("数学", 95.5)); - scoreManager.AddScore("2021001", new Score("英语", 87.0)); - - scoreManager.AddScore("2021002", new Score("数学", 78.5)); - scoreManager.AddScore("2021002", new Score("英语", 85.5)); - - scoreManager.AddScore("2021003", new Score("数学", 88.0)); - scoreManager.AddScore("2021003", new Score("英语", 92.0)); - Console.WriteLine("成绩信息添加完成"); - - // 3. 测试年龄范围查询 - Console.WriteLine("\n3. 查找年龄在19-20岁的学生:"); - // TODO: 调用GetStudentsByAge方法并显示结果 - - - // 4. 显示学生成绩统计 - Console.WriteLine("\n4. 学生成绩统计:"); - // TODO: 遍历所有学生,显示其成绩、平均分和等级 - - - // 5. 显示排名(简化版) - Console.WriteLine("\n5. 平均分最高的学生:"); - // TODO: 调用GetTopStudents(1)方法显示第一名 - - - // 6. 文件操作 - Console.WriteLine("\n6. 数据持久化演示:"); - // TODO: 保存和读取学生文件 - - + Console.WriteLine("=== 学生成绩管理系统 ===\n"); + // 创建管理器实例 + var studentManager = new StudentManager(); + var scoreManager = new ScoreManager(); + var dataManager = new DataManager(); + + try + { + // 1. 学生数据(共3个学生) + Console.WriteLine("1. 添加学生信息:"); + studentManager.Add(new Student("2021001", "张三", 20)); + studentManager.Add(new Student("2021002", "李四", 19)); + studentManager.Add(new Student("2021003", "王五", 21)); + Console.WriteLine("学生信息添加完成"); + + // 2. 成绩数据(每个学生各2门课程) + Console.WriteLine("\n2. 添加成绩信息:"); + scoreManager.AddScore("2021001", new Score("数学", 95.5)); + scoreManager.AddScore("2021001", new Score("英语", 87.0)); + scoreManager.AddScore("2021002", new Score("数学", 78.5)); + scoreManager.AddScore("2021002", new Score("英语", 85.5)); + scoreManager.AddScore("2021003", new Score("数学", 88.0)); + scoreManager.AddScore("2021003", new Score("英语", 92.0)); + Console.WriteLine("成绩信息添加完成"); + + // 3. 测试年龄范围查询 + Console.WriteLine("\n3. 查找年龄在19-20岁的学生:"); + // TODO: 调用GetStudentsByAge方法并显示结果 + var studentsInAgeRange = studentManager.GetStudentsByAge(19, 20); + foreach (var s in studentsInAgeRange) + { + Console.WriteLine(s); + } + + // 4. 显示学生成绩统计 + Console.WriteLine("\n4. 学生成绩统计:"); + // TODO: 遍历所有学生,显示其成绩、平均分和等级 + var allStudents = studentManager.GetAll(); + foreach (var s in allStudents) + { + var scores = scoreManager.GetStudentScores(s.StudentId ?? ""); + Console.WriteLine($"\n学生: {s.Name} (ID: {s.StudentId})"); + foreach (var score in scores) + { + Console.WriteLine($" 课程: {score.Subject}, 分数: {score.Points}"); + } + double avg = scoreManager.CalculateAverage(s.StudentId ?? ""); + Grade grade = scoreManager.GetGrade(avg); + Console.WriteLine($" 平均分: {avg:F2}, 等级: {grade}"); + } + + // 5. 显示排名(简化版) + Console.WriteLine("\n5. 平均分最高的学生:"); + // TODO: 调用GetTopStudents(1)方法显示第一名 + var topStudent = scoreManager.GetTopStudents(1); + if (topStudent.Count > 0) + { + var student = allStudents.Find(s => s.StudentId == topStudent[0].StudentId); + if (student != null) + { + Console.WriteLine($"第一名: {student.Name} (ID: {student.StudentId}), 平均分: {topStudent[0].Average:F2}"); + } + else + { + Console.WriteLine("未找到第一名学生信息"); + } + } + else + { + Console.WriteLine("没有学生成绩信息"); + } + + // 6. 文件操作 + Console.WriteLine("\n6. 数据持久化演示:"); + // TODO: 保存和读取学生文件 + string filePath = "students.csv"; + dataManager.SaveStudentsToFile(allStudents, filePath); + dataManager.LoadStudentsFromFile(filePath); + } + catch (Exception ex) + { + Console.WriteLine($"程序执行过程中发生错误: {ex.Message}"); + } + Console.WriteLine("\n程序执行完毕,按任意键退出..."); + Console.ReadKey(); } - catch (Exception ex) - { - Console.WriteLine($"程序执行过程中发生错误: {ex.Message}"); - } - - Console.WriteLine("\n程序执行完毕,按任意键退出..."); - Console.ReadKey(); } } } \ No newline at end of file