C#基础(16)实践:学生成绩管理系统
简介
通过基础部分的学习,我们已经能进行一些实际应用的开发,学生成绩系统我相信是大家基本在大学期间上程序课必定会经历的一个小项目。
这个小项目看上去简单,但是思考量却不少。
这里就不带着大家一步一步讲解了,因为里面涉及到一些博主没有讲到过的库的使用。
博主尽量写了多的注释来帮助你理解。
如果你有所不懂,建议多查多思考多问。
你也可以自己尝试去实现一下这样的系统:
- 能记录学生姓名和各科成绩(集合属性,使用结构体),并且不能重复录入(姓名检重)
- 查看平均成绩排名(排序算法)
- 开始界面功能选择(Switch)
- 删除相关信息(检索)
- 记录和写入(文件操作——格外内容,需要自己动手搜寻资料学习)
你可以先自己尝试,然后再来看博主给出的代码学习思路。当然可能有些地方博主用了其他的处理,你可以在博主的基础上,用自己的想法去实现。
请务必多敲代码,这样才能让你在代码路上走得更远。
// 引用所需的命名空间
using System;
using System.IO; // 用于文件操作,如读取和写入文件
using System.Linq; // 提供LINQ功能,用于查询和操作集合
using System.Collections.Generic; // 用于使用泛型集合类,如 List class Program
{private const string FilePath = "grades.txt"; // 定义存储成绩数据的文件路径 static void Main(string[] args){while (true) // 无限循环,直到用户选择退出 {Console.WriteLine("请选择操作: 1. 录入成绩 2. 查看成绩 3. 删除成绩 4. 退出");string choice = Console.ReadLine();switch (choice){case "1":InputGrades(); // 调用输入成绩的方法 break;case "2":DisplayGrades(); // 调用显示成绩的方法 break;case "3":DeleteGrades(); // 调用删除成绩的方法 break;case "4":return; // 退出程序 default:Console.WriteLine("无效的选择,请重新输入。");break;}}}// 方法: 输入学生成绩 private static void InputGrades(){Console.Write("请输入学生姓名: ");string name = Console.ReadLine();// 检查学生是否存在 if (IsStudentExists(name)){Console.WriteLine("该学生已存在,请重新输入。");return;}// 提示用户输入成绩 Console.Write("请输入数学成绩: ");decimal math = decimal.Parse(Console.ReadLine());Console.Write("请输入语文成绩: ");decimal chinese = decimal.Parse(Console.ReadLine());Console.Write("请输入英语成绩: ");decimal english = decimal.Parse(Console.ReadLine());// 组织录入的成绩字符串 string record = $"{name},{math},{chinese},{english}";// 将成绩追加到文件中 File.AppendAllText(FilePath, record + Environment.NewLine);Console.WriteLine("成绩录入成功!");}// 方法: 检查学生是否已存在 private static bool IsStudentExists(string name){// 检查文件是否存在 if (!File.Exists(FilePath)) return false;// 读取文件中的所有记录,并使用LINQ检查学生是否存在 string[] records = File.ReadAllLines(FilePath);return records.Any(record => record.StartsWith(name + ",")); // 返回是否找到匹配的学生 }// 方法: 显示所有录入的成绩 private static void DisplayGrades(){// 检查文件是否存在 if (!File.Exists(FilePath)){Console.WriteLine("没有成绩记录。");return;}// 读取所有记录 string[] records = File.ReadAllLines(FilePath);List<Student> students = new List<Student>(); // 创建学生列表 // 遍历每一条记录并解析为学生对象 foreach (string record in records){string[] parts = record.Split(','); // 按逗号分隔记录 if (parts.Length == 4) // 预期为四个部分 {// 尝试解析成绩,如果失败则报告错误 if (decimal.TryParse(parts[1], out decimal math) &&decimal.TryParse(parts[2], out decimal chinese) &&decimal.TryParse(parts[3], out decimal english)){students.Add(new Student{Name = parts[0],MathScore = math,ChineseScore = chinese,EnglishScore = english});}else{Console.WriteLine($"解析记录失败: {record}");}}}// 按照平均成绩降序排序学生 var sortedStudents = students.OrderByDescending(s => s.AverageScore()).ToList();Console.WriteLine("已录入的成绩(按平均成绩排序):");// 显示所有学生的成绩信息 foreach (var student in sortedStudents){Console.WriteLine($"姓名: {student.Name}, 数学: {student.MathScore}, 语文: {student.ChineseScore}, 英语: {student.EnglishScore}, 平均成绩: {student.AverageScore()}");}}// 方法: 删除学生成绩 private static void DeleteGrades(){Console.Write("请输入要删除的学生姓名: ");string name = Console.ReadLine();// 检查学生是否存在 if (!IsStudentExists(name)){Console.WriteLine("未找到该学生的记录。");return;}try{// 读取所有记录并过滤掉要删除的记录 string[] records = File.ReadAllLines(FilePath);var updatedRecords = records.Where(record => !record.StartsWith(name + ",")).ToList();// 将更新后的记录写回文件 File.WriteAllLines(FilePath, updatedRecords);Console.WriteLine("成绩删除成功!");}catch (Exception ex){// 捕获写入文件时的异常并提示用户 Console.WriteLine("删除失败: " + ex.Message);}}
}// 定义学生类
class Student
{public string Name { get; set; } // 学生姓名 public decimal MathScore { get; set; } // 数学成绩 public decimal ChineseScore { get; set; } // 语文成绩 public decimal EnglishScore { get; set; } // 英语成绩 // 方法: 计算平均成绩 public decimal AverageScore(){return (MathScore + ChineseScore + EnglishScore) / 3; // 计算平均成绩 }
}
相关文章:
C#基础(16)实践:学生成绩管理系统
简介 通过基础部分的学习,我们已经能进行一些实际应用的开发,学生成绩系统我相信是大家基本在大学期间上程序课必定会经历的一个小项目。 这个小项目看上去简单,但是思考量却不少。 这里就不带着大家一步一步讲解了,因为里面涉…...
git常用命令(patch补丁和解决冲突)
diff/apply方案 使用diff命令生成patch文件,后使用apply命令应用patch到分支,从而实现修改复刻。 生成补丁 git diff > commit.patch 检查补丁 git apply --check commit.patch 应用补丁 git apply commit.patchgit diff --cached > commit.pa…...
数模方法论-整数规划
一、基本概念 非线性规划的应用包括工程设计、资源分配、经济模型等。在求解过程中,由于非线性特性,常用的方法有梯度法、牛顿法、启发式算法等。求解非线性规划问题时,解的存在性和唯一性通常较难保证,且可能存在多个局部最优解…...
【问题随记】在使用 AuthenticationManager 的时候,出现循环依赖问题 —— `java.lang.StackOverflowError`
问题随记 在使用 AuthenticationManager 的时候,出现循环依赖问题 —— java.lang.StackOverflowError,查资料查了两天半,终于找到原因。 2024-06-16T17:54:19.48708:00 ERROR 20672 --- [nio-8789-exec-1] o.a.c.c.C.[.[.[/].[dispatcherS…...
2024年华为杯-研赛F题论文问题一二讲解+代码分享
X射线脉冲星光子到达时间建模 摘要 脉冲星是一类高速自转的中子星,其自转形成规律性脉冲信号,类似于“宇宙中的灯塔”,因此被认为是极为精确的时钟。X射线脉冲星导航利用脉冲星信号为航天器提供时间和空间参考。通过比较脉冲信号到达航天器…...
代码随想录训练营第34天|dp前置转移
62. 不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,1));for(int i1; i<m;i){for(int j1; j<n; j){dp[i][j]dp[i-1][j]dp[i][j-1];}}return dp[m-1][n-1];} }; dp[i][j]:运动至(i,j)的方…...
乐观锁、悲观锁
一、悲观锁 悲观锁 (Pessimistic Locking),具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现&#x…...
Java客户端SpringDataRedis(RedisTemplate使用)
文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模…...
wsl2桥接网络 ubuntu到弃坑到又跳坑
搜索Hyper-V image.png 如下图进入虚拟交换机管理器 image.png image.png C:\Users\Administrator下存放 ; 这是 WSL 2 的配置文件 [wsl2] processors4 ; 设置 WSL 2 可以使用的最大 CPU 核心数为 4,自行修改 memory4GB …...
WIFI路由器的套杆天线简谈
❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代,想必大家对其都不陌生。随着科技的发展,常用的路由器上的天线也越来越多,那么问题来了:天线越多,信号越好吗?路由器…...
希尔排序(C语言实现)
目录 1.希尔排序( 缩小增量排序 ) 2.动图 编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结: 1.希尔排序( 缩小增量排序 ) 基本思想: 1.先选定一个…...
LLVM 中的Value、User、Use设计
概述 LLVM是一个强大的编译器基础设施,提供了一套丰富的库,用于构建编译器的前端和后端。在LLVM中,Value、User和Use是几个核心的概念,它们之间有着紧密的关系 Value Value是LLVM中表示所有可计算的值的基类,例如常…...
C++智能指针入门教程(C++11)
智能指针 1.定义 C中的智能指针是一种用于自动管理动态分配的内存的模板类,它们通过封装原始指针来提供自动的内存管理功能,从而避免了内存泄漏和悬挂指针等问题。C标准库中提供了几种智能指针类型,其中最常用的是std::unique_ptr、std:…...
常用工具推荐!分享7款AI论文修改软件工具网站
在当今学术研究和写作领域,AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率,还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站,其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…...
怎么解除BitLocker对磁盘的加密?
BitLocker是一种Windows操作系统内置的加密功能,用于保护用户的数据安全。它通过对整个磁盘进行加密,防止数据被未经授权的用户访问。BitLocker主要用于保护笔记本电脑和台式机中的重要数据,尤其是在设备丢失或被盗的情况下。怎么解除BitLock…...
群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景:如果遇到周末紧急需要改方案,但团队成员都在各自家中,这个时候如果大家能够轻松访问这个…...
Unity3d 以鼠标位置点为中心缩放视角(正交模式下)
思路整理: 缩放前: 缩放后: 记录缩放前鼠标的屏幕坐标 A,计算鼠标位置对应的世界坐标 A_world 缩放完成后,根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码ÿ…...
Git清除某文件所有历史提交记录
一、软件要求 1.1 软件版本要求 git > 2.22.0python3 > 3.5 1.2 辅助插件 git filter-repo Linux/macOS # Debian/Ubuntu 系统 # 或使用 pip 安装pip install git-filter-repo sudo apt install git-filter-repo Windows pip install git-filter-repo二、操作步骤…...
jacoco生成单元测试覆盖率报告
前言 单元测试是日常编写代码中常用的,用于测试业务逻辑的一种方式,单元测试的覆盖率可以用来衡量我们的业务代码经过测试覆盖的比例。 目前市场上开源的单元测试覆盖率的java插件,主要有Emma,Cobertura,Jacoco。具体…...
【CSS Tricks】如何做一个粒子效果的logo
效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果Logo</title>…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
