数据结构课程设计-学生成绩管理系统

学生成绩管理系统


1.头文件
//第一门成绩即为语文成绩
//第二门成绩即为数学成绩
//第三门成绩即为英语成绩

#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct STUDENT
{
	char studentNumber[10];/*学生学号*/
	char studentName[20];/*学生姓名*/
	char className[20];/*班级名称*/
	char yearName[20];/*学期名称*/
	float mark1;/*第1门成绩*/
	float mark2;/*第2门成绩*/
	float mark3;/*第3门成绩*/
	struct STUDENT *next;
}STUDENT;

STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/

void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT *MallocNode(void);

void GetInformation(STUDENT *t);
void OutputInformation(void);
void DesplayInfoBystudentName(void);
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkByName(void);
void ChangeMarkByNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void CompositorByTotalMark(void);
2.源文件
#include"head.h"
int choose;/*用于接受用户的选择*/
/*主函数*/
void welcome()//登录考试报名管理系统
{  
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\t*****************************************************************\n");
	printf("\t    欢迎进入考试报名管理系统    \n");
	printf("\t*****************************************************************\n");
	char username[20];
	string passward;
    printf("\n");
	printf("\t\t\t请输入用户名: ");
	gets(username);
	printf("\n");
	printf("\t\t\t请输入您的密码:");
	cin>>passward;
	//	gets(passward);
	while(passward!="123456")
	{
		printf("密码错误,请重新输入!!!\n");
        printf("请输入用户名:");
		gets(username);
		//	    scanf("%d\n",username);
		printf("请输入密码:");
		//		scanf("%d\n",passward);
		cin>>passward;
	}
	system("cls");
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\n");
	printf("\t\t*************************************\n");
	printf("\t\t*  密码正确,请稍候 !!!  *\n");
	printf("\t\t*************************************\n");
	Sleep(3000);
	system("cls");
}

void main()
{
	CreateHeadLink();
	ReadInfoFormFile();
	DesplayMenu();
}


/************************************
函数功能:从文件中读学生信息到链表中
************************************/

