干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】

前言

关于这个系统是我们专业要求做的一个课程设计,本来是上个学期交的,我也是上个学期弄好的,打算发出来,但是一直没交上去(怕交上去之前发出来老师说我作弊。。。),今天就把我做的这个系统分享给大家,不足之处一起改进。下面的大量文字来源于我的实验报告,这报告写了我差不多一个星期,足足写了一万三千字,可能会有人觉得没有必要弄这么多,但是我觉得既然是一次设计,那就认真一点吧,认真对待每一次设计也是每个软件开发者必备的思想吧,哈哈哈,进入正题吧。

运行环境

开发工具:Dev C+

需求分析

此课程设计的题目为学生成绩管理系统,该系统模拟学校在考完试之后对学生成绩的处理。为了方便管理者对学生成绩的处理,本系统设有录入、显示、查找、修改、排序、删除、保存、读取、退出等九大功能。为了可以永久性保存学生信息,该系统才用以文件存储数据的形式进行设计,系统功能尚算齐全。学生信息暂时设有姓名、学号、性别、年龄、数学、英语、计算机以及总分。

系统功能

该系统功能有:录入、显示、查找、修改、排序、删除、保存、读取、退出共9个主要功能(有些功能里还有次要功能)。下面将一一介绍这些功能:
1、录入功能
该功能是模拟对学生成绩的录入。
2、显示功能
将当前所有学生的成绩显示出来,方便预览。此外会统计当前信息库中的学生总人数。
3、查找功能
该功能是对某个学生进行查找,考虑到可能存在同名同姓的学生,故该功能可设两个辅助查找功能——即按姓名查找以及按学号查找。因为姓名可能不唯一,但是学号肯定是唯一的。学生成绩管理者还可通过该功能查找本校同名同姓的学生,并且统计同名同姓者人数。
4、修改功能
为了模拟老师可能因为失误以至于输入错误的学生信息,系统增设修改功能。主要目的是对信息有误的学生信息进行修改。该功能在修改时会把学生的信息都重新输入一遍,当然了,也可以修改指定的信息,但是为了简洁本系统中并不设此功能。
5、排序功能
为了便于查看每科或者总分的最高分以及成绩优异的那一批人,本系统设计了排序功能。排序时会用到冒泡排序算法,在对学生成绩进行排序算法设计的过程中,联想到老师既然想看最高分,也有可能想看最低分,所以此功能还会对学生成绩进行升序排序。
6、删除功能
此功能主要是删除某个学生的信息。例如如果学生毕业之后,那他的成绩信息就可以去除了,铁打的学校流水般的学生,说的好像就是这个道理吧。
7、保存功能
为了便于将学生信息进行永久性的保存,系统开设了保存信息的功能。在保存的时候还应该考虑信息追加和信息更新。
8、读取功能
意如其名,字面意思就是从文本文件中读取学生的信息。方便于老师可以在不同的时间段工作。
9、退出功能
即直接推出该系统。

系统结构图

干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第1张图片

算法概要设计

干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第2张图片

就放一张主函数的图的,因为图片有点多,比较占位置。。。

心得体会(瞎写的吧)

