c语言项目实践04游戏24点_第1页
c语言项目实践04游戏24点_第2页
c语言项目实践04游戏24点_第3页
c语言项目实践04游戏24点_第4页
c语言项目实践04游戏24点_第5页
已阅读5页,还剩19页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言编程项目实践-04项目案例分析与点评24点程序 运行:

C:\24point.exe显示如图:选择1(如果选择y或n则会死掉!)选择2显示规则选择3则退出程序项目案例分析——24点程序 提示输入4个数字如1

24

1

1显示等10秒后输入计算结果: 然后输入

1*24(回车)程序显示1*24=24然后继续输入(要求有3次计算过程)

24*1=24(程序显示略)

24*1=24(程序显示你赢了)项目案例分析——24点程序然后程序显示出所有可能的组合 (在我们这个12411)的数字组合中,有多少可能的组合呢?多到一屏不够显示中间输错了,不能中断,只好关掉程序窗口重来!项目案例分析——24点程序为什么要分析这个程序白痴地简直看不下去!你要怎么改?项目案例分析——24点程序24点程序——你要怎么改1你要怎么改?用户界面改的舒服一点(至少把错误改正吧)4个数字用随机数方式生成,不要人工输入人算出来的结果,直接输计算公式(类似点计算器), 不要手工一次次地输入人跟机器比赛?——这个几乎不可能,放弃人跟人比赛(有谁愿意试试?)可以选择难度(类似扑克数字1-9或1-13)机器先用排除法,再用枚举法,进一步提高计算速度24点程序——你要怎么改2你要怎么改?杜绝一切可能的输入错误允许可能的“没有解”允许程序人为的中断24点程序——你要怎么改3从需求角度,与上一个程序的比较程序逻辑和结构上要复杂程序“努棒性”要求要高24点程序——你要怎么改4双运算子函数程序主界面选择2处理选择3退出初始化输入4个数字输入结果并计算计算所有可能结果显示所有结果还是从分析程序结构开始功能修改1——随机生成4张牌这个很简单,把人工输入,改成机器生成start(){int

i,

j,

k,

l,

n,

m,

r,data[4],a[4]={0};double

num[4]

={0},

res1,

res2,

res3;char

sign[5]

=

"+-*/",ch;printf("input

4

numbers:");for

(i

=

0;

i

<

4;

i++){scanf("%lf",

num+i);/*从键盘中输入要进行24点游戏的数字*/data[i]=num[i];}printf("Reflections

on

10

seconds,input

your

answer:\n");sleep(10);/*程序暂停10秒钟*/改为随机生成4个随机数,范围是1-9或1-13……for(i=1;i<=3;i++){scanf("%d",&a[2]);scanf("%c",&ch);scanf("%d",&a[3]);switch(ch)/*根据运算符进行运算*/{case

'+':a[1]=a[2]+a[3];break;case

'-':a[1]=a[2]-a[3];break;case

'*':a[1]=a[2]*a[3];break;case

'/':a[1]=a[2]/a[3];break;}这个有点难度,但也不是很难。printf("please

input

your

result:\n");功能修改2——一次性接收计算结果不用3次循环了,一次搞定!接收的是一组计算公式对接收的计算公式,进行分解、识别、

检查、计算。这里

有难度哟!printf("%d%c%d=%d\n",a[2],ch,a[3],a[1]);/*输出计算过程*/}这个可以保持不变,也可以改为自己认为合适的形式。功能修改2——一次性接收计算结果为什么接收计算公式有点难?用户可能输入任何字符什么是对的,或者是允许的允许有空格允许有刮号什么是错的(数值应在限定范围内、分母不能为0)直接输入0作为分母计算结果为0(成为分母)为什么要有这样的要求?for

(i

=

0;

i

<

4;

i++)for

(j

=

0;

j

<

4;

j++)功能修改3——先排他、后枚举是否能够简化原算法七层for循环都“套”了些什么if(j!=i)(4个运算数,两两计算、自己不与自己计算){for

(k

=

0;

k

<

4;

k++)if

(k

!=

i

&&

k

!=

j){for

(l

=

0;

l

<

4;

l++)if(l!=i

&&

l!=j

&&

l!=k)(i、j、k、l四重循环代表4个运算数){for

(n

=

0;

n

<

4;

n++)for

(m

=

0;

m

<

4;

m++)for(r=0;r<4;r++)(n、m、r、三重循环代表4个运算操作符)七重循环,代表了对所有运算数和操作符的枚举switch

(b){case

0:return

(a1+a2);/*返回两数相加的值*/case

1:return

(a1-a2);/*返回两数相减的值*/case

2:return

(a1

*a2);/*返回两数相乘的值*/case

3:return

(a1/a2);/*返回两数相除的值*/}}先看两两计算doubleoperation(doublea1,doublea2,int

b)/*自定义函数,用于进行两个数之间的运算*/{功能修改3——先排他、后枚举根据b的值(b代表进行哪种运算),进行计算,并返回结果res1

=

operation(num[i],

num[j],

n);res2

=

operation(res1,

num[k],

m);res3

=

operation(res2,

num[l],

r);if

(res3

==

24.0)功能修改3——先排他、后枚举再看实质计算printf("[(%d%c%d)%c%d]%c%d=24\n",data[i],sign[n],

data[j],

sign[m],

data[k],

sign[r],data[l]);/*若结果为24则按正常顺序输出*/以上计算,要进行4*4*4*4*4*4*4=65536次(实际少于此数)根据函数定义,n、m、r代表进行哪种运算,num[i]、num[j]、num[k]、num[l]代表了4个运算数else

if

(res3

== -

24.0)printf("[%d%c(%d%c%d)]%c%d=24\n",data[k],sign[m],data[i],

sign[n],

data[j],

sign[r],

data[l]);/*调整输出顺序*/else

if

(res3

==

1.0

/

24.0)printf("%d%c[(%d%c%d)%c%d]=24\n",

data[l],sign[r],

data[i],

sign[n],data[j],

sign[m],data[k]);/*调整输出顺序*/else

if

(res3

== -

1.0

/

24.0)printf("%d%c[%d%c(%d%c%d)]=24\n",

data[l],sign[r],

data[k],

sign[n],

data[i],

sign[m],data[j]);/*调整输出顺序*/这样导致24-0、0-24,24/1和1/24、甚至-24/1、-1/24都成为可能,所以,最后结果列出很多可能。功能修改3——先排他、后枚举原算法也有特殊情况处理-/操作有顺序,可调整前后次序else{res1

=

operation(data[i],

data[j],

n);res2

=

operation(data[k],

data[l],

r);res3

=

operation(res1,

res2,

m);if

(res3==24.0)/*判断结果是否为24*/printf("(%d%c%d)%c(%d%c%d)=24\n",data[i],sign[n],

data[j],

sign[m],

data[k],sign[r],

data[l]);功能修改3——先排他、后枚举原算法也有特殊情况处理这段什么意思?有点多余啊?功能修改4——排除因子排除规则1:24的分解因子(2、3、4、6、8、12)(限制运算的最大数为13)当(x1-x4)4个操作数中,有24的分解因子时例如:x1=8,则只要计算x2-x4是否能组成3(而不是x1-x4组成24),计算的复杂度为原来的1/4。(3*8=24)是因子情况之一依次类推,如果有2个因子,又减少3/4但有3个、甚至4个时,情况如何?功能修改4——排除因子所有因子及其可能(同时考虑位置因素)2:2+20、26-2、2*12、48/23:3+21、27-3、3*8、72、34:……6:8:12:功能修改4——排除因子for(i=0;i<4;i++){if(num[i]==2||num[i]==3||num[i]==4||num[i]==6||num[i]==8||num[i]==12)for(j=0;j<4;j++)for(k=0;k<4;k++){if(k!=j)for(l=0;l<4;l++){if(l!=

j

&&

l

!=

k){n=2; /*

假定计算操作为相乘,如果是其他情况,再添加for

(m

=

0;

m

<

4;

m++)for

(r

=

0;

r

<

4;

r++){res1

=

operation(num[j],

num[k],

m);res2

=

operation(res1,

num[l],

r);res3

=

operation(res2,num[i],n);if

(res2==24.0/num[i])

/*

求余下的三个数的计算结果少了一次循环功能修改4——排他排他规则2:先组成因子虽然(x1-x4)4个操作数中,没有24的直接分解因子(如:3、8、12)时,按照前一规则的思路,可以先找两两组合中,是否可构成因子选择两两组合是因子的计算量:余下的计算量:智能枚举:看是否是因子,比看是否是24要省劲,不要一条路走到黑。17+7=24的情况功能修改5——刮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论