标签:
来源自:《数据结构与面向对象程序设计》
1、在选择恰当的子任务时,需要关注的两个问题是什么?
答:1)潜在的代码重用;2)将来更改程序的可能性
2、C++原型函数中包含哪些元素?
答: 函数的原型包含返回类型、名称、参数列表,并以分号结尾。
3、本习题将参照Jervis编写的一个函数,函数原型和前置条件/后置条件协议如下所述:
int data_check(int year,int month,int day){ //Precondition: The three parameters are a legal year,month, and day of the month. //Postcondition: If the given data has been reached on or before today, then the function returns to 0. //Otherwise, the value returned is the number of the day until the given data will occur.
假设使用语句date_check(2009,7,29)调用该函数。如果今天是2009年7月22号,那么函数的返回值是多少?如果今天是2009年7月30号呢?如果今天是2010年2月1号呢?
答:7,其他两个都返回0
4、编写一条断言语句,用于检查函数data_check中的变量month是否是一个有效的整数。
答:assert(month>0&&month<=12);
5、C++标准库中有一个工具<cmath>,该工具包含了一个具有如下原型的函数:
double sqrt(double x);
函数返回变量x的平方根。试为这一函数编写合理的前置条件和后置条件,并将答案与本章结尾给出的参考答案进行比较。
答:assert(x>=0);后置条件是返回x的正数平方根。
6、如果要使用自测习题5中的sqrt函数,试写出在使用该函数之前必须出现的include指令。
答:#include <cmath>
7、在使用任何C++标准库的内容之前,都必须出现一条using语句,试写出这一语句。
答:using namespace std;
8、编写一个程序,用于打印从英尺到公尺的转换表。使用温度转换程序作为程序设计的参考。
答:
#include <cassert> #include <cstdlib> #include <iomanip> #include <iostream> using namespace std; double inch_to_meter(double c){ return 0.3048*c; } void setup_cout_fractions(int fraction_digits){ assert(fraction_digits > 0); cout.precision(fraction_digits); cout.setf(ios::fixed, ios::floatfield); if(fraction_digits == 0){ cout.unsetf(ios::showpoint); }else{ cout.setf(ios::showpoint); } } int main( ){ const char HEADING1[] = " Inch"; const char HEADING2[] = "Meter"; const char LABEL1 = ‘I‘; const char LABEL2 = ‘M‘; const double TABLE_BEGIN = -50.0; const double TABLE_END = 50.0; const double TABLE_STEP = 10.0; const int WIDTH = 9; const int DIGITS = 4; double value1; double value2; setup_cout_fractions(DIGITS); cout<<"CONVERSIONS from "<<TABLE_BEGIN<<" to "<<TABLE_END<<endl; cout<< HEADING1 <<" "<< HEADING2<<endl; for(value1=TABLE_BEGIN;value1<=TABLE_END;value1+=TABLE_STEP){ value2=inch_to_meter(value1); cout<<setw(WIDTH)<<value1<<LABEL1<<" "; cout<<setw(WIDTH)<<value2<<LABEL2<<endl; } return 0; }
9、为什么说再检测到无效数据的最早时刻就该结束程序的执行是一种较好的程序设计。
答:早些结束程序并返回错误消息有助于使调试变得更加简单
10、如果要在程序中关闭所有的断言检查,最简单的方法是什么?
答:#define NDEBUG 应该出现在include指令之前
11、下面的每个表达式都是某一算法所需操作步数的计算公式。使用大O表示法表示出每个公式。
a.n2+5n e.5n+3n2
b.3n2+5n f.2n的数字位数
c.(n+7)(n-2) g.当n被10除时,在余数小于1.0之前所做的除法次数。
d.100n+5
答:a.O(n2), b.O(n2), c.O(n2), d.O(n), e.O(n2), f.O(lgn), g.O(lgn)
12、在下面的公式中,确定哪个公式是O(n):
a.16n2 c.n2/2的下整
b.n2+n+2 d.10n+25
答:d
13、什么是最坏情况下的时间分析?
答:用来计算执行函数所需要的最大操作步数。如果无法获得准确的操作步数,则可以估计一个操作步数,并确保估计值都比真实的操作步数的值要大。
14、对于如下所示的代码段,最坏情况下的大O分析是什么?
for(i=0;i<n;++i){
for(j=0;j<=i;++j){
z+=n;
}
}
答:总的操作步数是(n+1)n/2,具有O(n2)的时间复杂度
15、假设n具有非常大的数值,根据运行时间分析的结果,按照所需时间从小到大的顺序,重新排列下面的公式:
n2+1; 50logn; 1,000,000; 10n+10,000
答:1,000,000 < 50logn < 10n+10,000 < n2+1
16、编写一个函数,利用循环来计算从1到n之间所有整数之和。对该函数进行时间分析,将每个基本操作(例如赋值和++操作)记为一个操作。
答:
int sum(int n){ int answer,i; answer=0; for(i=1;i<=n;++i){ answer+=i; } return answer; }
17、试列举恰当的测试数据应该具有的两个属性。
答:知道器正确输出的测试数据。测试输入应该包括那些最有可能导致错误的输入。
18、在前文的函数data_check中,对于day变量,应该使用何种边界值作为测试输入。
答:应该选择28,29,30,31作为边界值。代表一个月所具有的天数。此外,1作为最低的边界值,27作为非一个月中天数的最大值,两者都应该加以测试
19、假设程序的输入为-20到20之间的任何整数,程序的输出是输入的整数所具有的数字位数。应该使用何种边界值作为测试输入?
答:一般来说,0,1,-1总是作为边界值。在这个问题中,-20(最小值)和20(最大值)也是边界值。9和10(因为数字在这里从一位变为两位数)、-9和-10也是边界值。
20、完全代码测试的两个规则是什么?
答:确保代码中的每一行都使用测试数据至少执行了一次。如果代码的某一段有时会被完全跳过,则应该确保至少有一个测试输入真正地跳过这段代码。
21、假设程序接受单行作为输入,然后输出一则消息,表明输入行中是否含有字母A,而且消息还将指明输入行中是否含有超过3个以上的字母A。对于这个程序,恰当的测试输入集是什么?
答:一个空行和分别含有0、1、2和3个A的行。还要包含一个含有4个A的行和超过4个A的行。对于含有1个或多个A的行,应该包括仅含有A的行和同时含有A和其他字符的行。此外还应该测试A出现在行首和行尾的情况。
22、试描述profiler和调试器如何帮组完成程序的测试和调试。
profiler能够保证代码被完全测试(通过输出每一行代码被执行的次数)。一旦发现一个错误,调试器通过显示代码行中的变量在某一时刻的值,能够帮助跟踪错误发生的原因。
标签:
原文地址:http://www.cnblogs.com/holt/p/4435925.html