做了这个课程设计之后,我的收获还是蛮大的。先来说说自己的感受吧,我觉得做这个课程设计,非常有必要,也很有意义。从一开始的选题,到设计系统结构,再到制定所用到的功能,接着开始写代码,每完成一个功能就测试一下,这过程并不是很顺利。比如说对于指针那一块有点忘记了,然后又在图书馆里复习了指针和结构体以及结构体指针。然后老师要求用文本的形式进行存储数据,我又新学了FILE文件指针。
在一开始制作之前,在CSDN上参考了很多大神的课程设计,主要是看一下他们的思路,和他们都设计了哪些功能,CSDN真的是一个好东西,在那上面可以学到很多东西,也正因如此,我就在参考的过程中学会system语句。不得不说这个语句真的挺实用的,把它用到我的代码里去,可以使系统在运行之后更有序。
写这个系统前后用了6天的时间吧,初步完成后是557行代码,然后加上注释以及更新了一部分功能就变成了700多行代码,每天都在图书馆里,基本上每天完成1-2个功能。这其中也有很多苦。比如在bug出现的时候,有时会盯着自己写的代码看很久,绞尽脑汁去解决这个bug,甚至有些bug是我在去食堂的路上,突然就想到了解决的方法。说真的,一开始写代码的时候,我感觉完成这个课程设计有点困难,因为之前从来没有试过去做这样一个项目,但是在把最后一个bug解决好的那一刻,真的就是特别快乐,特别的激动,从0到1,这个过程虽然艰辛,但是特别过瘾。
其实做这个学生成绩管理系统,就相当于做了一个小软件吧,因为它同做软件的流程是一样的,先是需求分析,然后概要设计,详细设计,之后开始编程,编程完成后还要开始测试,还有之后的更新维护。所以我觉得做这样一个课程设计特别有意义。
在做这个管理系统的过程中,我也有意外的发现,如果说代码是习武之人常说的招式,那么支撑招式的内力就是理论和概念。之前我不怎么喜欢理论和概念的东西,因为比较枯燥,所以我更喜欢实际一点的东西,但是现在我觉得,一个卓越的软件工程师,其理论知识也会特别扎实。所以在接下来的学习里,我会好好的复习和学习理论知识,比如现在所学的OS和计算机组成原理。此外,每天的算法题也要坚持去做。
“哪怕只有痛苦作伴也要勇往直前…”一句歌词送给自己吧,去追求那充满鲜花的世界,励志成为一名卓越的软件工程师。

部分效果图演示

干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第3张图片
干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第4张图片
干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第5张图片
干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】_第6张图片

详细代码(干货来咯~我很菜,心灵脆弱,大佬们别喷)

#include 
#include 
#include 
#include 


// 定义学生信息结构体 
typedef struct Students{
     
 	char name[20]; //姓名 
 	int number;	//学号,学号定义为整型,8位数,例如:18241024 
 	char sex[3]; //性别 
	int age; //年龄 
 	int math; //数学成绩 
	int english; //英语成绩 
	int computer; //计算机成绩 
	int TatolScore; //总分 
	struct Students *next; //指向下一个节点
}Students;
 
 
Students *head=NULL; //把head作为全局变量 




// 定义一个菜单 
void Menu(){
     
	printf("*****************************************\n");
	printf("*\t欢迎使用学生成绩管理系统\t*\n");
	printf("*****************************************\n");
	printf("*\t系统功能如下所示\t\t*\n");
	printf("*****************************************\n");
	printf("*\t1、录入学生成绩\t\t\t*\n");
	printf("*\t2、显示学生成绩\t\t\t*\n");
	printf("*\t3、查找学生信息\t\t\t*\n");
	printf("*\t4、修改学生信息\t\t\t*\n");
	printf("*\t5、学生成绩排序\t\t\t*\n");
	printf("*\t6、删除学生信息\t\t\t*\n");
	printf("*\t7、保存学生信息\t\t\t*\n");
	printf("*\t8、读取学生信息\t\t\t*\n");
	printf("*\t9、退出管理系统\t\t\t*\n");
	printf("*****************************************\n");
}

 
 
 
//定义一个函数,在排序时用于交换数据,减少代码冗余 
void Swap(int *a,int *b){
     
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}




//定义一个函数,用于交换两节点之间的信息 
void SwapStudent(Students *p){
     
	char TmpName[20],TmpSex[3];
	Swap(&p->math,&p->next->math);
	Swap(&p->age,&p->next->age);
	Swap(&p->english,&p->next->english);
	Swap(&p->computer,&p->next->computer);
	Swap(&p->TatolScore,&p->next->TatolScore);
	Swap(&p->number,&p->next->number);
	strcpy(TmpName,p->name);
	strcpy(p->name,p->next->name);
	strcpy(p->next->name,TmpName);
	strcpy(TmpSex,p->sex);
	strcpy(p->sex,p->next->sex);
	strcpy(p->next->sex,TmpSex);
}




