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

LNK*_*019 2 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++;

      }  } } }
Run Code Online (Sandbox Code Playgroud)

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

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

我的第二次尝试,我添加了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++;
}
 }
}
Run Code Online (Sandbox Code Playgroud)

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

  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++;
}
 }
}
Run Code Online (Sandbox Code Playgroud)

最后.面试结束后,我觉得我真的很紧张.我将代码复制到我的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;
    }
Run Code Online (Sandbox Code Playgroud)

Spa*_*ter 8

很多练习:)

虽然我不认为一些小的语法错误会给面试者带来太多麻烦 - 只要你的理论是合理的.


Jon*_*erg 7

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

  • 虽然,即便如此...... (2认同)