当前位置: 首页 > news >正文

C语言之小型成绩管理系统


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。



C语言之小型成绩管理系统

目录

  1. 设计题目
  2. 设计目的
  3. 设计任务描述
  4. 设计要求
  5. 输入和输出要求
  6. 验收要求
  7. 进度安排
  8. 系统分析
  9. 总体设计
  10. 详细设计
    • 数据结构设计
    • 函数列表及功能简介
  11. 程序实现
  12. 测试数据和运行结果
  13. 总结与思考
  14. 参考文献
  15. 附录代码

设计题目

C语言之小型成绩管理系统

设计目的

  1. 加深对C语言基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
  2. 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
  3. 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。

设计任务描述

设计一个学生信息管理系统,能够实现以下功能:

  1. 添加学生信息:录入学生的姓名、学号和三门课程的成绩。
  2. 显示学生信息:显示所有已添加的学生信息。
  3. 按学号查找学生信息:根据学号搜索学生信息。
  4. 插入学生信息:在特定位置插入一个新的学生记录。
  5. 删除学生信息:根据学号删除一个学生记录。
  6. 按总分降序排序:按学生的总分降序排序学生记录。
  7. 退出系统:退出程序。

设计要求

  1. 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
  2. 应用模块化编程思想,各项功能分别用函数实现。
  3. 系统功能设计成菜单形式,用户通过菜单选择操作。
  4. 系统界面友好、直观、易操作。

输入和输出要求

  1. 系统界面友好、直观、易操作。
  2. 用户根据提示输入数据。
  3. 输入数据时提供清晰的提示信息。
  4. 处理完成后,清楚地显示运行结果。

验收要求

  1. 运行所设计的系统。
  2. 回答有关问题。
  3. 提交课程设计报告。
  4. 提交源程序。

进度安排

  1. 系统分析、设计准备阶段:6学时。
  2. 编程调试阶段:26学时。
  3. 总结和书写报告阶段:6学时。
  4. 考核阶段:2学时。

系统分析

学生信息管理系统旨在简化学生信息的管理流程,提高管理效率,同时为用户提供便捷的操作体验。系统需要实现以下功能:

  • 添加学生信息。
  • 显示学生信息。
  • 按学号查找学生信息。
  • 插入学生信息。
  • 删除学生信息。
  • 按总分降序排序。

总体设计

系统采用模块化设计,主要模块包括:

  1. 学生信息管理模块:添加、显示、查找、插入和删除学生信息。
  2. 排序模块:按总分降序排序学生记录。
  3. 用户界面模块:提供友好的用户界面。
  4. 数据持久化模块:将数据存储到文件系统(可选)。
    在这里插入图片描述

详细设计

数据结构设计

struct Student {char name[50];int id;int grades[3];
};

函数列表及功能简介

  1. addStudent()

    • 功能:添加一个新的学生记录到 students 数组中。
    • 过程:提示用户输入学生的姓名、学号和三门课程的成绩,然后将这些信息存储在一个新的 Student 结构体中,并将其添加到数组的下一个空位。
  2. displayStudents()

    • 功能:显示所有已添加的学生信息。
    • 过程:检查是否有学生记录,如果有,则遍历数组并打印每个学生的姓名、学号和成绩。
  3. searchStudentById()

    • 功能:根据学号搜索学生信息。
    • 过程:提示用户输入要搜索的学号,然后在数组中查找匹配的学生记录。如果找到,打印该学生的详细信息。
  4. insertStudent()

    • 功能:在特定位置插入一个新的学生记录。
    • 过程:首先提示用户输入要插入的学生的学号,然后找到合适的插入位置,接着提示用户输入新学生的详细信息,并将新学生记录插入到数组中。
  5. deleteStudent()

    • 功能:根据学号删除一个学生记录。
    • 过程:提示用户输入要删除的学号,找到对应的学生记录,然后从数组中删除该记录。
  6. sortByTotalGrades()

    • 功能:按学生的总分降序排序学生记录。
    • 过程:使用冒泡排序算法,根据每个学生的总分进行排序,然后打印排序后的学生信息。
  7. swap(struct Student *a, struct Student *b)

    • 功能:交换两个 Student 结构体指针所指向的记录。
    • 过程:使用一个临时变量来交换两个学生记录的内容。
  8. calculateTotalGrades(struct Student student)

    • 功能:计算一个学生的总分。
    • 过程:将一个学生的三门课程成绩相加并返回总分。

测试数据和运行结果

