C语言之小型成绩管理系统
🌟 嗨,我是LucianaiB!
🌍 总有人间一两风,填我十万八千梦。
🚀 路漫漫其修远兮,吾将上下而求索。
C语言之小型成绩管理系统
目录
- 设计题目
- 设计目的
- 设计任务描述
- 设计要求
- 输入和输出要求
- 验收要求
- 进度安排
- 系统分析
- 总体设计
- 详细设计
- 数据结构设计
- 函数列表及功能简介
- 程序实现
- 测试数据和运行结果
- 总结与思考
- 参考文献
- 附录代码
设计题目
C语言之小型成绩管理系统
设计目的
- 加深对C语言基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
- 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
- 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。
设计任务描述
设计一个学生信息管理系统,能够实现以下功能:
- 添加学生信息:录入学生的姓名、学号和三门课程的成绩。
- 显示学生信息:显示所有已添加的学生信息。
- 按学号查找学生信息:根据学号搜索学生信息。
- 插入学生信息:在特定位置插入一个新的学生记录。
- 删除学生信息:根据学号删除一个学生记录。
- 按总分降序排序:按学生的总分降序排序学生记录。
- 退出系统:退出程序。
设计要求
- 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
- 应用模块化编程思想,各项功能分别用函数实现。
- 系统功能设计成菜单形式,用户通过菜单选择操作。
- 系统界面友好、直观、易操作。
输入和输出要求
- 系统界面友好、直观、易操作。
- 用户根据提示输入数据。
- 输入数据时提供清晰的提示信息。
- 处理完成后,清楚地显示运行结果。
验收要求
- 运行所设计的系统。
- 回答有关问题。
- 提交课程设计报告。
- 提交源程序。
进度安排
- 系统分析、设计准备阶段:6学时。
- 编程调试阶段:26学时。
- 总结和书写报告阶段:6学时。
- 考核阶段:2学时。
系统分析
学生信息管理系统旨在简化学生信息的管理流程,提高管理效率,同时为用户提供便捷的操作体验。系统需要实现以下功能:
- 添加学生信息。
- 显示学生信息。
- 按学号查找学生信息。
- 插入学生信息。
- 删除学生信息。
- 按总分降序排序。
总体设计
系统采用模块化设计,主要模块包括:
- 学生信息管理模块:添加、显示、查找、插入和删除学生信息。
- 排序模块:按总分降序排序学生记录。
- 用户界面模块:提供友好的用户界面。
- 数据持久化模块:将数据存储到文件系统(可选)。
详细设计
数据结构设计
struct Student {char name[50];int id;int grades[3];
};
函数列表及功能简介
-
addStudent()
:- 功能:添加一个新的学生记录到
students
数组中。 - 过程:提示用户输入学生的姓名、学号和三门课程的成绩,然后将这些信息存储在一个新的
Student
结构体中,并将其添加到数组的下一个空位。
- 功能:添加一个新的学生记录到
-
displayStudents()
:- 功能:显示所有已添加的学生信息。
- 过程:检查是否有学生记录,如果有,则遍历数组并打印每个学生的姓名、学号和成绩。
-
searchStudentById()
:- 功能:根据学号搜索学生信息。
- 过程:提示用户输入要搜索的学号,然后在数组中查找匹配的学生记录。如果找到,打印该学生的详细信息。
-
insertStudent()
:- 功能:在特定位置插入一个新的学生记录。
- 过程:首先提示用户输入要插入的学生的学号,然后找到合适的插入位置,接着提示用户输入新学生的详细信息,并将新学生记录插入到数组中。
-
deleteStudent()
:- 功能:根据学号删除一个学生记录。
- 过程:提示用户输入要删除的学号,找到对应的学生记录,然后从数组中删除该记录。
-
sortByTotalGrades()
:- 功能:按学生的总分降序排序学生记录。
- 过程:使用冒泡排序算法,根据每个学生的总分进行排序,然后打印排序后的学生信息。
-
swap(struct Student *a, struct Student *b)
:- 功能:交换两个
Student
结构体指针所指向的记录。 - 过程:使用一个临时变量来交换两个学生记录的内容。
- 功能:交换两个
-
calculateTotalGrades(struct Student student)
:- 功能:计算一个学生的总分。
- 过程:将一个学生的三门课程成绩相加并返回总分。
测试数据和运行结果
测试数据
-
添加学生信息:
请输入学生姓名: John Doe 请输入学生学号: 1001 请输入三门课程的成绩(用空格分隔): 85 90 78
-
显示学生信息:
所有学生信息如下: 姓名: John Doe, 学号: 1001, 成绩: 85 90 78
-
按学号查找学生信息:
请输入要查找的学生学号: 1001 学生姓名: John Doe, 学号: 1001, 成绩: 85 90 78
-
插入学生信息:
请输入要插入的学生学号: 1002 请输入学生姓名: Jane Smith 请输入三门课程的成绩(用空格分隔): 92 88 90
-
删除学生信息:
请输入要删除的学生学号: 1001 要删除的学生信息:姓名: John Doe, 学号: 1001, 成绩: 85 90 78 学生信息删除成功。
-
按总分降序排序:
按总分降序输出的学生信息: 姓名: Jane Smith, 学号: 1002, 总分: 270
总结与思考
优点
- 功能完善:系统涵盖了添加、显示、查找、插入、删除和排序等核心功能。
- 界面友好:系统提供了简洁直观的用户界面,操作方便。
- 模块化设计:代码结构清晰,便于维护和扩展。
改进方向
- 数据持久化:当前系统未实现数据持久化,建议将学生信息存储到文件中,以便程序重启后仍能读取数据。
- 错误处理:增加对用户输入的验证,避免非法输入导致程序异常。
- 更多功能:可以增加更多功能,如修改学生信息、统计平均分等。
参考文献
【排序算法】八大排序(下)(c语言实现)(附源码)-阿里云开发者社区
超详细之C语言实现学生信息管理系统(含文件读写)_c语言学生信息管理系统-CSDN博客
附录代码
#include <stdio.h>#include <stdlib.h>#include <string.h>struct Student {char name[50];int id;int grades[3];};struct Student students[100]; // 最多存储100个学生信息int studentCount = 0;void addStudent();void displayStudents();void searchStudentById();void insertStudent();void deleteStudent();void sortByTotalGrades();void swap(struct Student *a, struct Student *b);int calculateTotalGrades(struct Student student);int main() {int choice;do {printf("\n学生信息管理系统菜单\n");printf("1 添加学生信息\n");printf("2 显示学生信息\n");printf("3 按学号查找学生信息\n");printf("4 插入一个学生信息\n");printf("5 删除一个学生信息\n");printf("6 按总分降序输出\n");printf("7 退出\n");printf("请选择操作:");scanf("%d", &choice);switch (choice) {case 1:addStudent();break;case 2:displayStudents();break;case 3:searchStudentById();break;case 4:insertStudent();break;case 5:deleteStudent();break;case 6:sortByTotalGrades();break;case 7:printf("退出程序。\n");break;default:printf("无效选择,请重新输入。\n");}} while (choice != 7);return 0;}void addStudent() {struct Student newStudent;printf("请输入学生姓名: ");scanf("%s", newStudent.name);printf("请输入学生学号: ");scanf("%d", &newStudent.id);printf("请输入三门课程的成绩(用空格分隔): ");for (int i = 0; i < 3; i++) {scanf("%d", &newStudent.grades[i]);}students[studentCount] = newStudent;studentCount++;printf("学生信息添加成功。\n");}void displayStudents() {if (studentCount == 0) {printf("暂无学生信息。\n");return;}printf("所有学生信息如下:\n");for (int i = 0; i < studentCount; i++) {printf("姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);}}void searchStudentById() {int searchId;printf("请输入要查找的学生学号: ");scanf("%d", &searchId);for (int i = 0; i < studentCount; i++) {if (students[i].id == searchId) {printf("学生姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);return;}}printf("未找到该学生。\n");}void insertStudent() {struct Student newStudent;int insertId;printf("请输入要插入的学生学号: ");scanf("%d", &insertId);int insertIndex = 0;while (insertIndex < studentCount && students[insertIndex].id < insertId) {insertIndex++;}// 输入学生信息printf("请输入学生姓名: ");scanf("%s", newStudent.name);newStudent.id = insertId;printf("请输入三门课程的成绩(用空格分隔): ");for (int i = 0; i < 3; i++) {scanf("%d", &newStudent.grades[i]);}// 插入学生信息for (int i = studentCount; i > insertIndex; i--) {students[i] = students[i - 1];}students[insertIndex] = newStudent;studentCount++;printf("学生信息插入成功。\n");}void deleteStudent() {int deleteId;int deleteIndex = -1;printf("请输入要删除的学生学号: ");scanf("%d", &deleteId);// 寻找要删除的学生for (int i = 0; i < studentCount; i++) {if (students[i].id == deleteId) {deleteIndex = i;break;}}if (deleteIndex == -1) {printf("未找到该学生。\n");} else {printf("要删除的学生信息:姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[deleteIndex].name, students[deleteIndex].id, students[deleteIndex].grades[0], students[deleteIndex].grades[1], students[deleteIndex].grades[2]);// 删除学生信息for (int i = deleteIndex; i < studentCount - 1; i++) {students[i] = students[i + 1];}studentCount--;printf("学生信息删除成功。\n");}}void sortByTotalGrades() {// 使用冒泡排序for (int i = 0; i < studentCount - 1; i++) {for (int j = 0; j < studentCount - i - 1; j++) {if (calculateTotalGrades(students[j]) < calculateTotalGrades(students[j + 1])) {swap(&students[j], &students[j + 1]);}}}// 显示按总分降序排序后的学生信息printf("按总分降序输出的学生信息:\n");for (int i = 0; i < studentCount; i++) {printf("姓名: %s, 学号: %d, 总分: %d\n", students[i].name, students[i].id, calculateTotalGrades(students[i]));}}void swap(struct Student *a, struct Student *b) {struct Student temp = *a;*a = *b;*b = temp;}int calculateTotalGrades(struct Student student) {return student.grades[0] + student.grades[1] + student.grades[2];}
嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。
点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。
相关文章:

