简易的学生管理系统

2023-11-07


前言

本文在链表前篇之数组的基础上写的一个简易的学生管理系统。


本着练手感的目的去写的一个代码,并不是很完美,代码仅供参考。
话不多说,先放源码

一、代码

代码如下(示例):

/*
 *作者:	LiZhenhao
 *项目:学生成绩管理系统
 *功能:记录、插入、排序、删除
 *时间:2021年10月16日17:04:36
 *
 */

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

//#define N 6		//学生最多6个人
//int stu_sum;		//记录学生人数

typedef struct Student {
	int		num;			/*学号*/
    char	name[15];		/*姓名*/
    int		c_grade;        /*C语言成绩*/
    int		m_grade;        /*数学成绩*/
    int		e_grade;        /*英语成绩*/
    int		aver;			/*平均分*/
    int		rank;			/*名次*/
} student_t;

typedef struct Arr {
	student_t *pBase;		//存储的是数组第一个元素的地址
	int	 len;				//数组所能容纳的最大元素的个数
	int  cnt;				//当前数组有效的个数

}array_t;


/* 函数声明 */
array_t* init_arr(array_t *pArr, int length);		//给学生数组开辟内存空间
void Menu1();									//菜单1
void Menu2(array_t *pArr );						//菜单2
void InputRecored(array_t *pArr );				//记录学生成绩
void DisplayRecord(array_t *pArr );				//显示学生成绩
void InsertRecorde(array_t *pArr );				//插入数据
void ShowData(array_t *pArr);					//只显示数据
void Sort_Arr(array_t *pArr);					//排序
void Delete_Arr(array_t *pArr);					//删除某个位置的学生信息


int main(void) {
	int number;		//选择数
	
	array_t  *p_array;

	init_arr(p_array, 6);	//初始化,开辟学生数组长度为6的动态内存,cnt有效学生个数为0,学生数组长度为6

	Menu1();		//执行函数
	printf("请选择你要用的功能(0-5):");
	scanf("%d", &number);
	printf("\n");

	if ( 1 == number ) {		//非0即1
		printf("请输入要记录的学生人数:");
		scanf("%d", &p_array->cnt);			//输入有效学生个数
	} else if (!number) {
		number = 0;
	} else {
		printf("你尚未输入数据!!! \n请输入要记录的学生人数:");
		scanf("%d", &p_array->cnt);
		printf("\n");
		number = 1;
	}

	switch (number) {
		case 1:
			system("cls");
			InputRecored(p_array);
			break;
		case 0:
			exit(0);
			break;
		default:
			break;
	}

	return 0;
}

//初始化数组,给数组开辟动态内存空间
array_t* init_arr(array_t *pArr, int length) {
	(pArr) = (array_t*)malloc( 1 * sizeof(array_t) );
	(pArr)->pBase = (student_t*)malloc( sizeof(student_t) * length );
	if ( (NULL == pArr) && (NULL == (pArr)->pBase) )  {
		printf("创建动态内存失败!!!");
		exit(-1);	//终止整个程序	
	} else {
		(pArr)->len = length;
		(pArr)->cnt = 0;
	}

	return pArr;
}


/* 菜单1 */
void Menu1() {		
	printf("       学生成绩管理系统     \n");
    printf("  *********************菜单*********************\n");
    printf("  *												*\n");
    printf("  *   1 输入记录			2 展示记录			*\n");
    printf("  *   3 插入数据			4 成绩排序			*\n");
    printf("  *   5 删除数据			0 退出系统			*\n");
    printf("  *												*\n");
    printf("  ***********************************************	\n");
}


/* 菜单2 */
void Menu2(array_t *pArr ) {
	int i;
	Menu1();
	printf("请输入选项0-5:");
	scanf("%d", &i);
	printf("\n");
	switch(i) {
		case 0:
			exit(0);
			break;
		case 1:
			system("cls");
			InputRecored(pArr);
			break;

		case 2:
			system("cls");
			DisplayRecord(pArr);
			break;

		case 3:
			system("cls");
			InsertRecorde(pArr);
			break;

		case 4:
			system("cls");
			Sort_Arr(pArr);
			break;

		case 5:
			system("cls");
			Delete_Arr(pArr);
			break;
			
		default:
			break;

	}
}
 
