第7章练习
  1. 把前面用数组方式定义的一些函数改写为用指针运算的方式定义。


  2. 把前面练习中定义的各种求根函数改写为使用函数指针的函数。


  3. 写一个程序,其命令行包括一个字符串参数,运行中由标准输入读入一系列正文行。该程序把所有输入行依次输出,并在那些包含字符串的行前面标一个星号。


  4. 1)写一个函数,它检查两个字符串是否由同样一些字符组成。2)写一个函数,它判断一个字符串是不是可以由另一个字符串通过重排字符而得到,例如,dare,read和dear都有这种关系。


  5. 1)修改第五章的猜数程序,通过命令行参数为它提供数的范围。2)将前面的某些程序改造成为使用命令行参数的,通过命令行为程序提供运行的数据。


  6. 矩阵是数值计算中最常用的结构之一,在程序里可以很自然地采用两维数组表示。请按照本章提出的处理两维数组的通用函数的技术,写出几个通用函数实现矩阵的常用操作,包括数乘、矩阵加法、矩阵乘法、矩阵转置、行列式求值等。(提示:实现矩阵行列式的求值请采用消去法(高斯消去法),将矩阵变换为三角矩阵后完成计算。)


  7. 利用函数指针功能,写出利用梯形法求数值积分的函数。


  8. 辛普生方法是用二次曲线逼近被积函数的数值积分方法,有辛普生公式:

    积分区间划分为2m个等分小区间,。用函数指针实现按这一公式计算数值积分的函数,请考虑采用能根据情况自动调整区间分割数的方法。



  9. 魔阵是由1这些整数排成方阵,其中每一行、每一列和两个对角线上的数之和相同。写程序构造出3阶和4阶的魔阵。

    下面是一个构造奇数阶魔阵的通用算法:首先把1放在第一行中间。当数k放好后,考虑数k+1的安放,总把它放在向上一行、向右一个位置。下面是各种特殊情况的处理:

    1)要从最上一行向上,那么就转移到最下一行;2)要从最右一列向右,那么就转移到最左一列;3)如果企图放数的位置已经有了数,那么就把这个数放在它前面一个数的下面。

    写程序实现这个算法。另外写一个函数,它能检查一个n阶方阵是否为一个魔阵。



  10. 写一个小游戏程序,它内部存储着一些英语单词(在写程序时给定单词集合)。程序运行中每次由这些单词中随机地选出一个,要求游戏者猜。做游戏者反复询问某些字母是否出现在单词里面,程序给出回答。直至人猜出这个单词(或者放弃)。


  11. 修改前一题提出的猜单词程序,设计实现某种较好的选词策略和提示策略。


  12. 写一个函数select(int n, double a[], double b[], double x),它将数组b中大于等于x的数顺序复制到数组a中。假定n是两个数组的大小。请分别用数组写法和指针写法完成这一工作。


  13. 写一个程序,它可以输入并保存至多100个长度不超过80个字符的字符行。在读完所有的输入之后,它先输出其中长度不超过40个字符的行,而后输出其他行。考虑下面两种实现方式:1)用两维字符数组保存字符行;2)用一个字符指针数组,将字符行保存在通过动态分配的存储块里。


  14. 完善本章中处理任意数量学生成绩的程序,完成文中提出的各种改造,并加入你所设想的合理的进一步改造。


  15. 修改7.6节的筛法程序,将分配数组的工作移到实现筛法的函数sieve里,使它返回做好的数组,并对主函数做适当改造。从程序的清晰性和功能分配的合理性等方面比较这两种实现方式。


  16. 请定义:1)一个数组类型,该类型的数组包含10个元素,其元素是函数指针,被指函数都是有一个double参数并返回double值(请直接定义,并将写出的定义与借助于MFP的定义做一个比较);2)一个函数的原型说明,它的参数是一个指向“数学函数”的指针和一个double,返回值是指向数组的指针。这种数组中包含着12double值(请分别采用直接的方式和预先定义其他类型的方式定义它)。


  17. 多项式可以数组表示,例如用一个n+2个元素的整数数组a表示一个n次的整系数多项式,其中的在a[0] 中保存多项式最高次的次数(由此也可以决定多项式的项数),其余元素顺序表示一个多项式的0次项、1次项、2次项等等的系数,多项式的变量隐含假定为x。这种数组可以通过动态存储分配创建。请基于这种表示方式实现一元多项式的输入(自己设计一种输入方式,输出可尽可能采用类似数学中的表示形式(例如输出为3+2x+4x^2,系数为0的项不输出)。请进一步实现各种多项式运算,完成一个简单的一元多项式计算系统。


  18. 假定所用C语言支持的整数类型long32位)无法满足目前应用的需要,我们需要一种64位的整数。请设法利用现有的功能实现64位整数的表示、输入、输出和计算。