简易学生管理系统(c语言、结构体数组、指针)

前话:时隔半年的博客,哎,大二课太多了,没办法,这不最近结了几门课,有点空闲时间,正愁写点什么好,恰巧翻到了c语言结课时的大作业,整理整理就来更新了。大一的时候上网课学的不是太好,现在看这个学生成绩管理系统感觉还是有点简陋了,但是嘛,这也是自己的成长过程不是?行了,咱废话不多说,来聊聊这个程序。

设计思路

  1. 选择数据
    因为学生信息包含学号、成绩数字信息和名字、等级字符信息,所以我们需要使用能够包含不同数据类型的结构体。那么问题来了,是使用链表还是结构体数组呢?对当时的我来说没得选,因为学的太菜(狗头保命),只有用较为简单的结构体数组。
  2. 函数之间的传值问题
    利用指针的特点,即在每个函数中可通过指针直接修改结构体数组中数据,这样就避免了函数之间传值,简化程序。

我的程序主要有以下七个功能
在这里插入图片描述
部分代码详解

  • 菜单函数
int menu()
{
	int n; 
	printf("\t\t请输入学生人数:");
	scanf("%d",&n); 
	printf("\n");
	printf("				菜	单\n");
	printf("		------------------------------------------\n");
	printf("			1-信息录入\n");
	printf("			2-依据学生的学号查询记录\n");
	printf("			3-显示所有学生信息\n");
	printf("			4-依据成绩降序排列\n");
	printf("			5-依据学号修改成绩\n");
	printf("			6-统许平均分和不及格人数\n");
	printf("			7-存档保存\n");
	printf("			0-退出\n");
	printf("		------------------------------------------\n");
	printf("\n");
	return n;
}

此函数为什么要先输入学生人数n,打乱队形呢?其实是因为后边的功能函数都需要遍历,当时为了偷懒才这样写(捂脸)。如果你有强迫症的话,可以在结构体内设置最后一位同学信息标志,当检测到这个标志就结束遍历,就不会打乱队形了(哈哈哈,我真是个小机灵鬼)。

  • 降序排序函数
void sorting(S students[10],int n)//依据成绩降序排列
{
	int i,j;
	struct student max[1],STUDENTS[10];
	for(i=0;i<n;i++)
	{
		STUDENTS[i]=students[i];//只有同样的结构体才能利用=赋值 
	}
	for(i=0;i<n;i++)//选择排序 
	{
		for(j=i+1;j<n;j++)
		{
			if(STUDENTS[i].gread<STUDENTS[j].gread)
			{
				max[0]=STUDENTS[i];
				STUDENTS[i]=STUDENTS[j];
				STUDENTS[j]=max[0];		
			}
		}
		printf("学号:%12d 姓名:%s 成绩:%4d 等级:%c\n",STUDENTS[i].num,STUDENTS[i].name,
		STUDENTS[i].gread,STUDENTS[i].level);
	}
	printf("\n");
}

这里再定义一个STUDENTS[10]的原因是我不希望排序的时候会改变原来的信息存储顺序。
注意:只有同样的结构体才能用=赋值

完整代码展示

#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	int num;//学号 
	char name[10];//名字 
	int gread;//成绩 
	char level;//等级 
}S;
int menu();//初始菜单 
void choose(S *p,int sel,int n);//选择 
void show(S *p1,int n);//显示学生信息 
void search(S *p2,int n);//依据学号查询记录
void insert(S *p3,int n);//信息录入、评级 
void sorting(S student[10],int n);//依据成绩降序排列
void modify_gread(S *p6,int n);//依据学号修改成绩
void statistics(S *p7,int n);//统计平均分和不及格人数
void save(S *p8,int n);//归档保存

