学生成绩管理系统C语言.docx

上传人:b****5 文档编号:30346011 上传时间:2023-08-13 格式:DOCX 页数:29 大小:61.28KB
下载 相关 举报
学生成绩管理系统C语言.docx_第1页
第1页 / 共29页
学生成绩管理系统C语言.docx_第2页
第2页 / 共29页
学生成绩管理系统C语言.docx_第3页
第3页 / 共29页
学生成绩管理系统C语言.docx_第4页
第4页 / 共29页
学生成绩管理系统C语言.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

学生成绩管理系统C语言.docx

《学生成绩管理系统C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言.docx(29页珍藏版)》请在冰豆网上搜索。

学生成绩管理系统C语言.docx

学生成绩管理系统C语言

 

课程设计名称:

高级语言程序设计

专业班级:

学生姓名:

学号:

指导教师:

课程设计时间:

 

专业课程设计任务书

学生姓名

专业班级

学号

题目

学生成绩管理系统

课题性质

课题来源

指导教师

同组姓名

主要内容

学习掌握并熟练运用C语言进行程序设计;

学习使用数组、指针、结构体和文件等数据结构;

根据具体题目进行简单的需求分析,给出设计方案。

任务要求

综合运用和融化所学理论知识,提高分析和解决实际问题的能力,使用C语言设计一个简单的学生成绩管理系统;

完成需求分析报告,报告中对关键部分给出图表说明。

要求格式规范,工作量饱满。

参考文献

《C语言程序设计》(第三版)谭浩强清华大学出版社

《数据结构(C语言版)》严蔚敏清华大学出版社

审查意见

指导教师签字:

教研室主任签字:

年月日

说明:

本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页

 

1需求分析

1.1本程序实现一个小型的学生成绩管理系统。

利用C语言编制程序,实现学生成绩信息的输入、调入、查询、删除、追加、显示、统计、保存、排序、退出等功能。

2.1本题我选择了最简单的顺序存储结构,而且九个功能再加上一个菜单功

能,则共要七个部分。

因为有以往的经验,可以预知本次的量是很大的,而且还限制了很多的元素,因此源程序应该不会变化太大,实现起来还是比较简单的。

2概要设计

2.1函数creat功能:

创建链表,此函数带回一个指向链表头的指针。

在该函数中完成学生成绩信息的输入。

2.2函数load功能:

从文件读入学生记录。

在该函数中完成从磁盘文件中录入学生成绩信息的功能。

2.3函数add功能:

追加学生资料,并且将所有学生资料按学号排序。

在该函数中完成对学生成绩信息的插入,并把插入后的所有学生成绩信息按学号排序。

2.4函数search功能:

查询学生成绩。

在该函数中完成对已有学生成绩信息的查询。

2.5函数del功能:

删除学生资料。

在该函数中实现对已有学生成绩信息的删除。

2.6函数print功能:

显示学生成绩。

以表格形式显示已有的学生成绩信息。

2.7函数statistics功能:

统计学生成绩。

以个人总分和平均分、单科平均分、单科最高分、单科最低分、单科分数段人数五种方式对学生成绩信息进行统计。

2.8函数save功能:

保存学生的资料。

在该函数中实现把现有学生成绩信息保存到磁盘文件中。

2.9函数taxis功能:

排序。

以按学生学号排序、按平均分排序、按语文成绩排序、按英语成绩排序、按数学成绩排序这五种排序方式对学生成绩信息进行排序。

2.10函数menu功能:

菜单选择界面。

为用户提供一个友好的使用界面。

2.11主函数main功能:

通过调用以上所述的各个函数,实现学生成绩管理系统功能。

3运行环境

3.1硬件环境:

普通PC机。

3.2软件环境

1)操作系统:

WindowsXP

2)编程环境:

VisualC++6.0

4开发工具和编程语言

4.1开发工具:

MicrosoftVisualC++6.0

4.2编程语言:

VisualC

5详细设计

5.1创建链表,实现学生成绩信息的输入功能。

score*creat(void)

