行业资讯

学生信息管理系统 — 代码构思解析

发布时间:2026/8/6 3:16:16
学生信息管理系统 — 代码构思解析 学生信息管理系统 — 代码构思解析一、整体设计概要设计层次对应类/文件职责数据模型层IStudent接口、ManStudent、WomanStudent定义学生通用属性并实现性别具体类通用业务层AddT、RemoveT、UpdateT、SearchT基于泛型实现增删改查适用于任何实现了IStudent的类型性别视图层ManT、WomanT负责显示对应性别列表并提供功能菜单调用通用业务层主入口Program初始化两个性别列表显示主菜单进入对应性别视图核心思想通过接口 泛型约束让一份 CRUD 代码同时处理ManStudent和WomanStudent避免重复编写同时也保持了性别特有的显示与菜单逻辑独立。二、文件模块详解1. IStudent.cs —— 统一数据契约csharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { //定义学生们的通用属性用于给男生类和女生类使用 internal interface IStudent { //接口的待实现属性 string Name { get; set; } string Sex { get; set; } int Age { get; set; } double Score { get; set; } } }作者构思定义四个公共属性作为所有学生类型的“最小公共集合”。接口使得后续的泛型类可以约束T必须实现该接口从而安全地访问Name、Sex等成员。这种做法遵循面向接口编程原则提高了扩展性未来可增加Teacher类只要实现IStudent即可复用现有泛型代码。2. ManStudent.cs与 WomanStudent.cs —— 具体学生类ManStudent.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static 学生信息管理系统.Program; namespace 学生信息管理系统 { //储存男生的基本信息 public class ManStudent: IStudent { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public double Score { get; set; } public ManStudent(string name, string sex, int age, double score) { Name name; Sex sex; Age age; Score score; } public ManStudent() { } } }WomanStudent.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static 学生信息管理系统.Program; namespace 学生信息管理系统 { //储存女生的基本信息 public class WomanStudent: IStudent { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public double Score { get; set; } public WomanStudent(string name, string sex, int age, double score) { Name name; Sex sex; Age age; Score score; } public WomanStudent(){ } } }构思两个类都实现IStudent接口并自动实现属性。提供有参构造方便初始化示例数据和无参构造满足泛型new()约束用于AddT中创建实例。虽然两类的代码几乎完全相同但作者区分它们是为了在界面显示“男生信息”与“女生信息”时能明确类型同时在AddT中通过typeof(T)自动设置性别保证了数据一致性。3. 通用 CRUD 模块AddT、RemoveT、UpdateT、SearchT这些类都应用了相同的泛型约束where T : IStudent, new()。IStudent确保可使用Name、Sex等属性。new()确保可通过new T()创建对象用于添加功能。Add.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace 学生信息管理系统 { //男女共用的添加功能模块 //这里AddT只是使用IStudent的属性所以无需实现IStudent定义的属性和方法 internal class AddT where T : IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 //用这个可以写public void Addd(){} //private ListT list new ListT(); public void Addd(ListT list) { Console.WriteLine(请输入姓名); string name Console.ReadLine(); Console.WriteLine(请输入年龄); int age; int.TryParse(Console.ReadLine(), out age); Console.WriteLine(请输入成绩); double score; double.TryParse(Console.ReadLine(), out score); // T student new T(); 后student 被编译器视为一个实现了 IStudent 的对象 T student new T(); student.Name name; //typeof(T):获取T的类型名称 string sex (typeof(T) typeof(ManStudent)) ? 男 : 女; student.Sex sex; student.Age age; student.Score score; list.Add(student); } } }构思方法接收ListT作为参数直接操作外部列表。通过new T()创建实例然后逐一赋值。关键点性别不由用户输入而是通过typeof(T)判断当前类型是ManStudent还是WomanStudent自动赋值为“男”或“女”。这样既减少用户操作又避免因输入不一致导致数据错误同时也使得添加逻辑与性别解耦。Remove.cscsharpusing System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { //男女共用的删除功能模块 internal class RemoveT where T : IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 public void SRemove(ListT list) { Console.WriteLine(请输入要删除的信息的名字); string name Console.ReadLine(); for (int i 0; i list.Count; i) { if (list[i].Name name) { T removed list[i]; list.RemoveAt(i); //删除索引下标为i的 Console.WriteLine($已删除); return; } } Console.WriteLine($未找到姓名为「{name}」的学生。); } } }构思按姓名查找并删除第一个匹配项简化设计假定姓名唯一。删除后立即return避免继续循环。若未找到则提示。泛型使同一段代码能处理男生和女生列表。Update.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { //男女共用的修改功能模块 internal class UpdateT where T : IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 public void SUpdate(ListT list) { Console.WriteLine(请输入要修改的信息的名字); string name Console.ReadLine(); for (int i 0; i list.Count; i) { if (list[i].Name name) { Console.WriteLine(已找到); Console.Write(请输入新姓名); list[i].Name Console.ReadLine(); Console.Write(请输入新年龄); list[i].Age int.Parse(Console.ReadLine()); Console.Write(请输入新成绩); list[i].Score double.Parse(Console.ReadLine()); break; } if (i list.Count-1) { Console.WriteLine(未找到按任意键重选); Console.ReadKey(); } } } } }构思同样按姓名查找并修改第一个匹配项。更新时性别不可修改因为类型已固定性别自动对应这符合业务逻辑。使用int.Parse和double.Parse但未做异常处理作者可能假设用户输入合法预留改进点。Search.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { //男女共用的查找功能模块 internal class SearchT where T : IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 public void SSearch(ListT list) { Console.WriteLine(请输入要查找的人员的名字); string name Console.ReadLine(); for (int i 0; i list.Count; i) { if (list[i].Name name) { Console.WriteLine(已找到按任意键重选); Console.WriteLine(${list[i].Name}\t{list[i].Sex}\t ${list[i].Age}岁\t{list[i].Score}分); Console.ReadKey(); break; } if (i list.Count - 1) { Console.WriteLine(未找到按任意键重选); Console.ReadKey(); } } } } }构思查找并显示详细信息同样按姓名匹配。找到后显示并等待按键然后退出方法返回上级菜单未找到也会提示。由于使用了泛型list[i].Sex等属性可以安全访问。4. 性别视图层ManT与WomanTMan.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { //男生信息系统 internal class ManT where T : IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 public void SMan(ListT list) { while (true) { Console.Clear(); Console.WriteLine( 男生信息); foreach (T s in list) { Console.WriteLine(${s.Name}\t{s.Sex}\t{s.Age}岁\t{s.Score}分); } Console.WriteLine(请选择功能1、增加 2、删除 3、修改 4、查询 0、回退); string xuan2_1 Console.ReadLine(); switch (xuan2_1) { case 1: AddT add new AddT(); add.Addd(list); break; case 2: RemoveT remove new RemoveT(); remove.SRemove(list); break; case 3: UpdateT update new UpdateT(); update.SUpdate(list); break; case 4: SearchT search new SearchT(); search.SSearch(list); break; case 0: return; } } } } }Woman.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static 学生信息管理系统.WomanStudent; namespace 学生信息管理系统 { internal class WomanTwhere T: IStudent, new() { //IStudentT必须实现IStudent接口这样在类内部就可以安全地使用IStudent中定义的属性和方法如 Name、Sex //new()T必须具有一个公共无参构造函数这样在类内部才能使用new T()来创建T的实例 public void SWoMan(ListT list) { //ListManStudent StudentsMan new ListManStudent(); while (true) { Console.Clear(); Console.WriteLine( 女生信息); foreach (T s in list) { Console.WriteLine(${s.Name}\t{s.Sex}\t{s.Age}岁\t{s.Score}分); } Console.WriteLine(请选择功能1、增加 2、删除 3、修改 4、查询 0、回退); string xuan2_1 Console.ReadLine(); switch (xuan2_1) { case 1: AddT add new AddT(); add.Addd(list); break; case 2: RemoveT remove new RemoveT(); remove.SRemove(list); break; case 3: UpdateT update new UpdateT(); update.SUpdate(list); break; case 4: SearchT search new SearchT(); search.SSearch(list); break; case 0: return; } } } } }构思这两个类的代码几乎完全相同区别仅在于标题文字“男生信息” vs “女生信息”。它们各自负责清屏并显示当前性别列表。提供功能菜单增删改查回退。根据用户选择实例化对应的泛型 CRUD 类并调用其方法。通过将“显示标题”和“菜单”与具体性别绑定实现了界面层与业务层的分离。虽然两个类高度相似但作者可能为了逻辑清晰也方便未来差异化定制而选择分开编写。5. 主程序 Program.cscsharpusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 学生信息管理系统 { internal class Program { static void Main(string[] args) { ListManStudent StudentsMan new ListManStudent(); StudentsMan.Add(new ManStudent(张三, 男, 20, 85.5)); ListWomanStudent StudentsWoman new ListWomanStudent(); StudentsWoman.Add(new WomanStudent(李四, 女, 19, 89.5)); bool b false; while (!b) { Console.Clear(); // 每次刷新界面 Console.WriteLine( 学生信息管理系统 ); Console.WriteLine( 1. 查看男生信息); Console.WriteLine( 2. 查看女生信息); Console.WriteLine( 0. 退出程序); Console.Write(请选择操作); string xuan1_1 Console.ReadLine(); switch (xuan1_1) { case 1: ManManStudent man new ManManStudent(); man.SMan(StudentsMan); //Man(StudentsMan); break; case 2: WomanWomanStudent woman new WomanWomanStudent(); woman.SWoMan(StudentsWoman); break; case 0: return; } } } } }构思初始化两个独立的列表分别存放男生和女生对象并各加入一条示例数据。主循环显示顶级菜单用户选择“1”或“2”后创建对应性别视图类的实例并传入对应的列表。进入子菜单后所有操作都基于该列表进行直到用户选择“回退”返回主菜单。使用bool b控制循环但实际并未修改b而是通过return直接退出程序选择0时—— 这可能是作者的简化处理也可视为一种实现方式。三、待改进方向合并ManT和WomanT为一个类通过参数传入标题。增加输入校验年龄、成绩转换失败时重试。支持按其他字段如年龄、成绩范围查询或修改。添加数据持久化文件或数据库防止程序退出后数据丢失。处理同名学生的冲突当前只操作第一个匹配项。