Я обычно делаю много ошибок (логические ошибки, синтаксические ошибки) в первой попытке выполнить некоторые задачи программирования. Я должен написать единичный тест, чтобы обнаружить эти ошибки. Это особенно проблематично, когда я нахожусь в интервью. В этой ситуации я испытываю давление, и я не могу проверить свой код с помощью компилятора и модульного теста.Как правильно писать код в первый раз?
Мой вопрос в том, что как я могу написать правильный код в первую очередь? Я знаю, что это сложно. Существует ли какой-либо прагматичный подход к устранению ошибок в первый раз?
Спасибо всем.
Мне понадобилось , чтобы написать функцию, которая получает указатель на массив 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. Я больше никогда этого не сделаю. Я знал, что программе нужны два цикла. Однако есть некоторые большие проблемы в коде
- «i» не должно увеличиваться в конце первого цикла.
- если я% J == 0, IsPrime должен быть ложным
- операция массива должен поставить в конце цикла, когда мы находим простое
Мою вторую попытку, я добавил тест 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, исправил все ошибки и протестировал их. Я отправил это моему интервьюеру и пожалел об этом. Я был очень удивлен, сколько ошибок я мог бы сделать в такой маленькой проблеме. Final Version
#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;
}
сильный текст
К сожалению, я достиг максимум 12 голосов за день, но это довольно субъективный и спорный корм. –
Когда вы узнаете, пожалуйста, сообщите остальным из нас. –
Некоторые языки программирования предлагают меньше возможностей для ошибок. Но они, конечно, не могут заменить практику - переход на, скажем, Хаскелл сейчас не панацею. Но также хочу упомянуть, что C++ является одним из худших языков по этим критериям. Вы можете попробовать использовать что-то еще, после C++ не очень сложно выучить другой язык. –