void ReadInfoFormFile(void)
{
	welcome();
	FILE *fp;
	STUDENT *p;
	fp=fopen("student.txt","r");
	if(!fp)
	{
		printf("文件不存在\n");
		return;
	}
	p=MallocNode();
	while(fscanf(fp,"%s%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,p->yearName,&(p->mark1),&(p->mark2),&(p->mark3))>0)
	{
		InsertOneNode(p);
		p=MallocNode();
	}
	fclose(fp);
}

/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
************************************/


void DesplayMenu(void)
{
	STUDENT *p;
	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("           ┃   8.显示不及格学生成绩┃\n");
	printf("           ┃   9.按平均成绩排序并输出成绩┃\n");
	printf("           ┃  10.退出系统哟┃\n");
	printf("           ┗━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("老师寄语:成绩并不代表什么,关键要从中吸取经验和教训,再接再厉!重新树立起好的心态哦,踏踏实实的走下去吧^_^\n");
	printf(">>请输入选择:");
	scanf("%d",&choose);/*取得用户的选择*/
	printf("\n");
	switch(choose)
	{
	case 1:
		OutputInformation();/*显示所有学生的信息*/
		break;
	case 2:
		DesplayInfoBystudentName();
		break;
	case 3:
		p=MallocNode();/*先申请一个新结点*/
		GetInformation(p);/*要求用户输入信息到新结点中*/
		InsertOneNode(p);/*将新结点加到链表中*/
		break;
	case 4:
		DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
		break;
	case 5:
		ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
		break;
	case 6:
		ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
		break;
	case 7:
		SaveLinkToFile();/*保存数据*/
		break;
	case 8:
		DesplayMarkSegment();/*显示不及格的学生成绩*/
		break;
	case 9:
		CompositorByTotalMark();/*按平均成绩排序*/
		break;
	case 10:
		SaveLinkToFile();/*保存数据后再退出*/
		free(headLink);
		break;
	default:
		break;
	}
	DesplayMenu();/*递归调用*/
}

/************************************
函数功能:建立链表表头
************************************/
void CreateHeadLink(void)
{
	STUDENT *p;
	p=(STUDENT*)malloc(sizeof(STUDENT));
	headLink=p;
	p->next=NULL;
}

/************************************
函数功能:申请一个新结点,并将其初始化
************************************/

STUDENT *MallocNode(void)
{
	STUDENT *p;
	int i;
	p=(STUDENT*)malloc(sizeof(STUDENT));
	if(p==NULL)
		return NULL;
	for(i=0;i<10;i++)
		p->studentNumber[i]='\0';
	for(i=0;i<20;i++)
		p->studentName[i]='\0';
	for(i=0;i<20;i++)
		p->className[i]='\0';
	for(i=0;i<20;i++)
		p->yearName[i]='\0';
	p->mark1=0.0;
	p->mark2=0.0;
	p->mark3=0.0;
	p->next=NULL;
	return p;
}

/************************************
函数功能:取得用户输入的学生信息
************************************/

void GetInformation(STUDENT *t)
{
	printf("请输入学生学号:");
	scanf("%s",t->studentNumber);
	printf("请输入学生姓名:");
	scanf("%s",t->studentName);
	printf("请输入该生所在班级:");
	scanf("%s",t->className);
	printf("请输入学期:");
	scanf("%s",t->yearName);
	printf("请输入第1门课成绩:");
	scanf("%f",&(t->mark1));       
	printf("请输入第2门课成绩:");
	scanf("%f",&(t->mark2));
	printf("请输入第3门课成绩:");
	scanf("%f",&(t->mark3));
}

/************************************
函数功能:在链表的结尾处增加一个结点
************************************/

void InsertOneNode(STUDENT *t)
{
	STUDENT *p;
	p=headLink;
	while(p->next)
	{
		p=p->next;
	}
	p->next=t;
}

/************************************
函数功能:根据用户输入的学生姓名显示该学生的信息
************************************/

void DesplayInfoBystudentName(void)
{
	STUDENT *p;
	char studentName[20];
	char flag=0;
	p=headLink->next;
	printf("请输入学生姓名:");
	scanf("%s",studentName);
	while(p)
	{
		if(strcmp(p->studentName,studentName)==0)
		{
			printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
			DesplayOneNode(p);
			flag=1;
			break;
		}
		p=p->next;
	}
	if(!flag)
		printf("对不起,(╯^╰〉不存在姓名为 %s 的学生\n",studentName);
}


/************************************
函数功能:输出一个结点的信息
************************************/

void DesplayOneNode(STUDENT *t)
{
	printf("%s\t",t->studentNumber);
	printf("%s\t",t->studentName);
	printf("%s\t",t->className);
	printf("%s\t",t->yearName);
	printf("%.2f\t",t->mark1);
	printf("%.2f\t",t->mark2);
	printf("%.2f\t",t->mark3);
	printf("%.2f\t",t->mark1+t->mark2+t->mark3);
	printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);
}

/************************************
函数功能:根据用户输入的学号删除该学生
************************************/

void DeleteNodeBystudentNumber(void)
{
	char studentNumber[10];
	STUDENT *p,*q;
	char flag=0;
	printf("请输入要删除的学生学号:");
	scanf("%s",studentNumber);
	p=headLink;
	q=headLink->next;
	while(q)
	{
		if(strcmp(q->studentNumber,studentNumber)==0)
		{
			p->next=q->next;
			free(q);
			flag=1;
			break;
		}
		p=p->next;
		q=q->next;
	}
	if(!flag)
	{
		printf("对不起,(°ο°)不存在该学号的学生\n");
		return;
	}
	printf("成功删除\n");
}

/************************************
函数功能:显示所有学生的信息
************************************/

void OutputInformation(void)
{
	STUDENT *p;
	p=headLink->next;
	if(p==NULL)
	{
		printf("现在没有学生信息,请先输入学生信息\n\n");
		return;
	}
	printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
	while(p)
	{
		DesplayOneNode(p);
		p=p->next;
	}
}

/************************************
函数功能:根据输入的班级修改成绩
************************************/

void ChangeMarkByName(void)
{
	STUDENT *p;
	int a;
	char studentName[20];
	char flag=0;
	float mark1,mark2,mark3;
	p=headLink->next;
	printf("请输入学生班级:");
	scanf("%d",&a);
	printf("请输入学生姓名:");
	scanf("%s",studentName);
	while(p)
	{
		if(strcmp(p->studentName,studentName)==0)
		{
			printf("请输入新的第1门成绩:");
			scanf("%f",&mark1);
			printf("请输入新的第2门成绩:");
			scanf("%f",&mark2);
			printf("请输入新的第3门成绩:");
			scanf("%f",&mark3);
			p->mark1=mark1;
			p->mark2=mark2;
			p->mark3=mark3;
			flag=1;
			printf("修改成功\n");
			break;
		}
		p=p->next;
	}
	if(!flag)
		printf("对不起,不存在班级为 %s 的学生\n",studentName);
}


/************************************
函数功能:根据输入的学期修改成绩
************************************/

void ChangeMarkByNumber(void)
{
	STUDENT *p;
	int b;
	char studentNumber[20];
	char flag=0;
	float mark1,mark2,mark3;
	p=headLink->next;
	printf("请输入学生所在学期:");
	scanf("%d",&b);
	printf("请输入学生学号:");
	scanf("%s",studentNumber);
	while(p)
	{
		if(strcmp(p->studentNumber,studentNumber)==0)
		{
			printf("请输入新的第1门(语文)成绩:");
			scanf("%f",&mark1);
			printf("请输入新的第2门(数学)成绩:");
			scanf("%f",&mark2);
			printf("请输入新的第3门(英语)成绩:");
			scanf("%f",&mark3);
			p->mark1=mark1;
			p->mark2=mark2;
			p->mark3=mark3;
			flag=1;
			printf("修改成功\n");
			break;
		}
		p=p->next;
	}
	if(!flag)
		printf("对不起,不存在学期为 %s 的学生\n",studentNumber);
}


/************************************
函数功能:保存链表数据到文件中
************************************/

void SaveLinkToFile(void)
{
	STUDENT *p;
	FILE *fp;
	p=headLink->next;
	if(p==NULL)
	{
		printf("现在没有学生信息,请先输入学生信息哦\n\n");
		return;
	}
	fp=fopen("student.txt","w+");
	if(!fp)
	{
		printf("文件不存在\n");
		return;
	}
	while(p)
	{
		fprintf(fp,"%s %s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->yearName,p->mark1,p->mark2,p->mark3);
		p=p->next;
	}
	fclose(fp);
	printf("学生信息保存成功!\n");
}



/************************************
函数功能:不及格学生成绩
************************************/

void DesplayMarkSegment(void)
{
	STUDENT *p;
	int count=0;
	p=headLink->next;
	printf("60分以下(不及格)的学生成绩如下:\n");
	printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
	while(p)
	{
		if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10)))) /*只要有一科不及格就认为该生不及格*/
		{
			count++;
			DesplayOneNode(p);
		}
		p=p->next;
	}
	printf("不及格的学生一共有%d人\n",count);
}

