C语言课程实践报告.docx
- 文档编号:29911509
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:50
- 大小:601.62KB
C语言课程实践报告.docx
《C语言课程实践报告.docx》由会员分享,可在线阅读,更多相关《C语言课程实践报告.docx(50页珍藏版)》请在冰豆网上搜索。
C语言课程实践报告
大连理工大学城市学院
C语言课程实践报告
题目:
歌手打分系统
学院:
计算机工程学院
班级:
08软件1班
指导教师:
刘丽艳
同组人:
王浩唐淼
组长:
赵云海
完成日期:
2009-11-11
任务书及成绩评定
1、目的与要求
(1)要有可供选择的功能菜单
**************************************
*1.输入歌手成绩*
*2.插入新歌手*
*3.删除退赛歌手*
*4.歌手成绩排名*
*5.输出歌手分数*
*6.输出歌手排名*
*7.退出系统*
**************************************
(2)通过输入菜单项的序号启动相应模块的功能
1能够根据输入的选手人数创建链表;
2录入9名评委给选手的打分,并存储到文件singerOriginal.dat中;
3按照去掉一个最高分和去掉一个最低分的原则求每名选手的平均分;
4按平均分由高到低的顺序对选手进行排序;
5把排名后的数据存储到文件singerFianl.dat中;
6把原始数据和最终的结果输出到屏幕;
7在第②步中保存singerOriginal.dat文件之前,可根据情况修改数据,例如:
插入或删除歌手。
2、本人完成部分
3、成绩评定
成绩:
指导老师:
2009年月日
引言
编由于金融危机的对各个行业的冲击,使同学们的就业状况更加不容乐观,更加苛刻的就业要求迫使我们要更加努力来提升自己的水平。
因此,进行此项目的开发具有很重要的意义,软件的开发不是一个人的项目,他是由一个团队组成通过对原之间密切的配合以及合理的分工共同完成的,这次实践可以让我们初步了解了基本软件开发的流程,团队之间如何进行合理的分工,进行有效地交流和讨论。
同时也是给自己在这个开发团队中一个合理的定位,为将来在软件行业中拼搏打下一个基础。
这次实践的另外一个意义就是通过这个程序锻炼同学的程思维,他考验了我们对各个模块的组合以及各种应用到得基础知识的牢固程度强化对函数、数组、指针、结构体、链表等方面知识的理解和应用,同时又为实践项目的开发打下了基础。
2系统设计
2.1.1设计内容
本项目的主要内容是设计并实现评委打分系统。
该系统作为一种一般的数据检索和排序方式,有着较高的使用价值。
设计并实现该系统将C语言的大部分知识进行融会贯通。
该系统具有将输入的数据以文件形式保存,根据歌手编号查找歌手,录入信息并排名歌手名次,添加删除歌手的功能,并为用户提供简单易操作的人机界面。
2.1.2设计方法
模块划分符合以下三条基本原则:
1.模块在功能上尽可能的单一化,明确化,即模块的内聚性。
2.模块之间的联系及相互影响尽可能的少,尽量避免逻辑耦合,而仅限一数据耦合。
3.模块的规模应当足够小。
实施方法:
自顶而下,逐步细化。
结构化程序设计方法保证了软件的可靠标准度及易于修改,但是增大了程序工作量,降低了程序的运行效率。
2.1.3功能设计
1.main函数:
主函数,实现整个系统的流程控制。
2.链表函数:
creatLink函数,用于存储歌手的信息。
3.输入信息:
inputData函数,输入选手的编号,姓名,和评委打分。
4.输出函数:
outputOriginalData函数,outputFianlData函数,输出链表的各项结点的信息。
5.查找函数:
locatenode函数,输入选手的编号来查找歌手的详细信息。
6.插入函数:
insertNode函数,用于插入新的歌手信息。
7.删除函数:
deletelNode函数,用于删除指定编号的歌手信息。
8.求平均分函数:
calculateData函数,去掉一个最高分,去掉一个最低分,求平均数。
9.排序函数:
sortData函数,将计算好平均分的最后得分,按由高到低排列,即为选手的排名。
10.保存文件函数:
writeOriginalData函数,writeFianlData函数,将选手在链表中的信息存入指定文件及将比赛结果在数组中的信息存入指定文件。
2.2程序结构
2.2.1系统结构图
2.2.2流程图
主函数流程图
建立动态链表流程图
录入选手信息流程图
输出歌手信息流程图
查找流程图
插入流程图
删除流程图
求平均分流程图
排序流程图
保存文件流程图
3程序实现
3.1各模块的功能及程序说明
3.1.1此模块功能为建立动态链表
NODE*creatLink(intn)
{
inti;
NODE*head,*p,*q;
head=q=p=(NODE*)malloc(sizeof(NODE));
for(i=1;i { p=(NODE*)malloc(sizeof(NODE)); q->next=p; q=p; q->next=NULL; } returnhead; } 3.1.2模块的功能为录入选手的信息及评委打分的功能 voidinputData(NODE*h) { inti; floatscore; NODE*p=h; while(p! =NULL) { printf("请输入歌手的编号: "); scanf("%s",p->id); printf("请输入歌手的名字: "); scanf("%s",p->name); for(i=0;i<9;i++) { printf("请输入第%d位评委的评分: ",i+1); scanf("%f",&score); p->score[i]=score; } p=p->next; } } 3.1.3模块的功能为输出歌手得分情况 voidoutputOriginalData(NODE*h){ inti; printf("\n************评委打分如下所示************\n"); printf("-----歌手编号-------姓名----评委打分--\n"); while(h! =NULL){ printf("%10s%14s%",h->id,h->name); printf(""); for(i=0;i<9;i++) printf("%.0f,",h->score[i]); printf("\n"); h=h->next; } } 3.1.4模块的功能为查找一个歌手的信息 NODE*locatenode(NODE*h){ NODE*p; charx[10]; inti; p=h; printf("\n\n**提示**: 要想插入(删除)一名新歌手必须输入前一名歌手的编号\n不能在第一个歌手前插入新歌手,也不能删除第一个歌手! ! ! \n\n"); printf("请输入您要查找的歌手的编号: "); scanf("%s",x); while(p! =NULL&&strcmp(p->id,x)) p=p->next; printf("-----歌手编号-------姓名----评委打分--\n"); printf("%10s%14s%",p->id,p->name); printf(""); for(i=0;i<9;i++) printf("%.0f,",p->score[i]); returnp; } 3.1.5模块的功能为插入一个新歌手的信息 intinsertNode(NODE*s) { NODE*p; charc,d; floatscore; inti,x=0; printf("\n是否要在您查找到的歌手后面插入一个新歌手? (y/n)"); getchar(); scanf("%c",&c); while(c=='y'||c=='Y'){ p=(NODE*)malloc(sizeof(NODE)); printf("请输入歌手的编号: "); scanf("%s",p->id); printf("请输入歌手的名字: "); scanf("%s",p->name); for(i=0;i<9;i++) { printf("请输入第%d位评委的评分: ",i+1); scanf("%f",&score); p->score[i]=score; } p->next=s->next; s->next=p; x=x+1; printf("\n是否继续插入一个新歌手? (y/n)"); getchar(); scanf("%c",&c); } returnx; } 3.1.6模块的功能为删除一个歌手 intdeletelNode(NODE*s) { NODE*p; charc; inti=0; printf("\n是否要在您查找到的歌手后面删除一个歌手? (y/n)"); getchar(); scanf("%c",&c); if(c=='y'||c=='Y'){ if(s->next! =NULL) { p=s->next; s->next=p->next; free(p); printf("\n"); printf("删除成功! ! ! \n"); i=i+1; } else printf("您要删除的选手不存在! ! ! \n"); } returni; } 3.1.7模块的功能为计算歌手平均分 voidcalculateData(NODE*head) { NODE*p=head; inti; floatmax,min,aver; while(p! =NULL) { max=min=p->score[0]; aver=0; for(i=0;i<9;i++) if(p->score[i]>max) max=p->score[i]; elseif(p->score[i] min=p->score[i]; for(i=0;i<9;i++) aver+=p->score[i]; aver-=(max+min); aver=aver/7; p->averScore=aver; p=p->next; } } 3.1.8模块的功能为对歌手得分按由高到低排序 voidsortData(NODE*head,structresultp[],intn) { floattemp; charnum[10]; charstr[20]; NODE*pp=head; inti=0,j; while(pp! =NULL) { strcpy(person[i].id,pp->id); strcpy(person[i].name,pp->name); person[i].score=pp->averScore; pp=pp->next; i++; } for(i=0;i for(j=i+1;j if(person[i].score { temp=person[i].score; person[i].score=person[j].score; person[j].score=temp; strcpy(str,p[i].name); strcpy(num,p[i].id); strcpy(p[i].name,p[j].name); strcpy(p[i].id,p[j].id); strcpy(p[j].name,str); strcpy(p[j].id,num); } } 3.1.9模块的功能为输出歌手的得分和排名 voidoutputFianlData(structresultp[],intn) { inti; printf("\n*****************选手成绩排名****************\n"); printf("-----名次----选手编号---------姓名-------得分------\n"); for(i=0;i printf("%8d%10s%16s%12.2f\n",i+1,p[i].id,p[i].name,p[i].score); } 3.1.9模块的功能为向文件写原始数据 voidwriteOriginalData(NODE*h) { inti; FILE*fp; NODE*p=h; if((fp=fopen("singerOriginal.dat","w"))==NULL) { printf("文件无法打开! \n"); return; } else { fprintf(fp,"歌手得分情况文档: \n\n");//向fp所指向的文件中写入数据。 fprintf(fp,"********************************************************\n"); while(p) { fprintf(fp,"选手编号: %s选手名字: %10s\n\n",p->id,p->name); for(i=0;i<9;i++) { fprintf(fp,"评委%2d: %.2f\n",i+1,p->score[i]); } p=p->next; fprintf(fp,"********************************************************\n"); } } printf("\n\n**提示**: 歌手详细得分已经保存至singerOriginal.dat文件。 \n\n"); fclose(fp); } 3.1.10模块的功能为向文件写最终成绩排名 voidwriteFianlData(structresultp[],intn) { inti; FILE*fp; if((fp=fopen("singerFianl.dat","w"))==NULL) { printf("文件无法打开! \n"); return; } else { fprintf(fp,"歌手成绩排名情况文档: \n\n");//向fp所指向的文件中写入数据。 fprintf(fp,"********************************************************\n"); for(i=0;i fprintf(fp,"选手排名: %d选手编号: %s选手名字: %S选手得分: %.2f\n\n",i+1,p[i].id,p[i].name,p[i].score); fprintf(fp,"********************************************************\n"); } printf("\n\n**提示**: 歌手成绩排名已经保存至singerFianl.dat文件。 \n\n"); fclose(fp); } 3.1.11模块的功能为主导引程序 main() { NODE*h,*p,*q; inti; intn; printf("*********************************\n"); printf("欢迎进入歌手评分系统\n"); printf("*********************************\n\n"); printf("请输入歌手的总人数(人数必须大于1): "); scanf("%d",&n); if(n! =1){ h=creatLink(n); do { printf("\n\t***********************************\n"); printf("\n\t*1.输入歌手成绩*\n"); printf("\n\t*2.插入新歌手*\n"); printf("\n\t*3.删除退赛歌手*\n"); printf("\n\t*4.歌手成绩排名(计算排序)*\n"); printf("\n\t*5.输出歌手分数(评委打分)*\n"); printf("\n\t*6.输出歌手排名(成绩排名)*\n"); printf("\n\t*7.退出系统*\n"); printf("\n\t***********************************\n"); printf("请输入操作序号(1-5): "); scanf("%d",&i); switch(i) { case1: inputData(h); writeOriginalData(h); break; case2: q=locatenode(h); n=n+insertNode(q); writeOriginalData(h); break; case3: q=locatenode(h); n=n-deletelNode(q); writeOriginalData(h); break; case4: calculateData(h); sortData(h,person,n); writeFianlData(person,n); break; case5: outputOriginalData(h);break; case6: outputFianlData(person,n);break; case7: break; } getchar(); if(i==7) break; }while (1); } else printf("您输入的数据不符合要求! ! ! "); } 3.2系统主要功能模块的运行效果图 1.欢迎界面 2.输入选手个数 3.输入选手信息并保存至文件 ] 4.输出选手信息 5.歌手成绩排名 6.输出歌手排名成绩 7.插入新歌手 8.删除歌手 9.退出程序 10.保存选手信息文件结果图 11.保存最终结果文件结果图 4设计体会 通过本项目的开发,使我们更深一步的了解软件开发过程,使我们更进一步熟悉VisualC++6.0编程环境,掌握面向过程程序的执行流程,掌握C语言中大部分的常用概念,达到能够综合运用所学编程知识,解决实际问题的能力。 一.实验中出现的问题: 1.部分函数不认识或不熟悉使用方法 2.写代码时不认真(同时也是不太了解所致) 3.通过运行发现程序本身存在着漏洞 二.所出现问题的解决方法: 1.对不了解的函数进行询问和资料查询,并做以记录 2.通过运行来解决实际的程序错误 三.实验意义: 通过实训使自己对C语言的了解有了质的提升,学习到了许多课本上未曾见过的函数,但同时实训中知识是平时积累,大的项目是小程序的扩展。 实训验证了平时讲到的知识点并进行了扩充。 通过实训对软件开发有了初步的了解,为以后的学习和工作奠定了基础。 四.实验中的最大收获 通过实验明白了项目不是一个人做的,团队合作是非常非常重要的! 也是必不可少的。 5参考文献 1.《c语言程序设计》葛日波主编北京邮电大学出版社 2.《数据结构》郭芳曹桂琴主编大连理工大学出版社 附录A: 系统完整源程序 #include #include #include /*定义结构体类型来创建链表,存储歌手及评委打分数据; 并自定义为NODE新类型*/ typedefstructsinger { charid[10]; charname[20]; floatscore[9]; floataverScore; structsinger*next; }NODE; /*定义结构体数据用来存储排序数据*/ structresult { charid[10]; charname[20]; floatscore; }person[20]; /**************creatLink函数描述****************** NODE*creatLink(intn) { inti; NODE*head,*p,*q; head=q=p=(NODE*)malloc(sizeof(NODE)); for(i=1;i { p=(NODE*)malloc(sizeof(NODE)); q->next=p; q=p; q->next=NULL; } returnhead; } /**************inputData函数描述****************** voidinputData(NODE*h) { inti; floatscore; NODE*p=h; while(p! =NULL) { printf("请输入歌手的编号: "); scanf("%s",p->id); printf("请输入歌手的名字: "); scanf("%s",p->name); for(i=0;i<9;i++) { printf("请输入第%d位评委的评分: ",i+1); scanf("%f",&score); p->score[i]=score; } p=p->next; } } /************outputOriginalData函数描述********** voidoutputOriginalData(NODE*h){ inti; printf("\n************评委打分如下所示************\n"); print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程 实践 报告