C程序设计 24点小游戏.docx

上传人:b****6 文档编号:8385656 上传时间:2023-01-30 格式:DOCX 页数:12 大小:145.09KB
下载 相关 举报
C程序设计 24点小游戏.docx_第1页
第1页 / 共12页
C程序设计 24点小游戏.docx_第2页
第2页 / 共12页
C程序设计 24点小游戏.docx_第3页
第3页 / 共12页
C程序设计 24点小游戏.docx_第4页
第4页 / 共12页
C程序设计 24点小游戏.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

C程序设计 24点小游戏.docx

《C程序设计 24点小游戏.docx》由会员分享,可在线阅读,更多相关《C程序设计 24点小游戏.docx(12页珍藏版)》请在冰豆网上搜索。

C程序设计 24点小游戏.docx

C程序设计24点小游戏

1设计内容

有2、3、4、5、6、7、8、9、10、J、Q、K、A共13张牌,编一程序,判断对任意给定的4张牌,能否在进行加、减、乘、除运算后,其运算结果等于24。

其中J按11计算,Q按12计算,K按13计算,A按1计算。

如果能得到结果24,则输出可得到该结果的计算表达式。

若输入数据符合要求,且经过加、减、乘、除运算后,运行结果能得到24,如输入5,5,5,1,则显示可得到该结果的计算表达式,如5*(5-(1/5))。

若输入数据小于1或者大于13或者不是整数时,提示输入错误。

若输入不能运算出24的数据,如1,1,1,1,则显示经过加、减、乘、除运算后,运行结果不能得到24。

2程序设计

2.1存储结构设计

由于要储存的数据不多,主要是储存所输入的4个整数,所以采用一维数组(a[4])储存。

而计算过程会出现小数,所以数据类型采用浮点型(float)。

2.2主要程序设计

程序采用穷举法,对输入的4个数进行排列,有4!

=24种。

用for来循环,if来判断,算法如下。

for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(j!

=i)

for(k=0;k<4;k++)

if(k!

=j&&k!

=i)

for(l=0;l<4;l++)

if(l!

=i&&l!

=j&&l!

=k)

{calculate(a[i],a[j],a[k],a[l]);}

用if来判断括号的类型,然后作出不同顺序的运算。

括号有两对,主要有两种类型:

一种是()()型,如(a+b)*(c+d);另一种是(())型,继续细分又有4种类型,如下a*(b*(c+d)),(a*(b+c))*d,a*((b+c)*d),((a+b)*c)*d。

算法如下

if((!

(i==3&&b==0))&&(!

(j==3&&c==0))&&(!

(k==3&&d==0)))

{

sum1=arithmetic(i,a,b);

sum2=arithmetic(j,sum1,c);

sum3=arithmetic(k,sum2,d);

}

if(k==2)

{

sum1=arithmetic(i,a,b);

sum2=arithmetic(j,c,d);

sum3=sum1*sum2;

}

if(k==3)

{

sum1=arithmetic(i,a,b);

sum2=arithmetic(j,c,d);

if(sum2!

=0)

{

sum3=sum1/sum2;

}

}

在输入方面,按要求,数据类型是1至13的整数,符合则进行运算,不符合则重新输入。

用if语句来实现,如下

if(a[i]<1||a[i]>13||a[i]!

=int(a[i]))

在输出方面,运算结果等于24就输出,利用调用的参数判断输出形式,有5种:

(a+b)*(c+d),a*(b*(c+d)),(a*(b+c))*d,a*((b+c)*d),((a+b)*c)*d。

算法如下:

voidshow(inttype,inti,intj,intk,floata,floatb,floatc,floatd)

{

if(type==1){

if(j==4||j==5)

{

if(k==4||k==5)

cout<

else

cout<<"("<

}

elseif(k==4||k==5)

{

cout<

}

else

cout<<"(("<

}

if(type==2||type==3)

{

cout<<"("<

}

}

2.3程序流程框图

程序流程框图如图2-3所示:

 

图2-3

3程序调试

3.1测试用例

开始运行时的页面如图4-1所示:

图4-1

首先,测试程序能不能运算出正确的结果,输入数据6,6,6,6,出现了44组符合要求的解,如图4-2所示。

接着输入数据2,9,7,14,提示输入错误,重新输入2,7,5,13,能得到正确运行结果,如图4-2所示。

输入4,9,11,13,不能运算得到24,显示“你所输入的数,经过四则运算后,不等于24点”,如图4-3所示。

输入5,5,5,1,这组数据要运算得到24,一定会出现小数,因为只有一种运算,即5*(5-1/5),程序显示出正确结果,如图4-4所示。

3.2调试运行结果

程序第一次编译时,有19个错误,都是语法错误,修改后,能通过编译。

第一次运行,并不能输出正确结果,主要原因有两个:

一个是运算符号的穷举次数不对,另一个是4个数的运算先后顺序不对。

其他的错误有除数不能为零,括号的位置不对。

经过修改,调试后,能运算出正确的结果。

3.1运行的结果如图:

图4-2

图4-3

图4-4

图4-5

4心得体会

通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计题目----计算24点,通过用for的多重循环,结合if判断,舍弃多余的循环,提高了程序的运行效率。

在编写这个程序的过程中,我服习了之前学的基本语法,更加深刻的认识到循环是大部分程序的基本要素。

结合了这学期学的数据结构,分析算法的时间复杂度,不断改进算法,更加巩固了之前学的知识,比以前更能灵活运用。

