基于C语言的学生成绩管理系统

news2024/11/23 23:40:19
  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        一个基础功能完善的学生成绩管理系统必须要实现对学生信息的管理和处理,包括初始化学生信息、计算平均成绩、修改成绩、查看学生信息、排序学生信息和筛选查看学生成绩等功能。它可以帮助用户管理学生的成绩信息,并根据不同的需求进行排序和筛选,方便了学生成绩的管理和分析。

        那么我们要实现的目标也就有了:

  • 首先定义学生信息的结构体,并包含姓名、学号、年龄和语文、数学、英语成绩等信息。
  • 提供学生信息的初始化函数,通过随机生成学生的姓名、学号、年龄和成绩来初始化学生信息。
  • 实现计算学生平均成绩的函数,根据语文、数学和英语成绩计算平均成绩,并根据平均成绩给学生等级评定(ABCDE)。
  • 提供修改学生成绩的函数,可以根据用户输入的选项修改学生的语文、数学或英语成绩,并重新计算平均成绩和等级评定。
  • 实现查看学生信息的函数,可以打印所有学生的姓名、学号、年龄、语文、数学、英语成绩、平均成绩和等级评定。
  • 提供根据学生姓名查找并打印学生信息的函数,用户可以输入姓名来查看特定学生的详细信息。
  • 实现学生信息排序的函数,可以根据姓名、年龄、平均成绩、语文、数学或英语成绩进行排序,并打印排序后的学生信息。
  • 添加筛选查看成绩高于指定阈值的学生信息的函数,用户可以输入一个分数阈值,程序会打印所有满足条件的学生信息。

功能展示:

 

                 什么,你问我为啥没有标注?

        那我只能说自己认真看hhh~

学知识不要嫌累!

        完整代码如下:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>



// 学生信息结构体
struct student
{
	char name[20];	//姓名
	int num;		//学号
	short age;		//年龄
	struct scores
	{
		float chinese;	//语文
		float math;		//数学
		float english;	//英语
		float average;	//平均成绩
	}score;
	char grade;	//等级评定: ABCDE
};


// 获取随机年龄
int rand_age(void)
{	
	int tmp;
	while( ( tmp=rand()%24) < 19 )	//随机数范围0~23, 小于19的不取
		/* empty */;
	return tmp;	
}


// 初始化
void student_init(struct student stu[10], int n)
{
	//准备是个名字
	char *tmp_name[10] = {"赵", "钱", "孙", "李", "王", "张", "陈", "杨", "吴", "苏"};
	
	srand(time(NULL));	//播撒随机种子
	for (int i=0; i<n; i++)
	{
		strcpy(stu[i].name, tmp_name[i]);	//赋值名字
		stu[i].num = 23050+i;	//学号
		stu[i].age = rand_age();
		// 随机给定一些成绩
		stu[i].score.chinese = rand() % 56 + 45;	//随机45~100
		stu[i].score.math = rand() % 56 + 45;		//45~100
		stu[i].score.english = rand() % 56 + 45;	//45~100
		stu[i].score.average = 0;				//初始化平均成绩0
		stu[i].grade = 'E';			//初始化等级为E
	}
}


// 打印所有学生信息
void show_student(struct student stu[10], int n)
{
	char *line = "---------------------------------------------------------------------------------";
	char *print_table[] = {"姓 名", "学 号", "年 龄", "语 文", "数 学", "英 语", "平 均", "等 级"};
	int tab_pad = 12;	// 填充表头间的空隙
	printf("%s\n", line);
	printf("%*s%*s%*s%*s%*s%*s%*s%*s\n", 
				tab_pad,print_table[0], tab_pad,print_table[1], tab_pad,print_table[2], tab_pad,print_table[3],
				tab_pad,print_table[4], tab_pad,print_table[5], tab_pad,print_table[6], tab_pad,print_table[7]);
	for (int i=0; i<n; i++)
	{
		printf("%10s%11d%10hd%10.1f%10.1f%10.1f%10.1f%9c\n", 
								stu[i].name, stu[i].num, stu[i].age,
								stu[i].score.chinese,
								stu[i].score.math, 
								stu[i].score.english, 
								stu[i].score.average,
								stu[i].grade);
	}
	printf("%s\n", line);
}


// 计算平均成绩
void average_stu(struct student stu[10], int n)
{
	for (int i=0; i<n; i++)
	{
		stu[i].score.average = (stu[i].score.chinese + stu[i].score.math + stu[i].score.english)/3;
		if( (int)(stu[i].score.average) >= 90)
			stu[i].grade = 'A';
		else if( (int)(stu[i].score.average) >= 80)
			stu[i].grade = 'B';
		else if( (int)(stu[i].score.average) >= 70)
			stu[i].grade = 'C';
		else if( (int)(stu[i].score.average) >= 60)
			stu[i].grade = 'D';
		else
			stu[i].grade = 'E';
	}
}



