课程设计 | 学生成绩管理系统

news2024/7/6 19:27:53

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: C/C++/Java课程设计100例 优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、需求分析

二、设计思路

三、功能实现

3.1 计算每个课程的总分和平均分

3.2 按分数降序排序

3.3 按学号升序排序

3.4 通过学号查询

3.5 统计分析

3.6 从文件读取


本篇文章对学生成绩管理系统进行详细讲解, 更多课程设计/大作业请点击 C/C++/Java课程设计100例 获取!

一、需求分析

1. 使用 C 语言实现学生成绩管理系统;

2. 支持计算每个课程的总分和平均分;

3. 支持计算每个学生的总分和平均分;

4. 支持按分数降序排序、按分数升序排序、按学号升序排序、按姓名字典序排序;

5. 支持通过学号查询;

6. 支持通过姓名查询;

7. 支持统计分析、列表展示;

8. 支持从文件中读取和保存。

二、设计思路

通过菜单列出学生成绩管理系统支持的所有功能,并将功能标号,用户可以根据标号选择功能,然后根据对应标号执行对应的功能,学生成绩管理系统流程如下所示。

图1 学生成绩管理系统流程图

三、功能实现

下面将针对程序的主要功能进行详细介绍,包括:计算每个课程的总分和平均分、按分数降序排序、按学号升序排序、通过学号查询、统计分析以及从文件读取。

3.1 计算每个课程的总分和平均分

对所有学生的具体课程进行遍历,统计当前课程的总分,最后计算出平均分,代码实现如下所示。

// 计算每门课程的总分和平均分
void averageSumOfEveryCourse(STU *head)
{
    int x = 20, y = 3;
	getCoord(x, y++); printf("******************************************************************************");
	if (head->next != NULL) {
        int j = 1;
		for (int i = 0; i < m; i++) {
			STU *p = head->next;
			float sum = 0.0;
			do {
				sum += p->score[i];
				p = p->next;
			} while (p != NULL);
			getCoord(x, y++); printf("\t\t\t课程 %d:    总分 = %.0f , 平局分 = %.0f\n", j++, sum, sum/n);
		}
	} else {
        getCoord(x, y++); printf("没有学生信息");
	}
    getCoord(x, y++); printf("******************************************************************************");

	char ch = ' ';
	while (ch != 'Q') {
        getCoord(x, y); printf("请输入 Q 退出:");
        scanf("%c", &ch);
	}
}

3.2 按分数降序排序

对数据排序通过一个单独的函数来处理,具体排序规则只需要传入排序类型即可实现对应的排序,这里 type = 1 表示按分数降序排序,代码实现如下所示。

// type = 1
void sortbyScoreDescending(STU *head)
{
    int x = 20, y = 3;
	getCoord(x, y++); printf("******************************************************************************");
    getCoord(x, y++); printf("按分数降序排列");
	sortCommon(head, 1);
}

3.3 按学号升序排序

同理,type = 3 表示按照学号进行升序排序,代码实现如下所示。

// type = 3
void sortbyNum(STU *head)
{
    int x = 20, y = 3;
	getCoord(x, y++); printf("******************************************************************************");
    getCoord(x, y++); printf("按学号升序排列");
	sortCommon(head, 3);
}

3.4 通过学号查询

首先,用户输入学号,根据用户输入的学号遍历所有学生,查找对应学号的学生并进行输出,代码实现如下所示。

void searchbyNum(STU *head)
{
	int x = 20, y = 3;
	getCoord(x, y++); printf("******************************************************************************");
    getCoord(x, y++); printf("通过学号进行查询");
	long num;
	bool flag = true;
	getCoord(x, y++); printf("请输入学号:");
	scanf("%ld", &num);
	STU *p = head->next;
	if (p != NULL) {
		do {
			if (p->num == num) {
				getCoord(x, y++); printf("学号:"); printf("%ld", p->num);
				getCoord(x, y++); printf("姓名:"); printf("%s", p->name);
				for (int i = 0; i < m; i++) {
					getCoord(x, y++); printf("课程 %d: %.0f\t", i+1, p->score[i]);
				}
				getCoord(x, y++); printf("总分:%.0f\n", p->sum);
				getCoord(x, y++); printf("平均分:%.0f\n", p->sum/m);
				flag = false;
				break;
			}
			p = p->next;
		} while (p != NULL && flag);
		if (flag) {
			getCoord(x, y++); printf("没有发现!\n");
		}
	}
	getCoord(x, y++); printf("******************************************************************************");
	returnMenu(x, y+1);

}

3.5 统计分析

对所有学生的成绩进行分析,输出各个成绩段的学生情况,包括:< 60、60 - 69、70 - 79、80 - 89、90 - 99、100,代码实现如下所示。

