VFP趣味编程:鸡兔同笼

鸡兔同笼。小朋友数了数圈在笼子里的鸡和兔共有 14个头,脚共有 44只,问圈在笼子里的鸡和兔各有多少只?

算法分析。这个问题与上次所讲的盲人裁判的问题差不多,如何解决鸡兔同笼问题呢?首先,设笼子中有x只鸡,则兔有14-x(为什么?因为无论是鸡或兔都只有一个头噻)。其次,寻找到另一个条件,脚一共有44只;这里还要用上生活常识作为默认条件,即一只鸡有2只脚,一只兔有4只脚,所以不用考虑鸡、兔缺胳膊少腿这种残疾现象,也不用说是死鸡死兔肢体不全了(如果那样,就叫钻牛角尖了,不是一种正确正常的考虑问题的方法),所以得到2x+4(14-x)=44这个条件。

按照人类一般思维及解决问题的推理方法,直接求解这个方程就可以了,可以得到x=6。但根据计算机的特点又如何解决吗?我们说过,计算机喜欢在大量的重复劳动中找到答案,所以,运用穷举法原理,让整数x0变到14,验证哪一个x满足条件2x+4(14-x)=44,如果满足条件,就输出,如果不满足条件,就继续判断。注意要将条件2x+4(14-x)=44改写成VFP表达式。源程序ex13_5.prg如下:

SET TALK OFF
CLEA
CLEA ALL
heads
= 14
feets
= 44
FOR x
= 0  TO heads
  IF  
2 * x + 4 * ( heads  - x) = feets
    
?    " 笼里的鸡和兔共有 " + STR(heads)
    
??   " 个头,共有 " + STR(feets) + " 只脚。 "
    
?    "       其中,鸡有 " + STR(x) + " "
    
??   " , 兔有 " + STR(heads - x)  + " "
  ENDIF
ENDFOR
RETU
 如果将这个程序进一步扩展,在程序开头,要求用户输入笼子里的鸡、兔的头与脚的数量,则程序运用范围更广一些。原程序可以改为 ex13_6.prg
SET TALK OFF
CLEA
CLEA ALL
INPUT 
" 笼子里鸡和兔的总头 数: "  TO h
INPUT 
" 笼子里鸡和兔的总脚 数: "  TO F
Y
= (F - 2 * h) / 2
x
= ( 4 * h - F) / 2
IF Y
< 0  OR x < 0
  
?   " 数据有错,不能作为鸡兔同笼问题! "
  RETU
ENDIF
heads
= h
feets
= F
FOR x
= 0  TO heads
  IF  
2 * x + 4 * ( heads  - x) = feets
    
?    " 笼里的鸡和兔共有 "  ;
      
+ ALLT(STR(heads))
    
??   " 个头,共有 "
    
??  ALLT(STR(feets)) + " 只脚。 "
    
?    "       其中,鸡有 "  ;
      
+ ALLT(STR(x)) + " "
    
??   " , 兔有 "
    
??   + ALLT(STR(heads - x))  + " "
  ENDIF
ENDFOR
RETU

思考:① 这里只加了一段输入数据的程序,并进行数据验证。这个验证是必要的,否则无法构成鸡兔问题了。请分析一下,程序中是根据什么原理来验证数据的?

ex13-5.prgex13_6.prg 两段程序在输出命令上有一些区别,试分析allt()函数的功能。

③ 除了ex13_6.prg中加有allt()函数外,两段程序的输出结果基本是相同的的,试比较两段程序中分别“;”和问号“??”的作用。

发布了24 篇原创文章 · 获赞 5 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/cdbqss1/article/details/1547232
今日推荐