//冒泡排序法对学生成绩进行排序
//len表示当前链表节点个数,p为当前的链表,choose表示选择 
void BubbleSort(int len,Students *p,int choose){
     
	int i,j;
	for(i=0;i<len-1;i++){
     
	p=head;
		for(j=0;j<len-i-1;j++){
     
			if(choose==1){
     		//按计算机成绩降序排序 
				if(p->computer<p->next->computer)
					SwapStudent(p); 	//调用学生信息交换函数,交换两节点之间的信息 
				p=p->next;
			}
			else if(choose==2){
     		//按数学成绩降序排序 
				if(p->math<p->next->math)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==3){
     		//按英语成绩降序排序 
				if(p->english<p->next->english)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==4){
     		//按总成绩降序排序 
				if(p->TatolScore<p->next->TatolScore)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==5){
     		//按计算机成绩升序排序 
				if(p->computer>p->next->computer)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==6){
     		//按数学成绩升序排序 
				if(p->math>p->next->math)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==7){
     		//按英语成绩升序排序 
				if(p->english>p->next->english)
					SwapStudent(p);
				p=p->next;
			}
			else if(choose==8){
     		//按总成绩升序排序 
				if(p->TatolScore>p->next->TatolScore)
					SwapStudent(p);
				p=p->next;
			}
		}
	}
}




//定义一个函数,被主查找函数进行调用
//该函数以学生姓名查找学生信息,该查找不排除同名同姓的情况 
void FindStuName(){
     
	char StuName[10];
	Students *p;
	p=head; //指向头节点 
	int flag=1; //flag用于标记 
	int people=0;
	if(head==NULL){
      //如果头节点为空,表示查找失败 
		printf("查找失败:目前尚无任何信息可查\n");
		system("pause"); //system函数,用于停顿 
		system("cls");	//system函数,用于清屏 
		return; //结束该函数 
	}
	
	//如果头节点不为空 
	printf("请输入你所需要查找的姓名:");
	scanf("%s",StuName); 
	printf("_____________________________________________________________________________________________________________\n");
	while(p!=NULL){
     
		if(strcmp(StuName,p->name)==0){
     
			printf("%d-----姓名:%s   学号:%d   性别:%s   年龄:%d   数学:%d   英语:%d   计算机:%d   总分:%d\n",people+1,p->name,p->number,p->sex,
				p->age,p->math,p->english,p->computer,p->TatolScore);
			flag=0;
			people++;
		}
		p=p->next;
	}
	
	//当flag置零时表示信息库中没有此人 
	if(flag){
     
		printf("查找失败:学生信息库中暂无此人\n");
		system("pause"); //任意键继续 
		system("cls");	//清屏 
		return;	//结束函数 
	}
	
	//查到信息后会显示出来 
	printf("查找完毕,共有%d条结果\n",people);
	system("pause");	//任意键继续 
	system("cls");		//清屏 
}




//定义一个函数,被主查找函数调用
//该函数目的在于以学号的方式对学生进行查找,查找结果唯一,因为学号唯一 
void FindStuNum(){
     
	Students *p;
	p=head;
	
	//如果头节点为空,则表示查找失败 
	if(head==NULL){
     
		printf("查找失败:目前尚无任何信息可查\n");
		system("pause");
		system("cls");
		return;
	}
	
	int StuNum;
	printf("请输入你所需要查找的学号:");
	scanf("%d",&StuNum);
	printf("_____________________________________________________________________________________________________________\n");
	while(p!=NULL&&p->number!=StuNum)
		p=p->next;
		
	//p为NULL时,表示并未查到该学号 
	if(p==NULL){
     
		printf("查找失败:学生信息库中并未查到该学号\n");
		system("pause");
		system("cls");
		return;
	}
	
	printf("姓名:%s   学号:%d   性别:%s   年龄:%d   数学:%d   英语:%d   计算机:%d   总分:%d\n",p->name,p->number,p->sex,p->age,p->math,
		p->english,p->computer,p->TatolScore);
	printf("查找完毕\n");
	system("pause");
	system("cls");
}




