资讯专栏INFORMATION COLUMN

C语言课程设计——学生成绩管理系统(详细报告)

megatron / 2215人阅读

摘要:概要设计功能设计该学生成绩管理系统可以按功能进行模块划分,其模块图如图所示。

欢迎来到的博客。我是小魏,一名普通的在校大学生。希望大家多多关照,我们一起成长一起进步,也希望大家多多支持我鸭,喜欢我就给我一个关注吧!

题目:学生成绩管理系统
学生数据由学号、姓名、班级、三门课(数学、英语、计算机)的成绩和平均成绩构成。 实现功能包括:
(1)添加学生的记录
(2)查询学生(分别按学号和姓名)
(3)对学生数据排序(按总成绩的降序)
(4)删除学生记录
(5)修改学生记录
(6)班级成绩分析(各科平均成绩、最高分、最低分、及格率)
(7)输出学生信息表(全部学生成绩信息显示或按班级显示学生成绩信息)

1. 用户分析

1.1用户需求

(1)学生信息包括学号、姓名、班级和所学三门课程(数学、英语、计算机)的成绩 和平均成绩(每位学生的平均分和各科平均分)以及各科成绩的最低分和最高分、及格 率;
(2)学生信息管理系统以菜单方式工作;
(3)录入的学生信息用文件形式保存,并可以对其进行添加、查询、数据排序(按总 分)、修改、成绩分析、删除等基本操作;
(4)按学号查询学生信息,或按姓名查询;
(5)按学号修改学生信息并保存到文件中;
(6)输出学生信息表(全部学生成绩信息显示或按班级显示学生成绩信息);
(7)用户使用过程中能够要有容错处理。

1.2用户目的

设计一个学生成绩管理系统,使之能提供以下功能:
(1)添加学生信息;
(2)查询学生信息(分别按学号和姓名);
(3)对学生的成绩进行排序(按总分降序);
(4)修改学生信息;
(5)删除学生信息;
(6)按本专业学生成绩分析和按班级成绩分析(各科平均成绩、最高分、最低分、及 格率);
(7)输出学生信息表;
(8)学生信息保存到文件中。

2.概要设计

2.1功能设计

该学生成绩管理系统可以按功能进行模块划分,其模块图如图1所示。

2.2数据结构设计

学号,15个字符;
姓名,10个字符;
班级,正整数;
各科分数,无小数点;
总分,无小数点;
各科平均分,小数点后两位;
各科及格率,小数点后两位;
各科最低分,无小数点;
各科最高分,无小数点;
在处理过程中各项可以作为一个学生的不同属性来进行处理;整体作为一张二维表进行处理,因此,采用结构数组。

2.3功能运行流程图

系统的执行应从功能菜单的选择开始,依据用户的选择来进行后续的处理,直到用户选择保存数据并退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如图2所示。

3.系统功能设计

3.1菜单选择模块的流程图

菜单选择功能中,通过输入不同的数字(1-6)来进行菜单选择,实现不同的程序结果,直到用户输入数字6时,就直接退出系统。菜单选择模块的流程图如图3所示。

3.2添加模块的流程图

添加学生信息模块中,实现添加学生的班级、姓名、学号和三门成绩(数学、英语、计算机)的输入,直到用户输入x为0时,则结束当前输入,并返回上级主菜单。添加模块的流程图如图4所示。

3.3排序输出模块的流程图

输出模块中,先判断链表大小list->size是否为0,若不为空,进入菜单选择输入不同的数字(1-3),若用户输入1,则实现本专业学生成绩的输出,若输入2,则按班级输出学生信息,直到用户输入数字3时,结束当前信息的输出,并返回上级主菜单。输出模块的流程图如图5所示。

3.4执行模块的流程图

3.4.1信息查询模块的流程图

通过菜单选择,输入不同的数字(1-3)实现不同的方式进行查询,若输入数字1,按学号进行查询学生信息,输入数字2,按姓名查询学生信息,输入数字3,结束信息查询功能,返回上级主菜单。查询模块的流程图如图6所示。

3.4.2信息修改模块的流程图

先进行判断链表是否为空,若不为空,就能进行输入学生的学号;然后,再进行判断是否有用户输入的学号,若没有,则返回学号输入,再进行重新输入学号。若在链表中的数据
存在用户输入的学号,则输出该学生的信息,之后进行菜单选择,可输入不同的数字(1-5),用户可选择想修改的的数据,直到该用户输入数字5时,返回上级主菜单。信息修改模块流程图如图7所示。

3.4.3信息删除模块的流程图

进入该程序运行中,需判断链表大小list->size是否为0,若为0,则结束信息删除操作;若不为0,将进入学号输入操作;然后判断链表数据中是否存在用户输入的学号id,若不存在,进入退出选择操作,用户可输入0或其他数字,若输入0,则返回上级菜单;若输入其他数字,则该学生的信息将在链表中清除并释放该空间。若该用户继续进行删除操作,可输入其他数字键;若输入0,直接退出该程序并返回上级主菜单。信息删除模块的流程图如图8所示。

