设计题目: 24点游戏
2012年 9 月 1 日
目录
一题目及要求 二项目概述 三项目分析 四程序思路分析
五总结 六答辩记录 七教师意见
一 题目及要求 计算24点游戏
输入四个数,通过加减乘除计算出24,显示计算过程,并提示成功信息。 二 项目概述
我设计的是24点游戏,它功能是输出给定4个数运算得出24的算式。大概思路很简单,就是穷举4个数字排列组合后的所算式,选择其中结果为24的,并筛选符合数学法则的输出,难点在于穷举 三项目分析
通过题目这是大家很熟悉的游戏,大家也都知道直接计算很难,想不出具体的算法,但考虑到计算机的特点——运算速度快,不知疲倦,我们可以另辟蹊径,让计算机算出所有与这4个数字相关的算式,选择其中得24的算输出即可。所以确定思路,穷举。大概分几个模块,主函数,转化四则运算的fun函数,for循环,if选择,scanf,printf。 四 程序思路分析
程序要求给出4个数字,输出算出等于24的结果的所有算式,所以大体上首先scanf4个数字储存在数组中,然后试用定义的fun函数,fun函数为将4则运算
转化为数字的函数,然后用多个for语句实现数字的排列组合,关于括号的问题,分两种情况,一种是“三一”的,一种是“二二”的。然后写一个报错的语句,关于结果用printf输出,如果结果为-24,-1/24,1/24的,可以改变输出结果的顺序。
下面附上源程序: #include double fun(double a1,double a2,int b) { switch(b) {
case 0:return (a1+a2);
case 1:return (a1-a2);
case 2:return (a1*a2);
case 3:return (a1/a2); } } void main() { int g; for(g=0;g
int i,j,k,l,n,m,r,save[4];
double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;
char sign[5]=\"+-*/\";
printf(\"请输入4个数,数字与数字之间用空格隔开:\");
for(i=0;i
{
scanf(\"%lf\",num+i);
save[i]=num[i];
} for(i=0;i
for(j=0;j
if(j!=i)
{
for(k=0;k
if(k!=i&&k!=j)
{
for(l=0;l
if(l!=i&&l!=j&&l!=k)
{
for(n=0;n
for(m=0;m
for(r=0;r
{
tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m);
tem3=fun(tem2,num[l],r);
if(tem3==24.0)printf(\"{(%d%c%d)%c%d}%c%d=24\\n\",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
else if(tem3==-24.0)printf(\"{%d%c(%d%c%d)}%c%d=24\\n\",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
else if(tem3==1.0/24.0)printf(\"%d%c{(%d%c%d)%c%d}=24\\n\",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
else if(tem3==-1.0/24.0)printf(\"%d%c{%d%c(%d%c%d)}=24\\n\",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);
else
{
tem1=fun(num[i],num[j],n);
tem2=fun(num[k],num[l],r);
if(tem2 == 2 && m == 3)
printf(\"此处省略出现的一个非法运算\\n\");
else
{
tem3=fun(tem1,tem2,m);
if(tem3==24.0)
printf(\"(%d%c%d)%c(%d%c%d)=24\\n\",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
}
}
}
}
}
} g++; } } 下面详细说明:
double fun(double a1,double a2,int b) //定义fun函数 { switch(b)
{
case 0:return (a1+a2);
case 1:return (a1-a2);
case 2:return (a1*a2);
case 3:return (a1/a2); } }用switch语句将四则运算转化。 void main() 定义主函数
int i,j,k,l,n,m,r,save[4];
double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;
char sign[5]=\"+-*/\";
printf(\"请输入4个数,数字与数字之间用空格隔开:\");
for(i=0;i
{
scanf(\"%lf\",num+i); //输入语句
save[i]=num[i];}
定义参数,有fun函数转化四则运算,但需要将四则运算的符号存入字符数组中以便输出时使用。用for语句循环实现输入。
用两段语句分两种情况计算for(n=0;n
for(m=0;m
for(r=0;r
{
tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m);
tem3=fun(tem2,num[l],r); for循环实现运算的排列组合,上面是一种情况(不带有括号的),下面是另一种
else
{
tem1=fun(num[i],num[j],n);
tem2=fun(num[k],num[l],r); else 下面是两两组合的情况
{tem3=fun(tem1,tem2,m);
if(tem3==24.0) printf(\"(%d%c%d)%c(%d%c%d)=24\\n\",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
用for和if语句实现数字的排列组合, for(i=0;i
for(k=0;k
{
for(l=0;l
if(l!=i&&l!=j&&l!=k)
{ 输出语句如下 if(tem3==24.0)printf(\"{(%d%c%d)%c%d}%c%d=24\\n\",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
else if(tem3==-24.0)printf(\"{%d%c(%d%c%d)}%c%d=24\\n\",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
else if(tem3==1.0/24.0)printf(\"%d%c{(%d%c%d)%c%d}=24\\n\",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
else if(tem3==-1.0/24.0)printf(\"%d%c{%d%c(%d%c%d)}=24\\n\",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]); 对于其他几种结果通过改变输出时变量的顺序即可。 五 总结
通过这次学习,我学到了很多,这个程序的难度级别是B,不是很难,但是算法比较繁琐,考虑要细心才行。通过此次程序设计,也让我们把平时学的理论知识用在了实际问题上,有助于我们的理解和运用,而且这个程序设计本身也比较有趣,能激发我们自己去深入研究。
以上就是我对这次程序设计的心得体会,也希望在以后的专业课学习中能够充分利用计算机本身速度快的优势,利用编写程序完成一些用手工计算很难完成的问题。
张博禹 05111112 六 答辩记录
七 教师意见