C语言课程设计|C语言课程设计——学生成绩管理系统
欢迎来到的博客。我是小魏,一名普通的在校大学生。希望大家多多关照,我们一起成长一起进步,也希望大家多多支持我鸭,喜欢我就给我一个关注吧!
题目:学生成绩管理系统
学生数据由学号、姓名、班级、三门课(数学、英语、计算机)的成绩和平均成绩构成。 实现功能包括:
(1)添加学生的记录
(2)查询学生(分别按学号和姓名)
(3)对学生数据排序(按总成绩的降序)
(4)删除学生记录
(5)修改学生记录
(6)班级成绩分析(各科平均成绩、最高分、最低分、及格率)
(7)输出学生信息表(全部学生成绩信息显示或按班级显示学生成绩信息)
目录
-
- 1. 用户分析
-
- 1.1用户需求
- 1.2用户目的
- 2.概要设计
-
- 2.1功能设计
- 2.2数据结构设计
- 2.3功能运行流程图
- 3.系统功能设计
-
- 3.1菜单选择模块的流程图
- 3.2添加模块的流程图
- 3.3排序输出模块的流程图
- 3.4执行模块的流程图
-
- 3.4.1信息查询模块的流程图
- 3.4.2信息修改模块的流程图
- 3.4.3信息删除模块的流程图
- 3.4.4信息保存模块的流程图
- 3.5数据结构的C语言表示
- 4.系统功能代码设计
-
- 4.1代码编写要求
- 4.3菜单选择模块的代码清单
- 4.4添加模块的代码清单
- 4.5排序输出模块的代码清单
- 4.6执行模块的代码清单
-
- 4.6.1信息查询模块
- 4.6.2 信息修改模块
- 4.6.3信息删除模块
- 4.6.4信息保存模块
- 4.6.5退出画面程序清单
- 5.系统调试
-
- 5.1运行结果
-
- 5.1.1菜单选择程序运行截图
- 5.1.2信息添加程序运行截图
- 5.1.3信息输出程序运行截图
- 5.1.4信息查询运行截图
- 5.1.5信息修改程序运行截图
- 5.1.6信息删除程序运行截图
- 5.1.7信息保存到文件截图
- 5.1.8系统退出画面截图
- 5.2缺陷现象
- 5.3缺陷原因
- 5.4缺陷修改
- 5.5修改验证
- 6.报告总结
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_
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++;
}
int main()
{ int num=0;
FILE*file=NULL;
struct List *list=NULL;
list=createList();
//创建链表
fileToList(list,"studentFile.txt");
//把数据添加到链表中
SetConsoleTitle("学生成绩管理系统");
//控制台显示标题
while(1)
{system("cls");
//清屏
printf("******学生信息管理系统****\n");
printf("******1.添加学生信息******\n");
printf("******2.输出学生信息******\n");
printf("******3.查询学生信息******\n");
printf("******4.修改学生信息******\n");
printf("******5.删除学生信息******\n");
printf("******6.保存后退出********\n");
printf("请选择:");
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.4添加模块的代码清单
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.5排序输出模块的代码清单
//按总成绩排序
void sort(struct List *list)
{ int i,j;
struct Student s;
struct Node *temp=NULL,*temp1=NULL,*temp2=NULL;
//建立新节点
for(i=0;
isize-1;
i++)
{temp=list->head;
//当前链表的下一个节点
for(j=0;
jsize-i-1;
j++)
{temp1=temp;
temp2=temp->next;
//新建链表的下一个节点
if(temp1->student.sumstudent.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)//若链表空间大小为0则返回上级
{printf("抱歉,暂无学生信息!\n");
return;
}
sort(list);
//排序
system("cls");
//清屏
while(1)
{temp=list->head;
//每循环一次该节点重新作为头节点
system("cls");
printf("*******1.本专业学生成绩分析******\n");
printf("*******2.按班级显示成绩分析******\n");
printf("*******3.退出********************\n");
printf("请选择:");
scanf("%d",&num);
cnt=0;
system("cls");
av_math=av_eng=av_se=0;
//清零
pass[0]=pass[1]=pass[2]=0;
//清零
switch(num)
{case 1:
for(i=0;
i<35;
i++)
printf("*");
printf("本专业学生成绩分析");
for(i=0;
i<35;
i++)
printf("*");
printf("\n\n%s\t%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","序号","班级","学号","姓名","数学","英语","计算机","总成绩","平均分");
while(temp)
{cnt++;
printf(" %d\t %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",cnt,temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);
av_math+=temp->student.score[0];
av_eng+=temp->student.score[1];
av_se+=temp->student.score[2];
if(cnt==1)
{for(i=0;
i<3;
i++)
{max[i]=min[i]=temp->student.score[i];
}
}
for(i=0;
i<3;
i++)
{if(temp->student.score[i]>=60)
{pass[i]+=100;
}
if(temp->student.score[i]>max[i])
{max[i]=temp->student.score[i];
}
if(temp->student.score[i]student.score[i];
}
}
temp=temp->next;
//当前链表的下一个节点
}
printf("\n数学-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[0],min[0],av_math/cnt,pass[0]/cnt);
printf("英语-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[1],min[1],av_eng/cnt,pass[1]/cnt);
printf("计算机-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[2],min[2],av_se/cnt,pass[2]/cnt);
system("pause");
break;
case 2:
printf("请输入班级:");
scanf("%d",&class_num);
for(i=0;
i<37;
i++)
printf("*");
printf("%d班学生成绩表",class_num);
for(i=0;
i<37;
i++)
printf("*");
printf("\n\n%s\t%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","序号","班级","学号","姓名","数学","英语","计算机","总成绩","平均分");
while(temp)
{if(temp->student.class_num==class_num)
{cnt++;
printf(" %d\t %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",cnt,temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);
av_math+=temp->student.score[0];
av_eng+=temp->student.score[1];
av_se+=temp->student.score[2];
if(cnt==1)
{for(i=0;
i<3;
i++)
{max[i]=min[i]=temp->student.score[i];
}
}
for(i=0;
i<3;
i++)
{if(temp->student.score[i]>=60)
{pass[i]+=100;
}
if(temp->student.score[i]>max[i])
{max[i]=temp->student.score[i];
}
if(temp->student.score[i]student.score[i];
}
}
}
temp=temp->next;
//当前链表的下一个节点
}
if(cnt==0)
{printf("%d班级,暂无学生信息!\n",class_num);
break;
}
printf("\n数学-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[0],min[0],av_math/cnt,pass[0]/cnt);
printf("英语-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[1],min[1],av_eng/cnt,pass[1]/cnt);
printf("计算机-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[2],min[2],av_se/cnt,pass[2]/cnt);
system("pause");
break;
case 3:
return;
default:
printf("输入有误,请重新输入!\n");
system("pause");
break;
}
}
}
4.6执行模块的代码清单
4.6.1信息查询模块
void find(struct List *list)
{ int num,class_num;
char id[15],name[10];
//学号、姓名
struct Node *temp;
if(list->size==0)//若链表空间大小为0,则返回上级
{printf("抱歉,暂无学生信息!\n");
return;
}
while(1)
{system("cls");
//清屏
printf("*******1.按学号查询******\n");
printf("*******2.按姓名查询******\n");
printf("*******3.退出************\n");
printf("请选择:");
scanf("%d",&num);
system("cls");
temp=list->head;
//每循环一次该节点重新作为头节点
switch(num)
{case 1:
printf("请输入要查找学生信息的学号:");
scanf("%s",id);
while(temp)
{if(strcmp(temp->student.id,id)==0)break;
//查找学号
temp=temp->next;
//当前链表的下一个节点
}
if(temp)
{printf("查找到该学生信息为:\n");
printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","班级","学号","姓名","数学","英语","计算机","总成绩","平均分");
printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);
}
else
{printf("抱歉,不存在该学生信息!\n");
}
system("pause");
break;
case 2:
printf("请输入要查找学生信息的班级、姓名:");
scanf("%d %s",&class_num,name);
while(temp)
{if(temp->student.class_num==class_num&&strcmp(temp->student.name,name)==0)
{break;
}
temp=temp->next;
}
//输出该学生信息
if(temp)
{printf("查找到该学生信息为:\n");
printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","班级","学号","姓名","数学","英语","计算机","总成绩","平均分");
printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",temp->student.class_n um,temp->student.id,temp->student.name,
temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);
}
else
{printf("抱歉,不存在该学生信息!\n");
}
system("pause");
break;
case 3:
return;
default:
printf("输入有误,请重新输入!\n");
system("pause");
break;
}
}
}
4.6.2 信息修改模块
/*修改具体细节 */
void detail(struct Node *temp)
{ char id[15];
//学号
int num=0,x;
printf("\n******信息修改********");
printf("\n******1.班级修改******");
printf("\n******2.学号修改******");
printf("\n******3.姓名修改******");
printf("\n******4.成绩修改******");
printf("\n******5.退出*********\n");
while(1)
{printf("请选择:");
scanf("%d",&num);
switch(num)
{case 1:
printf("请您输入修改后的班级号为:");
scanf("%d",&temp->student.class_num);
break;
case 2:
printf("请您输入修改后的学号为:");
scanf("%s",temp->student.id);
break;
case 3:
printf("请您输入修改后的姓名为:");
scanf("%s",temp->student.name);
break;
case 4:
printf("请您修改该同学的成绩为:\n");
printf("数学--英语--计算机\n-->");
scanf("%f %f %f",&temp->student.score[0],&temp->student.score[1],&temp->student.score[2]);
temp->student.sum=temp->student.score[0]+temp->student.score[1]+temp->student.score[2];
//求每位同学的总分
system("pause");
break;
case 5:
return;
default:
printf("您输入有误,请重新输入!");
break;
}
printf("退出请按数字0,其他数字键继续修改:");
scanf("%d",&x);
if(x==0)break;
}
}
/*修改学生信息 */
void change(struct List *list)
{ char id[15],flag=1;
struct Student student;
struct Node *temp=list->head;
//把新节点作为头节点
if(list->size==0)//若链表空间大小为0,则返回上级
{printf("抱歉,暂无学生信息!\n");
return;
}
printf("请输入要修改学生信息的学号:");
scanf("%s",id);
while(temp)
{if(strcmp(temp->student.id,id)==0) //查找学号
{printf("当前该学生信息为:\n");
printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\n","班级","学号","姓名","数学","英语","计算机","总成绩");
printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum);
detail(temp);
printf("修改成功!\n");
flag=0;
break;
}
temp=temp->next;
//当前链表的下一个节点
}
if(flag)
{printf("抱歉,不存在该学生信息,无法修改!\n");
}
}
4.6.3信息删除模块
void Delete(struct List *list)
{ char id[15];
int flag,x;
struct Node *temp,*prevNode=NULL;
//建立新头结点prevNode
while(1)
{temp=list->head;
//每循环一次该节点重新作为头节点
if(list->size==0)//若链表空间大小为0,则结束循环
{printf("\n抱歉,暂无学生信息!\n");
break;
}
flag=1;
printf("请输入要删除学生信息的学号:");
scanf("%s",id);
while(temp)
{if(strcmp(temp->student.id,id)==0)
{printf("删除的该学生信息为:\n");
printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\n","班级","学号","姓名","数学","英语","计算机","总成绩");
printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum);
/*找到前一个节点,再与后一个节点连接 */
prevNode=getBeforeNode(list,temp->student);
if(prevNode==NULL)//删除的是头节点
{list->head=temp->next;
}
else
{prevNode->next=temp->next;
//删除的是普通节点
}
flag=0;
free(temp);
//释放temp所指的空间内存
temp=NULL;
//将该节点的指针域为空
list->size--;
//将该节点
printf("\n该学生信息删除成功!\n");
break;
}
temp=temp->next;
//当前链表的下一个节点
}
if(flag)
{printf("\n抱歉,不存在该学生信息,无法删除!\n\n");
}
printf("\n退出请按数字0,其他数字键继续删除操作:");
scanf("%d",&x);
if(x==0)break;
}
system("pause");
}
4.6.4信息保存模块
FILE* openFile(char *filename,char *type)//打开文件
{ FILE*file=fopen(filename,type);
if(file==NULL)
{printf("打开%s文件失败!\n",filename);
return NULL;
}
return file;
}
void fileToList(struct List *list,char *filename) //文件数据添加到链表中
{ int count=0;
struct Student student;
struct Node *node=NULL;
FILE*file=openFile(filename,"r");
//以写的方式打开文件
if(file==NULL)return;
while(1)
{
count=fscanf(file,"%d%s%s%f%f%f%f\n",&student.class_num,student.id,student.name,&student.score[0],&student.score[1],&student.score[2],&student.sum);
student.sum=student.score[0]+student.score[1]+student.score[2];
//求总分
if(count<=0)break;
node=createNode(student);
//创建节点
addList(list,node);
//添加到链表
}
fclose(file);
}
void listToFile(struct List *list,char *filename) //将链表数据存储到文件中
{ struct Node *temp=list->head;
FILE*file=openFile(filename,"w");
//以写的方式打开文件
if(file==NULL)return;
while(temp)
{ fprintf(file,"%d\t%s\t%s\t%.0f\t%.0f\t%.0f\t%.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum);
temp=temp->next;
}
fclose(file);
//关闭文件并释放文件缓冲区
}
4.6.5退出画面程序清单
void quit()
{ int i,j,k;
for(k=0;
k<5;
k++)
printf("\n");
for(i=0;
i<21;
i++)//控制21行
{for(k=0;
k 感谢您的使用! <—");
for(k=0;
k<29;
k++)
printf("*");
break;
}
printf("*");
}
printf("\n");
}
for(k=0;
k<5;
k++)
printf("\n");
}
5.系统调试 5.1运行结果
5.1.1菜单选择程序运行截图
文章图片
5.1.2信息添加程序运行截图
文章图片
5.1.3信息输出程序运行截图 菜单选择显示
文章图片
本专业学生成绩输出结果
文章图片
按班级输出学生成绩显示
文章图片
文章图片
5.1.4信息查询运行截图 菜单选择显示
文章图片
按学号查询学生信息显示
文章图片
按姓名查询学生信息显示
文章图片
5.1.5信息修改程序运行截图
文章图片
修改学生信息后查询显示
文章图片
5.1.6信息删除程序运行截图
文章图片
删除该学生信息后查询显示
文章图片
5.1.7信息保存到文件截图
文章图片
5.1.8系统退出画面截图
文章图片
5.2缺陷现象
添加程序运行结果
文章图片
5.3缺陷原因
在添加程序中输入文件中已存在的学号时,没有进行判断学号是否唯一,使得输入文件已存在的学号仍能继续后续操作,这样就不符合实际。
5.4缺陷修改
修改添加程序部分代码如下:
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;
}
}
5.5修改验证
添加程序代码修改后运行结果显示如下:
文章图片
6.报告总结 在我看来,课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,当今计算机的应用在生活中可以说得是无处不在。
“锲而不舍,金石可镂”。很多题目需要靠坚持才能有结果。一次次编写的程序无法运行,一次次的改正无法获得”编译成功“的认可。此时倘若将其放掉,那这个题目可能就永远被埋掉了,那些错误之处也就再无机会得到修正,那个知识点也可能从此漏了。因此,用实际行动去解决每一个问题,才能发现问题。
C语言是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的地位。要学好这种语言,仅仅学习课本上的知识是不够的,还要经常自己动手,有较强的实践能力。只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在本学期的日子里,可以学到很多实用的东西,同时不仅可以巩固以前所学过的知识,而且学到很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,单纯理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
最后,感谢曹老师的辛勤指导,在您的身上我学到很多实用的知识。同时,在理论课和实训授课过程中,同学之间的相互探讨,老师的循循善诱,最终让我们达到了举一反三的效果,在学知识的同时,也增加了同学老师之间的感情。
今后,我期待自己能变得坚强和勇敢,让学习更上一层楼;我相信,只要有信心,人永远不会挫败!
【C语言课程设计|C语言课程设计——学生成绩管理系统】博主后记:
希望看到此篇博文的网友,如果发现有什么不对的地方,欢迎在下方留言指正!博主一定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个赞。
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 爱琐搭配(喜欢复古、冷淡,像这种双环设计的气质耳环)
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 别墅庭院设计,不同的别墅庭院设计也给人视觉上完全不一样的!
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场