5.2 程序开发

最后更新于:2022-04-01 06:19:58

现在你应该可以阅读并理解一个完整的C++函数了。但是到底怎么设计函数可能还不清楚。我会马上介绍**增量开发**技术。 举个例子,假设要计算两点之间的距离,其中两个点分别用坐标 (x1, y1)和(x2, y2)表示。按照定义, ![enter image description here](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-09-01_55e55d62f2259.jpg)第一步要考虑的是,在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函数中输出并验证结果值。 随着编程经验的增多,你会发现自己可以一次编写和调试多条语句。不过,增量开发过程能节省很多调试时间。 这一过程的几个关键方面是: • 从一个小的、可以工作的程序开始,加以微小的增量变化。在任何时候,如果出现错误,都能精确地知道错误位置。 • 使用临时变量保存中间值,以便于输出并验证它们。 • 一旦程序正常工作,你可能想删除一些支架代码或者将多条语句合并为符合表达式,但要确认这不会让代码难以阅读。
';