2016-10-20 4 views
6

Итак, мой профессор сказал, что разрыв в выражении if/if-else - это «плохой» код. Что именно она имеет в виду? Также, как я могу исправить свой код, который я написал в настоящее время, потому что он работает так, как я его хочу, сейчас мне нужно получить удовольствие от инструкции break.Если-else не должен иметь перерыв?

int sumOne = 1; 
    int sumTwo = 1; 
    int sumOneTotal = 0; 
    int sumTwoTotal = 0; 
    while(sumOne > 0 || sumTwo > 0){ 
     System.out.print("Enter a number to add to first sum: "); 
     //The user enters in a value for the first sum. 
     sumOne = input.nextInt(); 

     /** 
     * We use an if-else statment to ensure sumOne is never less than or equal to 0. 
     * If it does it ends the program immediately and totals the sums. 
     * This is because we only want the user to enter in positive numbers. 
     */ 
     if (sumOne <= 0){ 
      break; 
     }else{ 
      sumOneTotal = sumOneTotal + sumOne; 
     } 

     System.out.print("Enter a number to add to second sum: "); 
     //The user enters in a value for the second sum. 
     sumTwo = input.nextInt(); 

     /** 
     * We use an if-else statment to ensure sumTwo is never less than or equal to 0. 
     * If it does it ends the program immediately and totals the sums. 
     * This is because we only want the user to enter in positive numbers. 
     */ 
     if (sumTwo <= 0){ 
      break; 
     }else{ 
      sumTwoTotal = sumTwoTotal + sumTwo; 
     } 
    } 
    //We print out the total of sumOneTotal and sumTwoTotal. 
    System.out.printf("%1s%1d%12s%1s%1d", "First sum: ", sumOneTotal, " ", "Second sum: ", sumTwoTotal); 

По существу я хочу, чтобы пользователь мог ввести любое положительное число, а число добавляется к первой или второй сумме. Как только пользователь вводит любое число < = 0 Я хочу, чтобы программа немедленно остановилась. Проблема, которую я продолжаю иметь, когда я возиться с кодом, заключается в том, что код продолжает работать. Значение, если у меня есть пользователь, введите в 0, чтобы быть добавленным к первой сумме, код по-прежнему просит пользователя ввести число для второй суммы. Мне нужно, чтобы он сразу остановился и не продолжил. Любая помощь будет большой помощью! Я использую Java.

EDIT !!! Итак, предположим, что я хочу сделать программу, которая делает то же самое, что и сейчас, без инструкции break. Как мне это сделать? Несколько правил. Самый внешний оператор должен быть «while». Внутренние работы этого могут быть любыми. Мне также нужна машина для печати «Введите число, которое нужно добавить к первой сумме:» и «Введите число, чтобы добавить ко второй сумме», чередуя. Поэтому, если я вхожу в 1,2,3,4. Первая сумма будет равна 4, а вторая сумма будет равна 6. Последнее правило заключается в том, что она не может содержать никаких операторов break!

+3

Использование разрыва правильное. Ваш учитель ошибается! Я признаю, что он может быть «плохим кодом», но не тогда, когда он сделан правильно, как у вас здесь. – Herter

+2

Возможно, вам придется спросить ее, что она имеет в виду. Для меня это похоже на чрезмерное обобщение. –

+1

Вам следует избегать использования 'break;', если вы можете, но иногда избегая «перерыва», хуже. В этом случае было бы хуже ИМХО. –

ответ

2

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

int sumOne = 1; 
    int sumTwo = 1; 
    int sumOneTotal = 0; 
    int sumTwoTotal = 0; 
    while (sumOne > 0 && sumTwo > 0) { 
     System.out.print("Enter a number to add to first sum: "); 
     // The user enters in a value for the first sum. 
     sumOne = input.nextInt(); 

     /** 
     * We use an if-else statment to ensure sumOne is never less than or 
     * equal to 0. If it does it ends the program immediately and totals 
     * the sums. This is because we only want the user to enter in 
     * positive numbers. 
     */ 
     if (sumOne > 0) { 
      sumOneTotal = sumOneTotal + sumOne; 
      System.out.print("Enter a number to add to second sum: "); 
      // The user enters in a value for the second sum. 
      sumTwo = input.nextInt(); 

      /** 
      * We use an if-else statment to ensure sumTwo is never less 
      * than or equal to 0. If it does it ends the program 
      * immediately and totals the sums. This is because we only want 
      * the user to enter in positive numbers. 
      */ 
      if (sumTwo > 0) { 
       sumTwoTotal = sumTwoTotal + sumTwo; 
      } 
     } 
    } 
