5.2 程序开发
现在你应该可以阅读并理解一个完整的C++函数了。但是到底怎么设计函数可能还不清楚。我会马上介绍增量开发技术。
举个例子,假设要计算两点之间的距离,其中两个点分别用坐标 (x1, y1)和(x2, y2)表示。按照定义, 第一步要考虑的是,在C++中距离函数应该如何表示,也就是要确定函数的输入(即参数)和输出(即返回值)。
在这个例子中,两个点就是参数,很自然,可以用四个double值表示。返回值就是距离,也是double类型的。
我们已经可以写出这个函数的轮廓了:
double distance (double x1, double y1, double x2, double y2) {
return 0.0;
}
返回语句只是用于占位,以便函数通过编译并返回一个值,即使这个值是不正确的。眼下这个函数并没有做什么有用的事情,但尝试编译一下这个函数还是值得的,因为这样可以在函数变得更复杂之前发现任何语法错误。
为了测试这个新函数,我们必须使用样本值值调用它。在main函数的某个位置我添加了下面语句:
double dist = distance (1.0, 2.0, 4.0, 6.0);
cout << dist << endl;
我选择这些值,这样两个点的水平距离是3,垂直距离是4;那样,距离就是5(3-4-5直角三角形的斜边)。测试函数时,知道正确答案是有用的。
一旦函数定义的语法验证无误,我们就可以开始一次一行的添加代码了。每次增量改变,我们都重新编译并运行程序。这样,在任何点我们都能精确地知道错误的位置——肯定是在我们最后增加的代码中。
计算的下一步就是求出x2−x1和y2−y1的差。我会把这些值存在临时变量dx和dy中。
double distance (double x1, double y1, double x2, double y2) {
double dx = x2 - x1;
double dy = y2 - y1;
cout << "dx is " << dx << endl;
cout << "dy is " << dy << endl;
return 0.0;
}
我添加了输出语句,在继续之前先验证中间值。前面提到过,我们已经知道这两个值应该是3.0和4.0。
函数完成之后我会删除输出语句。这样的代码称为支架代码,因为它虽然有助于构建程序,但并非最终产品的组成部分。有时保留支架代码,仅将其注释掉是个好想法,以防后面再用到。
开发的下一步就是求dx和dy的平方。我们可以使用pow函数,但更简单快捷的方法是通过每一项自乘来计算。
double distance (double x1, double y1, double x2, double y2) {
double dx = x2 - x1;
double dy = y2 - y1;
double dsquared = dx*dx + dy*dy;
cout << "dsquared is " << dsquared;
return 0.0;
}
现在,再次编译运行程序,并检查中间值(它应该是25.0)。
最后,可以使用sqrt函数计算并返回结果。
double distance (double x1, double y1, double x2, double y2) {
double dx = x2 - x1;
double dy = y2 - y1;
double dsquared = dx*dx + dy*dy;
double result = sqrt (dsquared);
return result;
}
然后,我们应该在main函数中输出并验证结果值。
随着编程经验的增多,你会发现自己可以一次编写和调试多条语句。不过,增量开发过程能节省很多调试时间。
这一过程的几个关键方面是: • 从一个小的、可以工作的程序开始,加以微小的增量变化。在任何时候,如果出现错误,都能精确地知道错误位置。 • 使用临时变量保存中间值,以便于输出并验证它们。 • 一旦程序正常工作,你可能想删除一些支架代码或者将多条语句合并为符合表达式,但要确认这不会让代码难以阅读。