{score*head;

score*p1,*p2,*p3,*max;

inti,j;

floatfen;

chart[10];

n=0;

p1=p2=p3=(score*)malloc(LEN);head=p3;/*开辟一个新单元*/

printf("请输入学生资料,输0退出!

\n");

repeat1:

printf("请输入学生学号(学号应大于0):

");

scanf("%d",&p1->number);/*输入学号,学号应大于0*/

while(p1->number<0)

{getchar();

printf("输入错误,请重新输入学生学号:

");

scanf("%d",&p1->number);}

/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/

if(p1->number==0)gotoend;/*当输入的学号为0时,转到末尾,结束创建链表*/

else{p3=head;

if(n>0)

{for(i=0;i

{if(p1->number!

=p3->number)p3=p3->next;

else{printf("学号重复,请重输!

\n");

gotorepeat1;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/

}

}

}

printf("请输入学生姓名:

");

scanf("%s",&p1->name);/*输入学生姓名*/

printf("请输入语文成绩(0~100):

");/*输入语文成绩,成绩应在0-100*/

scanf("%f",&p1->yuwen);

while(p1->yuwen<0||p1->yuwen>100)

{printf("输入错误,请重新输入语文成绩:

");

scanf("%f",&p1->yuwen);}/*输入错误,重新输入语文成绩直到正确为止*/

printf("请输入英语成绩(0~100):

");/*输入英语成绩*/

scanf("%f",&p1->yingyu);

while(p1->yingyu<0||p1->yingyu>100)

{printf("输入错误,请重新输入英语成绩");

scanf("%f",&p1->yingyu);}/*输入错误,重新输入*/

printf("请输入数学成绩(0~100):

");/*输入数学成绩*/

scanf("%f",&p1->shuxue);

while(p1->shuxue<0||p1->shuxue>100)

{printf("输入错误,请重新输入数学成绩");

scanf("%f",&p1->shuxue);}/*输入错误,重新输入*/

p1->ave=(p1->shuxue+p1->yingyu+p1->yuwen)/3;

head=NULL;

while(p1->number!

=0)

{n=n+1;

if(n==1)head=p1;

elsep2->next=p1;

p2=p1;

p1=(score*)malloc(LEN);

printf("请输入学生资料,输0退出!

\n");

repeat2:

printf("请输入学生学号(学号应大于0):

");

scanf("%d",&p1->number);/*输入学号,学号应大于0*/

while(p1->number<0)

{printf("输入错误,请重新输入学生学号:

");

scanf("%d",&p1->number);}

/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/

if(p1->number==0)gotoend;/*当输入的学号为0时,转到末尾,结束创建链表*/

else{p3=head;

if(n>0)

{for(i=0;i

{if(p1->number!

=p3->number)p3=p3->next;

else{printf("学号重复,请重输!

\n");

gotorepeat2;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/

}

}

}

printf("请输入学生姓名:

");

scanf("%s",&p1->name);/*输入学生姓名*/

printf("请输入语文成绩(0~100):

");

scanf("%f",&p1->yuwen);/*输入语文成绩,成绩应在0-100*/

while(p1->yuwen<0||p1->yuwen>100)

{printf("输入错误,请重新输入语文成绩");

scanf("%f",&p1->yuwen);}/*输入错误,重新输入到正确为*/

printf("请输入英语成绩(0~100):

");

scanf("%f",&p1->yingyu);/*输入英语成绩,成绩应在0-100*/

while(p1->yingyu<0||p1->yingyu>100)

{printf("输入错误,请重新输入英语成绩");

scanf("%f",&p1->yingyu);}/*输入错误,重新输入*/

printf("请输入数学成绩(0~100):

");

scanf("%f",&p1->shuxue);/*输入数学成绩,成绩应在0-100*/

while(p1->shuxue<0||p1->shuxue>100)

{printf("输入错误,请重新输入数学成绩");

scanf("%f",&p1->shuxue);}/*输入错误,重新输入*/

p1->ave=(p1->shuxue+p1->yingyu+p1->yuwen)/3;

}

end:

p1=head;p3=p1;

for(i=1;i

{for(j=i+1;j<=n;j++)

{max=p1;

p1=p1->next;

if(max->number>p1->number)

{k=max->number;

max->number=p1->number;

p1->number=k;/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/

strcpy(t,max->name);

strcpy(max->name,p1->name);

strcpy(p1->name,t);/*交换前后结点中的姓名,使之与学号相匹配*/

fen=max->yuwen;

max->yuwen=p1->yuwen;

p1->yuwen=fen;/*交换前后结点中的语文成绩*/

fen=max->yingyu;

max->yingyu=p1->yingyu;

p1->yingyu=fen;/*交换前后结点中的英语成绩*/

fen=max->shuxue;

max->shuxue=p1->shuxue;

p1->shuxue=fen;/*交换前后结点中的数学成绩*/

fen=max->ave;

max->ave=p1->ave;

p1->ave=fen;/*交换前后结点中的平均成绩*/

}

}

max=head;p1=head;/*重新使max,p指向链表头*/

}

p2->next=NULL;/*链表结尾*/

printf("输入的学生数为:

%d个!

\n",n);

return(head);

}

5.2从文件读取学生成绩信息。

score*load(score*head)

{score*p1,*p2;

intm=0;

charfilepn[10];

FILE*fp;

printf("请输入文件路径及文件名:

");

scanf("%s",filepn);/*输入文件路径及名称*/

if((fp=fopen(filepn,"r"))==NULL)

{printf("不能打开文件!

\n");

return0;

}

fscanf(fp,"考试成绩管理系统\n");

fscanf(fp,"欢迎使用\n");

fscanf(fp,"------------------------------------------------\n");

fscanf(fp,"|学号\t|姓名\t|语文\t|英语\t|数学\t|平均分\t|\n");

fscanf(fp,"------------------------------------------------\n");

printf("考试成绩管理系统\n");

printf("欢迎使用\n");

printf("------------------------------------------------\n");

printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|平均分\t|\n");

printf("------------------------------------------------\n");

n=0;

p1=p2=(score*)malloc(LEN);/*开辟一个新单元*/

fscanf(fp,"%d%s%f%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,&p1->ave);

head=NULL;

while(!

feof(fp))

{n=n+1;

if(n==1)head=p1;

elsep2->next=p1;

p2=p1;

p1=(score*)malloc(LEN);/*开辟一个新单元*/

fscanf(fp,"%d%s%f%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue,&p1->ave);

}

p2->next=NULL;

printf("------------------------------------------------\n");/*表格下线*/

fclose(fp);/*结束读入,关闭文件*/

print(head);

return(head);

}

5.3查询学生成绩信息。

score*search(score*head)

{intnumber;

score*p1,*p2;

printf("输入要查询的学生的学号:

");

scanf("%d",&number);

while(number!

=0)

{if(head==NULL)

{printf("\n没有任何学生资料!

\n");return(head);}

printf("-----------------------------------------\n");

printf("|学号\t|姓名\t|语文\t|英语\t|数学\t|\n");

printf("-----------------------------------------\n");

p1=head;

while(number!

=p1->number&&p1->next!

=NULL)

{p2=p1;p1=p1->next;}

if(number==p1->number)

{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);

printf("-----------------------------------------\n");}

elseprintf("%d不存在此学生!

\n",number);

printf("输入要查询的学生的学号:

");

scanf("%d",&number);

}

printf("已经退出了!

\n");

return(head);}

5.4删除学生成绩信息。

score*del(score*head)/*函数del功能:

删除学生资料*/

{score*p1,*p2;

intnumber;

printf("输入要删除的学生的学号(输入0时退出):

");

scanf("%d",&number);

while(number!

=0)/*输入学号为0时退出*/

{if(head==NULL)

{printf("\n没有任何学生资料!

\n");

return(head);

}

p1=head;

while(number!

=p1->number&&p1->next!

=NULL)

{p2=p1;p1=p1->next;}/*p1后移一个结点*/

if(number==p1->number)/*找到了*/

{if(p1==head)

head=p1->next;/*若p1指向的是首结点,把地二个结点地址赋予head*/

else

p2->next=p1->next;/*否则将下一个结点地址赋给前一结点地址*/

printf("删除:

%d\n",number);n=n-1;

}

elseprintf("%d不存在此学生!

\n",number);/*找不到该结点*/

printf("输入要删除的学生的学号:

");

scanf("%d",&number);

}

printf("已经退出了!

\n");

printf("现在的学生数为:

%d个!

\n",n);

return(head);

}

5.5追加某学生成绩信息。

score*add(score*head,score*stu)

{score*p0,*p1,*p2,*p3,*max;

inti,j;

floatfen;

chart[10];

p3=stu=(score*)malloc(LEN);/*开辟一个新单元*/

printf("\n输入要增加的学生的资料!

");

repeat4:

printf("请输入学生学号(学号应大于0):

");

scanf("%d",&stu->number);/*输入学号,学号应大于0*/

while(stu->number<0)

{printf("输入错误,请重新输入学生学号:

");

scanf("%d",&stu->number);}/*输入错误,重新输入学号*/

if(stu->number==0)gotoend2;/*当输入的学号为0时,转到末尾,结束追加*/

else{p3=head;

if(n>0)

{for(i=0;i

{if(stu->number!

=p3->number)p3=p3->next;

else{printf("学号重复,请重输!

\n");

gotorepeat4;}/*当输入的学号已经存在,程序报错,返回前面重新输入*/

}

}

}

printf("输入学生姓名:

");

scanf("%s",stu->name);/*输入学生姓名*/

printf("请输入语文成绩(0~100):

");

scanf("%f",&stu->yuwen);/*输入语文成绩,成绩应在0-100*/

while(stu->yuwen<0||stu->yuwen>100)

{printf("输入错误,请重新输入语文成绩");

scanf("%f",&stu->yuwen);}/*输入错误,重新输入*/

printf("请输入英语成绩(0~100):

");

scanf("%f",&stu->yingyu);/*输入英语成绩,成绩应在0-100*/

while(stu->yingyu<0||stu->yingyu>100)

{printf("输入错误,请重新输入英语成绩");

scanf("%f",&stu->yingyu);}/*输入错误,重新输入*/

printf("请输入数学成绩(0~100):

");

scanf("%f",&stu->shuxue);/*输入数学成绩,成绩应在0-100*/

while(stu->shuxue<0||stu->shuxue>100)

{printf("输入错误,请重新输入数学成绩");

scanf("%f",&stu->shuxue);}/*输入错误,重新输入*/

stu->ave=(stu->shuxue+stu->yingyu+stu->yuwen)/3;

p1=head;

p0=stu;

if(head==NULL){head=p0;p0->next=NULL;}/*当原来链表为空时,从首结点开始存放资料*/

else{if(p1->next==NULL)/*找到原来链表的末尾*/

{p1->next=p0;p0->next=NULL;}/*将它与新开单元相连接*/

else{while(p1->next!

=NULL)/*还没找到末尾,继续找*/

{p2=p1;p1=p1->next;}

p1->next=p0;

p0->next=NULL;

}

}

n=n+1;

p1=head;p0=stu;

for(i=1;i

{for(j=i+1;j<=n;j++)

{max=p1;

p1=p1->next;

if(max->number>p1->number)

{k=max->number;

max->number=p1->number;

p1->number=k;/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/

strcpy(t,max->name);

strcpy(max->name,p1->name);

strcpy(p1->name,t);/*交换前后结点中的姓名,使之与学号相匹配*/

fen=max->yuwen;

max->yuwen=p1->yuwen;

p1->yuwen=fen;/*交换前后结点中的语文成绩*/

fen=max->yingyu;

max->yingyu=p1->yingyu;

p1->yingyu=fen;/*交换前后结点中的英语成绩*/

fen=max->shuxue;

max->shuxue=p1->shuxue;

p1->shuxue=fen;/*交换前后结点中的数学成绩*/

fen=max->ave;

max->ave=p1->ave;

p1->ave=fen;/*交换前后结点中的平均成绩*/

}

}

max=head;p1=head;/*重新使max,p指向链表头*/

}

end2:

printf("现在的学生数为:

%d个!

\n",n);

return(head);

}

5.6以多种方式统计学生成绩。

score*statistics(score*head)

{floatsum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,maxyw,maxyy,maxsx,max1,max2,max3;

score*p;

intx,y=0,i=0;

p=head;

printf("1个人总分和平均分\t2单科平均分\t3单科最高分\t4单科最低分\t5单科分数段人数\n");

scanf("%d",&x);

switch(x)/*用switch语句实现功能选择*/

{case1:

if(head==NULL)

{printf("\n没有任何学生资料!

\n");return

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

当前位置:首页 > 医药卫生 > 中医中药

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

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