c语言课程设计报告书学生成绩管理.docx
《c语言课程设计报告书学生成绩管理.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告书学生成绩管理.docx(17页珍藏版)》请在冰豆网上搜索。
c语言课程设计报告书学生成绩管理
C语言程序设计报告
课题:
学生成绩管理
时间:
一、需求分析
任务要求:
自学C语言中有关链表及外部文件的内容,设计出学生成绩管理。
具体要求如下:
1.主要功能:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
系统功能需求分析:
1、定义一个结构体类型,成员包括学期、班级、各科成绩、建立链表,定义该结构体类型的指针,用于指向各结点;
2、分别建立具有添输入、修改、查询、总分及平均分、排序等功能的子函数,完成相应功能,对程序实现模块化。
二、概要设计
系统总体设计框架:
对程序进行模块化,建立输入、修改、查询、查找和显示功能的子函数,各子函数中运用链表存储数据。
系统功能模块图:
三、详细设计
主要功能模块的算法设计思路如下:
1、输入信息函数
(1)定义指向结构体变量的指针;
(2)移动指针,找到插入结点;
(3)在要插入的结点输入信息;
(4)返回头指针。
2、修改信息
(1)定义指向结构体变量的指针;
(2)用指针检验链表中是否有记录,若没记录,出现报错,然后要求重新输入;
(3)根据要修改的编号查找对应结点;
(4)修改信息;
(5)修改成功。
3、排序函数
(1)定义所要排序的班级和链表的头指针为形参;
(2)调用排序函数,把班级和链表的头指针赋给形参;
(3)在子函数中进行排序;
(4)输出排序结果。
4、显示学生成绩信息(voidDisp(Linkl))
(1)选择想要查询的项目(学生各科成绩、不及格科目、班级成员);
(2)用指针检验是否有记录;
(3)若无记录,输出提示信息,返回主函数;
若有记录,移动指针,依次输出记录;
5、查询班级成绩信息(voidFind(Linkl))
(1)选择所要查询的班级;
(2)输入班级:
(3)在链表中寻找相应结点;
(4)输出结点信息。
以上各个函数的流程图如下:
主函数
定义程序所需变量
调用CREAT函数创建一个信息链表并返回指针
继续进行操作
1、修改信息
2、统计成绩并排序
3、查找信息
4、输出成绩
输入所需修改学生的姓名
输入班级
查询
分数
查询科目
查询班级
输入班级序号
调用add并赋值给P->sum
查找班内成员
调用average函数
输入姓名并查找学生
输出不及格学生的姓名及成绩
输入班级序号并输出班级成员的名字
逐个输出他们的各科成绩
并赋值给P->ave
输出排序前的学生成绩
调用sort进行排序
输出排序后的学生成绩
是否继续操作
子函数
排序:
f!
=p->class
p=p->next
f==r->class
f==s->next->class&&s->next
交换结构体内各成员的值
求和:
intsum
i==p->class
yes
no
sum==p->scor_1+p->scor_2+p->scor_3
return(sum)
求平均数:
floatave
intsum
sum==add(I,P)
ave==sum/3.0
return(ave)
四、主要源程序代码
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent)
#definePRINTprintf("======================mainmenu=======================\n")
#definePRINprintf("Pleasechosethenumber:
\n")
#definePRIprintf("Sorry,thenumberyouchoseiserror,pleasechoseagain\n")
structstudent\*定义一个结构体*\
{
intterm;\*学期*\
intclass;\*班级*\
charname[20];\*姓名*\
intscore_1;\*科目一*\
intscore_2;\*科目二*\
intscore_3;\*科目三*\
floatave;\*平均分*\
intsum;\*总分*\
structstudent*next;
};
intn;
structstudent*creat(void)\*创建信息链表*\
{
structstudent*head;
structstudent*p1,*p2;
n=0;
p1=p2=(structstudent*)malloc(LEN);
printf("Pleaseinputthestudentinformation:
\n");
printf("TermClassNameScore_1Score_2Score_3\n");
scanf("%d%d%s%d%d%d",&p1->term,&p1->class,p1->name,&p1->score_1,&p1->score_2,&p1->score_3);
head=NULL;
while(p1->term!
=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
scanf("%d%d%s%d%d%d",&p1->term,&p1->class,p1->name,&p1->score_1,&p1->score_2,&p1->score_3);
}
p2->next=NULL;
return(head);
}
voidsort(structstudent*p,intf)\*排序(形参为链表的头指针和想要排序的班级)*\
{
inta,b,c,e;
floatd;
charz[20];
structstudent*r,*s;
while(f!
=p->class)\*判断是否是想要排序的班级*\
p=p->next;
for(r=p;f==p->class&&r;r=r->next)
for(s=p;s->next&&f==s->next->class;s=s->next)
if(s->ave<(s->next)->ave)
{\*交换结构体各个成员*\
d=s->ave;s->ave=s->next->ave;s->next->ave=d;
a=s->score_1;s->score_1=s->next->score_1;s->next->score_1=a;
b=s->score_2;s->score_2=s->next->score_2;s->next->score_2=b;
c=s->score_3;s->score_3=s->next->score_3;s->next->score_3=c;
e=s->sum;s->sum=s->next->sum;s->next->sum=e;
strcpy(z,s->name);strcpy(s->name,s->next->name);strcpy(s->next->name,z);
}
}
intadd(inti,structstudent*p)\*求和(形参为想要求和的班级和链表的头指针)*\
{
intsum;
if(i==p->class)
sum=p->score_1+p->score_2+p->score_3;
return(sum);
}
floataverage(inti,structstudent*p)\*求平均分(形参为想要求和的班级和链表的头指针)*\
{
floatave;
intsum;
sum=add(i,p);\*调用add函数求和*\
ave=sum/3.0;
return(ave);
}
voidmain()\*主函数*\
{
inti,m;
structstudent*p,*q;
printf("================Nowbegintosetup===================\n");
p=creat();\*调用creat函数,并创建一个信息链表*\
q=p;
do
{
PRINT;
printf("1:
correctthestudentinformation\n");\*修改学生信息*\
printf("2:
calculatethestudents'scoreandthensort\n");\*统计学生成绩并排序*\
printf("3:
searchthestudents'information\n");\*查找学生信息*\
printf("4:
outputthescoreofstudent\n");\*输出学生成绩*\
PRIN;
do
{
scanf("%d",&i);
if(i!
=1&&i!
=2&&i!
=3&&i!
=4)PRI;\*报错功能*\
}
while(i!
=1&&i!
=2&&i!
=3&&i!
=4);
if(i==1)
{
charx[20];
printf("Pleaseinputthenameofstudentyouwanttocorrect:
");
do
{
scanf("%s",x);\*输入你要修改学生成绩的姓名*\
for(p=q;p!
=NULL;p=p->next)
{
if(strcmp(x,p->name)==0)\*查找学生*\
{
printf("Now,pleaseinputthenewscoreofthestudent:
\n");\*输入新的成绩*\
printf("Score_1Score_2Score_3\n");
scanf("%d%d%d",&p->score_1,&p->score_2,&p->score_3);
printf("Informationcorrectsucceed\n");
printf("Now,%s'sscoreis%-6d%-6d%-6d\n",x,p->score_1,p->score_2,p->score_3);
break;
}
}
if(p==NULL)
printf("Can'tfindthestudent,pleaseinputagain:
");\*报错功能*\
}
while(p==NULL);
p=q;
}
if(i==2)
{
intj;
printf("Pleaseinputwhichclassyouwanttocount:
");
scanf("%d",&j);\*输入你想要统计的班级*\
printf("Thescoreinformationof%dclassis:
\n",j);
printf("NameScore_1Score_2Score_3AverageSum\n");
for(p=q;p!
=NULL;p=p->next)
{
p->sum=add(j,p);\*调用函数add并赋值给结构体*\
p->ave=average(j,p);\*调用函数average并赋值给结构体*\
}
p=q;
printf("Beforesorted,thestudentscoreis:
\n");
for(p=q;p!
=NULL;p=p->next)
if(j==p->class)
printf("%-9s%-9d%-9d%-9d%-9.2f%-9d\n",p->name,p->score_1,p->score_2,p->score_3,p->ave,p->sum);\*输出排序前的学生成绩*\
p=q;
sort(p,j);\*调用函数sort*\
printf("Aftersorted,thestudentscoreis:
\n");
for(p=q;p!
=NULL;p=p->next)
if(j==p->class)
printf("%-9s%-9d%-9d%-9d%-9.2f%-9d\n",p->name,p->score_1,p->score_2,p->score_3,p->ave,p->sum);\*输出排序后的成绩*\
p=q;
}
if(i==3)
{
inta;
chary[20];
PRINT;
printf("1:
searchthescoreofstudent\n");\*查询学生的各科分数*\
printf("2:
searchthescoreoffaillesson\n");\*查询不及格科目*\
printf("3:
searchthenameofstudent\n");\*查询每个班级的成员*\
printf("What'sdoyouwanttodo?
");PRIN;
scanf("%d",&a);\*输入你想要执行的操作的序号*\
if(a==1)
{
printf("Pleaseinputthestudentname:
");
do
{
scanf("%s",y);\*输入你想要查询的学生的姓名*\
for(p=q;p!
=NULL;p=p->next)
{
if(strcmp(y,p->name)==0)\*查找学生*\
{
printf("%s'sscoreis%d%d%d\n",p->name,p->score_1,p->score_2,p->score_3);
break;\*输出学生的成绩*\
}
}
if(p==NULL)
printf("Can'tfindthestudent,pleaseinputagain:
");\*报错功能*\
}
while(p==NULL);
p=q;
}
elseif(a==2)
{
for(p=q;p!
=NULL;p=p->next)
{
if(p->score_1<60)
printf("%s'slesson1isfailedandthescoreis%d\n",p->name,p->score_1);
if(p->score_2<60)
printf("%s'slesson2isfailedandthescoreis%d\n",p->name,p->score_2);
if(p->score_3<60)
printf("%s'slesson3isfailedandthescoreis%d\n",p->name,p->score_3);
}
p=q;
}
elseif(a==3)
{
intc;
printf("Pleaseinputthenumberofclass:
\n");
scanf("%d",&c);\*输入你想要输出成绩的班级*\
printf("The%dclasshavethesestudent:
\n",c);
for(p=q;p!
=NULL;p=p->next)
if(c==p->class)
printf("%-10s",p->name);
printf("\n");
p=q;
}
}
if(i==4)
{
intb;
printf("Pleaseinputwhichclass:
\n");\*输入你想要输出成绩的班级*\
scanf("%d",&b);
printf("Now,thescoreofthestudentof%dclassis:
\n",b);
printf("NameScore_1Score_2Score_3\n");
for(p=q;p!
=NULL;p=p->next)
if(b==p->class)
printf("%-12s%-12d%-12d%-12d\n",p->name,p->score_1,p->score_2,p->score_3);
}输出成绩
PRINT;
printf("Doyouwanttogoingon?
\n");\*是否想要继续操作*\
printf("1:
YES2:
NO\n");
scanf("%d",&m);
}
while(m!
=2);
}
五、调试分析过程描述
运行情况如下:
输入学生的基本信息:
修改指定学生的成绩:
统计并排序一班成绩:
统计并排序二班的成绩:
查询指定学生的成绩:
查询学生不及格的成绩:
查询班级成员:
输出一班的成绩:
输出二班的成绩:
调试过程中的主要问题及解决方法:
1、执行排序函数时出错,指针指向不确定。
2、编译时无出错警告,连接时出现错误。
3、表格输出时,格式不能对齐。
未运用格式控制字符。
六、课程设计小结
通过这次课程设计,我对C语言有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清晰了。
在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,不停地修改与调试,我终于完成了这段程序。
在调试过程中,我认识到了C语言的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运行。
当然我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。