+0

Это работает !!! Эта проблема сводила меня с ума, потому что, хотя я делал все правильно, она была недовольна заявлениями о перерывах! –

0

Иногда избегать перерыва хуже, чем использовать его. Я бы написал это так с одним меньшим перерывом.

int sumOneTotal = 0; 
int sumTwoTotal = 0; 
while (true) { 
    System.out.print("Enter a number to add to first sum: "); 
    //The user enters in a value for the first sum. 
    int sumOne = input.nextInt(); 

    if (sumOne <= 0) 
     break; 

    sumOneTotal += sumOne; 

    System.out.print("Enter a number to add to second sum: "); 
    //The user enters in a value for the second sum. 
    int sumTwo = input.nextInt(); 

    if (sumTwo <= 0) 
     break; 
    sumTwoTotal += sumTwo; 
} 

Вы можете избежать перерывов, но это не делает код более понятным/простым ИМХО.

int sumOneTotal = 0; 
int sumTwoTotal = 0; 
boolean okay = true; 
do { 
    System.out.print("Enter a number to add to first sum: "); 
    //The user enters in a value for the first sum. 
    int sumOne = input.nextInt(); 

    if (sumOne <= 0) { 
     okay = false; 
    } else { 
     sumOneTotal += sumOne; 

     System.out.print("Enter a number to add to second sum: "); 
     //The user enters in a value for the second sum. 
     int sumTwo = input.nextInt(); 

     if (sumTwo <= 0) { 
      okay = false; 
     } else { 
      sumTwoTotal += sumTwo; 
     } 
} while (okay); 

Те же рекомендации касаются использования меток. Избегайте их там, где это возможно, если их избежать не означает, что они делают что-то хуже.

0

Я не соглашаюсь с тем, что всегда полезно использовать break внутри if. Однако это скорее вопрос мнения, чем что-либо, и на самом деле здесь нет. Я отвечу на часть вашего вопроса, которая по теме, а именно: как я могу исправить свой код, чтобы не использовать break внутри if.

Приведенный ниже код продолжит цикл, запросив у пользователя ввод, пока не будет введен правильный номер. Это позволяет избежать исходной проблемы и дает дополнительное преимущество, позволяя пользователю вводить новый номер, если они совершают ошибку, вместо выхода из цикла и начала их запуска.

int sumOne = 1; 
int sumTwo = 1; 
int sumOneTotal = 0; 
int sumTwoTotal = 0; 
while(sumOne > 0 || sumTwo > 0){ 
    do { 
     System.out.print("Enter a number to add to first sum: "); 
     //The user enters in a value for the first sum. 
     sumOne = input.nextInt(); 

     System.out.print("Enter a number to add to second sum: "); 
     //The user enters in a value for the second sum. 
     sumTwo = input.nextInt(); 
    }while(sumTwo <= 0 || sumOne <= 0); 

    sumOneTotal = sumOneTotal + sumOne; 
    sumTwoTotal = sumTwoTotal + sumTwo; 
} 
//We print out the total of sumOneTotal and sumTwoTotal. 
System.out.printf("%1s%1d%12s%1s%1d", "First sum: ", sumOneTotal, " ", "Second sum: ", sumTwoTotal); 
+0

Это решило бы! Однако я должен сделать код чередующимся вводом. Поэтому он попросил бы сумму один, затем суммировать два, затем один. Она очень придирчива к тому, как мы пишем эту программу. –

+0

@DylanKelemen не проблема! см. мое редактирование. он будет циклически до тех пор, пока оба числа не будут действительными входами, прежде чем добавлять их в общую сумму. если он недействителен, он будет запрашивать оба числа снова, по порядку, как хочет ваш учитель. пожалуйста, помните, чтобы поддержать и принять, если это полезно =] – nhouser9

6

Это возврат к тому, когда структурированное программирование было новым, назад, когда утверждения goto и т. П. Были повсюду. Теоретически, В идеале вам никогда не придется использовать разрывы/продолжения и иметь только одну точку возврата. В действительности, делая это может сделать вашу работу намного сложнее, делая программы сложнее писать, труднее читать и использовать больше вычислительных ресурсов. Множественные возвращения, продолжения и разрывы - это средние мужчины между действительно структурированным программированием и кодом спагетти. Используется правильно, с ними нет ничего плохого.

