第9章练习
  1. 请定义如下计算平面点与其他图形之间关系的函数:
    1. 计算一个点是否在一个圆之内;
    2. 计算一个点与一个圆之间的距离(该点与圆周上最近一点之间的距离);
    3. 判断一个点是否在一个矩形内部;
    4. 计算一个点与一个矩形之间的距离(该点与矩形上最近一点之间的距离);
    5. 计算两个圆之间的距离(如果相切或者互相有重叠则认为距离是0);
    6. 计算两个矩形之间的距离;
    7. 计算一个矩形与一个圆之间的距离。

  2. 定义一个表示时间的结构(包括时、分、秒成员)类型,定义由这种类型的参数计算总秒数的函数。


  3. 定义一个表示日期的结构类型,然后定义下面函数:
    1. 由这种类型计算一天是该年的第几天的函数(注意闰年问题);
    2. 比较两个日期的大小的函数;
    3. 计算两个日期的天数差的函数;
    4. 定义以一个日期和一个天数为参数的函数,它能算出某日期若干天之后的日期;
    5. 定义计算某日期之前若干天的日期的函数;
    6. 其他你认为重要的日期函数。
    用这些函数计算:到本世纪末还有多少天,今天是本世纪的第多少天,你自己已经生活了多少天,离你的下一个生日还有多少天,你最近的生日与今天的天数差,从孔子出生到今天已经有多少天,等等。


  4. 定义几个比较两个身份证大小的函数:以出生年月日作为标准;以身份证号作为标准,以姓名的编码作为标准。考虑应该使用结构参数,还是使用结构指针参数。


  5. 完成正文中设计实现的复数结构及其相关函数,再为它增加一些有用的函数。设计一个交互式的复数计算系统界面主函数。


  6. 以两个整数为成员的结构可以表示有理数。定义计算这种有理数加、减、乘、除运算的函数。函数的返回值如何定义比较合理?


  7. 开发一个小型信息查询系统。当这个系统运行时,人输入一个城市的名字(拼音),它就能给出由你所在城市到所输入城市的铁路距离,火车票价。(如果要求的是对输入的一对城市给出有关信息,你能够完成这个小系统吗?)


  8. 考虑定义一个计算台球位置的函数,这个函数的一个参数应当是一个表示台球状态的结构,其成员至少包括:台球直径、当前位置,速度向量。把台球桌的大小作为程序常量,定义计算t时间后台球状态的函数。进一步考虑桌面阻力因素和台球桌边沿的弹性系数,修改前面定义的函数,使其能够更好地反映现实世界的情况。考虑利用这个函数做一个有趣的程序实例。


  9. 完成正文中基于结构的学生成绩处理程序。提供按照成绩排序输出的功能。


  10. 完成正文中的账目管理系统。


  11. 对你所完成的账目管理系统做一些扩充,例如:
    1. 增加用直方图形式显示账目变动曲线的情况,可以考虑按时间周期的收入情况、支出情况和余额情况等。
    2. 增加对本次处理的一系列账目的总的统计。
    3. 提供对一段时期的各种情况的统计功能。
    4. 采用动态存储管理的方式分配账目"数组",保证能够处理任意大小的账目。

  12. 对你所完成的账目管理系统做一些修改,使用户在启动程序时可以通过命令行参数提供一批文件名,程序在启动后自动装入这些文件里的账目记录,而后接受用户命令完成各种统计工作。增加一个命令,使程序可以要求新文件,并将新文件的内容附加到程序已经装入的账目条目之后。再增加一个命令,使程序可以将程序里当前保存的账目全部输出到用户指定的文件里。


  13. 修改账目管理系统,使它在每次启动后首先去查看名字为account.sav的文件。如果这个文件存在,本系统就将列在该文件里的账目装入。用户提供的其他文件的内容都附加在程序里已有账目内容之后。在程序结束时将当时数组里保存的账目重新存入上述文件,以备本程序下次再用。注意,请在保存之前将整个数组按照日期排序。


  14. 参考上面的账目管理系统,设计一个学生成绩管理系统。它应该能:
    1. 启动时自动读入一个学生成绩文件。
    2. 读入新的学生成绩文件,并将其中的成绩记录在有关学生的原有成绩记录之后(可以假定每个学生总共的课程数不超过某个事先定义好的常量,因此一个学生的所有成绩可以存在一个数组里,作为学生记录的一部分)。这里可能出现新的学生和新的课程;
    3. 每次运行完成后能将程序中所有学生成绩记录保存到将来能自动读入的文件。
    4. 增加各种有用的统计输出功能。(在完成这一工作时,可以考虑或者不考虑课程名。如果考虑课程名,可以维持一个课程名与成绩记录位置的对照表)。

  15. 扩充正文中的单词统计程序,使之能处理任意长度的单词。(提示:请考虑用动态分配的存储块保存单词)


  16. 如果文件中的单词很多,记录它们的链接表就会非常长,查找确定一个单词所需的时间也会大大增加。考虑下面的改进技术:
    1. 定义一个指针数组LINK table[21],数组里的每个指针指向一个结点表;
    2. 将长度为i的单词都存入指针table[i]所指向的表里(table[0]闲置);
    3. words[20]里保存长度大于等于20的所有单词。
    这种方式可以减少程序处理每个单词所需的时间。请采用这一技术重新实现单词计数程序。通过处理很大的文本,比较这一实现与本章正文中的实现的执行情况。


  17. 在实现单词计数时(假设为英文单词)考虑下面的改进技术:
    1. 定义一个指针数组LINK table[26],数组里的每个指针指向一个结点表;
    2. 按照单词的首字母将读入的单词分别存入指针数组table的不同元素所指向的链接表里,在读入单词后查找存入表之前将单词里所有大写字母改为小写字母。
    通过处理很大的文本,比较这一实现与本章正文中所提出的实现的性能。