C语言之小型成绩管理系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…...
ASP.NET Core 中基于 Cookie 的身份鉴权实现
在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...
为什么要学习C++?
在编程语言的广阔天地中,C 以其独特的魅力和强大的功能占据着重要的一席之地。尽管它并非新兴的热门语言,学习曲线也相对陡峭,但这丝毫没有阻挡开发者们对它的热情。那么,究竟为什么要学习 C 呢?接下来,我们…...
freecad1.0的编译
最近freecad发布了1.0版本,通常意义上,1.0也代表了稳定版本的发布。但是在编译的过程中遇到很多问题,再次做下记录,以便后续再编译时有参考。 1 freecad1.0编译环境 参考:https://blog.csdn.net/qq_26221775/article/details/144406212 环境:vs2022,win10,camke3.26.4;…...

汇编与逆向(一)-汇编工具简介
RadASM是一款著名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。 一、汇编IDE工具:RadASM RadASM有内置的语言包 下载地址:RadASM asse…...
.NET Framework
.NET Framework 是微软推出的一个软件开发平台,主要用于构建和运行 Windows 应用程序。它是 .NET 生态系统的早期版本,专注于 Windows 平台,并提供了丰富的类库和运行时环境。 注意事项 跨平台限制:.NET Framework 主要适用于 W…...