/************************************
函数功能:按平均成绩排序
************************************/

void CompositorByTotalMark(void)
{
	STUDENT exchange,*r,*p,*q;
	r=headLink->next;
	if(r==NULL)
	{
		printf("现在还没学生信息,请先输入学生信息\n");
		return;
	}
	while(r)/*实现排序*/
	{
		p=r;
		q=r->next;
		while(q)
		{
			if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
			{
				strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
				strcpy(exchange.studentName,q->studentName);
				strcpy(exchange.className,q->className);
				exchange.mark1=q->mark1;
				exchange.mark2=q->mark2;
				exchange.mark3=q->mark3;
				
				strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
				strcpy(q->studentName,p->studentName);
				strcpy(q->className,p->className);
				q->mark1=p->mark1;
				q->mark2=p->mark3;
				q->mark3=p->mark3;
				strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
				strcpy(p->studentName,exchange.studentName);
				strcpy(p->className,exchange.className);
				p->mark1=exchange.mark1;
				p->mark2=exchange.mark2;
				p->mark3=exchange.mark3;
			}
			q=q->next;
		}
		r=r->next;
	}
	
	
	OutputInformation();
}
读文件操作文件截图:
数据结构课程设计-学生成绩管理系统_第1张图片
运行结果;
1.用户界面登陆
数据结构课程设计-学生成绩管理系统_第2张图片

数据结构课程设计-学生成绩管理系统_第3张图片
2.管理界面
数据结构课程设计-学生成绩管理系统_第4张图片
3.按照班级查找成绩单
数据结构课程设计-学生成绩管理系统_第5张图片
4.增添保存学生功能:

数据结构课程设计-学生成绩管理系统_第6张图片
数据结构课程设计-学生成绩管理系统_第7张图片
5.显示不及格学生成绩
数据结构课程设计-学生成绩管理系统_第8张图片
6.显示按照平均成绩从高到低排序
数据结构课程设计-学生成绩管理系统_第9张图片
设计心得:
三天的课程设计,通过对代码的调试,对整体框架系统的构思,让我受益匪浅,希望自己可以在这次课程设计中找到自己的不足,以后认真对待并且去克服它,多思考,多总结,这样学习才会达到事半功倍的效果。
                                                                                                                2015.12.27

你可能感兴趣的:(数据结构课程设计-学生成绩管理系统)