简易学生管理系统(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");
}

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

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

相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页