栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C语言]C语言学生管理系统功能详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C语言]C语言学生管理系统功能详解

目录

一.学生管理系统流程图

二.学生管理系统初始化

三.学生管理系统主界面

四.学生管理系统添加学生信息

五.学生管理系统查找学生信息

六.学生管理系统展示所有学生信息

七.学生管理系统学生成绩排序

八.学生管理系统删除学生信息

九.学生管理系统修改学生信息


一.学生管理系统流程图

昨天花了一天时间写的学生管理系统,主要用到链表和文件读写,功能都比较简单,流程图如下

二.学生管理系统初始化

定义学生结构体,初始化节点,如果文本中有内容,先要把文本中的内容读取到链表中

#include "stdafx.h"
#include 
#include 
#include 

定义一个学生类型
typedef struct Student
{	
	char ID[16];//学号   
	char name[20];//姓名
	char sex[6];//性别
	int scoreCh;//语文成绩
	int scoreMa;//数学成绩
	int scoreEn;//外语成绩
	struct Student*pNext;//下一个学生的指针
}Stu,*pStu;




pStu pHeader;
pStu pTail;
void initStu(char* path)
{
	FILE*file;
	pHeader=(pStu)malloc(sizeof(Stu));
	
	if (pHeader==NULL)
	{
		printf("分配失败");
	}
	// 初始化头节点
	pTail=pHeader;
	pTail->pNext=NULL;
	//打开文件
	file=fopen(path,"r");
	if (file==NULL)
	{
		printf("打开文件失败!");
		return;
	}
	while(1)
	{
		pStu pNew=(pStu)malloc(sizeof(Stu));
		//scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF
		//文件中没有内容了则释放刚刚给它分配的空间
		if (fscanf(file,"%s %s %s %d %d %d",&(pNew->ID),&(pNew->name),&(pNew->sex),&(pNew->scoreCh),&(pNew->scoreMa),&(pNew->scoreEn))==EOF)
		{
			free(pNew);
			pNew=NULL;
			break;
		}
		pNew->pNext=NULL;
		//将当前结点和新建的链接起来
		pTail->pNext=pNew;
		//调整当前结点为新结点
		pTail=pNew;


	}
	fclose(file);



}

三.学生管理系统主界面

 设置界面功能,用switch case,一个case对应一个功能.



void interface(char* path)
{
	int c;
	while(1)
	{
		system("cls");
		printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪n");
		printf("╔═══╧╧ 学生管理系统 ╧╧═══╗n");
		printf("║※1.添加学生信息                  ║n");
		printf("║※2.查找学生信息                 ║n");
		printf("║※3.学生成绩排序                 ║n");
		printf("║※4.删除学生信息                 ║n");
		printf("║※5.修改学生信息                 ║n");
		printf("║※6.展示学生信息                 ║n");
		printf("║※0.退出程序                     ║n");
		printf("╚═════════════════╝n");
		system("color 0A");
		scanf("%d",&c);
		getchar();
		switch(c)
		{
		case 1:
			{
				StudentAdd(path);
				break;
			}
		case 2:
			{
				StudentSearch();
				break;
			}
		case 3:
			{
				sort();
				break;
			}
		case 4:
			{
				delStu(path);
				break;
			}
		case 5:
			{
				alterStu(path);
				break;
			}
		case 6:
			{
				bianli(pHeader);
				break;
			}
		case 0:
			{
				exit(0);
				break;
			}
		default:
			{
				printf("Error!n");
			}

		}
		system("pause");
	}
}
int main(int argc, char* argv[])
{
	//获取运行目录
	char infoPath[100];	
	GetCurrentDirectory(100,infoPath);
	strcat(infoPath,"\stuinfo.txt");
	
	initStu(infoPath);
	interface(infoPath);
	return 0;
}

四.学生管理系统添加学生信息

首先展示一下功能

添加学生信息要注意学号不能重复,所以要写个检查学号是否重复的功能

因为考虑到可能一次要输入多个学生信息,所以用了循环输入,输入#可以退出

特别注意,scanf多次输入要考虑scanf缓存的问题,一定要清除scanf缓存,不然数据可能错乱.

//清除scanf缓存
void safe_flush(FILE *fp)
{
	int ch;
	while( (ch = fgetc(fp)) != EOF && ch != 'n' );
}

//写入文件
void StudentWrite(char* infoPath,Student a)
{
	FILE*fp;

	fp=fopen(infoPath,"a");
	if (fp==NULL)
	{
		printf("fopen errorn");
	}
	fprintf(fp,"%s %s %s %d %d %dn",a.ID,a.name,a.sex,a.scoreCh,a.scoreMa,a.scoreEn);
	fclose(fp);

}

//1为重复 0为不重复
int checkAdd(char* id)
{

	pStu stu=pHeader->pNext;
	while(stu!=NULL)
	{
		
		if (strcmp(stu->ID,id)==0)
		{
			return 1;
		}
		stu=stu->pNext;
	}
	return 0;

}




