5.17 自由练习题
5.8 判断对错,并说明原因。
a)比较指向两个不同数组的指针是没有意义的。
b)由于数组名是指向数组第一个元素的指针,因此数组名可以和指针一样进行操作:
5.9 回答下列问题。假设无符号整数存放在2字节中,数组的开始内存地址为 1002500
。
a)声明5个元素的 unsigned int
类型数组 values
,并将其元素初始化为2到10的偶数,假设已经将符号化常量 SIZE
定义为5。
b)声明指针 vPtr
,指向 unsigned int
类型的对象。
c)用数组下标符号打印数组valu~的元素。使用for结构,并假设已经声明整型控制变量i。
d)用两个不同语句将数组 values
的开始地址指定为指针变量 vPlr
:
e)用指针/偏移量符号打印数组values的元素。
f)用数组名作为指针和指针/偏移量符号打印数组 values
的元素。
g)用数组指针的下标打印数组values的元素。
h)用数组下标符号、数组名作为指针和指针/偏移量符号、指针下标符号和指针/偏移量符号引用values的元素5。
i) vPtr+3
引用什么地址?该地址存放什么值?
j)假设vPtr指向 values[4]
, vPtr-=4
指向什么地址,该地址存放什么值?
5.10 对下列各题,各编写一条语句。假设已声明长整型变量 value1 和 value2,value1 初始化为 200000。
a)声明变量 lPtr 为 long 类型对象的指针。
b)将变量value1的地址赋给指针变量lPtr。
c)打印lPtr所指的对象值。
d)指定lPtr所指对象值为变量value2。
e)打印value2值。
f)打印value1地址。
g)打印lPtr中存放的地址,打印的值是否与value1的地址相同?
5.11 根据题目要求编写语句。
a)编写函数zero的函数首部,取长整数数组参数bigIntegers,不返回数值。
b)写出a)中函数的函数原型。
c)编写函数addlAndSum的函数首部,取整数数组参数oneTooSmall并返回一个整数值。
d)写出c)中函数的函数原型。
说明:练习 5.12 到 5.15 比较难。完成这些练习后,就可以很容易地实现常见的扑克牌游戏了。
5.12修改图 5.24 的程序,使洗牌函数向牌手发五张牌,然后编写完成下列任务的函数:
a)确定手中是否有一对牌。
b)确定手中是否有对牌。
c)确定手中是否有三色同号牌(如三张J)。
d)确定手中是否有四色同号牌(如四张A)。
f)确定手中是否有同花(即五张牌花色相同)。
g)确定手中是否有一条龙(即五张牌牌号连续)。
5.13用练习 5.12 建立的函数编写一个程序,发两手五张牌,确定两手牌哪个更好。
5.14 修改 5.13 练习中的程序,模拟发牌器。发牌器的五张牌是盖起来的,游戏者看不到。然后程序求值这手牌,根据牌的质量,抓一张、两张或三张牌,换掉原来手中不要的牌。然后程序重新求值这手牌。注意:这是个难题。
5.15 修改练习 5.14 的程序,使其能自动处理发牌器中的牌,但游戏者可以确定自己手中要换的牌。然后程序求值两手牌,确定谁赢。用这个新程序与计算机玩20把,看看是你赢还是计算机赢。再让你的朋友与计算机玩20把,看看谁赢得多。根据这些游戏的结果,完善扑克游戏程序(又是个难题)。再与计算机玩20把,修改后的程序是否能够玩更好的游戏?
5.16 在图 5.24 的洗牌与发牌程序中,我们故意用无效的洗牌算法,引入无穷延迟的概念。在这个练习中,要生成高性能的洗牌算法,避免无穷延迟。
按照下面的做法修改图5.24。初始化 deck
数组(如图5.35)。修改 shuffle
函数,在数组中一行一行、一列一列地循环,到达每个元素一次。每个元素与随机选择的数组元素进行交换。打印结果数组,确定是否洗好了牌(如图5.36)程序可能要多次调用 shuffle
函数,才能洗好牌。
注意,尽管这个练习改进了洗牌算法,但洗牌算法仍然要从deck数组搜索第1张牌、第2张牌、第3张牌等等。更糟的是,即使在发牌算法找到并发出牌之后,该算法仍然搜索牌推中的其他元素。修改图5.24的程序,使发牌之后不再继续匹配这张牌,程序立即转入发下一张牌。
5.17 (模拟龟兔赛跑)本练习中要模拟龟兔赛跑的寓言故事。用随机数产生器建立模拟龟兔赛跑的程序。对手从70个方格的第1格开始起跑,每格表示跑道上的一个可能位置,终点线在第70格处。第一个到达终点的选手奖励一个新鲜萝卜和莴苣。兔子要在山坡上睡一觉,因此可能失去冠军。
有一个每秒钟滴答一次的钟,程序应按下列规则调整动物的位置:
动物 | 运动类型 | 时间百分比 | 实际运动 |
---|---|---|---|
乌龟(tortoise) | Fast plod(快走) | 50% | 向右3格 |
Slip(跌跤) | 20% | 向左6格 | |
Slow plod(慢走) | 30% | 向右1格 | |
兎子(Hare) | Sleep(睡觉) | 20% | 不动 |
Big hop(大跳) | 20% | 向右9格 | |
Big slip(大跌) | 10% | 向左12格 | |
Small hop(小跳) | 30% | 向右1格 | |
Small slip(小跌) | 20% | 向左2格 |
用变量跟踪动物的位置(即位置号1到70)。每个动物从位置1开始,如果动物跌到第1格以外,则移回第1格。
产生随机整数 1≤i≤10
,以得到上表中的百分比。对于乌龟, 1≤i≤5
时快走, 6≤i≤7
时跌跤, 8≤i≤10
时慢走,兔子也用相似的方法。
起跑时,打印:
BANG !!!!!
AND THEY' RE OFF !!!!!
时钟每次滴答一下(即每个重复循环),打印第70格位置的一条线,显示乌龟的位置T和兔子的位置H。如果两者占用一格,则乌龟会咬兔子,程序从该位置开始打印 OUCH!!!
。除 T、H 和 OUCH!!!
以外的其他打印位置都是空的。
打印每一行之后,测试某个动物是否超过了第70格,如果是,则打印获胜者,停止模拟。如果乌龟赢,则打印 TORTOISE WINS!!!YAY!!!
。如果兔子赢,则打印 Hare wins.Yush。如果两个动物同时赢,则可以同情弱者,让乌龟赢,或者打印It's a tie。如果两者都没有赢,则再次循环,模拟下一个时钟滴答。准备运行程序时,让一组拉拉队看比赛,你会发现观众有多么投入。