3.4.4信息保存模块的流程图

在保存数据之前,首先需打开文件,然后判断文件是否为空,若为空就会提示该文件打开失败,直接结束整个程序运行;若文件不为空,进行判断链表的头节点是否为空,若头节点为空,则直接关闭该文件并结束程序,若头节点不为空,将链表数据保存到文件中,直到尾节点为空,就会关闭该文件并退出系统。信息保存模块的流程图如图9所示。

3.5数据结构的C语言表示

学生信息:

struct Student{	  	int class_num; 		//班级		char id[15];			//学号		char name[10];		//姓名		float score[3];			//各科分数		float sum; 			//总成绩float course_av[3];		//各科平均分float course_pass[3];	//各科及格率float course_max[3];	//各科最低分float course_min[3];	//各科最高分};

4.系统功能代码设计

4.1代码编写要求

⑴锯齿型程序书写格式
⑵变量说明
⑶函数功能、入口及出口参数说明
⑷关键处有足够的注释

4.2自定义头文件的内容设计

代码1:

/* 文件list.h */#ifndef  _LIST_H_			//防止重复编译,_LIST_H_为符号常量#define  _LIST_H_struct Student{				int class_num; 				char id[15];					char name[10];				float score[3];					float sum; 			float course_av[3];		float course_pass[3];	float course_max[3];	float course_min[3];	};struct Node{					struct Student student;	struct Node *next;};struct List{					struct Node *head;						//头节点设计	int size;};struct List* createList();						//创建链表void destoryList(struct List *list);				//销毁链表struct Node* createNode(struct Student student);	//创建节点 struct Node* getLastNode(struct List *list);		//获取链表最后一个节点struct Node* getBeforeNode(struct List *list,struct Student student);	//获取上一个节点void addList(struct List *list, struct Node *node);		//将节点添加到链表中 #endif

代码2:

/* 文件fun.h */#ifndef  _FUN_H_						//防止重复编译,_FUN_H_为符号常量#define  _FUN_H_void Menu(); 	//菜单栏FILE* openFile(char *filename,char *type);		//打开文件void fileToList(struct List *list,char *filename);	//文件数据添加到链表中  void listToFile(struct List *list,char *filename);	//将链表数据存储到文件中void input(struct List *list);					//添加学生信息void sort(struct List *list);					//按总成绩排序void output(struct List *list);					//输出学生信息void find(struct List *list);					//查找学生信息void detail(struct Node *temp);				//修改具体细节 void change(struct List *list);					//修改学生信息 void Delete(struct List *list);					//删除void quit();								//退出画面#endif	

4.3设计链表的代码清单

//创建链表 struct List* createList(){	struct List *list;	list=(struct List*)malloc(sizeof(struct List));	list->head=NULL;	list->size=0;	return list;}//销毁链表 void destoryList(struct List *list){	struct Node *temp=list->head,*del=NULL;	while(temp)	{		del=temp;		temp=temp->next;		free(del);//释放节点空间 		list->size--; 	}	free(list);//释放链表空间 }//创建节点 struct Node* createNode(struct Student student){	struct Node *node=NULL;	node=(struct Node*)malloc(sizeof(struct Node));	node->student=student;	node->next=NULL;	return node;}//获取链表最后一个节点 struct Node* getLastNode(struct List *list){	struct Node *temp=list->head,*last=NULL;	while(temp)	{		last=temp;		temp=temp->next;	}	return last;}//获取当前节点的上一个节点 struct Node* getBeforeNode(struct List *list,struct Student student){	struct Node *temp=list->head,*prevNode=NULL;	while(temp)	{		if(strcmp(temp->student.id,student.id)==0)		{			break;		}		prevNode=temp;		temp=temp->next;	}	return prevNode;}//将节点添加到链表中 void addList(struct List *list, struct Node *node){	struct Node *last; 	if(list->head==NULL) 	{ 		list->head=node; 	} 	else 	{	 	last=getLastNode(list);		last->next=node;	 	} 	list->size++;}

4.4菜单选择模块的代码清单

int main(){	int num=0;	FILE*file=NULL;	struct List *list=NULL;	list=createList();	//创建链表 	fileToList(list,"studentFile.txt");//把数据添加到链表中 	SetConsoleTitle("学生成绩管理系统");	void Menu()	{		printf("******学生成绩管理系统****/n"); 		printf("******1.添加学生信息******/n"); 		printf("******2.输出学生信息******/n");		printf("******3.查询学生信息******/n");		printf("******4.修改学生信息******/n");		printf("******5.删除学生信息******/n");		printf("******6.保存后退出********/n");		printf("请选择:");	}	while(1)	{		system("cls");	//清屏 		Menu();			//菜单栏 		scanf("%d",&num);		switch(num){			case 1:				system("cls");				input(list); //添加 			 	printf("请输入任意数字键/n返回上级菜单:");			 	scanf("%d",&num);				break;			case 2:				system("cls");				output(list); //输出				break; 			case 3:				system("cls");				find(list);	//查询				break; 			case 4:				system("cls");				change(list); //修改 				break;			case 5:				system("cls");				Delete(list); //删除 				break;			case 6: 				system("cls");				listToFile(list,"studentFile.txt");//数据保存到文件中 				destoryList(list); // 销毁链表				quit();		 //退出画面 				exit(0);			default:				printf("输入有误,请重新选择!/n");				printf("请输入任意数字键/n返回上级菜单:");			 	scanf("%d",&num);				break;		} 	}	return 0;}

4.5添加模块的代码清单

void input(struct List *list){	struct Student student; 	struct Node *node=NULL;    //建立新节点	struct Node *temp;			  //建立新节点	int x,i,flag;	while(1)	{		flag=1;		printf("-->请输入该学生信息的班级、学号、姓名<--/n-->");	 	scanf("%d %s %s",&student.class_num,student.id,student.name);		temp=list->head;			//当前链表的下一个节点		while(temp)				{			if(strcmp(temp->student.id,student.id)==0)		//限定学号唯一				{				printf("您输入的学号已存在!/n");				flag=0;			}			temp=temp->next;	//链表的下一个节点		}		if(flag)		{			printf("-->请输入该学生的每门成绩<--/n数学:");			scanf("%f",&student.score[0]);			printf("英语:");			scanf("%f",&student.score[1]);			printf("计算机:");			scanf("%f",&student.score[2]);			student.sum=0;			for(i=0;i<3;i++)			{				student.sum+=student.score[i];			}	 		node=createNode(student);	//创建节点 	 		addList(list,node);			//添加到链表 		}	 	printf("退出请按数字0,其他数字键继续添加:");	 	scanf("%d",&x);	 	if(x==0)break; 	} }

4.6排序输出模块的代码清单

//按总成绩排序 void sort(struct List *list){	int i,j; 	struct Student s;		struct Node *temp=NULL,*temp1=NULL,*temp2=NULL;  //建立新节点	for(i=0;i<list->size-1;i++)	{		temp=list->head;					             //当前链表的下一个节点		for(j=0;j<list->size-i-1;j++)		{			temp1=temp;			temp2=temp->next;			//新建链表的下一个节点			if(temp1->student.sum<temp2->student.sum)  			{				s=temp1->student;				temp1->student=temp2->student;				temp2->student=s;			}			temp=temp->next;			//当前链表的下一个节点		}	}}//输出学生信息 void output(struct List *list){	int cnt=0,num=0,class_num=0,i;		float av_math,av_eng,av_se;		        //数学、英语、计算机平均分	float pass[3],min[3],max[3];				//及格率、最低分、最高分	struct Node *temp=list->head;			//把新节点作为头结点	if(list->size==0)						//若链表空间大小           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122005.html

相关文章

  • 2018 PHP面试真题(包括详细解析)

    摘要:以下题目和解析分别来源于我的新书程序员面试笔试宝典程序员面试笔试真题解析。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。真题获得实例化对象所属类名字的函数是。 以下题目和解析分别来源于我的新书《PHP程序员面试笔试宝典》、《PHP程序员面试笔试真题解析》。 1、PHP常考基础 1、PHP与ASP、JSP有什么区别?ASP全名Active Server Page...

    pubdreamcc 评论0 收藏0
  • python初学——面向对象编程作业:学校选课系统

    摘要:如上海北京等管理员自己创建其他地方的学校管理员创建的课程。包含名字性别年龄等学员查询可上课程学员选课,选择学校课程,并付款。课程价格,周期课程价格,周期课程价格,周期创建讲师属于北京校区,属于上海校区。 作业需求 创建北京、上海 2 所学校 创建linux , python , go 3个课程,linuxpy在北京开, go 在上海开 课程包含,周期,价格,通过学校创建课程 通过学校...

    kbyyd24 评论0 收藏0
  • SCORM标准应用编程接口(API)和数据模型(Data Model)学习及总结

    摘要:需要对每个用户的每个内容对象维护一个数据结构。并没有直接和相连,所以是将数据由暂存的内存中取出。采用实现的可用进行数据提交。记录的完成情况,包括未尝试未学习未完成,已完成。 简介 SCORM定义了一个网络化学习的内容聚合模型(Content Aggregaion Model)和学习对象的实时运行环境(Run-time Environment)。简单说,它是为了满足对网络化学习内容的高水...

    ThinkSNS 评论0 收藏0
  • 大学学习路线规划建议贴

    摘要:不过,苹果实验室作为计算机学院的学习类组织,撰写此贴的内容集中于本科期间学习路线的宏观规划建议。其中主要问题大概是初入大学的迷茫与美好大学愿景之间的矛盾自主学习能力的欠缺与远大志向的矛盾。 ...

    niceforbear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<