本章的练习主要是写各种循环,包括逻辑控制的循环,计数循环,实现一系列输入的循环等等。后面一些练习是为了帮助读者学习正确写出带有输入的程序。本章最后给出的程序模式都很有用,请注意借鉴。 4.1节讨论了写循环的技术。对具体问题还需注意循环中数据项的计算。有时可能需要写两重或多重循环。这时的思考方式是从全局到局部,先规划好外层循环的过程,把内层循环看作一个抽象操作。外层循环写好后,再考虑抽象操作的实现,有时需要用循环实现,自然就形成了两重或者多重循环。有些题目中的循环项可以递推,利用这一关系可以把两重循环简化为一重循环,提高计算的效率。这种技术也很值得注意。 在学习写循环程序的同时仍要注意函数定义。下面一些题目的提示中提出了相关的建议。在学习基本程序设计的阶段,最重要的问题就是掌握定义函数的技术,学会在不同的抽象层次上考虑如何写程序,如何把复杂的程序工作分解为若干较为简单的工作,通过定义和调用函数完成整个程序。
|
习题 | 题目和讨论 |
4 | 写函数计算 1! + 2! + ... + k!。用主函数试验函数对一系列k值计算出的结果。你写出的函数对1到10计算结果都正确吗?如果出现错误,弄清楚是什么原因。这个程序能对k = 30得到正确结果吗?(另外,你能只用一重循环完成函数的定义吗?)
提示和讨论:
|
8 | 请
|
10 | 下面序列收敛很快:
请写一个程序,根据这个序列计算 π 的近似值。而后做与上一题类似的试验。
提示和讨论: 如果仔细观察,可以发现从第2项开始的各项可以递推计算:
|
13 |
考虑不用函数(例如isprime)直接写出对6~200的偶数验证哥德巴赫猜想的程序(利用循环、条件、break语句等,不使用goto语句)。将这样写出的程序与用定义函数的方式写出的程序比较。例如考察两个函数的行数、字节数,其中各种控制结构的嵌套深度,控制结构使用的个数等。 讨论:这个题目就是为了帮助学生体会函数定义的重要性。 |
17 |
对一个整数,如果其所有因子(包括因子1在内)之和正好等于这个数,那么就称它为"完全数"。因子之和小于自身的数称为"亏数";因子之和大于自身的数称为"盈数"。写一个函数,当其参数是亏数时返回负值,是完全数时返回0,是盈数时返回正值。利用这个函数求出1000以内的所有完全数(实际上只有1、6、28、496)。 为这个程序计时:从100开始每隔100做一次计算,写一个循环,输出各次计算花的时间。再从1000开始,每隔1000做一次计算直到10000为止,输出对程序执行计时的值。利用所定义的函数对一段区间的整数做一个分类,输出其中各个数所属的类。
提示和讨论:
|
21 |
假设程序由输入得到的一系列正实数是一条折线在 x 等于 0,1,2,… 的对应值(数据的数目事先并未确定),请求出这一折线与 x 轴之间区域的面积。 提示和讨论: 写一个循环取得一串输入的数。自己规定一种判断输入结束的方法,例如用文件结束符,或者用输入负数表示结束,程序里检查是负数就结束循环。最后输出总和的面积。 注意:要求出由先后两个值界定的区域的面积,必须用一个变量(如 x)接受输入,用另一个辅助变量(如 y)保存前一次输入的数。每次计算完一块面积并加入总和后,将新输入的数存入辅助变量 y 保存起来。 |
23 |
改造本章正文中讨论的计算器程序:
提示和讨论:
|
24 |
仿照本章正文中的单词统计程序,写一个统计C程序里标识符个数的程序。在程序里可以利用标准库提供的字符分类函数: int isalpha(int c) 当c是字母的编码时,返回非0值; int isdigit(int c) 当c是数字的编码时,返回非0值。
使用这两个函数时,应在程序文件前部写 #include
提示和讨论: |
本页由裘宗燕建立和维护。 这里的材料可自由用于个人学习和教学活动。其他使用必须得到裘宗燕书面许可
EMAIL:qzy@math.pku.edu.cn | 通讯地址:100871,北京大学数学学院信息科学系 |