数据结构课程设计学生成绩管理系统.docx
- 文档编号:23598303
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:21
- 大小:94.08KB
数据结构课程设计学生成绩管理系统.docx
《数据结构课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计学生成绩管理系统
沈阳航空航天大学
数据结构课程设计报告
选题名称:
学生成绩管理系统
系(院):
北方软件学院
专业:
计算机科学与技术
班级:
12330104
姓名:
张双全学号:
2011023301183
指导教师:
刘奇猛
学年学期:
2011~2012学年第2学期
2012年07月06日
1.总体设计
(1)程序设计组成框图
(2)模块功能说明
1输出功能:
完成全部学生记录的显示。
2查询功能:
输入姓名可以查询学生的详细信息。
3增加功能:
增加新学生的信息。
4删除功能:
删除学生信息。
5修改功能:
修改学生的错误信息。
6保存功能:
保存已输入信息。
7读取功能:
读取已输入信息。
8显示功能:
按要求显示学生记录。
9排序功能:
按要求完成对学生信息的排序。
10退出系统。
(3)程序流程图
(4)主要函数之间相互调用如下:
2.源程序代码
#include
#include
#include
#include
typedefstructSTUDENT
{
charstudentNumber[10];/*学生学号*/
charstudentName[20];/*学生姓名*/
charclassName[20];/*班级名称*/
charyearName[20];/*学期名称*/
floatmark1;/*第1门成绩*/
floatmark2;/*第2门成绩*/
floatmark3;/*第3门成绩*/
structSTUDENT*next;
}STUDENT;
STUDENT*headLink;/*链表表头指针*/
/*以下是函数声明*/
voidReadInfoFormFile(void);
voidDesplayMenu(void);
voidCreateHeadLink(void);
STUDENT*MallocNode(void);
voidGetInformation(STUDENT*t);
voidOutputInformation(void);
voidDesplayInfoBystudentName(void);
voidDesplayOneNode(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidChangeMarkByName(void);
voidChangeMarkByNumber(void);
voidSaveLinkToFile(void);
voidDesplayMarkSegment(void);
voidCompositorByTotalMark(void);
intchoose;/*用于接受用户的选择*/
/*主函数*/
voidmain()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/************************************
函数功能:
从文件中读学生信息到链表中
************************************/
voidReadInfoFormFile(void)
{
FILE*fp;
STUDENT*p;
fp=fopen("student.txt","r");
if(!
fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/************************************
函数功能:
显示菜单,根据用户的输入
完成相应的功能
************************************/
voidDesplayMenu(void)
{
STUDENT*p;
printf("-------请选择相应功能------------\n\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\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case1:
OutputInformation();/*显示所有学生的信息*/
break;
case2:
DesplayInfoBystudentName();
break;
case3:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case4:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case5:
ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
break;
case6:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
break;
case7:
SaveLinkToFile();/*保存数据*/
break;
case8:
DesplayMarkSegment();/*显示不及格的学生成绩*/
break;
case9:
CompositorByTotalMark();/*按平均成绩排序*/
break;
case10:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
break;
default:
break;
}
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:
建立链表表头
************************************/
voidCreateHeadLink(void)
{
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/************************************
函数功能:
申请一个新结点,并将其初始化
************************************/
STUDENT*MallocNode(void)
{
STUDENT*p;
inti;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
returnNULL;
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';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->next=NULL;
returnp;
}
/************************************
函数功能:
取得用户输入的学生信息
************************************/
voidGetInformation(STUDENT*t)
{
printf("请输入学生学号:
\n");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:
\n");
scanf("%s",t->studentName);
printf("请输入该生所在班级:
\n");
scanf("%s",t->className);
printf("请输入第1门成绩:
\n");
scanf("%f",&(t->mark1));
printf("请输入第2门成绩:
\n");
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:
\n");
scanf("%f",&(t->mark3));
}
/************************************
函数功能:
在链表的结尾处增加一个结点
************************************/
voidInsertOneNode(STUDENT*t)
{
STUDENT*p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/************************************
函数功能:
根据用户输入的学生姓名显示该学生的信息
************************************/
voidDesplayInfoBystudentName(void)
{
STUDENT*p;
charstudentName[20];
charflag=0;
p=headLink->next;
printf("请输入学生姓名:
\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在姓名为%s的学生\n",studentName);
}
/************************************
函数功能:
输出一个结点的信息
************************************/
voidDesplayOneNode(STUDENT*t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->className);
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);
}
/************************************
函数功能:
根据用户输入的学号删除该学生
************************************/
voidDeleteNodeBystudentNumber(void)
{
charstudentNumber[10];
STUDENT*p,*q;
charflag=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");
}
/************************************
函数功能:
显示所有学生的信息
************************************/
voidOutputInformation(void)
{
STUDENT*p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/************************************
函数功能:
根据输入的班级修改成绩
************************************/
voidChangeMarkByName(void)
{
STUDENT*p;
inta;
charstudentName[20];
charflag=0;
floatmark1,mark2,mark3;
p=headLink->next;
printf("请输入学生班级:
\n");
scanf("%d",&a);
printf("请输入学生姓名:
\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:
\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:
\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:
\n");
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);
}
/************************************
函数功能:
根据输入的学期修改成绩
************************************/
voidChangeMarkByNumber(void)
{
STUDENT*p;
intb;
charstudentNumber[20];
charflag=0;
floatmark1,mark2,mark3;
p=headLink->next;
printf("请输入学生所在学期:
\n");
scanf("%d",&b);
printf("请输入学生学号:
\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门成绩:
\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:
\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:
\n");
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);
}
/************************************
函数功能:
保存链表数据到文件中
************************************/
voidSaveLinkToFile(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%f%f%f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
p=p->next;
}
fclose(fp);
}
/************************************
函数功能:
不及格学生成绩
************************************/
voidDesplayMarkSegment(void)
{
STUDENT*p;
intcount=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:
\n");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\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);
}
/************************************
函数功能:
按平均成绩排序
************************************/
voidCompositorByTotalMark(void)
{
STUDENTexchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*两层while循环实现排序*/
{
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();
}
总结
首先经过一周的编程实习,并在后一段的报告总结,我对数据结构这门科有新的认识,本人实在是获益不浅!
要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。
这次设计,让我重新掌握了数据结构,而且还得到了用数据结构解决实际问题的宝贵经验。
其次,通过此次编程我也发现了自己在学习中的错误和不足,复习了以前学过的知识。
同时也学到了一些没学过的知识,让我从中收益非浅,也为期末考试准备了一下!
更重要的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 学生 成绩管理系统