//该系统功能之一,录入功能 
void InputStudent(){
     
	system("cls");	//清屏 
	Students *NewStudent;	//表示一个新同学的节点 
	Students *tail;	//链表的尾节点 
	tail=head;	 
	NewStudent=(Students*)malloc(sizeof(Students));	//为新同学节点分配 
	NewStudent->next=NULL;	//下一个节点置NULL 
	
	//查找尾节点 
	while(head!=NULL&&tail->next!=NULL)
		tail=tail->next;
		
	//如果头节点为空,则表示当前录入的是第一个同学 
	if(head==NULL)
		head=NewStudent;
	else
		tail->next=NewStudent; //不为空则令尾节点指向该同学 
		
	//录入开始 
	printf("***开始录入信息,请确保信息正确***\n");
	printf("请输入姓名:");
	scanf("%s",NewStudent->name);
	printf("请输入学号:");
	scanf("%d",&NewStudent->number);
	printf("请输入性别:");
	scanf("%s",NewStudent->sex);
	printf("请输入年龄:");
	scanf("%d",&NewStudent->age);
	printf("请输入数学成绩:");
	scanf("%d",&NewStudent->math);
	printf("请输入英语成绩:");
	scanf("%d",&NewStudent->english);
	printf("请输入计算机成绩:");
	scanf("%d",&NewStudent->computer);
	NewStudent->TatolScore=NewStudent->math+NewStudent->english+NewStudent->computer;
	printf("你本次录入的同学是%s,总分为:%d\n",NewStudent->name,NewStudent->TatolScore);
	printf("录入完毕\n");
	system("pause");
	system("cls");
}




//该系统主要功能之一,浏览(显示)功能,将全部学生成绩打印出来 
void PrintStuInfo(){
     
	system("cls");
	Students *StuInfo;
	int people=0;	//people用于统计人数 
	StuInfo=head;
	
	//相当于头节点为空	 
	if(StuInfo==NULL){
     
		printf("暂无学生信息,请输入后再试。\n");
		system("pause");
		system("cls");
		return;
	}
	
	//头节点不为空就打印信息 
	else{
     
		printf("*************************************************************************\n");
		printf("|姓名\t|学号\t\t|性别\t|年龄\t|数学\t|英语\t|计算机\t|总分\t|\n"); 
		while(StuInfo){
     
			people++;
			printf("*************************************************************************\n");
			printf("|%s\t|%d\t|%s\t|%d\t|%d\t|%d\t|%d\t|%d\t|\n",StuInfo->name,StuInfo->number,StuInfo->sex,StuInfo->age,StuInfo->math,StuInfo->english,
				StuInfo->computer,StuInfo->TatolScore);
			StuInfo=StuInfo->next;
		}
	}
	printf("*************************************************************************\n");
	printf("以显示全部,合计%d人\n",people); //报告学生人数 
	system("pause");
	system("cls");
}




//该系统主要功能之一,用于查找学生信息 
void FindStudent(){
     
	system("cls");
	
	//考虑到姓名可能不唯一但是学号一定唯一的情况,定义了两种查询方式
	//即按学号查询以及按姓名查询 
	printf("*****************************************\n");
	printf("*\t学生成绩查询\t\t\t*\n");
	printf("*****************************************\n");
	printf("*\t请选择您所需要的查找方式:\t*\n");
	printf("*\t1、按学号查找\t\t\t*\n");
	printf("*\t2、按姓名查找\t\t\t*\n");
	printf("*****************************************\n");
	int choose;
	printf("请选择:");
	scanf("%d",&choose);
	switch(choose){
     
		case 1:
			FindStuNum();	//调用按学号查询函数 
			break;
		case 2:
			FindStuName();		//调用按学生姓名查询函数 
			break;
		default:	//不小心按错,则退出该功能 
			printf("选择错误!因为不存在此项选择!\n");
			system("pause");
			system("cls");
			break; 
	}
}




