2.11 编程(www.cppentry.com)习题
在如下编程(www.cppentry.com)习题中,尽可能地使用本章所介绍的C++(www.cppentry.com)特性。例如,使用C++(www.cppentry.com)注释(//),而不是C注释(/* */),使用C++(www.cppentry.com)输入/输出库等。
2-1 编写一个程序,从标准输入读入整数直到文件结束,然后打印出最大值和最械。
2-2 编写一个echo程序,将标准输入直接送到标准输出,除非每一个tab被一定数目的空格代替。如果用户没有指定tab的宽度,假设tab的宽度为8。
2-3 设计一个函数db1,它拥有一个int类型参数,该函数将传入的参数乘以2,并且通过引用传递。例如,
编写一个调用db1的main函数来演示db1的工作情况。
2-4 结构
表示的是二维float数组,用r和c标记行和列a是一维r*cfloat数组。编写函数main、val、get_twodim和free_twodim。
函数get_twodim拥有一个引用方式的twodim类型参数,传值为int类型的row和col。get_twodim将传入的row赋给r,col赋给c,并且动态地确定数组大小为r*c float个单元,然后将数组的第一个元素的地址赋给a。
函数val拥有一个引用方式的参数c,传值方式的参数i和j,并以引用方式返回元素x.a[i*r+j]。
函数free_twodim拥有一个引用方式的twodim类型参数,该函数释放a指针所指的存储空间。
函数main调用get_twodim来创建3×4大小的二维数组。对于i和j,main通过反复调用函数val将值2.5*i*j赋给元素i,j;然后,main通过反复调用函数val,并应用cout打印所有元素的值;最后,main调用free_twodim释放a指针所指的存储空间。
2-5 设计一个函数print_str,功能如下:如果使用一个string类型参数s调用print_str,若s的长度不大于10,该函数打印s;若长度大于10,打印s的头十个字符。如果使用一个string类型参数s和一个整形参数n调用print_str,若s的长度不大于n,则该函数打印s;若长度大于n,则打印s的头n个字符。
编写一个main函数,通过多次调用print_str来演示print_str的工作状况。
2-6 给定如下代码:
设计一个函数print,当使用一个numeric参数调用print时,该函数输出结构a中的10个long型数字,每个数字占用一行;当使用一个string类型参数调用print时,该函数直接输出string字符串。
2-7 为例2-64添加一个reverse_elephant函数,该函数接收一个链表,并改变链表中节点的排列顺序,然后返回修改后链表的第一个节点的地址。修改main函数,并多次调用reverse_elephant,以测试reverse_elephant是否工作正常。
2-8 公式
用来预测朱喙蜡翅鸟在下一年度的总数,预测方式以目前的总数和其繁殖率为基础。变量Rate代表繁殖率,鹊在1~4之间,变量CurrentYr为目前的总数,假设其鹊范围是1~1 000 000。变量NextYr是下一年度朱喙蜡翅鸟的预计总数,本公式确保下年度的总数也介于1~1 000 000之间。例如,如果当前数目为100 000,而繁殖率为2.6,则下年度预计总数为234 000。
现在假设当前数目为100 000,繁殖率为2.6,如果要计算25年后朱喙蜡翅鸟的数目,可将下年度的NextYr作为第三年度的CurrentYr,从而得出25年后的数目为615 385。有趣的是,如果当前数目为900 000,而保持繁殖率为2.6不变,25年后的总数仍然是615 385。事实上,只要繁殖率为2.6,无论CurrentYr为多少(1~1 000 000之间),25年后的数目总是615 385左右!也就是说,在繁殖率为2.6时,CurrentYr将会收敛。如果繁殖率取其他值,CurrentYr的值将处于震荡状态。例如,若繁殖率为3.14,那么,40年后朱喙蜡翅鸟每年的数目将在538 007、780 464、538 007、780 464之间震荡。而若繁殖率为3.57,朱喙蜡翅鸟的数目既不收敛也不震荡,将处于一种随机变化状态。
编写一个程序,提示用户输入繁殖率Rate、当前数目CurrentYr和统计年数,然后计算每年朱喙蜡翅鸟的数目,并输出年份及当年的数目。
2-9 模拟Monty Hall 猜谜游戏,该游戏来源于电视节目Let誷 Make a Deal,游戏规则如下:游戏中设有三扇门,其中一扇门后是一辆汽车,另外两扇门后各有一头山羊。游戏参与者首先选择其中一扇门,然后,节目主持人将另外两扇门中藏有山羊的那扇打开(由于有两头山羊,不管游戏参与者如何选择,节目主持人总是可以打开一扇藏有山羊的门),并给游戏参与者一次改选的机会。这样,游戏参与者实际上有三种不同的选择方式:
维持原先的选择不变。
随机决定是维持原先的选择还是选择另一扇门(例如抛硬币作决定)。
直接选择另一扇门。
模拟程序运行时,提示用户输入其所作的决定以及用户希望的游戏次数。程序使用随机数产生器来决定汽车在哪扇门后面以及用户最开始选择的是哪扇门。若用户采用上述的第二种选择方式,程序随机选择是维持原决定还是换另一扇门。程序将用户玩的次数和获胜概率打印出来(若用户选择了藏有汽车的那扇门就算胜利)。在运行程序之前,请猜测一下你认为上述三种方式中哪种方式最好,程序运行结果可能会让你大吃一惊(有关Monty Hall 猜谜游戏的技术讨论参见L. Gillman所撰论文《The car and the goats》,Amer. Math. Mo. 99(1992): 3-7)。
2-10 本练习基于Lewis Carroll系统,其目的是进行文本编码和解码。我们采用ASCII码字符。编码和解码使用下表:
上表中,代表表头的那一行按顺序列出了可打印的ASCII码字符,从空格b1到鳎 铰糀)。表内的第一行与表头相同,下面每一行都与其上一行的内容相同,只是字母向左移动了一个位置。这样,下面每一行的最后一个字母与上一行的第一个字母相同。
为了进行文本编码,可以任意选择一个字符串,称为一个编码字符串。为解释编码方法,我们假设编码字符串是Walrus,需要进行编码的文本是:
空格之外的字符不进行编码。我们在待编码的文本之上重复书写上述编码字符串,使得编码字符串的长度与待编码文本的长度相同:
从上述两行文本中按列对应方式依次提取一个字符,可得到多个字符对:WM、ae、le等,这些字符对可用作上表的索引。这样,依次以这些字符对为索引可从上表中查到一系列字符,这些字符就构成了文本编码。例如,第W行第M列对应的字符是%,因此编码的第一个字符就是%;第a行第e列对应的字符是G;第l行第e列对应的字符是R。依次进行上述查找操作,可得到完整的编码
进行相反的操作就可对该文本解码。
编写一个程序,可提示用户进行编码、解码或退出操作。如果用户选择编码或解码操作,再提示用户输入一个编码字符串、需要进行编码的文本文件名以及编码后的输出文件名。