LabVIEW太赫兹二维扫描成像系统
使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发,结合硬件如太赫兹源、平移台、锁相放大器等,实现了高效、精准的成像功能。系统采用蛇形扫描方式,通过动态调整扫描参数,达到优化成像质量的目的。 项目背景 在非…...
图片专栏——概念
欢迎来到图片世界,大家一起学习交流! 1. 像素(Pixel) 定义:像素是图像的最小单位,是“图像元素”的缩写。你可以把像素想象成拼图中的一个最小块,无数个像素组合在一起就形成了完整的图像。作用ÿ…...

Linux内存管理(Linux内存架构,malloc,slab的实现)
文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念:分页管理的核心概念:Linux 中分页的实现:总结: 六、伙伴算法伙伴算法的核心…...

【C++】模板(进阶)
本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …...

Esxi下虚拟机磁盘类型厚置备改精简置备
Esxi虚拟机磁盘类型厚置备改精简置备 一、esxi报错磁盘不足 1.1、虚拟机报错磁盘不足 1.2、虚拟机磁盘类型 VMware vSphere 中有两种主要类型的虚拟硬盘:精简配置磁盘和厚置备磁盘。 厚置备磁盘有两种分配模型:厚置备延迟置零和厚置备置零。 三者比…...
Element使用表单重置如果不使用prop,重置无法生效
文章目录 为什么需要 prop?示例:使用 prop 的正确方式关键点总结 在 element-ui 的 el-form 组件中, prop 属性是与表单验证和表单字段绑定密切相关的,尤其在使用 resetFields() 重置表单数据时。 如果不使用 prop࿰…...

Windows FileZila Server共享电脑文件夹 映射21端口外网连接
我有这样一个使用场景,在外部网络环境下,通过手机便捷地读取存储在电脑上的视频文件。比如在外出旅行、出差,身边没有携带电脑,仅依靠手机设备,就能随时获取电脑里存储的各类视频,无论是学习资料视频、工作…...

MongoDB 备份与恢复综述
目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引…...
node.js 文件操作
在 Node.js 中,文件操作主要通过内置的 fs(File System)模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换
形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀(Erosion) 腐蚀操作通过消除图像边界来减少图像中的白色区域(前景),使物体的边…...
Spark SQL中的from_json函数详解
Spark SQL中的from_json函数详解 在Spark SQL中,from_json是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。这个函数在处理半结构化数据(如JSON日…...
【软件架构】软件的十二种架构简介
软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
日历热力图,月度数据可视化图表,vue组件 先看效果👇 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间,开始时间是 上一年的今天,例如2024/01/01 —— 2025/01/01,跨度刚…...
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
在Vue 3中,导航守卫(Navigation Guard)用于拦截路由的变化,可以在用户访问页面前进行检查。结合Axios进行token认证机制时,我们可以通过导航守卫在路由跳转时,检查用户的认证状态,确保用户有有效…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...