//该系统主要功能之一,用于修改学生信息,因为学号是唯一的,所以该函数以学号去查找学生信息 
void ChangeStudent(){
     
	system("cls");
	Students *p;
	p=head;
	
	//头节点为空,表示学生信息库中没有任何信息 
	if(head==NULL){
     
		printf("修改失败:学生信息库中暂无任何信息!\n");
		system("pause");
		system("cls");
		return;
	}
	
	int StuNum;
	int choose1;	//choose用于确保进行修改时没有输入错误的学号 
	printf("请输入你将修改的学生的学号:");
	scanf("%d",&StuNum);
	
	//查找学号 
	while(p!=NULL&&p->number!=StuNum)
		p=p->next;
		
	//如果没有找到 
	if(p==NULL)
		printf("修改失败:学生信息库中查找不到此学号!\n");
		
	//找到学号后,先显示学生信息 
	else{
     
		printf("\n*********系统为你查找到以下信息*********\n");
		printf("_____________________________________________________________________________________________________________\n");
		printf("姓名:%s   学号:%d   性别:%s   年龄:%d   数学:%d   英语:%d   计算机:%d   总分:%d\n",p->name,p->number,p->sex,p->age,p->math,
			p->english,p->computer,p->TatolScore);
		printf("_____________________________________________________________________________________________________________\n");	
			
		//确保没有输入错误学号 
		printf("请再次确认你是否需要修改该学生信息(是选择1,否选择2)\n");
		printf("请选择:");
		scanf("%d",&choose1);
		switch(choose1){
     
			case 1:
				break;
			case 2:
				printf("修改失败:你否认了修改指令!\n");
				system("pause");
				system("cls");
				return; 
		}
		
		//可以修改单个的信息,也可以修改全部信息,choose2为选择结果 
		system("cls");
		printf("*****************************************\n");
		printf("*\t请选择你需要修改的信息\t\t*\n");
		printf("*****************************************\n");
		printf("*\t1、学生姓名\t\t\t*\n");
		printf("*\t2、学生学号\t\t\t*\n");
		printf("*\t3、学生性别\t\t\t*\n");
		printf("*\t4、学生年龄\t\t\t*\n");
		printf("*\t5、数学成绩\t\t\t*\n");
		printf("*\t6、英语成绩\t\t\t*\n");
		printf("*\t7、计算机成绩\t\t\t*\n");
		printf("*\t8、全部信息\t\t\t*\n");
		printf("*****************************************\n");
		//定义新信息 
		int choose2;
		int NewNumber;
		int NewAge;
		int NewMath;
		int NewEnglish;
		int NewComputer;
		int NewTatolScore;
		char NewName[20];
		char NewSex[3];
		printf("请选择:");
		scanf("%d",&choose2);
		switch(choose2){
     
			case 1:
				printf("请输入姓名:");
				scanf("%s",NewName);
				strcpy(p->name,NewName);
				break;
			case 2:
				printf("请输入学号:");
				scanf("%d",&NewNumber);
				p->number=NewNumber;
				break;
			case 3:
				printf("请输入性别:");
				scanf("%s",NewSex);
				strcpy(p->sex,NewSex);
				break;
			case 4:
				printf("请输入年龄:");
				scanf("%d",&NewAge);
				p->age=NewAge;
				break;
			case 5:
				printf("请输入数学成绩:");
				scanf("%d",&NewMath);
				p->math=NewMath;
				break;
			case 6:
				printf("请输入英语成绩:");
				scanf("%d",&NewEnglish);
				p->english=NewEnglish;
				break;
			case 7:
				printf("请输入计算机成绩:");
				scanf("%d",&NewComputer);
				p->computer=NewComputer; 
				break;
			case 8:
				printf("请输入姓名:");
				scanf("%s",p->name);
				printf("请输入学号:");
				scanf("%d",&p->number);
				printf("请输入性别:");
				scanf("%s",p->sex);
				printf("请输入年龄:");
				scanf("%d",&p->age);
				printf("请输入数学成绩:");
				scanf("%d",&p->math);
				printf("请输入英语成绩:");
				scanf("%d",&p->english);
				printf("请输入计算机成绩:");
				scanf("%d",&p->computer);
				break;
		}
		//如果修改了成绩,那么总成绩也肯定要变 
		p->TatolScore=p->math+p->english+p->computer;
		printf("修改数据成功!\n");
	}
	system("pause");
	system("cls");
} 