// 修改学生的成绩
void change_score(struct student *stu)
{
	printf("请输入你要修改的成绩(0语文, 1数学, 2英语, 其他输入表示暂不修改)\n");
	
	int n;
	scanf("%d", &n);
	switch(n)
	{
		case 0: 
			scanf("%f", &stu->score.chinese); 
			break;	//-> . 的优先级比&高,所以此处取的是chinese成员的地址
		case 1: 
			scanf("%f", &stu->score.math); 
			break;	//-> . 的优先级比&高,所以此处取的是math成员的地址
		case 2: 
			scanf("%f", &stu->score.english); 
			break;	//-> . 的优先级比&高,所以此处取的是english成员的地址
		default:
			printf("暂不修改\n");
	}
	// 平均分和等级应该重新评定
	stu->score.average = (stu->score.chinese + stu->score.math + stu->score.english)/3;
		if( (int)(stu->score.average) >= 90)
			stu->grade = 'A';
		else if( (int)(stu->score.average) >= 80)
			stu->grade = 'B';
		else if( (int)(stu->score.average) >= 70)
			stu->grade = 'C';
		else if( (int)(stu->score.average) >= 60)
			stu->grade = 'D';
		else
			stu->grade = 'E';
}


// 打印一个学生信息
void print_info(struct student *stu)
{
	char *line = "---------------------------------------------------------------------------------";
	char *print_table[] = {"姓 名", "学 号", "年 龄", "语 文", "数 学", "英 语", "平 均", "等 级"};
	int tab_pad = 12;	// 填充表头间的空隙
	printf("%s\n", line);
	printf("%*s%*s%*s%*s%*s%*s%*s%*s\n", 
				tab_pad,print_table[0], tab_pad,print_table[1], tab_pad,print_table[2], tab_pad,print_table[3],
				tab_pad,print_table[4], tab_pad,print_table[5], tab_pad,print_table[6], tab_pad,print_table[7]);
	
	
	printf("%10s%11d%10hd%10.1f%10.1f%10.1f%10.1f%9c\n", 
								stu->name, stu->num, stu->age,
								stu->score.chinese,stu->score.math,
								stu->score.english, stu->score.average,stu->grade);	
	printf("%s\n", line);								
}




// task  表示要对该学生做的某种信息处理(打印该生信息,修改成绩)
void find_student(struct student stu[10], int n, char *cmp_name, void (*task)(struct student *stu) )
{
	if (cmp_name == NULL)
		return;
	for (int i=0; i<n; i++)
	{
		if ( !strcmp ( stu[i].name ,  cmp_name) )
		{
			task( &stu[i] );
			break;
		}
	}
}


// 按照名字排序
bool compare_name(struct student *s1, struct student *s2)
{
	return strcmp(s1->name, s2->name) >= 0 ? true : false;
}

// 按照年龄排序
bool compare_age(struct student *s1, struct student *s2)
{
	return s1->age >= s2->age ? true : false;
}

// 按照平均分排序
bool compare_average(struct student *s1, struct student *s2)
{
	return s1->score.average <= s2->score.average ? true : false;
}

// 按照语文分排序
bool compare_chinese(struct student *s1, struct student *s2)
{
	return s1->score.chinese <= s2->score.chinese ? true : false;
}

// 按照数学分排序
bool compare_math(struct student *s1, struct student *s2)
{
	return s1->score.math <= s2->score.math ? true : false;
}

// 按照英语分排序
bool compare_english(struct student *s1, struct student *s2)
{
	return s1->score.english <= s2->score.english ? true : false;
}


// 排序(名字,成绩,等级)
// cmp 由自己实现的比较方式
void sort(struct student stu[10], int n, bool (*cmp)(struct student*, struct student*) )
{
	for (int i=0; i<n; i++)		//比较多少轮
	{
		for (int j=0; j<n-i-1; j++)	//每轮多少次
		{
			if ( cmp(&stu[j], &stu[j+1] ) )	//通过传进来的参数来比较
			{
				struct student tmp = stu[j];
				stu[j] = stu[j+1];
				stu[j+1] = tmp;
			}
		}
	}
}

