c - 程序在编码之前如何进行测试?

标签 c algorithm project-planning

我正在使用C。 我期望 while 循环中出现这种情况,以防止任何大于 400 万的偶数值在我的“sum”变量中求和:

while ( (box1 < 4000000) || (box2 < 4000000) || (box3 < 4000000)) {

    box3 = box1 + box2;
    if (box3 % 2 == 0) /* checks if box is even */
        sum += box3;  /* if TRUE adds even value to the variable sum */

    box1 = box3 + box2;/* exceeded 4 millions on 12th loop */
    if (box1 % 2 == 0)
        sum += box1;

    box2 = box3 + box1; 
    if (box2 % 2 == 0)
        sum += box2;/* then summed undesired value here */
    printf("%d\n", sum);
}

我根本没有想到循环中第一个或第二个语句中的框超过 400 万个的可能性。这种情况发生了,我花了很长时间才发现我的程序在再次检查条件之前对一个额外的值求和。我希望您能原谅我,并有一点耐心,让您在这里度过宝贵的时间,但我需要知道经验丰富的程序员是否知道如何避免这种简单但烦人的错误。

如果这是真的,我会很高兴有机会向更好的程序员学习。谢谢

最佳答案

为了展示思考这个问题的正确方法,如评论中所述 - 这里的技术是认识到您正在重复相同的代码片段三次,并且这三个中的两个没有被正确检查。它通常被称为 DRY 原则(“不要重复自己”)。注意到这一点后,您重构了代码,使其“它是 DRY”。 DRY 代码比非 DRY 代码的故障点更少,这显然降低了出错的可能性。

int previous = 1, current = 1;
int next;
int sum = 0;

// single test for end
while (current < 4000000) {

    // test for evenness
    if (current % 2 == 0) {
        sum += current;
    }

    // next value
    next = previous + current;

    // shuffle values around so you can reuse the same code
    previous = current;
    current = next;
}

另请注意,如果变量名为 box1box2box3,则没有人可以轻松地阅读您的代码 - 其中包括 future 的你。根据复杂程度,在一到六个月内,您将不知道自己写了什么;拥有合理的名称对于顺利维护至关重要。

但是请注意,这些只是优秀代码的一些原则。正如许多评论者指出的那样,其中大多数都是通过经验而来的。您开始注意到“代码气味”,当您注意到时,您会重构它,使其不再有气味。

(此外,如评论中所述,有关编程技巧的一般问题应访问 https://softwareengineering.stackexchange.com/ ;Stack Overflow 更关注特定问题。如果您搜索该网站,会发现有许多线程讨论好的或可维护的代码。)

关于c - 程序在编码之前如何进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738901/

相关文章:

.net - 如何检测某个短语或正则表达式的 "typo"?

makefile - 使用错误跟踪器来完成工作和管理个人任务?

c - 这里的 while 循环有什么问题? C基础知识

c - 我如何使用 GSS API 更新 kerberos 服务票据

c - (&) 的地址从符号表中获取值

algorithm - apache spark 上的不相交集

javascript - 检查给定的字符串是否是同构的

c - 我在将值传递给 c 中的 recvfrom 和 sendto 函数时遇到问题

project-planning - 指定新功能

project-management - 管理 "product development"和 "software development"有什么区别