1、选择好的子任务有哪两个考虑因素?
选择好的子任务有两个考虑因素:代码复用的潜力和程序未来变更的可能性。
2、本题涉及 Jervis 编写的一个函数。函数原型和前置/后置条件契约如下: int date_check(int year, int month, int day); 三个参数分别为合法的年、月和日。如果给定日期在今天或之前已经到达,函数返回 0;否则,返回距离给定日期还需的天数。假设调用函数 date_check(2009, 7, 29) ,若今天是 2009 年 7 月 22 日,返回值是多少?若今天是 2009 年 7 月 30 日呢?2010 年 2 月 1 日呢?
若今天是 2009 年 7 月 22 日,函数返回 7;
若今天是 2009 年 7 月 30 日和 2010 年 2 月 1 日,函数返回 0,因为 2009 年 7 月 29 日已过去。
3、其中一个库是 工具库,它包含一个原型为double sqrt(double x);的函数。该函数返回x的平方根。为这个函数编写合理的前置条件和后置条件。
- 前置条件 :x 是一个大于或等于 0 的双精度浮点数(即 x >= 0),因为负数没有实数平方根。
- 后置条件 :返回值是 x 的平方根,是一个双精度浮点数。
4、写出在使用 sqrt 函数之前必须出现的包含指令。
#include <cmath>
较旧的编译器可能需要使用
#include <math.h>
代替。
5、在使用 C++ 标准库中的任何项目之前,必须出现的 using 语句是什么?
using namespace std;
6、为什么在检测到无效数据时尽早停止程序是个好主意?
当检测到无效数据时,不立即停止程序可能会导致以下问题:
- 程序继续使用损坏的数据进行计算;
- 最终在实际错误发生很久之后才崩溃;
- 或者默默地产生错误的答案。
这将导致 追踪错误实际位置时可能需要进行困难的调试工作 。
相反,在 最早检测到无效数据时就让程序产生错误消息 ,将使 测试和调试变得更加容易 。
7、在程序中关闭所有断言检查的最简单方法是什么?
在程序的包含指令之前立即放置语句“#define NDEBUG”。
8、以下每个式子都是某个算法的操作次数公式。请用大O表示法表示每个公式。a. n² + 5n e. 5n + 3n² b. 3n² + 5n f. 2n的位数 c. (n + 7)(n – 2) g. n在小于1.0之前能被10除的次数 d. 100n + 5
以下是将给定文本内容调整为markdown格式的结果:
- a. O(n²)
- b. O(n²)
- c. 展开(n + 7)(n – 2) = n² + 5n - 14,为O(n²)
- d. O(n)
- e. O(n²)
- f. 2n的位数为O(log n)
- g. n在小于1.0之前能被10除的次数为O(log n)
9、确定以下哪个公式的时间复杂度是O(n):a. 16n³ b. n² + n + 2 c. 10n + 25
c
10、最坏情况分析是什么意思?
最坏情况分析
当对于给定大小的输入,不同的可能输入会导致不同的操作次数时,通常计算给定大小输入所需的最大操作次数。这种计算最大操作次数的分析方式称为 最坏情况分析 。
在最坏情况分析中,如果无法精确计算操作次数,可以进行估计,但要确保估计值偏高,即实际操作次数必须始终小于分析中使用的估计值。
11、假设n非常大,按运行时间分析,将以下公式按时间要求从大到小排序:n² + 1;50 log n;1,000,000;10n + 10,000。
n² + 1 > 10n + 10,000 > 50 log n > 1,000,000
12、编写一个使用循环计算从 1 到 n 的所有整数之和的函数代码。进行时间分析,将每个基本操作(如赋值和 ++)视为一个操作。
以下是实现该功能的 C++ 代码:
#include <iostream>
int sumFrom1ToN(int n) {
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i;
}
return sum;
}
时间分析:
- 初始化
sum = 0为 1 个操作。 - 初始化
i = 1为 1 个操作。 - 每次循环中,
i <= n的比较操作、sum += i操作和++i操作,每次循环共 3 个操作,循环执行 n 次,共

最低0.47元/天 解锁文章
169万+

被折叠的 条评论
为什么被折叠?