void statisticAnalysis(STU *head)
{
	int a[6];
	int x = 20, y = 3;
    getCoord(x, y++); printf("******************************************************************************");
	for (int i = 0; i < m; i++) {
		STU *p = head->next;
		memset(a, 0, sizeof(a));
		do {
			if (p->score[i] < 60) {
				a[0]++;
			} else if (p->score[i] < 70) {
				a[1]++;
			} else if (p->score[i] < 80) {
				a[2]++;
			} else if (p->score[i] < 90) {
				a[3]++;
			} else if (p->score[i] < 100) {
				a[4]++;
			} else {
				a[5]++;
			}
			p = p->next;

		} while (p != NULL);

		getCoord(x, y++); printf("课程 %d:\n", i + 1);
		getCoord(x, y++); printf("* < 60\t%d\t%.2f%%\n", a[0], 100 * a[0] / 6.0);
		getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 60, 69, a[1], 100 * a[1] / 6.0);
		getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 70, 79, a[2], 100 * a[2] / 6.0);
		getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 80, 89, a[3], 100 * a[3] / 6.0);
		getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 90, 99, a[4], 100 * a[4] / 6.0);
		getCoord(x, y++); printf("* %d\t%d\t%.2f%%\n", 100, a[5], 100 * a[5] / 6.0);
	}
	getCoord(x, y++); printf("******************************************************************************\n");
    returnMenu(x, y+1);
}

3.6 从文件读取

数据存储在 student.txt  中,按照指定格式,读取文件内容,将其存储到结构中,代码实现如下所示。

void readfromFile(STU *head)
{
    int x = 20, y = 3;
    getCoord(x, y++); printf("******************************************************************************");
	STU *pre = head;
	FILE *fp;
	if ((fp = fopen("student.txt", "r")) == NULL) {
		getCoord(x, y++); printf("打开文件 student.txt 失败!\n");
	} else {
            fscanf(fp, "%d\t%d\n", &n, &m);
            for (int i = 0; i < n; i++) {
                STU *p = (STU *)malloc(LEN);
                pre->next = p;
                p->next = NULL;
                fscanf(fp, "%12ld", &p->num);
                fscanf(fp, "%12s", p->name);
                for (int j = 0; j < m; j++)
                {
                    fscanf(fp, "%12f", &p->score[j]);
                }
                fscanf(fp, "%12f%12f", &p->sum, &p->aver);
                pre = p;
            }
	}
    fclose(fp);
	getCoord(x, y++); printf("导入数据成功!\n");
	print(head, x, y);
}


🍓🍓🍓 更多课程设计/大作业请点击 C/C++/Java课程设计100例 获取!🎉🎉🎉


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

减小 Go 代码编译后的二进制体积

1 基线用例 减小编译后的二进制的体积&#xff0c;能够加快程序的发布和安装过程。接下来呢&#xff0c;我们分别从编译选项和第三方压缩工具两方面来介绍如何有效地减小 Go 语言编译后的体积。 我们采用同一个测试工程来测试不同方式的效果。 使用的测试工程如下&#xff0…

SQL全自动化检查神器

介绍 Yearning MYSQL 是一个SQL语句审核平台。提供查询审计&#xff0c;SQL审核等多种功能&#xff0c;支持Mysql&#xff0c;可以在一定程度上解决运维与开发之间的那一环&#xff0c;功能丰富&#xff0c;代码开源&#xff0c;安装部署容易&#xff01; 功能介绍 SQL查询查询…

Prometheus配合 alertmanager 使用邮箱报警

部署Prometheus 和 Alertmanager略 安装包部署prometheusGrafananode_exporter_争取不加班&#xff01;的博客-CSDN博客 prometheus监控报警部署Alertmanager_争取不加班&#xff01;的博客-CSDN博客 编辑Alertmanager配置文件 vim alertmanager/alertmanager.yml global: res…

MySQL高可用之主备同步:MySQL是如何保证主备一致的

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MySql是如何保证主备一致的 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入:…

【Java编程进阶】封装继承多态详解

推荐学习专栏:Java 编程进阶之路【从入门到精通】 文章目录 1. 封装2. 继承2.1 继承的语法2.2 子类重写父类的方法2.3 子类隐藏父类的方法2.4 super 关键字2.5 final 关键字2.6 父类子类类型转换3. 多态4. 总结Java 是一门面向对象程序设计语言,其具有封装,继承和多态三大特…

面向对象的特征之三:多态性

文章目录一、理解多态性二、什么是多态性三、多态性的使用——虚拟方法调用四、多态性使用前提五、适用范围六、虚拟方法调用详细介绍多态性是编译期的还是运行期的&#xff1f;举例每日一考七、instanceof关键字的使用引入&#xff1a;关于多态性的讨论向下转型&#xff1a;in…

Linux-7 文本编辑vi/vim

Linux-7 文本编辑vi/vim vim介绍 什么是vim&#xff1f; vi和vim是Linux下的一个文本编辑工具。&#xff08;可以李姐为Windows的记事本或word文档&#xff09; 为什么要使用vim&#xff1f; 因为Linux系统一切皆为文件&#xff0c;而我们工作最多的就是修改某个服务的配置&a…