void StudentAdd(char* path)
{
	Student ss;
	system("cls");
	system("color 0D");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt添加学生信息n");
	printf("-------------------------------n");

	while(1)
	{
		
		printf("请依次输入学生ID 姓名 性别 语文 数学 外语成绩,如果想结束输入,请按#退出n");
		scanf("%s",ss.ID);

		if (!strcmp(ss.ID,"#"))
		{
			break;
		}
		if (checkAdd(ss.ID)==1)
		{
			printf("学生ID重复,不能添加!n");
			safe_flush(stdin);//清除scanf缓存
			continue;
		}
		
		scanf("%s %s %d %d %d",ss.name,ss.sex,&ss.scoreCh,&ss.scoreMa,&ss.scoreEn);
		pStu pN=(pStu)malloc(sizeof(Stu));
		pN->pNext=NULL;
		 //给新节点赋值
		strcpy(pN->ID,ss.ID);
		strcpy(pN->name,ss.name);
		strcpy(pN->sex,ss.sex);
		pN->scoreCh=ss.scoreCh;
		pN->scoreMa=ss.scoreMa;
		pN->scoreEn=ss.scoreEn;
		
		pTail->pNext=pN;
		pTail=pN;

		StudentWrite(path,ss);	
		

	}
	

}

五.学生管理系统查找学生信息

查询很简单,下面上代码,检查学号这个功能光查找学生信息是不需要位置的,但为了兼顾删除和修改所以用到了位置

注意,(*pos)++一定要加括号,后面的++运算优先级比较高,我就是被这个小问题困扰了好大一会儿,还不知道哪里错了,大家千万别像我一样犯低级错误.