测试数据

  1. 添加学生信息

    请输入学生姓名: John Doe
    请输入学生学号: 1001
    请输入三门课程的成绩(用空格分隔): 85 90 78
    
  2. 显示学生信息

    所有学生信息如下:
    姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    
  3. 按学号查找学生信息

    请输入要查找的学生学号: 1001
    学生姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    
  4. 插入学生信息

    请输入要插入的学生学号: 1002
    请输入学生姓名: Jane Smith
    请输入三门课程的成绩(用空格分隔): 92 88 90
    
  5. 删除学生信息

    请输入要删除的学生学号: 1001
    要删除的学生信息:姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    学生信息删除成功。
    
  6. 按总分降序排序

    按总分降序输出的学生信息:
    姓名: Jane Smith, 学号: 1002, 总分: 270
    

总结与思考

优点

  1. 功能完善:系统涵盖了添加、显示、查找、插入、删除和排序等核心功能。
  2. 界面友好:系统提供了简洁直观的用户界面,操作方便。
  3. 模块化设计:代码结构清晰,便于维护和扩展。

改进方向

  1. 数据持久化:当前系统未实现数据持久化,建议将学生信息存储到文件中,以便程序重启后仍能读取数据。
  2. 错误处理:增加对用户输入的验证,避免非法输入导致程序异常。
  3. 更多功能:可以增加更多功能,如修改学生信息、统计平均分等。

参考文献

【排序算法】八大排序(下)(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语言之小型成绩管理系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…...

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中&#xff0c;基于 Cookie 的身份鉴权是一种常见的身份验证方式&#xff0c;特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据&#xff0c;从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...

为什么要学习C++?

在编程语言的广阔天地中&#xff0c;C 以其独特的魅力和强大的功能占据着重要的一席之地。尽管它并非新兴的热门语言&#xff0c;学习曲线也相对陡峭&#xff0c;但这丝毫没有阻挡开发者们对它的热情。那么&#xff0c;究竟为什么要学习 C 呢&#xff1f;接下来&#xff0c;我们…...

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汇编编辑器&#xff0c;支持MASM、TASM等多种汇编编译器&#xff0c;Windows界面&#xff0c;支持语法高亮&#xff0c;自带一个资源编辑器和一个调试器。 一、汇编IDE工具&#xff1a;RadASM RadASM有内置的语言包 下载地址&#xff1a;RadASM asse…...

.NET Framework

.NET Framework 是微软推出的一个软件开发平台&#xff0c;主要用于构建和运行 Windows 应用程序。它是 .NET 生态系统的早期版本&#xff0c;专注于 Windows 平台&#xff0c;并提供了丰富的类库和运行时环境。 注意事项 跨平台限制&#xff1a;.NET Framework 主要适用于 W…...

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发&#xff0c;结合硬件如太赫兹源、平移台、锁相放大器等&#xff0c;实现了高效、精准的成像功能。系统采用蛇形扫描方式&#xff0c;通过动态调整扫描参数&#xff0c;达到优化成像质量的目的。 ​ 项目背景 在非…...

图片专栏——概念

欢迎来到图片世界&#xff0c;大家一起学习交流! 1. 像素&#xff08;Pixel&#xff09; 定义&#xff1a;像素是图像的最小单位&#xff0c;是“图像元素”的缩写。你可以把像素想象成拼图中的一个最小块&#xff0c;无数个像素组合在一起就形成了完整的图像。作用&#xff…...

Linux内存管理(Linux内存架构,malloc,slab的实现)

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

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …...

Esxi下虚拟机磁盘类型厚置备改精简置备

Esxi虚拟机磁盘类型厚置备改精简置备 一、esxi报错磁盘不足 1.1、虚拟机报错磁盘不足 1.2、虚拟机磁盘类型 VMware vSphere 中有两种主要类型的虚拟硬盘&#xff1a;精简配置磁盘和厚置备磁盘。 厚置备磁盘有两种分配模型&#xff1a;厚置备延迟置零和厚置备置零。 三者比…...

Element使用表单重置如果不使用prop,重置无法生效

文章目录 为什么需要 prop&#xff1f;示例&#xff1a;使用 prop 的正确方式关键点总结 在 element-ui 的 el-form 组件中&#xff0c; prop 属性是与表单验证和表单字段绑定密切相关的&#xff0c;尤其在使用 resetFields() 重置表单数据时。 如果不使用 prop&#xff0…...

Windows FileZila Server共享电脑文件夹 映射21端口外网连接

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

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…...

node.js 文件操作

在 Node.js 中&#xff0c;文件操作主要通过内置的 fs&#xff08;File System&#xff09;模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换

形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作通过消除图像边界来减少图像中的白色区域&#xff08;前景&#xff09;&#xff0c;使物体的边…...

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…...

【软件架构】软件的十二种架构简介

软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…...

Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guard&#xff09;用于拦截路由的变化&#xff0c;可以在用户访问页面前进行检查。结合Axios进行token认证机制时&#xff0c;我们可以通过导航守卫在路由跳转时&#xff0c;检查用户的认证状态&#xff0c;确保用户有有效…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...