// 筛选查看xx分数以上的学生
void filter_students(struct student stu[10], int n, float threshold)
{
	
	char *line = "---------------------------------------------------------------------------------";
	char *print_table[] = {"姓 名", "学 号", "年 龄", "语 文", "数 学", "英 语", "平 均", "等 级"};
	int tab_pad = 12;	// 填充表头间的空隙
	printf("%s\n", line);
	printf("%*s%*s%*s%*s%*s%*s%*s%*s\n", 
				tab_pad,print_table[0], tab_pad,print_table[1], tab_pad,print_table[2], tab_pad,print_table[3],
				tab_pad,print_table[4], tab_pad,print_table[5], tab_pad,print_table[6], tab_pad,print_table[7]);

    for (int i = 0; i < n; i++)
    {
        if (stu[i].score.average > threshold)
        {
		printf("%10s%11d%10hd%10.1f%10.1f%10.1f%10.1f%9c\n", 
								stu[i].name, stu[i].num, stu[i].age,
								stu[i].score.chinese,
								stu[i].score.math, 
								stu[i].score.english, 
								stu[i].score.average,
								stu[i].grade);				
        }
    }
	printf("%s\n", line);
}
 

 
 
 
int main(int argc, char *argv[])
{
	
	struct student stu[10];
	// bzero( stu, sizeof(stu) );	//把stu所代表的内存清零
	
	student_init(stu, 10);
	
	
	
	printf("\n\n                                   平均成绩统计表\n");
	average_stu(stu, 10);
	show_student(stu, 10);

	printf("\n\n                                    张同学成绩表\n");
	find_student(stu, 10, "张", print_info);//查看张的成绩
	
	printf("\n\n                                   修改陈同学成绩\n");
	find_student(stu, 10, "陈", change_score);//修改陈的成绩
	
	printf("\n\n                                     均分排序表\n");
	sort(stu, 10, compare_average);
	show_student(stu, 10);
	// sort(stu, 10, compare_chinese);
	// show_student(stu, 10);
	// sort(stu, 10, compare_math);
		
	printf("\n\n                                     筛选成绩表\n");
	filter_students(stu, 10, 60);

	
	
// 写成一个选择的菜单

	// 函数指针数组
	// 把所有排序比较的方法存到该数组汇总
	bool (*cmp[6])(struct student*, struct student*) = {compare_name, compare_age, compare_average,
														compare_chinese, compare_math, compare_english};
	
	int cmp_tmp = 0;	//定义默认为姓名排序
	
	while(1)
	{
		printf("输入你想要的排序(0.姓名 1.年龄 2.平均分 3.语文分 4.数学分 5.英语分):\n");
		scanf("%d", &cmp_tmp);
		
		switch (cmp_tmp)
		{
			case 0: sort( stu, 10, cmp[cmp_tmp] ); break;
			case 1: sort( stu, 10, cmp[cmp_tmp] ); break;
			case 2: sort( stu, 10, cmp[cmp_tmp] ); break;
			case 3: sort( stu, 10, cmp[cmp_tmp] ); break;
			case 4: sort( stu, 10, cmp[cmp_tmp] ); break;
			case 5: sort( stu, 10, cmp[cmp_tmp] ); break;
			default:
				printf("超出选择范围\n");
		}
		
		show_student(stu, 10);
		break;
	}


	return 0;
}

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

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

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

相关文章

jmeter命令行运行(非GUI形式)参数详解

目录 一、JMete执行方式 二、JMete非GUI运行优点 三、jmeter非GU运行参数 四、jmeter非GUI运行命令 4.1非GUI基本命令格式&#xff1a; 4.2非GUI并生成html报告基本命令格式 总结&#xff1a; 一、JMete执行方式 正常情况下我们会以有页面的方式打开jmeter编写接口&…

lvs使用

1.前言 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于 Linux 内核的负载均衡器&#xff0c;用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式&#xff0c;以满足不同场景和需求的负载均衡需求 2.lvs功能 LVS 提供了三种负载均…

React在Dva项目中创建并引用页面局部组件

这篇文章我们演示Dva中编写组件的方式 官方这里也特意强调了UI这个关键词 跟多是作为我们界面元素的组件 而不是页面路由 我们要单独做路由的组件肯定还是直接放在我们Dva项目的src下的routes目录下就好了 然后 我们看 项目 src下有一个 components 目录 一般我们做什么前端项…

连接区块链节点的 JavaScript 库 web3.js

文章目录 前言web3.js 介绍web3.js安装web3.js库模块介绍连接区块链节点向区块链网络发送数据查询区块链网络数据 前言 通过前面的文章我们可以知道基于区块链开发一个DApp&#xff0c;而DApp结合了智能合约和用户界面&#xff08;客户端&#xff09;&#xff0c;那客户端是如…

TCP三次握手、数据传输与四次挥手

一、建立TCP连接 —— 三次握手 &#xff08;1&#xff09;客户端向服务端发送一个携带初始序列号的SYN包。 &#xff08;2&#xff09;服务端收到后将其加入到半连接队列&#xff0c;然后向客户端回复携带初始序列号的SYNACK包。 &#xff08;3&#xff09;客户端收到后再向服…

ModelAttribute用法详解

目录 官方解释 例子 使用场景1 使用场景2 场景3 官方解释 首先看一下官方文档上该注解的解释&#xff1a; 可以看到ModelAttribute可以用在参数上&#xff0c;也可以用在方法上&#xff1a; Can be used to expose command objects to a web view, using specific attribu…

