课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
![课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/20/fa5e898a-ea38-4c33-9615-fdb5c58b1140/fa5e898a-ea38-4c33-9615-fdb5c58b11401.gif)
课程设计报告
合肥学院C语言课程设计报告
一、需求分析
我的课程设计名称:
保龄球计分管理系统。
课程设计的目的:
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握自顶而下的设计方法,将大问题进行模块化,领会结构化程序设计的方法。
(6)熟练掌握C语言的基本语法,灵活运用各种数据类型。
设计内容:
设计一个保龄球计分管理系统,该系统要求对保龄球计分信息进行管理和维护。
(7)进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。
任务和要求:
打保龄球是用一个滚球去撞击10个站立的瓶,将瓶击倒。
一局分10轮,每轮可滚球1 次或多次,以击到的瓶数为依据计分,一局得分为10轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:
某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。
计分规则如下:
① 若某一轮的第一次滚球就击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加2次滚球),该轮得分为本次击倒瓶数10与以后2次滚球所击倒瓶数之和。
②若某一轮的第一次滚球未击倒全部10个球,则对剩下未击倒的瓶再滚球一次,如果这2次滚球击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加1次滚球),该轮得分为这2次击倒瓶数10与以后1次滚球所击倒瓶数之和。
③若某一轮2次滚球未击倒全部10个瓶,则本轮不在滚球,该轮得分为这2次滚球所击倒瓶数之和.
要求实现的功能:
①模拟10个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分。
②逐人逐轮逐次输入一次滚球击倒的瓶数。
③对10人的得分由低到高排序并显示。
④最后,把排序的存入文件中。
二、算法设计
1、设计思想:
根据题目要求,要逐人逐轮逐次输入,一次先输入第一人第一轮第一次出手出的得分,如果等于10则直接进行第二轮第一次的出手;如果这一次的得分小于10,则进行第一轮第二次的出手,两次的得分总和为第一轮的得分,然后再进行第二轮第一次的出手,如果第二轮第一次的出手得分等于10,则直接进行第三轮第一次的出手;如果这一次的得分小于10,则进行第二轮第二次的出手,两次的得分总和为第二轮的得分,。
依此类推,进行第三次,第四次……直到第10轮,如果这一轮的出手为10分,则可以另外加两次出手的机会,则第10轮的得分为三次的得分之和;如果这一轮的出手小于10,则进行第二次的出手,如果两次之和等于10,则可以另外加一次出手的机会,则第10轮的得分为三次的得分之和,如果不等于10,则第10轮的得分为两次得分之和;然后把每人每轮得分和总分算出并打印,对总分进行排序再打印.
2.流程图通过对题目的分析和理解,我做了一个简单的流程图,如下:
3、设计表示
程序中定义了子函数Order()用来完成10人总分排序并打印的功能。
在主数中计算各人的总分并用动态一维数组q来存储,然后传给子函数Order(),由于是一维数组,我们可以选择冒泡排序和选择排序方法来实现,这里我选择了选择排序。
之前我定义了动态二维数组p来存储10人10轮的得分,在总分排序的同时,把各个人和各个人的每轮得分进行交换,并把排序结果写入文件a.txt中进行保存。
选择排序算法的基本思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:
无序区为R[1..n],有序区为空。
②第1趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
③第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。
该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
4.实现注释
每个函数的功能Order()函数的功能是将每人每轮的得及分总分进行排序,首先Order()接受主函数传来的形参p代表每人每轮得分的二维动态数组和q代表每人总分的一维动态数组的地址,为其申请动态存储空间,利用一维数组的选择排序方法对总分进行降序排序,同时将每人交换和每轮得分交换,打开文件,将排序结果和交换结果写到指定文件中,然后关闭文件。
5、算法设计中一些新的想法和思路
在此程序中我用的是动态一维数组和动态二维数组,动态申请空间,避免了资源的浪费。
对于此程序我们可以用结构体来完成,定义一个结构体数组用来存储人数,定义一个成员数组来存储10轮的得分,在定义一个整形数组sum()来存储10人的总分,最后进行排序并把结果保存到指定的文件中。
我们也可以用链表来完成,动态申请内存空间用p来保存第一个人的每轮的得分以及总分,用p->next来保存第二人的每轮得分以及总分,用p->next->next保存第三人的每轮得分以及总分,依此类推,最后对总分进行排序并把链表输出,最后把排序结果保存在指定文件中。
还有,略微改一下人数本程序可以输入和显示更多人的信息和情况,应用很广泛!
三、用户手册
使用该程序时用户要注意:
本系统可在TurboC、VC++、C++Builder环境下进行,在输入格式方面只要是整形直接输入就行,中间不用什么分隔符。
在输入每人每轮第一次出手的得分时,如果不等于10时,此时紧接着应该输入第二次的出手的得分;然后再输入下一轮第一次出手的得分,在输入过程中有提示,只要按照提示信息输入就不会有错,当所有的输入都完成之后,调试编译,只要打开你所指向的文件中,即可看到你要的结果。
四、调试及测试
当我完成源代码,开始调试时,遇到了很多问题,如程序无法运行、提示信息多余、内存不可读、编译错误、出现随机数等等,当提示信息多余时,我选择的是把一些模块交换,就可避免累赘;还有当我把每人的总分排序之后,结果发现对应的人没有交换,此时我定义了一个动态的一维数组,来存储每个人,当排序的同时,将对应的人进行交换,就能实现。
当我设计和编码时,我一开始选择了链表,考虑到我的链表操作不如数组,因此我选择了使用动态数组,我定义了动态二维数组p,它的外循环控制人数,内循环控制每人的每轮的得分,用一维数组q保存总分,再用一维数组的选择排序方法对总分进行排序,再进行程序实践操作,一步一个脚印,稳扎稳打,最终成功。
通过调试以及测试,我收获了C语言在VC++中的调试方法。
五、小结
本程序在刚开始调试时有许多错误,但在我的努力及同学的帮助下都被一一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。
在刚开始的几次调试中曾经出现过不能运行、排序不成功、总分出现随机数、数据不能交换等等一系列问题能和错误,幸好在指导老师及同学们的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。
现在、它能对总分进行排序并把人们的位置进行交换,能在文件中显示并且给出正确答案。
最后还能得到正确的结果。
在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。
从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。
除此之外,我还得到了一些有用的教训:
写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。
在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。
通过这次的课程设计让我将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通。
熟练掌握C语言的基本语法,灵活运用各种数据类型。
但本系统有一些不足的情况,有待进一步完善。
六、参考文献
[1]贾宗璞、许合利,C语言程序设计,江苏:
中国矿业大学出版社,2007.6
[2]谭浩强,C程序设计(第二版),北京:
清华大学出版社,2001.1
[3]
附录:
1、程序源代码:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
/*函数功能:
将每人每局难总分从小到大排序
然后输出*/
voidOrder(int*p,int*q)
{
inti,j,k,temp;
int*n,*c;
FILE*fp;
n=(int*)malloc(10*sizeof(int));/*申请10个存储空间*/
c=(int*)malloc(10*10,sizeof(int));/*申请100个存储空间*/
for(i=0;i<10;i++)
*(n+i)=i;
for(i=0;i<=9;i++)
{
for(j=i+1;j<10;j++)
if(*(q+j)>*(q+i))/*按总分从大到小排序*/
{
temp=*(q+j);
*(q+j)=*(q+i);
*(q+i)=temp;
for(k=0;k<10;k++)
{
temp=c[i*10+k];
c[i*10+k]=c[j*10+k];
c[j*10+k]=temp;
}
temp=*(n+j);
*(n+j)=*(n+i);
*(n+i)=temp;
}
}
fp=fopen("a.txt","a+");/*将排序结果追加到文件中*/
fprintf(fp,"排序后1-10轮的分数及总分\n");
fprintf(fp,"********************************************************************\n");
fprintf(fp,"第1轮第2轮第3轮第4轮第5轮第6轮第7轮第8轮第9轮第10轮总分\n");
for(i=0;i<10;i++)
{
fprintf(fp,"第%d人",*(n+i)+1);/*将排序后的每人每局得分及总分输出*/
for(j=0;j<10;j++)
fprintf(fp,"%5d",p[i*10+j]);
fprintf(fp,"%5d\n",*(q+i));
}
fprintf(fp,"********************************************************************\n");
fclose(fp);
}
voidmain()
{
intj,i,k,num,nu;
int*p,*q,*m;
FILE*fp;
p=(int*)malloc(10*10,sizeof(int));/*申请100个存储空间*/
q=(int*)malloc(10*sizeof(int));/*申请10个存储空间*/
m=(int*)malloc(2*sizeof(int));/*申请2个存储空间*/
for(i=0;i<10;i++)
{
*(q+i)=0;
for(j=0;j<10;j++)
{
printf("请输入第%d人第%d轮第一次得分:
",i+1,j+1);
scanf("%d",&p[i*10+j]);/*输入某人第几轮的第一次得分*/
if(p[i*10+j]<10&&j==9)
{
printf("请输入第二次击中的瓶数:
");
scanf("%d",&num);/*第一次不是10分,输入第二次得分*/
p[i*10+j]=p[i*10+j]+num;
if(p[i*10+j]==10)
{
printf("由于两次击中十个球且第10轮,输入另加一次击中的瓶数:
");
scanf("%d",&nu);/*两次击中十个球且第10轮,输入另加一次的得分*/
p[i*10+j]=10+nu;
}
}
if(p[i*10+j]<10&&j!
=9)
{
printf("请输入第二次击中的瓶数:
");
scanf("%d",&num);/*第一次不是10分,输入第二次得分*/
p[i*10+j]=p[i*10+j]+num;
}
if(p[i*10+j]==10&&j==9)
{
printf("由于是第10轮且是一次击中10,输入另加两次击中的瓶数:
");
for(k=0;k<2;k++)
scanf("%d",m+k);/*第10轮且是一次击中10,输入另加两次的得分*/
p[i*10+j]=10+*m+*(m+1);
}
if(p[i*10+j]==10&&j!
=9)
{
printf("为10\n");
p[i*10+j]=10;
}
*(q+i)=*(q+i)+p[i*10+j];/*计算每人的一局总分*/
}
}
fp=fopen("a.txt","w+");/*将输入的结果写入文件中*/
fprintf(fp,"1-10轮的分数及总分\n");
fprintf(fp,"********************************************************************\n");
fprintf(fp,"第1轮第2轮第3轮第4轮第5轮第6轮第7轮第8轮第9轮第10轮总分\n");
for(i=0;i<10;i++)
{
fprintf(fp,"第%d人",i+1);/*将每人每局得分及总分输出*/
for(j=0;j<10;j++)
fprintf(fp,"%5d",p[i*10+j]);
fprintf(fp,"%5d\n",*(q+i));
}
fprintf(fp,"********************************************************************\n");
fclose(fp);
Order(p,q);/*调用总分排序函数*/
}
2、调试
输入测试数据:
测试数据如下所示:
显示结果如下图所示:
注释:
输入数据时是逐人逐轮逐次输入。
由于在输入数据时测试数据在显示屏不能完全显示(如最上面的图),因此我选择了在文件中显示(如中间的一个图),这不是程序中有的,只是为了看数据方便而已。
最后将程序运行的结果在指定的文件a.txt中显示(如最后一个图),最后得出正确结论。