c语言课程设计报告书学生成绩管理.docx

上传人:b****7 文档编号:9305633 上传时间:2023-02-04 格式:DOCX 页数:17 大小:286.93KB
下载 相关 举报
c语言课程设计报告书学生成绩管理.docx_第1页
第1页 / 共17页
c语言课程设计报告书学生成绩管理.docx_第2页
第2页 / 共17页
c语言课程设计报告书学生成绩管理.docx_第3页
第3页 / 共17页
c语言课程设计报告书学生成绩管理.docx_第4页
第4页 / 共17页
c语言课程设计报告书学生成绩管理.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

c语言课程设计报告书学生成绩管理.docx

《c语言课程设计报告书学生成绩管理.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告书学生成绩管理.docx(17页珍藏版)》请在冰豆网上搜索。

c语言课程设计报告书学生成绩管理.docx

c语言课程设计报告书学生成绩管理

C语言程序设计报告

 

课题:

学生成绩管理

 

 

时间:

2010/7/15

 

一、需求分析

任务要求:

自学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语言的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运行。

当然我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1