此次写的程序还有很大的发展空间,可以通过循环,重复输入数据,多次计算24点。

还可以通过设计,让程序能计算出任意结果,不单是24。

在输出方面,为提高运行效率,可以设计只输出一组解。

在输入方面,放宽数据类型,例如,可以运算负数,小数等。

还可以输入多个数,不局限在4个数。

随着数量增加,循环增加,为提高运行效率,可以考虑更改数据类型。

此次课程设计,我受益匪浅,巩固旧知识的同时,学习了新的知识。

更重要的是,它使我对数据结构产生了浓厚的兴趣,对编写程序更有信心。

附件:

源程序清单

#include

#include

intcheck;//标志能否运算出24

floatarithmetic(intflag,floatm,floatn)//进行四则运算

{

switch(flag)//判断运算符号,返回相对应的运算结果

{

case0:

return(m+n);

case1:

return(m-n);

case2:

return(m*n);

case3:

if(n==0)

return10000;//除数为0,则返回10000,使之不能运算出24

else

return(m/n);

case4:

return(n-m);

case5:

if(m==0)

return10000;//除数为0,则返回10000,使之不能运算出24

else

return(n/m);

default:

return0;

}

}

voidshow(inttype,inti,intj,intk,floata,floatb,floatc,floatd)

//利用参数type选择输出形式,利用参数i,j,k确定输出的运算符号

{

charsign[6];//定义运算符号数组

sign[0]='+';

sign[1]='-';

sign[2]='*';

sign[3]='/';

sign[4]='-';//减法不符合交换律

sign[5]='/';//除法不符合交换律

if(type==1)//根据括号的类型做不同的输出

{

if(j==4||j==5)//减法和除法

{

if(k==4||k==5)//a*(b*(c+d))形式

cout<

else//(a*(b+c))*d形式

cout<<"("<

}

elseif(k==4||k==5)//a*((b+c)*d)形式

{

cout<

}

else//((a+b)*c)*d形式

cout<<"(("<

}

if(type==2||type==3)//(a+b)*(c+d)形式

{

cout<<"("<

}

}

voidcalculate(floata,floatb,floatc,floatd)//进行加、减、乘、除运算

{

inti,j,k;

floatsum1,sum2,sum3;//储存3次两两运算的结果

for(i=0;i<4;i++)//"+-*/"4个运算符号选3个,有4*4*4=64种

for(j=0;j<6;j++)//3种运算符排列有3!

=6种

for(k=0;k<6;k++)

{

if((!

(i==3&&b==0))&&(!

(j==3&&c==0))&&(!

(k==3&&d==0)))//括号的类型为(())

//3为做除法运算的标志,除数为0时,跳过

{

sum1=arithmetic(i,a,b);//a,b做以i为标志的运算,然后把值赋给sum1

sum2=arithmetic(j,sum1,c);//sum1,c做以j为标志的运算,然后把值赋给sum2

sum3=arithmetic(k,sum2,d);//sum2,d做以k为标志的运算,然后把值赋给sum3

if(fabs(sum3-24)<0.001)//判断能否运算出24,出现小数时,能够包含在内

{

check++;//标志能运算出24

show(1,i,j,k,a,b,c,d);//输出运算出24的表达式

}

}

if(k==2)//()*()

{

sum1=arithmetic(i,a,b);//a,b做以i为标志的运算,然后把值赋给sum1

sum2=arithmetic(j,c,d);//sum1,c做以j为标志的运算,然后把值赋给sum2

sum3=sum1*sum2;

if(fabs(sum3-24)<0.001)//出现小数时,能够包含在内

{

check++;//标志能运算出24

show(2,i,j,k,a,b,c,d);//输出运算出24的表达式

}

}

if(k==3)//括号的类型为()()

{

sum1=arithmetic(i,a,b);//sum1,c做以j为标志的运算,然后把值赋给sum2

sum2=arithmetic(j,c,d);//sum1,c做以j为标志的运算,然后把值赋给sum2

if(sum2!

=0)

{

sum3=sum1/sum2;

if(fabs(sum3-24)<0.001)//出现小数时,能够包含在内

{

check++;//标志能运算出24

show(3,i,j,k,a,b,c,d);//输出运算出24的表达式

}

}

}

}

}

voidmain()

{

inti,j,k,l,m=0;

floata[4];//储存所输入的4个整数

while(m==0)

{

m=1;

cout<<"请输入4个1--13的整数:

"<

for(i=0;i<4;i++)

{

cin>>a[i];

if(a[i]<1||a[i]>13||a[i]!

=int(a[i]))//判断是否为符合要求的整数

{

if(m!

=0)

{

cout<<"输入错误,请重新输入!

"<

}

m=0;

}

}

}

for(i=0;i<4;i++)//4的排列4!

=24,每中情况调用calculate

for(j=0;j<4;j++)

if(j!

=i)//第2数和第1个数不能重复

for(k=0;k<4;k++)

if(k!

=j&&k!

=i)//第3数和第1,2个数不能重复

for(l=0;l<4;l++)

if(l!

=i&&l!

=j&&l!

=k)//第4数和第1,2,3个数不能重复

{

calculate(a[i],a[j],a[k],a[l]);//调用calculate函数,进行进行加、减、乘、除运算

}

if(check==0)//不能运算出24

{cout<<"你所输入的数,经过四则运算后,不等于24点"<

}

 

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

当前位置:首页 > 高等教育 > 工学

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

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