编程基础:代码设计与测试要点

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;
}

时间分析:

  1. 初始化 sum = 0 为 1 个操作。
  2. 初始化 i = 1 为 1 个操作。
  3. 每次循环中, i <= n 的比较操作、 sum += i 操作和 ++i 操作,每次循环共 3 个操作,循环执行 n 次,共
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值