pStu checkXuehao(char*x,int* pos)
{
	pStu px=pHeader->pNext;
	*pos=-1;
	while(px!=NULL)
	{
		(*pos)++;
		if (strcmp(x,px->ID)==0)
		{
			return px;
		}
		px=px->pNext;

	}
	
	return NULL;
}
void StudentSearch()
{
	system("cls");
	system("color 0C");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt查找学生信息n");
	printf("-------------------------------n");
	char ID[16];
	printf("请输入您要查询的学生学号n");
	scanf("%s",ID);
	int value;
	pStu s=checkXuehao(ID,&value);
	if (s==NULL)
	{
		printf("您输入的学号不存在n");
	}
	else
	{
		printf("您查询的结果如下:n");
		printf("%8s%8s%8s%8s%8s%8sn","学号","姓名","性别","语文","数学","外语");
		printf("%8s%8s%8s%8d%8d%8dn",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
	}

}

六.学生管理系统展示所有学生信息



void bianli(pStu stu)
{
	system("cls");
	system("color 0E");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt展示学生信息n");
	printf("-------------------------------n");
	pStu px=pHeader->pNext;
	printf("%8s%8s%8s%8s%8s%8s%8sn","学号","姓名","性别","语文","数学","外语","总成绩");
	while(px!=NULL)
	{	
		printf("%8s%8s%8s%8d%8d%8d%8dn",px->ID,px->name,px->sex,px->scoreCh,px->scoreMa,px->scoreEn,px->scoreCh+px->scoreMa+px->scoreEn);
		px=px->pNext;
		
	}

}

七.学生管理系统学生成绩排序

先用冒泡进行排序,然后再调用展示学生信息

上面这两张截图就是按总成绩排序打印的



void paixuCh(pStu pHeader,int c)
{
	pStu p,p1,t=pHeader;

	for (p=pHeader->pNext;p!=NULL;p=p->pNext)
	{
		for (p1=p->pNext;p1!=NULL;p1=p1->pNext)
		{
			if (c==1)
			{
				if ((p->scoreCh)<(p1->scoreCh))
				{
					//复制内存
					//交换内存数据,不换指针,只需要将除pNext指针外的结构体数据拷贝交换即可
					MoveMemory(t,p,sizeof(Stu) - 4);
					MoveMemory(p,p1,sizeof(Stu) - 4);
					MoveMemory(p1,t,sizeof(Stu) - 4);

				}
			}
			else if (c==2)
			{
				if (p->scoreMascoreMa)
				{
					MoveMemory(t,p,sizeof(Stu) - 4);
					MoveMemory(p,p1,sizeof(Stu) - 4);
					MoveMemory(p1,t,sizeof(Stu) - 4);
				}
			}
			else if (c==3)
			{
				if (p->scoreEnscoreEn)
				{
					MoveMemory(t,p,sizeof(Stu) - 4);
					MoveMemory(p,p1,sizeof(Stu) - 4);
					MoveMemory(p1,t,sizeof(Stu) - 4);
				}
			}
			else if(c==4)
			{
				if ((p->scoreCh+p->scoreMa+p->scoreEn)<(p1->scoreCh+p1->scoreMa+p1->scoreEn))
				{
					MoveMemory(t,p,sizeof(Stu) - 4);
					MoveMemory(p,p1,sizeof(Stu) - 4);
					MoveMemory(p1,t,sizeof(Stu) - 4);
				
				}
			}


		}
	}

}
void sort()
{
	int c;
	system("cls");
	system("color 0B");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt学生成绩排序n");
	printf("-------------------------------n");
	printf("*******************n");
	printf("1.按语文成绩降序n");
	printf("2.按数学成绩降序n");
	printf("3.按外语成绩降序n");
	printf("4.按总成绩降序n");
	printf("*******************n");
	scanf("%d",&c);
	switch(c)
	{
	 case 1:
		{
			paixuCh(pHeader,c);
			bianli(pHeader);
			break;

		}
	 case 2:
		 {
			 paixuCh(pHeader,c);
			 bianli(pHeader);
			break;
			 
		}
	 case 3:
		{
			paixuCh(pHeader,c);
			bianli(pHeader);
			break;
					 
		}
	case 4:
		 {
			 paixuCh(pHeader,c);
			 bianli(pHeader);
			break;
					 
		}
	default:
		{
			printf("Error!n");
		}
	}

}

八.学生管理系统删除学生信息

 删除要找到位置,方法以前单向链表那篇文章已经讲过了,这里就不多赘述了



void rewrite(char* infoPath,pStu pHeader)
{
	FILE*fp;
	pStu rep=pHeader->pNext;
	
	fp=fopen(infoPath,"w");
	if (fp==NULL)
	{
		printf("fopen errorn");
	}
	while(rep!=NULL)
	{
		fprintf(fp,"%s %s %s %d %d %dn",rep->ID,rep->name,rep->sex,rep->scoreCh,rep->scoreMa,rep->scoreEn);
		rep=rep->pNext;
	}
	
	fclose(fp);

}
void delStu(char* path)
{
	system("cls");
	system("color 0B");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt删除学生信息n");
	printf("-------------------------------n");
	char ID[16];
	char a;
	printf("请输入您要删除的学生学号n");
	scanf("%s",ID);
	int pos;
	int i=0;
	pStu s=checkXuehao(ID,&pos);
	pStu d=pHeader->pNext;
	if (s==NULL)
	{
		printf("您输入的学号不存在n");
	}
	else
	{
		printf("您要删除的学生信息如下:n");
		printf("%8s%8s%8s%8s%8s%8sn","学号","姓名","性别","语文","数学","外语");
		printf("%8s%8s%8s%8d%8d%8dn",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
		printf("请问确定要删除吗?y/nn");
		safe_flush(stdin);
		scanf("%c",&a);
		if (a=='n')
		{
			return;
		}
		else if (a=='y')
		{
			while (d!=NULL && ipNext;
			}
			

			d->pNext=d->pNext->pNext;
			free(s);
			s=NULL;
			rewrite(path,pHeader);
			printf("删除成功!n");
		}
		else
		{
			printf("Error!/n");

		}	
	}
}

九.学生管理系统修改学生信息

修改也是要找到位置,然后重新写入时写到要修改的位置时把数据换成新输入的数据. 



void alterwrite(char* infoPath,pStu pHeader,int* pos)
{
	FILE*fp;
	pStu rep;
	Stu ss;
	int i=-1;
	printf("请依次输入学生ID 姓名 性别 语文 数学 外语成绩n");		
	scanf("%s %s %s %d %d %d",ss.ID,ss.name,ss.sex,&ss.scoreCh,&ss.scoreMa,&ss.scoreEn);
	
	fp=fopen(infoPath,"w");
	if (fp==NULL)
	{
		printf("fopen errorn");
	}
	rep=pHeader->pNext;			
	while (rep!=NULL)
	{
		i++;
		if (i==(*pos))
		{
			strcpy(rep->ID,ss.ID);
			strcpy(rep->name,ss.name);
			strcpy(rep->sex,ss.sex);
			rep->scoreCh=ss.scoreCh;
			rep->scoreMa=ss.scoreMa;
			rep->scoreEn=ss.scoreEn;
		}
		fprintf(fp,"%s %s %s %d %d %dn",rep->ID,rep->name,rep->sex,rep->scoreCh,rep->scoreMa,rep->scoreEn);
		rep=rep->pNext;

	}
	
	fclose(fp);
	
}
void alterStu(char* path)
{
	system("cls");
	system("color 0D");
	printf("-------------------------------n");
	printf("t欢迎来到学生管理系统tn");
	printf("tt修改学生信息n");
	printf("-------------------------------n");
	char ID[16];
	char a;
	printf("请输入您要修改的学生学号n");
	scanf("%s",ID);
	int pos=0;
	int i=0;
	
	pStu s=checkXuehao(ID,&pos);
	pStu d=pHeader;
	
	if (s==NULL)
	{
		printf("您输入的学号不存在n");
	}
	else
	{
		printf("您要修改的学生信息如下:n");
		printf("%8s%8s%8s%8s%8s%8sn","学号","姓名","性别","语文","数学","外语");
		printf("%8s%8s%8s%8d%8d%8dn",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
		printf("请问确定要修改吗?y/nn");
		
		safe_flush(stdin);
		scanf("%c",&a);
		if (a=='n')
		{
			return;
		}
		else if (a=='y')
		{
			alterwrite(path,pHeader,&pos);
			printf("修改成功!n");
		}
		else
		{
			printf("Error!/n");
			
		}	
	}

}


今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029394.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号