ceph--cephFS的使用

ceph分布式存储—cephFS的使用 1、cephfs的概念 ceph FS 即 ceph filesystem&#xff0c;可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使 用 ceph 集群作为数据存储服务器。 Ceph FS 需要运行 Meta Data Services(MDS)服务&#xff0c;其守护进程为 ceph-mds&#x…

【Unity面试篇】Unity 面试题总结甄选 |Unity渲染Shader相关 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新…

怎样优雅地增删查改(六):按任意字段关键字查询

文章目录 实现应用测试 实现 定义按任意字段关键字查询过滤器&#xff08;IKeywordOrientedFilter&#xff09;接口&#xff0c;查询实体列表Dto若实现该接口&#xff0c;将筛选指定的目标字段&#xff08;TargetFields&#xff09;包含指定的关键字&#xff08;Keyword&#…

软件开发的六大设计原则

我们常说软件开发要尽量具有良好的可扩展性&#xff0c;做到高内聚低耦合。那么究竟该如何实现呢&#xff1f;在面向对象软件设计领域有一系列大家所认可的设计原则&#xff0c;依据这些原则来设计软件&#xff0c;就可以让软件有很好的可扩展性&#xff0c;其中最重要的一条原…

发起投票平台投票吧网络投票平台网络投票平台

小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就可以实现&#xff0c;操作简单。 我们现在要以“青春大不同”为主题进行一次投票活动&…

扩展欧几里得 证明及应用代码(超详细,附带例题)

应用方面&#xff1a; 1.求解乘法逆元 2.求解&#xff08;ax&#xff09;%bc 即 a个x 模上b后得到c&#xff0c;其中满足条件的x的最小整数。[也可表示为axc(mod b)] 3.求解直线上的整点数 模板代码&#xff1a; 代码1&#xff1a; ll exgcd(ll a,ll b,ll &x,ll &a…

jeecgboot:vue3版本打包失败的解决过程

根据jeecgboot vue3的文档&#xff0c;把本地node升级到16&#xff0c;在本地运行都正常&#xff0c;打包后一直提示内存不足。 首先怀疑是代码配置问题&#xff0c;找到提示对应的地方&#xff0c;修改了package.json&#xff0c;把默认的NODE_OPTIONS--max-old-space-size81…

【批量将视频转为图像序列】

批量将视频转为图像序列 代码如下&#xff0c;代码中带有解释&#xff1a; # 导入所需要的库 import cv2 import os import numpy as np# 多个视频所在的路径 datasets_path ["/home/y/Code/数据集/1/007f.mp4","/home/y/Code/数据集/1/05f.mp4","/…

Python 打印文件执行路径和行号

文章目录 前言代码部分演示意外惊喜&#xff0c;文件位置跳转 前言 我最近在学Python&#xff0c;但是我感觉动态语言如果不打印文件路径和行号&#xff0c;到时候如果出问题Debug&#xff0c;除非你对业务特别熟悉&#xff0c;不然找不到问题的位置。 反正打印了也不亏 代码…

合宙Air001开发板系列教程—01环境搭建与点灯(基于Keil-MDK的开发)

近日合宙出品了一款&#xff1a; TSSOP20封装、ARMCortex-M0内核&#xff0c;内置32K Flash4K RAM、集成多路USART、IIC、SPI等通讯外设&#xff0c;5个16bit定时器以及1路12bit ADC和2路比较器的国产MCU10块钱一个开发板10个芯片&#xff0c;性价比还是很高的&#xff0c;加其…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升技术

空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注记 2.4 研究区…

ndk编译jni错误LOCAL_MAKEFILE is not defined,分析解决

概述 我们用ndk编译jni的时候&#xff0c;通常会写一个Android.mk脚本文件。但是有些情况&#xff0c;我们脚本文件名字不叫Android.mk&#xff0c;比如我的分别改成AndroidSo.mk&#xff0c;AndroidA.mk 这时候就会报错&#xff1a;LOCAL_MAKEFILE is not defined 软件环境 …

单片机数码管

LED数码管&#xff08;LED Segment Displays&#xff09;是由8个发光二极管构成&#xff0c;并按照一定的图形及排列封转在一起的显示器件。其中7个LED构成7笔字形&#xff0c;1个LED构成小数点&#xff08;固有时成为八段数码管&#xff09;。 LED数码管有两大类&#xff0c…

从新手到高阶,企业培训直播玩法全攻略

首先&#xff0c;把握培训直播的整体规划。 管理端&#xff1a;直播内容管理纳入企业内部学习资源的建设&#xff0c;让企业内部的知识积累、沉淀形成体系。学员端&#xff1a;方便学员精准、快速定位到课程资源&#xff0c;方便快捷检索内容&#xff0c;学习体验简单易用。 其…