课程设计报告Word下载.docx
- 文档编号:16202279
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:12
- 大小:143.40KB
课程设计报告Word下载.docx
《课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计报告Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
计分规则如下:
①
若某一轮的第一次滚球就击倒全部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"
stdlib.h"
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;
=9;
{
for(j=i+1;
j<
j++)
if(*(q+j)>
*(q+i))/*按总分从大到小排序*/
{
temp=*(q+j);
*(q+j)=*(q+i);
*(q+i)=temp;
for(k=0;
k<
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"
********************************************************************\n"
第1轮第2轮第3轮第4轮第5轮第6轮第7轮第8轮第9轮第10轮总分\n"
{
fprintf(fp,"
第%d人"
*(n+i)+1);
/*将排序后的每人每局得分及总分输出*/
for(j=0;
%5d"
p[i*10+j]);
%5d\n"
*(q+i));
}
fclose(fp);
}
voidmain()
intj,i,k,num,nu;
int*p,*q,*m;
p=(int*)malloc(10*10,sizeof(int));
q=(int*)malloc(10*sizeof(int));
m=(int*)malloc(2*sizeof(int));
/*申请2个存储空间*/
*(q+i)=0;
for(j=0;
{
printf("
请输入第%d人第%d轮第一次得分:
"
i+1,j+1);
scanf("
%d"
&
p[i*10+j]);
/*输入某人第几轮的第一次得分*/
if(p[i*10+j]<
10&
&
j==9)
请输入第二次击中的瓶数:
num);
/*第一次不是10分,输入第二次得分*/
p[i*10+j]=p[i*10+j]+num;
if(p[i*10+j]==10)
{
printf("
由于两次击中十个球且第10轮,输入另加一次击中的瓶数:
nu);
/*两次击中十个球且第10轮,输入另加一次的得分*/
p[i*10+j]=10+nu;
}
j!
=9)
{
p[i*10+j]=p[i*10+j]+num;
if(p[i*10+j]==10&
由于是第10轮且是一次击中10,输入另加两次击中的瓶数:
2;
m+k);
/*第10轮且是一次击中10,输入另加两次的得分*/
p[i*10+j]=10+*m+*(m+1);
if(p[i*10+j]==10&
为10\n"
p[i*10+j]=10;
*(q+i)=*(q+i)+p[i*10+j];
/*计算每人的一局总分*/
}
w+"
/*将输入的结果写入文件中*/
1-10轮的分数及总分\n"
i+1);
/*将每人每局得分及总分输出*/
fclose(fp);
Order(p,q);
/*调用总分排序函数*/
2、调试
输入测试数据:
测试数据如下所示:
显示结果如下图所示:
注释:
输入数据时是逐人逐轮逐次输入。
由于在输入数据时测试数据在显示屏不能完全显示(如最上面的图),因此我选择了在文件中显示(如中间的一个图),这不是程序中有的,只是为了看数据方便而已。
最后将程序运行的结果在指定的文件a.txt中显示(如最后一个图),最后得出正确结论。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)