C语言程序课程设计猜数字游戏.docx
《C语言程序课程设计猜数字游戏.docx》由会员分享,可在线阅读,更多相关《C语言程序课程设计猜数字游戏.docx(20页珍藏版)》请在冰豆网上搜索。
C语言程序课程设计猜数字游戏
C语言程序设计课程设计
评语:
考勤(10)
纪律(10)
过程(40)
设计报告(30)
答辩(10)
总成绩(100)
专业:
自动化
班级:
姓名:
学号:
指导教师:
兰州交通大学自动化与电气工程学院
2015年07月21日
一.引言
1.1设计目的
复习和巩固C语言基础知识,进一步加深对C语言的理解和掌握。
提高同学将课本上的理论知识和实际结合的能力,锻炼同学的分析解决实际问题的能力,提高同学团队合作的能力。
使同学们善于观察和思考,善于合作,具备实践编程的基础素质,和实际问题分析的思考方式。
1.2设计要求
在设计时充分地分析和理解问题本身,综合考虑系统功能,怎样使系统结构清晰、合理、简单和易于调试。
然后详细设计,确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系。
最后认真完成课程设计说明书,并对设计方法,结果等进行总结。
充分地分析和理解问题本身,弄清要求做什么(Whattodo?
)。
在确定解决方案框架过程中(Howtodo?
),综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系。
确定算法的主要流程,在此基础上进行代码设计(Coding),每个明确的功能模块程序一般不超过60行,否则要进一步划分。
上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:
(1)用一组测试数据手工执行程序;
(2)通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。
二.基础题
2.1题目
用选择法对10个数进行排序。
有一个已排好序的数组。
现输入一个数,要求按原来的规律插入到原数组中。
2.2解题思路
程序的主要功能是对数组元素用排序函数按从小到大的顺序进行排序。
先定义一个10个元素的一维数组a[10],然后从电脑输入10个数(也就是对数组赋值),然后使用一次fun()函数,对这10个数进行排序;然后再定义一个11个元素的一维数组b[11],同时再从电脑输入一个数同a[10]一起赋值给b[11],然后再使用fun()函数,重新排序的到最后的有顺序的一组数据。
2.3流程图
子函数流程图如图1所示:
图1基础题子函数流程图
主函数流程图如图2所示:
图2基础题主函数流程图
2.4源代码
基础题源代码见附录A。
2.5运行及测试结果
运行及测试结果如图3所示:
图3基础题运行及测试结果截图
三.改错题
3.1题目
#include
intfun()
{
inta[3][3],sum;
inti,j;
____;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf("%d"a[i][j]);
}
for(i=0;i<3;i++)
sum=sum*a[i][i];
printf("累乘积=%d\n",sum);
}
main()
{
fun();
}
3.2解题思路
程序的功能:
这是一个求3*3矩阵主对角线元素累乘积的程序。
程序分析:
可以看出源程序中,先声明了一个子函数,并定义子函数fun()累乘积函数(这个函数就是先定义了一个3*3的二维数组,然后从键盘输入数值对这个二维数组进行了数组赋初值,赋值过程中使用了for循环语句,然后利用for循环语句对主角线的元素做每个数的乘积,最后是输出这个累乘积。
)。
最后就是主函数main(),主函数中使用一次子函数fun()。
3.3错误分析
错误一:
原程序中对sum没有设置初值,应设置为“sum=1;”;
错误二:
scanf()函数中没有使用地址运算符,应在数组前加“&”
错误三:
子函数也没设返回值,返回值应为“returnsum;”。
3.4改错后的源代码
改错后的源代码见附录B。
3.6运行及测试结果
运行及测试结果如图4所示:
图4改错题运行及测试结果截图
四.综合题
4.1题目
设计课题四:
猜数字游戏
一.问题描述
该游戏可以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。
玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。
A表示位置正确且数字正确,B表示数字正确而位置不正确。
如果4A0B,表示游戏成功。
每次猜错会有提示,如果八次都未猜对,游戏失败,显示正确答案。
按任意键可以返回主菜单。
主要应运数组和循环实现改功能。
(对该系统有兴趣的同学可以在实现系统基本功能后,完善系统的其它功能,如:
破记录功能,若你所匹配的次数小于纪录保持者,则为破纪录。
)
二.功能要求
1.游戏显示这样的菜单:
(1)随机产生数据
(2)用户输入数据
(3)退出游戏
2.游戏成功与否都能返回主菜单
三.算法提示
1.数据结构:
数组
2.用简单的程序设计方法
四.测试数据
测试数据:
3792
第一次输入:
1234
0A2B
第二次输入:
5678
0A1B
第三次输入:
0867
0A1B
第四次输入:
9786
1A1B
第五次输入:
1794
2A0B
第六次输入:
2793
2A2B
第七次输入:
3792
4A0B
游戏成功!
!
!
五.其它
对该系统有兴趣的同学可以在实现系统基本功能后,完善系统的其它功能,如:
破记录功能,若你所匹配的次数小于纪录保持者,则为破纪录。
4.2设计思路
此游戏程序通过不断输入以及逐渐数位对应的方法,一步一步的缩小猜测范围最终猜测出机器内已经存储的数字,达到健脑益智的效果。
这种策略非常直接——每次都猜可能答案中的一个。
例如:
首先猜测1234,
如果得到的反馈是2A2B那么可能的答案包括1256125753265236等等。
根据简单策略,下一次就猜1256,因为1256是所有可能答案中最小的数字。
简单策略是程序运行速度非常快,缺点是所猜测的次数较多。
利用主函数调用子函数来实现模块化程序设计。
将游戏的每一个功能设计成一个子函,数调用完成游戏。
主要分为两大模块:
随机模式和用户模式。
猜数字游戏的主要功能,由系统自动产生4个随机排列的整数,或者由用户输入4个不同的整数,并给用户8次机会猜测数字的数值和排列顺序。
如果用户在8次之内没有猜出正确的结果,则提示用户游戏失败,否则提示用户猜数字成功。
该游戏可以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。
玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。
A表示位置正确且数字正确,B表示数字正确而位置不正确。
如果4A0B,表示游戏成功。
每次猜错会有提示,如果八次都未猜对,游戏失败,显示正确答案。
按任意键可以返回主菜单。
主要应运数组和循环实现改功能。
可以对系统在实现系统基本功能后,完善系统的其它功能,如:
破记录功能,若你所匹配的次数小于纪录保持者,则为破纪录。
4.4流程图
主程序流程图如图5所示:
图5主程序流程图
4.5源代码
源代码见附录C。
4.6运行及测试结果
开始界面如图6所示:
图6开始界面结果截图
使用说明界面如图7所示:
图7使用说明界面截图
成功进行了一次游戏如图8所示:
图8完整一次游戏截图
4.7总结
C程序课程设计是理论和实际的结合,通过这次程序的设计,提高了我的c语言水平,比如,查阅资料的重要性,对程序的整体性把握。
而且对整体的掌控,还有对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,积累了经验,但是当自己根据此思路设计出程序时,程序的运行出现了一些问题,这些问题出现时,我通过查阅资料,并且和同学交流,最终经过几次的修改,运行结果和期待的相同。
通过这次的课程设计,我感觉到自己的C语言知识很少,这次题目,可以让我掌握更多的知识,更好的了解c程序的编译过程,分析阶段,我的分析思路如下,进行面向对象的需求分析,系统设计,画出相应需求分析图,流程图,有了流程图,可以让我更好的理解这个程序的设计方法。
我还感觉到上机操作的重要性,以前我只是在书上看,而没有过多的上机操作,就算一个程序能写出来,上机操作的结果也未必正确,有时候自己对一个程序信心十足,但是如果上机操作,那么就有很多问题,并且遇到错误不要灰心,要一步一步的改,直到能运行出正确的结果为止,还有就是借助资料的重要性,一道题如果不会作,我们要借助资料来对比和解决,学习是一个不断完善的过程,要正视自己的不足之处,遇到不足的之处,要自己完善,比如,我体会到自己c语言知识知道的很少,在以后,我要学习和完善自己的C语言知识,还有,自己的实际操作太少,在以后学习C程序设计的过程中,要注重实际操作,而不只是在书上看看就完了。
参考文献
[1]谭浩强著.C程序设计(第四版).北京:
清华大学出版社,2010
[2]蔡志明著.指针的艺术.中国水利水电出版社,2009
[3]谭浩强编著.C程序设计(第三版).北京:
清华大学出版社,2005
[4]谭浩强著.C程序设计教程.北京:
清华大学出版社,2007
[5]谭浩强著.C语言程序设计(第2版).北京:
清华大学出版社,2008
[6]谭浩强编著.C程序设计题解与上机指导(第三版).北京:
清华大学出版社,2005
[7]谭浩强编著.C++程序设计.清华大学出版社,2004
[8]谭浩强著.C程序设计(第四版)学习辅导.北京:
清华大学出版社,2010
[9]陈明编著.计算机导论.北京:
清华大学出版社,2009
[10]C编写组编.常用C语言用法速查手册.北京:
龙门书局,1995
附录
附录A
#include
voidmain()
{
voidfun(inta[],intn);
inta[10],i,k,b[11];
printf("请输入十个数:
\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
fun(a,10);//使用了一次fun()子函数
printf("重新排序:
\n");
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
printf("\n");
printf("请输入一个插入的数:
\n");
scanf("%d",&k);
for(i=0;i<10;i++)
{
b[i]=a[i];
}
b[10]=k;
fun(b,11);//使用了一次fun()子函数
printf("重新排序:
\n");
for(i=0;i<11;i++)
{
printf("%d",b[i]);
}
printf("\n");
}
voidfun(inta[],intn)//编写子函数
{
inti,j,k,temp;
for(i=0;i{
k=i;//k的作用是记录要交换的位置
for(j=i+1;jif(a[j]k=j;//这个循环的作用是找出数组第i个元素以后最小数据
if(k!
=i)//如果k不等于i,说明a[i]不是数组第i位到第n位中最小的元素,交换后让其成为最小的
{
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
}
附录B
#include
intfun()
{
inta[3][3],sum;
inti,j;
sum=1;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<3;i++)
sum=sum*a[i][i];
printf("Sum=%d\n",sum);
returnsum;
}
main()
{
fun();
}
附录C
#include
#include
#include
#defineMANY4
#defineTIME_OUT8
/*定义变量及函数*/
inta,b,u;
voidgame();
voidab(intanswer[],intguess[]);
voidsame(intnum[]);
/*主目录*/
voidmenu()
{
charchoice,ch;
do
{
do
{
system("cls");
printf("\t\t\t\t简单猜数字\n\n\n\n");
printf("\t\t\t\t1.开始游戏\n\n");
printf("\t\t\t\t2.使用说明\n\n");
printf("\t\t\t\t3.退出游戏\n\n");
printf("\t\t\t请输入(1-3):
");
fflush(stdin);
choice=getchar();
}
while(choice!
='1'&&choice!
='2'&&choice!
='3');
switch(choice)
{
case'1':
{
game();
break;
}
case'2':
{
system("cls");
printf("\t\t\t\t欢迎使用本程序\n\n\n");
printf("游戏说明:
输入%d位数字,输入后会有提示XAYB,X表示有几个数字与答案数字相同且位置相同。
\n",MANY);
printf("Y表示有几位数字与答案数字相同但位置不正确。
\n");
printf("例如:
答案数字是5764,如果输入5481,则会提示1A1B。
\n");
printf("祝你愉快!
\n\n");
printf("按任意键返回主目录……\n");
getch();
break;
}
case'3':
{
printf("确定要退出吗?
(y/n):
");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
exit(0);
else
continue;
}
}
}
while
(1);
}
/*游戏部分*/
voidgame()
{
intguess[MANY],answer[MANY];
inttimes,i,m,j;
intkey;
time_tt;
charwantplay,temp;
srand((unsigned)time(&t));
do
{
/*生成MANY个随机数*/
do
{
u=0;
for(i=0;iguess[i]=rand()%10;
same(guess);
}
while(u);
printf("请输入%d位不相同的数:
\n",MANY);
for(times=1;times<=TIME_OUT+1;times++)
{
/*超过限定数次*/
if(times==(TIME_OUT+1))
{
printf("正确答案是:
");
for(m=0;mprintf("%d",guess[m]);
printf("\n猜了%d次都没猜中",TIME_OUT);
break;
}
printf("第%d次:
",times);
/*玩家输入*/
fflush(stdin);
for(j=0;j{
temp=getchar();
answer[j]=temp-48;/*temp是char型*/
}
/*检查输入有没有重复*/
u=0;
same(answer);
if(u)
{
printf("你输入的数字有重复,请重新输入\n");
continue;
}
ab(answer,guess);
/*判断输入数字正确的个数*/
if(a==MANY)
{
printf("恭喜!
你猜对了");
break;
}
else
printf("%dA%dB\n",a,b);
}
printf("还想玩吗?
(y/n):
");
fflush(stdin);
wantplay=getchar();
if(wantplay=='y'||wantplay=='Y')
{
system("cls");
continue;
}
else
menu();
}
while(wantplay=='y'||wantplay=='Y');
}
/*判断输入的数或生成的数有没有重复的函数*/
voidsame(intnum[])
{
inti,j;
for(i=0;ifor(j=i+1;jif(num[i]==num[j])
u=1;
}
/*提示XAYB的函数*/
voidab(intanswer[],intguess[])
{
inti,j;
a=b=0;
for(i=0;ifor(j=0;jif(answer[i]==guess[j])
if(i==j)
a++;
else
b++;
}
/*主函数*/
voidmain()
{
menu();
}