C语言程序课程设计猜数字游戏
爱情断了线-愿有情人终成眷属
C语言程序设计课程设计
评语:
考勤(10) 纪律(10)
过程(40)
设计报告(30)
答辩(10)
总成绩(100)
专 业
:
自动化
班 级
:
姓 名
:
学 号
:
指导教师
:
兰州交通大学自动化与电气工程学院
2015年07月21日
一.引言
1.1设计目的
复习和巩固C语言基础知识,进一步加深
对C语言的理解和掌握。提高同学
将课本上的理论知识和实际结合的能力,锻炼同学的分析解决实际问题
的能力,
提高同学团队合作的能力。使同学们善于观察和思考,善于合作,具备实践编程
的基础
素质,和实际问题分析的思考方式。
1.2设计要求
在设计时充分地分析和理解问
题本身,综合考虑系统功能,怎样使系统结构
清晰、合理、简单和易于调试。然后详细设计,确定每个过
程和函数的简单功能,
以及过程(或函数)之间的调用关系。最后认真完成课程设计说明书,并对设计<
br>方法,结果等进行总结。
充分地分析和理解问题本身,弄清要求做什么(What to
do?)。在确定解决
方案框架过程中(How to do?),综合考虑系统功能,考虑怎样使系统
结构清晰、
合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及过程(或函
数)
之间的调用关系。
确定算法的主要流程,在此基础上进行代码设计(Coding),每个明确的功能
模块程序一般不超过60行,否则要进一步划分。
上机前程序静态检查可有效提高调试效率,
减少上机调试程序时的无谓错误。静
态检查主要有两种途径:(1)用一组测试数据手工执行程序;(2
)通过阅读或给
别人讲解自己的程序而深入全面地理解程序逻辑。
二.基础题
2.1题目
用选择法对10个数进行排序。
有一个已排好序的数组。现输入一个数,要求按原来的规律插入到原数组中。
2.2解题思路
程序的主要功能是对数组元素用排序函数按从小到大的顺序进行排序。
先定义一个1
0个元素的一维数组a[10],然后从电脑输入10个数(也就是对
数组赋值),然后使用一次fun
()函数,对这10个数进行排序;然后再定义一
个11个元素的一维数组b[11],同时再从电脑输
入一个数同a[10]一起赋值给
b[11],然后再使用fun()函数,重新排序的到最后的有顺序
的一组数据。
2.3流程图
子函数流程图如图1所示:
开始i=1
N
i<=n-1
Y
j=n
i=i+1
N
j>=i
Y
a[j]N
互换a[j]和a[j-1]的数据<
br>Y
j=j+1
输出已排序的数组a
结束
图1 基础题子函数流程图
主函数流程图如图2所示:
开始
开始
定义
定义fun()
fun()
函数
函数
输入
输入
a[10]<
br>a[10]
调用
调用
fun(a,10)
fun(a,10)
赋值
赋值
b[i]=a[i]
b[i]=a[i]
插入一个数
插入一
个数
调用
调用
fun(b,11)
fun(b,11)
输出
输出
b[11]
b[11]
结束
结束
图2
基础题主函数流程图
2.4源代码
基础题源代码见附录A。
2.5运行及测试结果
运行及测试结果如图3所示:
图3
基础题运行及测试结果截图
三.改错题
3.1题目
#include
int fun()
{
int
a[3][3],sum;
int i,j;
____;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf(
}
for(i=0;i<3;i++)
sum=sum*a[i][i];
printf(累乘积=%dn
}
main()
{
fun();
}
3.2解题思路
程序的功能:这是一个求3*3矩阵主对角线元素累乘积的程序。
程序分析:可以看出源程序
中,先声明了一个子函数,并定义子函数fun()
累乘积函数(这个函数就是先定义了一个3*3的二
维数组,然后从键盘输入数值
对这个二维数组进行了数组赋初值,赋值过程中使用了for循环语句,然
后利用
for循环语句对主角线的元素做每个数的乘积,最后是输出这个累乘积。)。最后
就是
主函数main(),主函数中使用一次子函数fun()。
3.3错误分析
错误一:原程序中对sum没有设置初值,应设置为“sum=1;”;
错误二:scanf()函数中没有使用地址运算符,应在数组前加“&”
错误三:子函数也没设返回值,返回值应为 “return sum;”。
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设计思路
此游戏程序通过不断输入以及逐渐数位对应的方法,一步一步的缩小猜测范<
br>围最终猜测出机器内已经存储的数字,达到健脑益智的效果。
这种策略非常直接——每次都猜可能答案中的一个。例如:首先猜测 1234 ,
如果得到的反馈是 2A2B 那么可能的答案包括 1256 1257 5326 5236
等等。根据
简单策略,下一次就猜 1256 ,因为 1256
是所有可能答案中最小的数字。简单
策略是程序运行速度非常快,缺点是所猜测的次数较多。
利用主函数调用子函数来实现模块化程序设计。将游戏的每一个功能设计成一
个子函,数调用完成游戏。
主要分为两大模块:随机模式和用户模式。
猜数字游戏的主要功能,由系统自动产生4个随机排列的整
数,或者由用户
输入4个不同的整数,并给用户8次机会猜测数字的数值和排列顺序。如果用户
在8次之内没有猜出正确的结果,则提示用户游戏失败,否则提示用户猜数字成
功。
该游戏可
以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。
玩游戏者通过游戏提示输入八次来匹
配上面所输入的数字。A表示位置正确且数
字正确,B表示数字正确而位置不正确。
如果4A
0B,表示游戏成功。每次猜错会有提示,如果八次都未猜对,游戏失
败,显示正确答案。按任意键可以
返回主菜单。主要应运数组和循环实现改功能。
可以对系统在实现系统基本功能后,完善系统的其它功能
,如:破记录功能,若
你所匹配的次数小于纪录保持者,则为破纪录。
4.4流程图
主程序流程图如图5所示:
开始
开始
游戏说明及选项
游戏说
明及选项
游戏选项,非
为无效输入1,2,3
为无效输入
游戏选项,非
1,2,3
2
游戏说明2
游戏说明
清屏输出说明并返回
清屏输出说
明并返回
1
开始游戏1
开始游戏
并生成
个一位随机数4
个一
位随机数
并生成
4
3
退出询问3
退出询问
玩家输入
玩家输入
判断输入是否有重复数字并给与一定提示
判断输入是否有重复数字并给与一定提示选择是,结束程序
选择是,结束程序
选择否,返回
选择否,返回
如超过最
大回答次数,给出正答案。
如超过最大回答次数,给出正答案。
询问“是”继续,“否”退出<
br>询问“是”继续,“否”退出
在规定次数内猜对,输出你猜对了。
在规定次数内猜对,输
出你猜对了。
询问“是”继续,“否”退出。
询问“是”继续,“否”退出。
选择返回是
返回
选择
是
选择
退出否
退出
选择
否
选择
退出否
退出
选择
否选择
返回是
返回
选择
是
程序结束
程序结束
图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
void main()
{
void fun(int a[ ],int
n);
int a[10],i,k,b[11];
printf(请输入十个数:n
for(i=0;i<10;i++)
{
scanf(
}
fun(a,10); 使用了一次fun()子函数
printf(重新排序:n
for(i=0;i<10;i++)
{
printf(
}
printf(
printf(请输入一个插入的数:
n
scanf(
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(
}
printf(
}
void fun(int a[
],int n) 编写子函数
{
int i,j,k,temp;
for(i=0;i
k=i;
k的作用是记录要交换的位置
for(j=i+1;j
if(k!=i)
如果k不等于i,说明a[i]不是数组第i位到第n位中
最小的元素,交换后让其成为最小的
{
}
}
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
附录B
#include
int fun()
{
int a[3][3],sum;
int i,j;
sum=1;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf(
}
for(i=0;i<3;i++)
sum=sum*a[i][i];
printf(
return sum;
}
main()
{
fun();
}
附录C
#include
#include
#include
#define MANY 4
#define TIME_OUT 8
*定义变量及函数*
int a,b,u;
void game();
void ab(int answer[],int guess[]);
void
same(int num[]);
*主目录*
void menu()
{
char choice,ch;
do
{
do
{
}
while(choice!='1'&&choice!='2'&&choice!='3');
switch(choice)
{
case'1':
{
}
{
system(
printf(欢迎使用本程序nnn
printf(游戏说明:输入%d位数字,输入后会有提示XA
YB,X表示有
printf(表示有几位数字与答案数字相同但位置不正确。n
printf
(例如:答案数字是5764,如果输入5481,则会提示1A1B。
printf(祝你愉快!nn
printf(按任意键返回主目录……n
getch();
break;
game();
break;
system(
printf(简单猜数字
nnnn
printf(开始游戏nn
printf(使用说明nn
printf(退
出游戏nn
printf(请输入(1-3):
fflush(stdin);
choice=getchar();
case'2':
几个数字与答案数字相同且位置相同。n
n
}
}
}
{
}
printf(确定要退出吗?(yn):
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
exit(0);
continue;
else
case'3':
while(1);
}
*游戏部分*
void game()
{
int guess[MANY],answer[MANY];
int times,i,m,j;
int key;
time_t t;
char wantplay,temp;
srand((unsigned)time(&t));
do
{
*生成MANY个随机数*
do
{
}
while(u);
printf(请输入%d位不相同的数:n
u=0;
for(i=0;i
same(guess);
for(times=1;times<=TIME_OUT+1;times++)
{
if(times==(TIME_OUT+1))
{
}
printf(第%d次:
*玩家输入*
fflush(stdin);
{
temp=getchar();
answer[j]=temp-48;
*temp是char型*
printf(正确答案是:
for(m=0;m
printf(猜了%d次都没猜中
break;
*超过限定数次*
for(j=0;j
*检查输入有没有重复*
u=0;
same(answer);
if(u)
{
printf(你输入的数字有重复,请重新输入n
continue;
}
ab(answer,guess);
*判断输入数字正确的个数*
if(a==MANY)
{
printf(恭喜!你猜对了
break;
}
else
printf(
}
printf(还想玩吗?(yn):
fflush(stdin);
wantplay=getchar();
if(wantplay=='y'||wantplay=='Y')
{
system(
continue;
}
else
}
while(wantplay=='y'||wantplay=='Y');
menu();
}
*判断输入的数或生成的数有没有重复的函数*
void
same(int num[])
{
int i,j;
for(i=0;i
u=1;
}
*提示XAYB的函数*
void
ab(int answer[],int guess[])
{
int
i,j;
a=b=0;
for(i=0;i
if(i==j)
a++;
b++;
else
}
*主函数*
void main()
{
menu();
}