课程设计报告.docx

上传人:b****6 文档编号:3296739 上传时间:2022-11-21 格式:DOCX 页数:12 大小:143.40KB
下载 相关 举报
课程设计报告.docx_第1页
第1页 / 共12页
课程设计报告.docx_第2页
第2页 / 共12页
课程设计报告.docx_第3页
第3页 / 共12页
课程设计报告.docx_第4页
第4页 / 共12页
课程设计报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

课程设计报告.docx

《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。

课程设计报告.docx

课程设计报告

合肥学院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中显示(如最后一个图),最后得出正确结论。

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

当前位置:首页 > 小学教育 > 语文

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

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