Как правило, я обнаружил, что они будут только скрывать ваш код, если вы уже используете плохие методы, которые затрудняют чтение вашего кода (например, записывая огромные блоки логики, не разбирая их, плотно связывая объекты и т. Д.).

Если вам интересно, here - это ссылка на интересную перспективу, почему НЕ использовать их. И here - это взгляд на то, почему они полезны.

Многие другие уже ответили с кодом, но вот мой выстрел :)

public class Main { 
    public static void main(String args[]) { 
     int sumOne = 1; 
     int sumTwo = 1; 
     int sumOneTotal = 0; 
     int sumTwoTotal = 0; 
     Scanner input = new Scanner(System.in); 
     while(sumOne > 0 || sumTwo > 0){ 
      System.out.print("Enter a number to add to first sum: "); 
      sumOne = input.nextInt(); 
      if (is_positive(sumOne)){ 
       sumOneTotal = sum_numbers(sumOneTotal, sumOne); 
       System.out.print("Enter a number to add to second sum: "); 
       sumTwo = input.nextInt(); 
       if(is_positive(sumTwo)){ 
        sumTwoTotal = sum_numbers(sumTwoTotal, sumTwo); 
       } 
      } 
     } 
     System.out.printf("%1s%1d%12s%1s%1d", "First sum: ", sumOneTotal, " ", "Second sum: ", sumTwoTotal); 
     return; 
    } 
    public static int sum_numbers(int x, int y){ 
     int total = x + y; 
     return total; 
    } 
    public static boolean is_positive(int x){ 
     boolean is_pos = true; 
     if(x < 0){ 
      is_pos = false; 
     } 
     return is_pos; 
    } 
} 

Я бы сказал, что сейчас труднее читать. Чем правее мой код начинает тяготеть, тем больше мне жаль, кому нужно его поддерживать .. Конечно, я мог бы удалить уровень или два отступа путем обертывания (более) бит в методах. не тогда становится легче читать, но есть точка, где черный бокс каждый крошечный бит логики просто кажется излишним ...

0
while (sumOne > 0 && sumTwo > 0) { 
     System.out.print("Enter a number to add to first sum: "); 
     sumOne = input.nextInt(); 
     if (sumOne > 0) { 
      sumOneTotal = sumOneTotal + sumOne; 
      System.out.print("Enter a number to add to second sum: "); 
      sumTwo = input.nextInt(); 
      if (sumTwo > 0) 
       sumTwoTotal = sumTwoTotal + sumTwo; 
     } 
    } 

, но я согласен с другими - нет никакого смысла, чтобы избежать «перерыва»

1

Много более чистых, без перерывов.

int candidate = 0; 
int [] sums = {0,0}; 
int index = 1; 

System.out.print("Enter a number to add to first sum: "); 

while((candidate = input.nextInt()) > 0){ 
    sums[index] = sums[index] + candidate; 
    index = (index + 1)%2; 

    System.out.print("Enter a number to add to " + ((index == 0) ? "first":"second") + " sum: "); 
    } 
//We print out the totals. 
System.out.printf("%1s%1d%12s%1s%1d", "First sum: ", sums[0], " ", "Second sum: ", sums[1]); 

Это не значит, что вы должны всегда избежать перерывов, но в этом случае вы можете избежать этого, чтобы сделать код короче, менее многословны.

+0

очень сложно читать ... Modulo, incrementation + variable assignation в объявлении while ... – davidxxx

+0

Я думаю, что inline-if может быть перемещен для ясности. Для меня это ясно, но я вижу вашу точку зрения. –

+0

Мое условие выхода логически эквивалентно оригиналу. Исходный цикл не должен иметь sumOne> в условии while. –

-1

Я не согласен с вашим учителем. Нет ничего плохого в использовании инструкции break. Есть подходящие места для разрыва, которые будут использоваться. Фактически, причина, по которой исключения и обработка исключений были введены в современные языки программирования, заключается в том, что вы не можете решить каждую проблему, используя только структурированные методы.
Есть несколько вещей, которые вам нужно иметь в виду.
Когда в начале блока используется условие прерывания, в качестве первого условия они действуют как предварительное условие, так что это хорошо. Но при использовании в середине блока, с некоторым кодом вокруг, они действуют как скрытые ловушки, поэтому это плохо.
Теперь вернемся к вашему коду. Ваш код абсолютно прост и удобен для чтения.