/* 输入成绩 */
void InputRecored(array_t *pArr ){
	int i, j;
//	system("cls");
printf("                   输入学生信息                      \n");
    printf("*****************************************************\n");
    printf("\n");
    printf("数据录入格式提示:\n");
    printf("1.数据内容:学号、姓名、c语言成绩、数学成绩、英语成绩\n");
    printf("2.数据间以空格做间隔,最后回车录入数据结束\n");
    printf("\n");

    for(i = 0; i < pArr->cnt; i++) {
        printf("请输入第%d个学生的数据:",i+1);
        scanf("%d", &(pArr->pBase + i)->num);
        scanf("%s", (pArr->pBase + i)->name);
        scanf("%d", &(pArr->pBase + i)->c_grade);
        scanf("%d", &(pArr->pBase + i)->m_grade);
        scanf("%d", &(pArr->pBase + i)->e_grade);
    }
    printf("\n");
    printf("数据录入完成!\n");
    printf("\n");
    printf("1查看录入的信息  2返回主菜单  0退出:");
    scanf("%d",&j);
    switch(j)
    {
       case 1:					//输入1:显示数据
            printf("\n");
            DisplayRecord(pArr);
			break;
        case 2:					//输入2:显示子菜单
            system("cls");
			Menu2(pArr);
			break;
        case 0:					//输入0:退出
            exit(0);
			break;
    }
}

//显示数据
void DisplayRecord(array_t *pArr ){
	int i,j;
	system("cls");
	printf("				显示学生成绩											\n");
	printf("************************************************************************\n");
	printf("	学号	姓名	c语言成绩	数学成绩	英语成绩\n");
	for( i = 0; i < pArr->cnt; i++){
		printf("\t%d\t%s\t%d\t\t%d\t\t%d\n", (pArr->pBase + i)->num, (pArr->pBase + i)->name, (pArr->pBase + i)->c_grade, (pArr->pBase + i)->m_grade, (pArr->pBase + i)->
			e_grade);
	}
	printf("\n");
	printf("1返回主菜单  0退出:");
    scanf("%d",&j);
	switch(j) {
		case 1:
			system("cls");
			Menu2(pArr);
			break;
		case 0:
			exit(0);
			break;
		default:
			break;
	}
}


//只显示数据
void ShowData(array_t *pArr) {
	int i;
	printf("				已经录入的学生成绩											\n");
	printf("************************************************************************\n");
	printf("	学号	姓名	c语言成绩	数学成绩	英语成绩\n");
	for( i = 0; i < pArr->cnt; i++){
		printf("\t%d\t%s\t%d\t\t%d\t\t%d\n", (pArr->pBase + i)->num, (pArr->pBase + i)->name, (pArr->pBase + i)->c_grade, (pArr->pBase + i)->m_grade, (pArr->pBase + i)->
			e_grade);
	}
	printf("\n");

}

//在某个学号前面插入学生信息
void InsertRecorde(array_t *pArr ) {
	int i, j, pos, m = pArr->cnt;	///* m是记录当前移动的位置 */
	ShowData(pArr);
	printf("请输入你插入的学生信息(学号、姓名、C语言成绩、数学成绩、英语成绩):\n");
	printf("tip:以空格分别输入\n");

	student_t new_stu;				//定义一个新插入学生的结构体变量

	scanf("%d",&new_stu.num);
    scanf("%s",new_stu.name);
    scanf("%d",&new_stu.c_grade);
    scanf("%d",&new_stu.m_grade);
    scanf("%d",&new_stu.e_grade);

	pos = new_stu.num -1;
	for( i = 0; i < (pArr->cnt - pos); i++ ) {			//假如有5个学生,n = 5,插入3号位置,需要循环三次
		*(pArr->pBase + m) = *(pArr->pBase + (m - 1) );
		(pArr->pBase + m)->num++;
		m--;
	}
	
	*(pArr->pBase + pos) = new_stu;		//在用户想插入位置补充进新学生的信息
	pArr->cnt++;						//插入一名学生信息后,学生数组里的有效个数cnt加1

	printf("\n");
    printf("数据插入成功!\n");
    printf("\n");
    printf("1查看录入的信息  2返回主菜单  0退出:");
    scanf("%d",&j);
	switch(j) {
       case 1:					//输入1:显示数据
            printf("\n");
            DisplayRecord(pArr);
			break;
        case 2:					//输入2:显示子菜单
            system("cls");
			Menu2(pArr);
			break;
        case 0:					//输入0:退出
            exit(0);
			break;
    }
}

