Si no, no debería tener descanso?

Entonces, mi profesor mencionó que una ruptura en una declaración if / if-else es un código "malo". ¿Qué quiere decir exactamente con eso? Además, ¿cómo puedo arreglar mi código que he escrito actualmente? Porque funciona de la manera que quiero, es justo ahora que necesito entender la declaración de interrupción.

    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);

Esencialmente quiero que el usuario ingrese CUALQUIER número positivo y ese número se agrega a la primera o segunda suma. Una vez que el usuario ingresa cualquier número <= 0, quiero que el programa se detenga de inmediato. El problema que sigo teniendo cuando jugueteo con el código es que el código sigue ejecutándose. Es decir, si hago que el usuario ingrese 0 para ser agregado a la primera suma, el código aún le pide al usuario que ingrese un número para la segunda suma. Necesito que pare de inmediato y no continúe. ¡Cualquier ayuda sería de gran ayuda! Estoy usando Java

¡¡¡EDITAR!!! Entonces, digamos hipotéticamente, quiero hacer un programa que haga exactamente lo mismo que estoy haciendo ahora sin una declaración de interrupción. ¿Cómo lo haría? Algunas reglas La declaración más externa debe ser un ciclo "while". El funcionamiento interno de la misma puede ser cualquier cosa. También necesito que la máquina imprima "Ingrese un número para agregar a la primera suma:" e "Ingrese un número para agregar a la segunda suma:" alternando. Entonces si entro en 1,2,3,4. La primera suma sería 4 y la segunda suma sería 6. ¡La última regla es que no puede contener ninguna declaración de ruptura!

Respuesta 1

Si dibuja el diagrama de flujo de su código, puede ver que sale de un bucle en el medio, lo cual no está bien, la forma correcta es que salga cuando se evalúa en el momento, también cuando alguien está leyendo su código, deberían espere que se deje el bucle cuando se evalúa como falso en el tiempo, no de forma aleatoria si está dentro del bloque while, tomé su código e hice algunas correcciones para que funcione como se esperaba, pero no estoy seguro de si eso es lo que su maestro espera.

    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;
            }
        }
    }
Respuesta: 2

Esto es un retroceso a cuando la programación estructurada era algo nuevo, cuando las declaraciones goto y similares estaban en todas partes. En teoría, idealmente , nunca debería tener que usar descansos / continuos, y solo tener un único punto de retorno. En realidad, hacerlo puede hacer que su trabajo sea mucho más difícil al hacer que los programas sean más difíciles de escribir, más difíciles de leer y que consuman más recursos informáticos. Múltiples retornos, continuos y descansos son intermediarios entre la programación verdaderamente estructurada y el código de espagueti. Usado correctamente, no hay nada de malo en ellos.

En general, descubrí que solo oscurecerán su código si ya está utilizando malas prácticas que hacen que su código sea difícil de leer (por ejemplo, escribir grandes bloques de lógica sin romperlo, acoplar objetos, etc.).

Si está interesado, aquí hay un enlace a una perspectiva interesante sobre por qué NO usarlos. Y aquí hay una perspectiva de por qué son beneficiosos.

Muchos otros ya han respondido con código, pero aquí está mi oportunidad :)

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;
    }
}

Diría que ahora es más difícil de leer. Cuanto más a la derecha mi código comienza a gravitar, más siento pena por quién necesita mantenerlo ... por supuesto, podría eliminar un nivel o dos de sangría envolviendo (más) bits en métodos. Entonces se vuelve más fácil de leer, pero hay un punto en el que el boxeo negro de cada pequeña porción de lógica parece redundante ...

Respuesta: 3

Mucho más limpio, sin descansos.

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]);

Eso no quiere decir que siempre deba evitar los descansos, pero en este caso puede evitarlo para que su código sea más corto y menos redundante.

Respuesta: 4

A veces, evitar el descanso es peor que usarlo. Lo escribiría así con un descanso menos.

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;
}

Puede evitar el descanso, pero esto no hace que el código sea más claro / simple en mi humilde opinión.

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);

El mismo consejo se aplica al uso de etiquetas. Evítelos cuando sea posible a menos que evitarlos signifique hacer algo peor.

Respuesta: 5
    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;
        }
    }

pero estoy de acuerdo con los demás: no tiene sentido evitar el "descanso"

Respuesta: 6

Tengo una secuencia de elementos sin clasificar y una secuencia de comparadores. Quiero aplicar todos los comparadores en la secuencia usando "thenComparing" (Multisort) ¿Hay una forma más elegante que la siguiente ...

Spring-boot v1.4.1 Java v1.8 Thymeleaf v2.1.5. La siguiente línea de código en mi opinión: <td th: each = "sprint: $ {sprints}" th: text = "$ {sprint.releaseDate}? $ {# Temporals.format (sprint.releaseDate, ...

Antecedentes Uso de JDK 6 para cargar archivos XML en DOM. Los archivos XML deben validarse con un XSD. La ubicación del archivo XSD difiere según el entorno en ejecución. Asegurar que el XML puede ser ...

Quiero llamar dos tablas de diferentes bases de datos a la vez. La tabla de la base de datos A contiene la identificación del usuario y la tabla de la base de datos B contiene la ubicación del usuario con la identificación del usuario, por lo que quiero unir estas dos tablas y obtener ...