// 函数主要功能之一,用于学生成绩的排序 
void SortStudents(){
     
	system("cls");
	Students *p,*q;
	int len;	//统计节点个数,即学生个数 
	int choose;	//用于选择排序方式 
	len=0;
	q=head;
	
	//如果头节点为空 
	if(head==NULL){
     
		printf("排序失败:学生信息库中暂无任何信息!\n");
		system("pause");
		system("cls");
		return;
	}
	
	//统计节点 
	while(q!=NULL){
     
		q=q->next;
		len++;
	}
	
	printf("*****************************************\n");
	printf("*\t学生成绩排序\t\t\t*\n");
	printf("*****************************************\n");
	printf("*\t你有以下8种排序方式可选:\t*\n");
	printf("*\t1、按计算机成绩降序\t\t*\n");
	printf("*\t2、按数学成绩降序\t\t*\n");
	printf("*\t3、按英语成绩降序\t\t*\n");
	printf("*\t4、按总成绩降序\t\t\t*\n");
	printf("*\t5、按计算机成绩升序\t\t*\n");
	printf("*\t6、按数学成绩升序\t\t*\n");
	printf("*\t7、按英语成绩升序\t\t*\n");
	printf("*\t8、按总成绩升序\t\t\t*\n");
	printf("*****************************************\n");
	printf("请选择:");
	scanf("%d",&choose);
	
	//通过选择不同的方式进行排序,调用冒泡排序算法函数 
	switch(choose){
     
		case 1:
			BubbleSort(len,p,choose);
			break;
		case 2:
			BubbleSort(len,p,choose);
			break;
		case 3:
			BubbleSort(len,p,choose);
			break;
		case 4:
			BubbleSort(len,p,choose);
			break;
		case 5:
			BubbleSort(len,p,choose);
			break;
		case 6:
			BubbleSort(len,p,choose);
			break;
		case 7:
			BubbleSort(len,p,choose);
			break;
		case 8:
			BubbleSort(len,p,choose);
			break;
		default:	//防止输入错误选择 
			printf("选择错误!因为不存在此项选择!\n");
			system("pause");
			system("cls");
			break; 
	}
	printf("排序成功!请在功能2中查看!\n"); 	//排序成功后可以通过显示函数查看排序结果 
	system("pause");
	system("cls");
}




//函数主要功能之一,用于删除某个学生的信息,此处也是以学号进行查找,因为姓名会有同名的情况 
void DeleteStuInfo(){
     
	system("cls");
	Students *p,*BeforeNode;
	p=head;
	int StuNum;
	int choose;
	
	//如果头节点为空 
	if(head==NULL){
     
		printf("暂无学生信息,请输入后再试。\n");
		system("pause");
		system("cls");
		return;
	}
	
	printf("请输入你将删除的学生的学号:");
	scanf("%d",&StuNum);
	
	//查找学号 
	while(p!=NULL&&p->number!=StuNum){
     
		BeforeNode=p;
		p=p->next;
	}
	
	//查找失败,可能是输入学号错误或者信息库中没有该学号 
	if(p==NULL){
     
		printf("删除失败:学生信息库中并未查到该学号\n");
		system("pause");
		system("cls");
		return;
	}
 
	printf("你将删除的学生是:%s,学号为:%d\n",p->name,p->number);	//显示将要删除的学生的学号和姓名 
	printf("你确认要删除该同学的信息吗?(是选择1,不是选择2)\n");	//防止失误将学生信息删除的情况 
	printf("请选择:");
	scanf("%d",&choose);
	switch(choose){
     
		case 1:
			if(p==head)	//如果删除的学生是在头节点 
				head=p->next;
			else	//如果删除的学生是在尾节点或者是中间节点 
				BeforeNode->next=p->next;
			printf("删除成功!\n");
			break;
		case 2:
			printf("删除失败:你否认了删除指令!\n");
			break;
	}
	system("pause");
	system("cls");
}