网络安全——投票系统缺陷(靶场实战)

我们需要利用漏洞来把投票信息刷到第一位 我们可以利用 HTTP_X_FORWARDED_FOR 来进行获取伪造 我们再次进行投票的时候&#xff0c;我们抓取数据包的格式 我们采用上述方法进行伪造 增加变量&#xff0c;我们采用多IP攻击 选中247点击send to Intruder 选中247和1点击 add&…

基于Xlinx的时序分析与约束(8)----关于时序路径、时钟悲观度和建立时间/保持时间的一些问题

写在前面 最近研究vivado里的时序分析路径时&#xff0c;发现了3个很有意思的问题。经过一番查找资料后&#xff0c;总算把问题搞明白了&#xff0c;在这里分享给大家。 1、为什么同一条时序路径在报表里的值不一样&#xff1f; 在如下文件建立的工程中&#xff1a; module te…

Window10下配置Maxim SDK

参考网址&#xff1a; 微信&#xff08;中文&#xff09;&#xff1a;【嵌入式AI开发&Maxim篇一】美信Maxim78000Evaluation Kit AI部署流程初探 GitHub&#xff1a;MaximAI_Documentation/MAX78000_Feather at master MaximIntegratedAI/MaximAI_Documentation 下载地址…

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

如何安装python-ipopt&#xff1f; 要安装 python-ipopt&#xff0c;你需要先安装 Ipopt 库。这个库是用 C 编写的&#xff0c;所以你还需要安装一些 C 编译器。 在 Linux 系统上&#xff0c;你可以使用下面的命令来安装 Ipopt 和相关的依赖项&#xff1a; 复制 sudo apt-g…

excel成本统计:如何进行区域筛选,多条件求和?

最近有位小伙伴被一个计算产品成本的问题难住了&#xff0c;要求是根据配件成本核算出成品的成本。这个问题看上去似乎有点复杂&#xff0c;感觉一下子想不出好的解决办法&#xff0c;实际上&#xff0c;却非常简单&#xff0c;而且仅用常见的求和函数&#xff0c;就能轻松解决…

Mybatis源码分析(四)Mapper文件的解析

目录一 Mapper的使用二 MapperElement的解析三 解析cache-ref节点四 解析Cache节点五 解析ParameterMap节点六 解析ResultMap节点七 解析Sql节点八 处理各个数据库操作语句官网&#xff1a;mybatis – MyBatis 3 | 简介 参考书籍&#xff1a;《通用源码阅读指导书&#xff1a;M…

【每日一题】【LeetCode】【第一天】三数之和

三数之和的解决之路 题干表述 测试案列&#xff08;部分&#xff09; 第一次思路 这种其实是最暴力的&#xff0c;也是我脑海里第一个想到的最简单的方法了。 思路就是三个循环&#xff0c;一个循环去一个数&#xff0c;然后当三个下标不同&#xff0c;且对应的三个数相加为…

FPGA设计CPU书籍

一直以来CPU内部是绝大多数IT工程师难以触及的领域。纵使学习过计算机架构相关课程&#xff0c;自己动手实现CPU也始终遥不可及&#xff0c;因为这涉及计算机系统的最底层——芯片设计。 而近年来FPGA芯片产品的发展与普及打破了这一阻碍&#xff0c;利用内部电路可重编程的FPG…

【C++进阶】IO流

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

Docker进阶(中)

docker 进阶&#xff08;中&#xff09;docker提交镜像等命令docker 镜像原理docker 私有库&推送到私有库容器数据卷docker 安装常规软件docker提交镜像等命令 再这个谈这个docker 提交这个镜像之前我们先补充一下上一篇博客没有谈到的命令。再这里说一下。我们之前谈到的…

代码随想录算法训练营第六天 java :242.有效的字母异位词 349. 两个数组的交集 ,1. 两数之和

文章目录哈希表理论基础哈希碰撞&#xff1a; 拉链法和线性探测法线性探测法Leetcode242.有效的字母异位词题目链接思路AC代码Leetcode349. 两个数组的交集题目链接思路AC代码Leetcode 1. 两数之和题目链接思路与难点AC代码收获今日收获哈希表理论基础 哈希函数如下图所示&…

【C++】string (上)(string类的常用接口 string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作)

文章目录string标准库中的string类string类的常用接口string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作string string是一个专门管理字符数组的类。 标准库中的string类 string是表示字符串的字符串类该类的接口与常规容器的接口基本相同&#xff0…

计算机二级python考前复习笔记

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言程序设计风格&#xff1a;清晰第一&#xff0c;效率第二。结构化程序设计原则&#xff1a;自顶向下&#xff0c;逐步求精&#xff0c;模块化&#xff0c;限制使用goto语句&#xff08;Python无 goto 语句&#xf…