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>…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...
C++参数传递 a与a的区别
在 C 中,&a(引用)和 a(值传递) 的关键区别在于 参数如何传递给函数,以及由此引发的 性能、语义和安全问题。 最核心的在于你想不想传入的参数被改变,如果想,就用参数传递&#…...
稻米分类和病害检测数据集(猫脸码客第237期)
稻米分类图像数据集:驱动农业智能化发展的核心资源 引言 在全球农业体系中,稻米作为最关键的粮食作物之一,其品种多样性为人类饮食提供了丰富选择。然而,传统稻米分类方法高度依赖人工经验,存在效率低、主观性强等缺…...
