如何在第一时间编写正确的代码?

时间:2009-12-07 20:37:09

标签: correctness

在第一次尝试完成某些编程任务时,我经常犯很多错误(逻辑错误,语法错误)。我必须编写单元测试来检测这些错误。当我在接受采访时,这尤其成问题。在那种情况下,我处于压力之下,我无法使用编译器和单元测试来测试我的代码。

我的问题是我怎么能首先编写正确的代码?我知道这很难。是否有任何务实的方法来首次减少错误?

我需要编写一个接收指向int数组的指针和数组大小的函数。用素数填充该数组。这根本不是一个难题。但是我第一次犯了很多错误,不断发现新的错误。由于这是一次电话采访,我被要求输入答案并发送邮件。

我的第一次尝试

    void prim(int * array, int size) 
{ bool isPrime = true; 
for (int i=0;i<size;i++) 
{  
for (int j = 2;j<i/2;j++)  
{    if (i%j==0){
        isPrime = ture;
        *array = i;
        array++;

      }  } } }

在gmail中编写代码是一个非常糟糕的主意。我永远不会再这样做了。我知道程序需要两个for循环。但是代码中存在一些大问题

  1. '我'不应该在第一次循环结束时增加。
  2. if i%j == 0,isPrime应为false
  3. 当我们找到素数
  4. 时,数组操作应该放在循环的末尾

    我的第二次尝试,我添加了isPrime测试,修复了一些错误并重新提交了它。

        void prim(int * array, int size)
        {
        bool isPrime = true;
    
        for (int i=0;i<size;i++)
        {
    
         isPrime = true;
     for (int j = 2;j<i/2;j++)
     {
       if (i%j==0){
        isPrime = false;
      }
    
    if (isPrime)
    
    {
        *array = i;
        array++;
    }
     }
    }
    

    代码中仍然存在一些基本错误。但是我的时间到了,我试着在第三次尝试时修复它们。

      void prime(int * array, int size)
        {
    
       assert(array != null)
       assert(size>0)
    
        bool isPrime = true;
    
        for (int i=0;i<size;)
        {
    
         isPrime = true;
     for (int j = 2;j<i/2;j++)
     {
       if (i%j==0){
        isPrime = false;
      }
    
    if (isPrime)
    {
        *array = i;
        array++;
       i++;
    }
     }
    }
    

    最后。面试结束后,我觉得我真的很紧张。我将代码复制到我的IDE中,修复了所有错误并对其进行了测试。我把它寄给了我的面试官并对此表示抱歉。我真的很惊讶我在这么小的问题上可以犯多少错误。 最终版

    #include <iostream>
    #include <assert.h>
    using namespace std;
    
    
    void prime(int * array, int size)
    {
    
        assert(array != 0);
        assert(size>0);
        if (size == 1){
            *array=2;
            return;
        }
        else {
            *array=2;
            array++;
        }
        bool isPrime = true;
        int testNum = 3;
        for (int i=1;i<size;)
        {
            isPrime = true;
            for (int j = 2;j<testNum;j++)
            {
                if (testNum%j==0){
                    isPrime = false;
                    break;
                }
    
            }
            if (isPrime)
            {
                *array = testNum;
                array++;
                i++;
            }
            testNum++;
        }
    }
        int _tmain(int argc, _TCHAR* argv[])
        {
            int t[5]={0,};
            int sample[5]={2,3,5,7,11};
            prime(t,5);
            for (int i=0;i<5;i++){
                assert(t[i]==sample[i]);
            }
            return 0;
        }
    

10 个答案:

答案 0 :(得分:8)

许多练习:)

虽然我不认为一些轻微的语法错误会给面试官带来太多麻烦 - 只要你的理论合理。

答案 1 :(得分:7)

你不会喜欢这样的答案,那就是:成为一名程序员20年。

答案 2 :(得分:3)

先写评论。 编写注释将帮助您指定代码的主要目标,如果您的代码将来需要修改,将在以后提供帮助。 至于面试,它也可以帮助面试官更好地理解你正在写的想法,即使你的代码有点错误。

答案 3 :(得分:2)

你似乎在问两个问题

  • 如何在面试时回答编码问题?
  • 我如何编写好的干净代码?

回答第一个问题比第二个问题容易。请注意,如果您没有告诉面试官可能出现的问题,他们可能会认为您没有意识到存在错误,并且您不会知道要纠正它们。以下是一些建议

  • 告诉采访者您希望第一次切割时可能存在语法错误
  • 用文字描述你的算法
  • 首先编写伪代码
  • 自上而下编写功能
  • 与面试官讨论问题
  • 告诉面试官你如何纠正错误

关于第二个问题,练习。实践。写了很多代码。是的,测试驱动开发是一个非常好的主意。

答案 4 :(得分:1)

我会告诉你什么对我有用。即时错误检测器插件将非常有用。

我使用Resharper。在使用它之前,我在编译时遇到了太多错误。

2周前我不得不使用一个干净的视觉工作室(没有安装resharper),我编写了几乎没有错误的源代码。

有人说这个工具让程序员很懒,但我不同意。

答案 5 :(得分:0)

你需要简单地编写A LOT,从真正基本的程序开始,然后是更复杂的程序。

同样在我在大学的第一年,当我们在Pascal和C中介绍编程时,我们不得不一直在纸上“编码”。起初我发现它很愚蠢,现在我记得所有的错误(测试构建得如此,它们会包含所有最常见的错误,比如if(x = y)等等)所以我最近开始在Java上用纸编码(尽管我'我还是个初学者。)

现在我编写了各种各样的东西(每当我找到一个好主意我编码它)时,我认为这是改进的唯一方法。

答案 6 :(得分:0)

  

如何在第一时间编写正确的代码

如果这个问题有一个微不足道的答案,我们就不会有日常工作。

虽然有一些关于软件程序“可证明性”的学术着作,但是没有任何东西可以替代逻辑思维和对细节的关注 - 特别是如果你拥有的只是白板和标记。

正如其他人所提到的那样,访调员通常会为语法错误留出一些余地,但是粗略的逻辑错误不太可能被忽略。

答案 7 :(得分:0)

  

慢速平滑,平滑快速

                   - Unknown

花点时间考虑一下代码。在您工作/练习时,您将减少错误,并且您的编码速度会更快。就像你急于做某事而不认为自己犯错一样。你做的越多,它就会变成反应而不是思想。

答案 8 :(得分:0)

实践。如果您通常在工作或学校使用IDE,请在没有它​​的情况下每隔一周花一天时间进行编码。

如果您能举例说明您容易出现的错误类型,那么人们可能会提供更具体的建议。

答案 9 :(得分:0)

练习,使用正确的工具完成工作,编写大量代码,学习工具,编写更多代码,阅读有关编程的书籍,编写更多代码。你明白了。编程是一项艰苦的工作,并没有任何捷径。

也就是说,任何在接受采访时提出编码任务的人都希望得到一个干净利落的结果并开箱即用的结果显然是疯了,你不想在那里工作。优秀的经理使用编码任务来了解您如何处理问题。