//平均成绩排序
void Sort_Arr(array_t *pArr) {
	int i, j;
	student_t temp;

	for( i = 0; i < pArr->cnt; i++) {
		(pArr->pBase + i)->aver = ( (pArr->pBase + i)->c_grade + (pArr->pBase + i)->m_grade + (pArr->pBase + i)->e_grade ) / 3;	
	}
	//先选出第一个最大的数,然后"沉底"
	for( j = 0; j < (pArr->cnt - 1); j++) {	//如果数组长度是6的话,那么外循环需要"沉底"5次
		for( i = 0; i < ( (pArr->cnt - 1) - j); i++ ) {		//第一次"沉底"需要比较5次
			if( (pArr->pBase + i)->aver < (pArr->pBase + (i + 1) )->aver  ) {
				temp = *(pArr->pBase + i);
				*( pArr->pBase + i) = *(pArr->pBase + (i + 1) );
				*( pArr->pBase + (i + 1) ) = temp;
			}
		}
	}
	
	int k;
	printf("\n");
    printf("数据排序成功!\n");
	printf("				排序后的学生成绩											\n");
	printf("************************************************************************\n");
	printf("排名	学号	姓名	c语言成绩	数学成绩	英语成绩	平均成绩\n");
	for( i = 0; i < pArr->cnt; i++) {
		(pArr->pBase + i)->rank = i+1;
	}
	for( i = 0; i < pArr->cnt; i++){
		printf("%d\t%d\t%s\t%d\t\t%d\t\t%d\t\t\t%d\n", (pArr->pBase + i)->rank, (pArr->pBase + i)->num,
				(pArr->pBase + i)->name, (pArr->pBase + i)->c_grade, (pArr->pBase + i)->m_grade, (pArr->pBase + i)->e_grade, (pArr->pBase + i)->aver);
	}
	printf("\n");
    printf("\n");
    printf("1返回主菜单  0退出:");
    scanf("%d",&k);
	switch(k) {
        case 1:					//输入2:显示子菜单
            system("cls");
			Menu2(pArr);
			break;

        case 0:					//输入0:退出
            exit(0);
			break;
    }

	return ;
}

void Delete_Arr(array_t *pArr) {
	ShowData(pArr);
	printf("请输入你想要删除哪个位置的学生信息:");
	int i, j, pos, m;	/* m 表示记录数组的当前的位置,先设为pos*/
	scanf("%d", &pos);
	printf("\n");
	m = pos;
	for ( i = 0; i < (pArr->cnt - pos); i++ ) {
		*(pArr->pBase + (m -1)) = *(pArr->pBase + m);
		(pArr->pBase + m)->num--;
		m++;
	}
	
	pArr->cnt--;

	printf("\n");
    printf("数据删除成功!\n");
	ShowData(pArr);
    printf("\n");
    printf("1查看录入的信息  2返回主菜单  0退出:");
    scanf("%d",&j);
	switch(j) {
       case 1:					//输入1:显示数据
            printf("\n");
            DisplayRecord(pArr);
			break;
        case 2:					//输入2:显示子菜单
            system("cls");
			Menu2(pArr);
			break;
        case 0:					//输入0:退出
            exit(0);
			break;
    }

}

二、展示结果

1.主界面

在这里插入图片描述

2.输入记录

在这里插入图片描述

3.插入数据

在这里插入图片描述
在这里插入图片描述

4.删除数据

在这里插入图片描述
这里有点小bug,学号没有自动对齐。

5.成绩排序

在这里插入图片描述

总结

总体来说,写代码是一件既是痛苦又是快乐的事。
痛苦的是有时候一个小bug让你纠结很久,被人打断思路,又很难滤清思路。快乐的是你能得到很多你意想不到的收获,比如说,代码的规范,思路更加清晰,知识被填补等等。但这些收获是建立在你坚持努力把代码打出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简易的学生管理系统 的相关文章

  • 数据结构---快速排序

    快速排序 分治法思想 基准元素的选择 元素交换 双边循环法 JAVA实现 单边循环法 JAVA实现 快速排序也是从冒泡排序演化而来 使用了 分治法 快的原因 快速排序和冒泡排序共同点 通过元素之间的比较和交换位置来达到排序的目的 快速排序和