//函数主要功能之一,用于保存学生信息,该保存功能有覆盖以及追加两个功能 
void SaveStuInfo(){
     
	system("cls");
	FILE *fp;	//文件指针 
	int choose;	//choose用于选择 
	printf("*****************************************\n");
	printf("*\t学生信息保存\t\t\t*\n");
	printf("*****************************************\n");
	printf("*\t你可以选择以下两种保存方式\t*\n");
	printf("*\t1、追加学生信息\t\t\t*\n");	//追加 
	printf("*\t2、更新学生信息\t\t\t*\n");	//覆盖 
	printf("*****************************************\n");
	printf("请选择:");
	scanf("%d",&choose);
	
	//选择 
	switch(choose){
       
		case 1:
			fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","a");	//其中\为转义字符,用fopen函数打开D盘中学生成绩管理系统中的StuInfo文件,a表示追加 
			break;
		case 2:
			fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","w");	//用法同上,w表示删除之前的数据后再进行保存,即覆盖、更新 
			break;
	} 
	
	if(fp==NULL){
     
		printf("打开文件失败!\n");
		system("pause");
		system("cls");
		return;
	}
	Students *p;
	p=head;
	
	//保存学生信息 
	while(p!=NULL){
     
		fprintf(fp,"\n%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d",p->number,p->name,p->sex,p->age,p->math,p->english,p->computer,p->TatolScore);
		p=p->next;
	}
	
	printf("保存信息成功!\n");
	fclose(fp);	//用fclose函数关闭文件,一定要关闭 
	system("pause");
	system("cls");
}




//函数主要功能之一,用于读取学生信息库的信息
//如果在读取学生信息之前录入了新同学信息,则一定要保存,读取之后头节点指向StuInfo文本里第一个同学 
void ReadStuInfo(){
     
	system("cls");
	Students *p;
	FILE *fp;	//文件指针 
	Students *tail;
	tail=head;	 
	head=NULL;	//经测试,头节点要置空,若不置空,就会出现在运行程序时读取多次后,学生信息叠加的情况 
	fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","r");	//以只读的形式打开学生信息库文本 
	if(fp==NULL){
     
		printf("打开文件失败!\n");
		system("pause");
		system("cls");
		return;
	}
	while(!feof(fp)){
     
		p=(Students *)malloc(sizeof(Students));	//为当前节点分配 
		p->next=NULL;	//下个节点置空 
		
		//寻找尾节点 
		while(head!=NULL&&tail->next!=NULL)
			tail=tail->next; 
			
		//形成链表 
		if(head==NULL){
     
			head=p;
			tail=head;
		}
		else
			tail->next=p;
		
		//读取信息 
		fscanf(fp,"%d%s%s%d%d%d%d%d",&p->number,p->name,p->sex,&p->age,&p->math,&p->english,&p->computer,&p->TatolScore);
	}
	p=NULL;	//此时的p是尾节点的下一个节点,要置空 
	printf("读取信息成功!\n");
	fclose(fp); //关闭 
	system("pause");
	system("cls");
}




//该系统的主函数 
int main()
{
     
	int choise;
	while(1){
     
		Menu();	//先调用菜单函数 
		printf("请选择:");
		scanf("%d",&choise);
		
		//九大功能 
		switch(choise){
     
			case 1:
				InputStudent();	//录入功能 
				break;
			case 2:
				PrintStuInfo();	//显示功能 
				break;
			case 3:
				FindStudent();	//查找功能 
				break;
			case 4:
				ChangeStudent();	//修改功能 
				break;
			case 5:
				SortStudents();	//排序功能 
				break;
			case 6:
				DeleteStuInfo();	//删除功能 
				break;
			case 7:
				SaveStuInfo();	//保存功能 
				break;
			case 8:
				ReadStuInfo();	//读取功能 
				break;
			case 9:	//退出程序 
				printf("你已退出学生成绩管理系统,欢迎下次使用!");
				return 0;
				break;
			default:	//防止输入错误 
				printf("选择错误!因为不存在此项选择!\n");
				system("pause");
				system("cls");
				break;
		}
	}
	return 0;
}


你可能感兴趣的:(C,笔记,编程语言,算法,数据结构,c,c++)