2013-05-31 3 views
0

Проблема: перепишите небольшие числа от входа к выходу. Остановка обработки ввод после считывания числа 42. Все номера на входе: целые числа одной или двух цифр.В чем разница между этими двумя решениями?

Пример

Входной сигнал: 1 2 88 42 99

Выход: 1 2 88

Мое решение:

#include<stdio.h> 
int main() 
{ 
int i; 
scanf("%d",&i); 
while(i!=42) 
{ 
printf("%d",i); 
scanf("%d",&i); 
} 
return 0; 
} 

Правильное решение:

#include <stdio.h> 

int main(void) { 
int i; 
while(1) { 
    scanf("%d", &i); 
    if(i == 42) break; 
    printf("%d\n", i); 
} 
return 0; 
} 

Обе программы заканчиваются, если входной сигнал равен 42, а какая разница между ними?

EDIT: Я только что понял, что это должно было быть опубликовано на сайте codereview.stackexchange.com. Админы, пожалуйста, сделайте необходимое.

+3

Один печатает "\ n", другой нет. –

+2

Я считаю, что они строго эквивалентны, и некоторые хардкорные безделужки-ребята даже говорят, что ваш код более изящный. – Medinoc

+2

Я согласен с @Medinoc. Я ненавижу 'while (1)' заявления, как на их поверхности, они кажутся петлями навсегда. Если целью кода является остановка в определенном состоянии, тогда код должен быть написан, чтобы четко отражать это намерение. – abelenky

ответ

2

Не слишком много. Единственные различия, которые я вижу, это то, что:

  1. После печати каждого номера вы выводите новую строку «\ n».

  2. Ваш код не полностью «СУХОЙ» (вы повторяете строку scanf("%d",&i);).

В противном случае они (функционально) идентичны. Но я вынужден добавить:

  • Ваш код немного уродливее ... Используйте правильный отступ!
1

В первой программе вы вводите цикл после того, как пользователь ввел первое значение, поэтому вам нужно проверить значение в состоянии while.

Вторая программа вместо этого проверяет ввод всегда внутри цикла и, следовательно, более понятна.

+0

Вот почему спой-судья отвергнет первую. – aschepler

0

Они функционально эквивалентны, и лично я предпочитаю ваше решение: while(1) рассматривается некоторыми, включая меня, чтобы быть плохой практикой. Легче видеть, когда цикл while заканчивается, просто просматривая одну строку, вместо того, чтобы отслеживать код. Несколько отличий иначе:

  • Вы должны отступа кода, или это трудно читать
  • Вы не печатает символ новой строки (\n)
+2

Почему 'while (1)' считается плохой практикой? Вы возражаете против всех форм бесконечного цикла или предпочитаете 'while (true)', 'for (;;)', 'goto' ...? – simonc

+1

Я лично не увлекаюсь бесконечными петлями, когда это возможно, по причине, о которой я говорил выше. Я думаю, что это яснее и менее вероятно, чтобы вызывать ошибки, потому что могут существовать коды, которые вы пропускаете, которые не ломаются, когда им это нужно. Как я уже сказал, это мое (и, по крайней мере, некоторые другие, см. Комментарии по вопросу) мнение, оно по-прежнему функционально корректно. – jazzbassrob

+0

Спасибо за обновление. Не уверен, что я согласен с вашими рассуждениями, но причины для этого сейчас ясны :-) – simonc

1

С самого вопроса я могу сказать, что это из одного из вопросов, связанных с практикой веб-сайта по программированию.

Эти сайты также соответствуют формату, в котором вы отвечаете на свой вопрос. Поэтому необходима новая строка (\ n).

+0

Да, вы правы. Мое решение было принято после добавления символа новой строки. Спасибо за вашу помощь. – reb94

Смежные вопросы