From 71538930dac8a332120717912096be057e796500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=9A=E9=98=B3?= Date: Fri, 8 Aug 2025 16:31:03 +0800 Subject: [PATCH] Program.cs --- Homework/Program.cs | 283 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 252 insertions(+), 31 deletions(-) diff --git a/Homework/Program.cs b/Homework/Program.cs index b728a41..4520027 100644 --- a/Homework/Program.cs +++ b/Homework/Program.cs @@ -1,4 +1,4 @@ -// See https://aka.ms/new-console-template for more information +// See https://aka.ms/new-console-template for more information using System; using System.Collections.Generic; using System.IO; @@ -9,7 +9,11 @@ namespace StudentManagementSystem public enum Grade { // TODO: 定义成绩等级 F(0), D(60), C(70), B(80), A(90) - + F = 0, + D = 60, + C = 70, + B = 80, + A = 90 } // 泛型仓储接口 @@ -17,35 +21,70 @@ public interface IRepository { // TODO: 定义接口方法 // Add(T item) + void Add(T item); // Remove(T item) 返回bool + bool Remove(T item); // GetAll() 返回List + List GetAll(); // Find(Func predicate) 返回List - + List Find(Func predicate); } // 学生类 public class Student : IComparable { // TODO: 定义字段 StudentId, Name, Age - - + public string StudentId { get; private set; } + public string Name { get; private set; } + public int Age { get; private set; } + public Student(string studentId, string name, int age) { // TODO: 实现构造方法,包含参数验证(空值检查) - + try + { + if (studentId is null || studentId == "") + { + throw new ArgumentException("学号不能为空", nameof(studentId)); + } + else + { + StudentId = studentId; + } + if (name is null || name == "") + { + throw new ArgumentException("姓名不能为空", nameof(name)); + } + else + { + Name = name; + } + if (age <= 0 || age > 150) + { + throw new ArgumentOutOfRangeException(nameof(age), "年龄必须为有效值"); + } + else + { + Age = age; + } + } + catch (Exception ex) + { + Console.WriteLine($"Caught an exception: {ex.Message}"); + } } public override string ToString() { // TODO: 返回格式化的学生信息字符串 - + return $"学号:{StudentId},姓名:{Name},年龄:{Age}"; } // TODO: 实现IComparable接口,按学号排序 // 提示:使用string.Compare方法 public int CompareTo(Student? other) { - + return string.Compare(StudentId, other.StudentId); } public override bool Equals(object? obj) @@ -63,18 +102,41 @@ public override int GetHashCode() public class Score { // TODO: 定义字段 Subject, Points - + public string Subject { get; set; } + public double Points { get; set; } public Score(string subject, double points) { // TODO: 实现构造方法,包含参数验证 - + try + { + if (subject is null || subject == "") + { + throw new ArgumentException("科目名称不能为空"); + } + else + { + Subject = subject; + } + if (points < 0 || points > 100) + { + throw new ArgumentOutOfRangeException(nameof(points), "分数必须在0-100之间"); + } + else + { + Points = points; + } + } + catch (Exception ex) + { + Console.WriteLine($"Caught an exception: {ex.Message}"); + } } public override string ToString() { // TODO: 返回格式化的成绩信息 - + return $"科目:{Subject},分数:{Points:F1}"; } } @@ -83,39 +145,83 @@ public class StudentManager : IRepository { // TODO: 定义私有字段存储学生列表 // 提示:使用List存储 - + private readonly List students = new List(); public void Add(Student item) { // TODO: 实现添加学生的逻辑 // 1. 参数验证 // 2. 添加到列表 - + try + { + if (item is null) + { + throw new ArgumentNullException(nameof(item)); + } + else + { + students.Add(item); + } + } + catch (Exception ex) + { + Console.WriteLine($"Caught an exception: {ex.Message}"); + } } public bool Remove(Student item) { // TODO: 实现Remove方法 - + try + { + if (item is null) + { + throw new ArgumentNullException(nameof(item)); + } + else + { + students.Remove(item); + } + } + catch (Exception ex) + { + Console.WriteLine($"Caught an exception: {ex.Message}"); + } } public List GetAll() { // TODO: 返回学生列表的副本 - + return new List(students); } public List Find(Func predicate) { // TODO: 使用foreach循环查找符合条件的学生 - + List result = new List(); + foreach (var student in students) + { + if (predicate(student)) + { + result.Add(student); + } + } + return result; } // 查找年龄在指定范围内的学生 public List GetStudentsByAge(int minAge, int maxAge) { // TODO: 使用foreach循环和if判断实现年龄范围查询 - + List result = new List(); + foreach (var student in students) + { + if (student.Age >= minAge && student.Age <= maxAge) + { + result.Add(student); + } + } + return result; } } @@ -124,7 +230,7 @@ public class ScoreManager { // TODO: 定义私有字段存储成绩字典 // 提示:使用Dictionary>存储 - + private readonly Dictionary> scores = new Dictionary>(); public void AddScore(string studentId, Score score) { @@ -132,33 +238,86 @@ public void AddScore(string studentId, Score score) // 1. 参数验证 // 2. 初始化学生成绩列表(如不存在) // 3. 添加成绩 - + if (studentId is null || studentId == "") + throw new ArgumentException("学号不能为空"); + if (score is null) + throw new ArgumentNullException("成绩对象不能为空"); + + if (!scores.ContainsKey(studentId)) + { + scores[studentId] = new List(); + } + scores[studentId].Add(score); } public List GetStudentScores(string studentId) { // TODO: 获取指定学生的所有成绩 - + if (scores.TryGetValue(studentId, out var studentScores)) + { + return new List(studentScores); // 返回副本 + } + return new List(); } public double CalculateAverage(string studentId) { // TODO: 计算指定学生的平均分 // 提示:使用foreach循环计算总分,然后除以科目数 - + var studentScores = GetStudentScores(studentId); + if (studentScores.Count == 0) + return 0; + + double total = 0; + foreach (var score in studentScores) + { + total += score.Points; + } + return total / studentScores.Count; } // TODO: 使用模式匹配实现成绩等级转换 public Grade GetGrade(double score) { - + return score switch + { + >= 90 => Grade.A, + >= 80 => Grade.B, + >= 70 => Grade.C, + >= 60 => Grade.D, + _ => Grade.F + }; } public List<(string StudentId, double Average)> GetTopStudents(int count) { // TODO: 使用简单循环获取平均分最高的学生 // 提示:可以先计算所有学生的平均分,然后排序取前count个 - + List<(string StudentId, double Average)> studentAverages = new List<(string, double)>(); + foreach (var studentId in scores.Keys) + { + studentAverages.Add((studentId, CalculateAverage(studentId))); + } + + for (int i = 0; i < studentAverages.Count; i++) + { + for (int j = i + 1; j < studentAverages.Count; j++) + { + if (studentAverages[j].Average > studentAverages[i].Average) + { + var temp = studentAverages[i]; + studentAverages[i] = studentAverages[j]; + studentAverages[j] = temp; + } + } + } + + List<(string, double)> result = new List<(string, double)>(); + for (int i = 0; i < Math.Min(count, studentAverages.Count); i++) + { + result.Add(studentAverages[i]); + } + return result; } public Dictionary> GetAllScores() @@ -177,7 +336,15 @@ public void SaveStudentsToFile(List students, string filePath) try { // 在这里实现文件写入逻辑 - + using (StreamWriter writer = new StreamWriter(filePath)) + { + writer.WriteLine("StudentId,Name,Age"); + foreach (var student in students) + { + writer.WriteLine($"{student.StudentId},{student.Name},{student.Age}"); + } + } + Console.WriteLine($"学生数据已成功保存到 {filePath}"); } catch (Exception ex) { @@ -194,7 +361,31 @@ public List LoadStudentsFromFile(string filePath) try { // 在这里实现文件读取逻辑 - + using (StreamReader reader = new StreamReader(filePath)) + { + string line; + + while ((line = reader.ReadLine()) != null) + { + string[] parts = line.Split(','); + if (parts.Length == 3) + { + try + { + string studentId = parts[0]; + string name = parts[1]; + int age = int.Parse(parts[2]); + + students.Add(new Student(studentId, name, age)); + } + catch (Exception ex) + { + Console.WriteLine($"解析数据失败: {ex.Message}"); + } + } + } + } + Console.WriteLine($"从 {filePath} 成功读取 {students.Count} 名学生数据"); } catch (Exception ex) { @@ -241,23 +432,53 @@ static void Main(string[] args) // 3. 测试年龄范围查询 Console.WriteLine("\n3. 查找年龄在19-20岁的学生:"); // TODO: 调用GetStudentsByAge方法并显示结果 - + var ageRangeStudents = studentManager.GetStudentsByAge(19, 20); + foreach (var student in ageRangeStudents) + { + Console.WriteLine(student); + } // 4. 显示学生成绩统计 Console.WriteLine("\n4. 学生成绩统计:"); // TODO: 遍历所有学生,显示其成绩、平均分和等级 - + var allStudents = studentManager.GetAll(); + foreach (var student in allStudents) + { + Console.WriteLine($"\n{student}"); + var scores = scoreManager.GetStudentScores(student.StudentId); + foreach (var score in scores) + { + Console.WriteLine(score); + } + double average = scoreManager.CalculateAverage(student.StudentId); + Grade grade = scoreManager.GetGrade(average); + Console.WriteLine($"平均分: {average}, 等级: {grade}"); + } // 5. 显示排名(简化版) Console.WriteLine("\n5. 平均分最高的学生:"); // TODO: 调用GetTopStudents(1)方法显示第一名 - + var topStudents = scoreManager.GetTopStudents(1); + foreach (var topStudent in topStudents) + { + var student = studentManager.Find(s => s.StudentId == topStudent.StudentId).FirstOrDefault(); + if (student != null) + { + Console.WriteLine($"第一名: {student.Name}, 平均分: {topStudent.Average}"); + } + } // 6. 文件操作 Console.WriteLine("\n6. 数据持久化演示:"); // TODO: 保存和读取学生文件 - - + string filePath = "students.csv"; + dataManager.SaveStudentsToFile(studentManager.GetAll(), filePath); + var loadedStudents = dataManager.LoadStudentsFromFile(filePath); + Console.WriteLine("读取的学生列表:"); + foreach (var student in loadedStudents) + { + Console.WriteLine(student); + } } catch (Exception ex) { @@ -268,4 +489,4 @@ static void Main(string[] args) Console.ReadKey(); } } -} \ No newline at end of file +}