练习
  1. 检查你所用的C语言系统,弄清其中各种数值类型的表示范围。


  2. 利用字符分类函数,写一个程序统计一个文件里出现的十进制整数的个数。另写一个程序统计文件中出现的十六进制整数的个数。


  3. 一对实数可以表示平面上一个点的坐标。一系列实数对,当数对的第一个值为递增时,将它们表示的平面点连接,可得到一条与 x轴同方向的折线。由一条这种折线、该折线两端引x轴的垂线、x轴本身能够形成一个封闭区域的边界。写一个程序,它接受一系列由标准输入得到的数对,计算出该区域的面积。用一对零(两个0.0)表示输入结束。假定输入的数对中x值总是递增的,y的值均不为负。如果y值可以为负,修改程序使它也能计算正确。


  4. 定义函数判断一个点与坐标原点的距离是否小于1,是否在单位圆内。写一个通过蒙特卡罗方法计算圆周率值的程序:每次计算随机生成两个01之间的实数(利用标准库随机数生成函数产生这种实数),看这两个值形成的点是否在单位圆内。生成一系列随机点,统计单位圆内的点数与总点数,看它们之比的4倍是否趋向值。生成100200、…、1000个数据点做试验。


  5. 1)利用本章字符图形的基本函数,写出打印实心和空心三角形、正方形、六边形的通用函数(设计适当的参数)。设法写出能打印出空心和实心圆形(或者椭圆形)的函数。

    2)利用本章有关字符图形的基本函数,定义一些画各种字符图形的有用的功能函数,并利用它们画出一些你所感兴趣的图形。

    3)改写上述函数,使它能用某个由参数给定的符号做输出。改造上述函数,使利用它能够用字符A在若干输出行中拼出一个大的A。对其他几个字母、数字做同样的事。



  6. 修改正文中的函数format,使它带一个参数n,并能以n次调用形成一个周期,前n-1次调用各输出一个空格,第n次调用输出一个换行符。


  7. 设计一些程序,设法检查5.4.5节定义的random函数的随机性是否令人满意。


  8. 写出一些数学函数的定义,并用它们和你自己确定的区间去试验5.4.7节中定义的求根函数。检查所得到的根是否令人满意。


  9. 请实现一积分函数,使它能求出一个定义好的数学函数在某区间的数值积分值。试采用矩形方法、梯形方法,考察它们在不同分割情况下的表现,加细分割对积分值的影响。用不同的数学函数试验程序。如果函数在积分区间出现奇点,程序将出现什么问题?考虑有什么处理办法。


  10. 用牛顿叠代法求方程 的根的迭代公式是:,公式里的 的微商。由某个初始值 出发,反复使用上面公式可以求出方程根的近似值。

    二分法求根的初始情况与弦线法类似,也是从两端点函数值异号的一个区间开始,每次求出区间中点,从中点函数值的符号决定取左边半区间还是右边半区间作为缩短的区间。不断重复这个手续,直到得到满意的结果。

    写出用牛顿叠代法、二分法求函数根的函数。用它们求一些方程(多项式方程或包含超越函数的方程)在某点附近或某对点之间的根。考察方程情况与循环次数的关系(这就需要统计程序循环执行的次数)。


  11. 请写出如下程序:

    1)统计输入文件(由标准输入得到)的行数和空格数。

    2)分别统计输入文件里的元音字母和辅音字母。

    3)分别统计输入文件里的非空白字符个数和非空的行数。

  12. 写出如下几个程序,完成从标准输入到标准输出的复制:

    1)在遇到的连续空格字符时只输出一个空格字符。

    2)每个词放在一行。

    3)把输入中的每个tab字符换成4个空格字符。

    4)把输入中的连续4个空格字符换成一个tab字符。

  13. 写出下面的处理C语言源程序的程序,它们都由标准输入取得信息(通过重新定向可以把C源文件送给这些程序),结果送到标准输出。注意,在被处理程序里可能出现注释、字符串常量(如"/*")、字符常量(如'"')、字符或者串字符里的换义字符(例如字符串"Here the \" is not the end of a string")等,应当考虑如何处理。编译加工各程序转换的结果,以检查程序的正确性。

    1)写程序读入C源程序,向标准输出写删除程序中所有的注释后的结果。

    2)写程序删除C程序中所有无用字符,使其达到最短并保持程序意义不变。

    3)修改前面完成的统计C源程序中标识符总个数的程序,考虑程序中的注释、字符串、字符常量等的影响,保证函数统计结果的正确性。

  14. 要取得0n - 1的随机数,一个可能的办法是用表达式rand() % n。这种方法得到的数足够随机吗?取n值为234等做试验。如果在某种情况下得到的结果不够随机,请设法找出一种利用能rand()得到令人满意的随机数的方法。


  15. 请写出函数int setbits(int x, int p, int n, int y),它求出把整数x从左端数第p位开始的n个位用y的最右边n个位替换,而其他的位都不变,得到的整数。


  16. 请写出函数int right_rot(int x, int n),它求出将x向右方向循环移n位得到的数(右循环移位:总把从右端移出的位值填补到左边空出的位)。


  17. 请设计一些加密和解密方法,并定义出相应的加密程序和解密程序。注意:由于加密和解密是将产生出变换后的字节编码,有时你会遇到一些奇怪的现象。例如,你的加密程序可能将某个字符转换成换行符号或者制表符。另一更特殊的情况是,将某个字符转换成了文件结束符。这些都可能导致你无法正常显示文件的内容,或者影响你的解密程序的正常运行。要克服文件结束符带来问题,请用feof函数判断文件结束(要想这样做,请阅读本书后面有关文件处理的讨论)。


  18. HTML网页中有一部分是真正的网页信息内容,另外有大量的形式是由一对“<”和“>”括起的HTML标注。(1) 请写一个程序,它能删除由输入得到的HTML网页里的所有标注,只留下基本信息。(2) 设法留下原页面里的换行信息,使得到的结果更容易读。


  19. HTML网页里常常有一些对其他网页的链接。请写一个程序,它能抽取出网页中所有的链接,一行一个地显示出来。