int main(int argc, char* argu[ ])
{
	S students[10];
	int sel=9,n;
	n=menu(); 
	while(sel!=0)//此循环保证程序能够执行多步,直到输入0退出 
	{
		printf("请输入您要执行的功能前的号码:");
		scanf("%d",&sel);
	if(sel<0 ||sel>8)
		break;
	else
		choose(students,sel,n);
	}
	return 0;	
}
int menu()
{
	int n; 
	printf("\t\t请输入学生人数:");
	scanf("%d",&n); 
	printf("\n");
	printf("				菜	单\n");
	printf("		------------------------------------------\n");
	printf("			1-信息录入\n");
	printf("			2-依据学生的学号查询记录\n");
	printf("			3-显示所有学生信息\n");
	printf("			4-依据成绩降序排列\n");
	printf("			5-依据学号修改成绩\n");
	printf("			6-统许平均分和不及格人数\n");
	printf("			7-存档保存\n");
	printf("			0-退出\n");
	printf("		------------------------------------------\n");
	printf("\n");
	return n;
}
void choose(S *p,int sel,int n) 
{
	switch(sel)
	{
		case 1:insert(p,n);break;
		case 2:search(p,n);break;
		case 3:show(p,n);break;
		case 4:sorting(p,n);break;
		case 5:modify_gread(p,n);break;
		case 6:statistics(p,n);break;
		case 7:save(p,n);break;
		case 0:break;
	}
}
void show(S *p1,int n)//显示所有学生信息
{
	int i;
	for(i=0;i<n;i++,p1++)
	{
		printf("学号:%12d 姓名:%s 成绩:%4d 等级:%c\n",(*p1).num,(*p1).name,(*p1).gread,(*p1).level);
	}
	printf("\n");
}
void search(S *p2,int n)//依据学号查询记录
{
	int num,i;
	printf("请输入学号:"); 
	scanf("%d",&num); 
	for(i=0;i<n;i++,p2++)
	{
		if(num==(*p2).num)
		printf("学号:%12d 姓名:%s 成绩:%4d 等级:%c",(*p2).num,(*p2).name,(*p2).gread,(*p2).level);
	}
	printf("\n");
}
void insert(S *p3,int n)//信息录入、评级 
{
	int i,last;
	for(i=0;i<n;i++,p3++)
	{	
		//先输入相关信息 
		printf("当前为第%d个学生\n",i+1);
		printf("请输入学号:"); 
		scanf("%d",&(*p3).num); 
		printf("请输入姓名:");
		scanf("%s", &(*p3).name);
		printf("请输入成绩:");
		scanf("%d",&(*p3).gread);
		//输入完成后自动根据标准评级 
		last=(*p3).gread/10;
		switch(last)
		{
			case 9:(*p3).level='A';break;
			case 8:(*p3).level='B';break;
			case 7:(*p3).level='C';break;
			case 6:(*p3).level='D';break;
			default:(*p3).level='E';break;
		}
	}
	printf("\n");
}
void sorting(S students[10],int n)//依据成绩降序排列
{
	int i,j;
	struct student max[1],STUDENTS[10];
	for(i=0;i<n;i++)
	{
		STUDENTS[i]=students[i];//只有同样的结构体才能利用=赋值 
	}
	for(i=0;i<n;i++)//选择排序 
	{
		for(j=i+1;j<n;j++)
		{
			if(STUDENTS[i].gread<STUDENTS[j].gread)
			{
				max[0]=STUDENTS[i];
				STUDENTS[i]=STUDENTS[j];
				STUDENTS[j]=max[0];		
			}
		}
		printf("学号:%12d 姓名:%s 成绩:%4d 等级:%c\n",STUDENTS[i].num,STUDENTS[i].name,STUDENTS[i].gread,STUDENTS[i].level);
	}
	printf("\n");
}

void modify_gread(S *p5,int n)//依据学号修改成绩
{
	int num,i,G;
	printf("请输入您要修改成绩的学生学号:");
	scanf("%d",&num);
	printf("请输入修改后的成绩:");
	scanf("%d",&G);
	
	for(i=0;i<n;i++,p5++)//遍历寻找目标 
	{
		if(num==p5->num)
		p5->gread=G;
	}
	printf("\n");
}
void statistics(S *p6,int n)//统计平均分和不及格人数
{
	int i,count=0;
	double averange,sum=0;
	for(i=0;i<n;i++,p6++)
	{
		sum=sum+(*p6).gread;
		if((*p6).gread<60)
		count++;
	}
	averange=sum/n;//计算平均分 
	printf("平均分:%f,不及格人数:%d\n",averange,count);
	printf("\n");
}

void save(S *p7,int n)//归档保存
{
	FILE*fp;
	int i;
	fp=fopen("F://1.txt","w");
	for(i=0;i<n;i++,p7++)//遍历写入文件 
	{
		fprintf(fp,"%d %s %d %c\n",(*p7).num,(*p7).name,(*p7).gread,(*p7).level);
	}
	fclose(fp);
	printf("保存成功\n");
	printf("\n");
}

记得修改文件路径哦!!!

运行结果
在这里插入图片描述
程序到这里即完成了,测试也都通过!这个程序还是较为简单的,希望能够帮助到你,欢迎各位读者在评论区留言啊,我会在第一时间回复的。写者不易,留个赞再走呗!

  • 19
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.基于数组的“学生信息管理系统” 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。N定义为符号常量,定义N名学生信息的结构体数组。 实验要求: main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 功能: (1)定义函数Input:功能是可以从键盘输入任意个学生信息。 (2)定义函数Save:将输入的学生信息全部或者选择性的存入指定文件(如:输入5个学生信息,选择其前3或者2个存入文件,或者全部存入文件)。 (3)定义函数Output:将某个学生信息格式化输出(学生信息从文件读取,并且提供可选择的学号)。 (4)定义函数Fetch:从文件随机读取某个学生的信息。 (5)定义函数Del:删除指定学号学生信息,并保存到原文件。 (6)定义函数:实现输出所有学生信息的功能(包括学生的平均分和总分)。 (7)定义函数Max:求所有学生某门课程的最高分,并将此学生的分数以及学生姓名输出(注意:当有多名相同最高分数时,可将所有学生姓名输出)。 (8)定义函数Sort_select:对某个专业的学生,按总平均成绩由低到高进行简单选择排序。 (9)定义函数Sort_buble:对某个专业某个班级的学生,按总平均成绩由高到低进行起泡排序。 (10)定义函数Sort_insert:对某个专业某个班级的学生,按某门课程成绩由低到高进行直接插入排序。 (11)定义函数Search:实现某专业某班级的成绩综合查找(如智能专业1班,总分240分以上同学)。 (12) 定义函数printmenu: 打印菜单 退出 2.基于链表的“学生信息管理系统” 实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。 实验要求: (1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 (2)定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。 (3)定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。 (4)定义函数Save:将某个学生信息存入文件。 (5)定义函数Fetch:从文件随机读取某个学生的信息。 (6)定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。 (7)定义函数InsertList:在函数输入一个学生的信息,将该学生信息插入到链表的相应位置,并保持此链表按学号的有序性。 (8)定义函数Delete_num:从链表删除指定学号的学生。 (9)定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。 (10)定义函数Delete_ major _subject:从链表删除某个专业的、某门课程的成绩小于某个分数的学生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值