随机推荐

  • elasticsearch-数据聚合

    目录 介绍 实际操作 DSL实现Metrics聚合 嵌套聚合 RestClient实现聚合 以酒店品牌为例 实现对酒店品牌 城市 星级的过滤 补6 20 32条消息 Elasticsearch 聚合查询 aggs 龙源lll的博客 CSDN
  • 成pmo了(几年前帖子,私密变公开后时间就变了)

    哈哈 我还没转正 也没项目 只是做产品 估计就和小学的语文课代表一样
  • border 颜色渐变

    div style border right 1px dashed fff background none width 577px div style font size 16px background color fff div div
  • C语言文本文件与二进制文件转换

    本程序要自己创建个文本格式的输入文件a1 txt 编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示 并存入输出文件a2 txt中 然后再将二进制文件还原并存入a3 txt文件 实现文件之间的转换 具体代码如下
  • vue项目cdn加速,减少webpack打包体积

    在webpack中使用cdn加速优化 减少打包体积 减少用户访问时间 文章目录 在webpack中使用cdn加速优化 减少打包体积 减少用户访问时间 1 引入cdn资源 2 在webpack基础配置文件中加入externals配置 打包 编
  • Java动态追踪技术探究

    Java动态追踪技术是指在Java应用程序运行过程中 通过监控和记录方法调用 异常 性能指标等信息 以便于分析和排查问题 优化性能 或进行安全审计等目的的技术手段 在Java开发和运维中 动态追踪技术起到了重要的作用 能够帮助开发人员和运维
  • idea中maven找不到本地仓库jar包_Maven 的这 7 个问题你思考过没有?

    专注于Java领域优质技术 欢迎关注 作者 张丰哲 在如今的互联网项目开发当中 特别是Java领域 可以说Maven随处可见 Maven的仓库管理 依赖管理 继承和聚合等特性为项目的构建提供了一整套完善的解决方案 可以说如果你搞不懂Mave
  • 自我理解:精度(precision)和召回(recall)

    1 精度 precision 精度是用于评估分类模型的一个重要指标 它反映了模型预测为正例的样本中 实际真正为正例样本的比例 注 正例样本指在二分类问题中 被标注为正类的样本 例如 在垃圾邮件分类任务中 正例样本就是真实的垃圾邮件 精度的计
  • 大学生团体天梯赛(第三届)

    题目地址 天梯赛 include
  • 树莓派LINUX内核移植

    参考博文 https editor csdn net md not checkout 1 articleId 109006969 树莓派linux内核下载地址 https github com raspberryPi 需要下载内核的版本可以
  • Hadoop的搭建,VmwareWorkstation 16pro + Ubuntu18.04.1

    文章目录 前言 一 VmwareWorkstation 16pro安装Ubuntu18 04 1 二 Ubuntu的基础配置 1 设置国内镜像源 2 下载安装Vmware Tools 三 安装Hadoop 总结 前言 Hadoop的搭建过程
  • PyQt编程实战:画出QScrollArea的scrollAreaWidgetContents内容部署层的范围矩形

    老猿Python博文目录 专栏 使用PyQt开发图形界面Python应用 老猿Python博客地址 一 引言 在 PyQt Python Qt 学习随笔 QScrollArea滚动区域详解 介绍了滚动区域的展现层 也称框架层 和内容部署层
  • python的格式化输出

    python格式化输出 被称为格式化操作符 专门用于处理字符串中的格式 包含 的字符串 被称为格式化字符串 和不同的字符串连用 不同类型的数据 需要使用不同的格式化字符 格式化字符 含义 s 字符串 d 有符号十进制整数 06d不是输出的整
  • iOS开发之 __block 与 __weak的区别理解

    资料来源1 资料来源2 block对象在block中是可以被修改 重新赋值的 使用了 weak修饰符的对象 作用等同于定义为weak的property 自然不会导致循环引用问题 因为苹果文档已经说的很清楚 当原对象没有任何强引用的时候 弱引
  • Springboot 启动过程二

    用于源码分析的代码 Github 接着启动过程一中的代码 继续debug 这一篇主要看new SpringApplication primarySources 的代码 首先还是列出问题 带着问题去看源码收获也会多些 待解答的问题 这段代码的
  • 【vcruntime140.dll文件下载】vcruntime140.dll丢失的解决方法

    vcruntime140 dll文件对一些电脑软件 电脑游戏等程序的正常运行起到关键性作用 对于弹出缺少此类文件的弹窗 用户们很多时候也摸不着头脑 程序明明上次都能正常运行 突然就弹出缺少vcruntime140 dll文件的提醒窗口 通过
  • 最详细、最仔细、最清晰的几道python习题及答案(建议收藏哦)

    名字 阿玥的小东东 学习 python c 主页 没了 今天阿玥带大家来看看更详细的python的练习题 目录 1 在python中 list tuple dict set有什么区别 主要应用在什么样的场景
  • 玩转Nginx日志

    目录标题 Nginx日志 nginx conf nginx日志切割 2 设置linux定时任务 Nginx日志 nginx conf user nobody worker processes 1 error log logs error l
  • QT------常用控件:qtlistwidget和qtlistview

    qtlistwidget和qtlistview都是用于在界面成行 成列的显示数据的 两者的区别在于 1 qtlistview可以用使用model 更便于动态添加数据 而qtlistwidget只能一条一条的增加列表项进行显示数据 使用QSt
  • 简易的学生管理系统

    文章目录 前言 一 代码 二 展示结果 1 主界面 2 输入记录 3 插入数据 4 删除数据 5 成绩排序 总结 前言 本文在链表前篇之数组的基础上写的一个简易的学生管理系统 本着练手感的目的去写的一个代码 并不是很完美 代码仅供参考 话不