如何在编码之前测试程序?

时间:2015-04-20 03:32:11

标签: 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);
}

在循环中的第一个或第二个语句中,盒子超过4百万的所有可能性都没有出现在我的脑海中。这发生了,我花了很长时间,直到我认为我的程序在再次检查条件之前总结了一个额外的值。我希望你原谅我并有一点耐心让你在这里度过宝贵的时间,但我需要知道有经验的程序员是否知道如何避免这种简单但令人讨厌的错误。

如果确实如此,我很高兴有机会向更优秀的程序员学习。感谢

1 个答案:

答案 0 :(得分:0)

为了展示正确的思考方式,正如评论中所述 - 这里的技术是识别您重复相同的代码片段三次,并且这三个中的两个未被正确检查。它通常被称为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,则任何人都无法轻松阅读您的代码 - 这包括您未来的自我。根据复杂程度,在一到六个月内你不会知道你写的是什么;有明智的名字对于顺利维护非常重要。

但请注意,这些只是好代码的一些原则。正如许多评论者所指出的,他们中的大多数都来自经验。你开始注意到“代码味道”,当你这样做时,你会重构它,所以它不再闻到。

(另外,正如评论中所述,关于编程工艺的一般问题应该转到https://softwareengineering.stackexchange.com/; Stack Overflow更侧重于特定问题。如果你搜索该网站,有一些讨论良好或可维护代码的线程。)