Necesito ayuda con una tarea

He estado trabajando en esta programación durante aproximadamente 3 semanas y no puedo entender mis errores. Tengo que usar dos clases públicas: 1) validateLength (Number) y 2) convertIntegerToWords (Number). Mi problema es que una vez que el usuario ingresa su número entero, mi ciclo continúa para siempre. El sistema pedirá un entero, una entrada de usuario, una salida del sistema demasiado larga o continuará con convertIntgerToWords. Mi codigo esta abajo

import java.util.Scanner;
public class Project2 {

    public static void main(String [] args) {
        //Main Method//

        //Create a Scanner//
        Scanner input = new Scanner(System.in);

        //Enter an Integer//   
        System.out.print(" What is your integer ? ");
        int Number= input.nextInt(); 
        while (Number >= 0) {
            if (Number != 0)
                validateLength(Number);
            else if(Number == 0) {
                System.out.print( "Thank you for playing! " + "Good bye! ");    
                break;
            }
        }   
    }

    //Next Method//
    public static boolean validateLength(int userNum) {
        String Number = "" + userNum;
        while (userNum >= 0) {
            if (userNum < 10) 
                convertIntegerToWords(userNum);
            else if (userNum > 9){
                System.out.print("Your integer is too long !");
                break;
            }
        }
    }
    //End of validate//

    //Final Method//
    public static String convertIntegerToWords(int Number) {
        if (Number == 1)
            System.out.println("Your integer " + Number + "is written out as one");
        else if (Number == 2) 
            System.out.println("Your integer " + Number + "is written out as two");
        else if (Number == 3) 
            System.out.println("Your integer " + Number + "is written out as three");
        else if (Number == 4) 
            System.out.println("Your integer " + Number + "is written out as four");
        else if (Number == 5) 
            System.out.println("Your integer " + Number + "is written out as five");
        else if (Number == 6) 
            System.out.println("Your integer " + Number + "is written out as six");
        else if (Number == 7) 
            System.out.println("Your integer " + Number + "is written out as seven");
        else if (Number == 8) 
            System.out.println("Your integer " + Number + "is written out as eight");
        else if (Number == 9) 
            System.out.println("Your integer " + Number + "is written out as nine");
            return Number + "";
        }
    }
}

preguntado el 16 de mayo de 11 a las 17:05

6 Respuestas

Necesitas moverte

Number = input.nextInt();

dentro de la while círculo. Aquí está el modismo típico (también se agregó otra limpieza):

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);
    
    // Enter an Integer//
    System.out.print(" What is your integer ? ");
    int Number;
    while ((Number = input.nextInt()) >= 0)
    {
        if (Number == 0)
        {
            System.out.print("Thank you for playing! " + "Good bye! ");
            break;
        }
        
        validateLength(Number);
    }
}

Editar

si el usuario ingresa 0 entonces sí, el programa termina. Sin embargo, si el usuario ingresa un número entero del 1 al 9, el programa debe deletrear el número entero en palabras (es decir, 1 se escribe como uno). Hace esto pero se repite infinito. Igual que si el usuario ingresa un número entero mayor que 9, informa que el "SU número entero es demasiado grande, ingrese otro número entero". Sin embargo, esto se repite en la misma línea una y otra vez.

Eso es por el while incluyete validateLength(). Pruebe esto (tenga en cuenta la otra limpieza de código también):

public class ScannerDemo
{
    private static void convertIntegerToWords(int num)
    {
        String message = null;
        if (num > 9)
        {
            message = "Your integer is too long!";
        }
        else if (num > 0)
        {
            message = "Your integer " + num + " is written out as ";
            String numString = "";
            
            switch (num)
            {
                case 1:
                    numString = "one"; break;
                case 2:
                    numString = "two"; break;
                case 3:
                    numString = "three"; break;
                case 4:
                    numString = "four"; break;
                case 5:
                    numString = "five"; break;
                case 6:
                    numString = "six"; break;
                case 7:
                    numString = "seven"; break;
                case 8:
                    numString = "eight"; break;
                case 9:
                    numString = "nine"; break;
            }
            
            message += numString;
        }
        
        System.out.println(message);
    }
    
    private static int getNextNumber(Scanner s)
    {
        System.out.println("What is your integer?");
        return s.nextInt();
    }
    
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        
        int number;
        while ((number = getNextNumber(input)) >= 0)
        {
            if (number == 0)
            {
                System.out.println("Thank you for playing! Good bye!");
                break;
            }
            
            convertIntegerToWords(number);
        }
    }
}

Es también en github.

Respondido el 20 de junio de 20 a las 12:06

Esto funciona bien. Gracias por tu ayuda; sin embargo, una vez que el usuario ingresa un número entero igual o menor que 9, el programa lo escribe pero continúa indefinidamente. He agregado el número de retorno + ""; línea pero aún en vano. - mrroberts

¿Cuál es el comportamiento esperado después de que el usuario ingresa un número? <= 9? A partir de su código, parecía que el usuario debería poder terminar el programa ingresando 0, que es lo que permite el código de mi respuesta. - Matt Ball

@matt ... si el usuario ingresa 0 entonces sí, el programa termina. Sin embargo, si el usuario ingresa un número entero del 1 al 9, el programa debe deletrear el número entero en palabras (es decir, 1 se escribe como uno). Hace esto pero se repite infinito. Igual que si el usuario ingresa un número entero mayor que 9, informa que el "SU número entero es demasiado grande, ingrese otro número entero". Sin embargo, esto se repite en la misma línea una y otra vez. - mrroberts

@Marc: el problema es el while bucle dentro del validateLength() método. Sin embargo, como está escrito en la pregunta, validateMethod() no compila. ¿Le importaría editar su pregunta para incluir el código que está intentando ejecutar ahora? - Matt Ball

@ Matt, ¿puedes ahora decirme cuál es la diferencia entre convertIntegerToWords (int) estático público, validateLength booleano estático público y tus métodos estáticos privados? ¡Esta programación es realmente alucinante! - mrroberts

su condicional while siempre se cumple, por lo que continuará pasando por el ciclo while. Solo se detendrá cuando el Número ya no sea mayor o igual a cero.

necesita usar algún otro tipo de condición por completo, si desea usar un bucle (aunque no puedo decir por qué lo desea en este ejemplo). Nunca cambiará el valor asociado con Number, por lo que siempre será el valor con el que se creó la instancia. ¿Quizás pretendías tener un código que cambie su valor dada una determinada condición? De lo contrario, debe perder esa condición por completo.

contestado el 16 de mayo de 11 a las 22:05

No estoy seguro de a qué te refieres con condición. Entienda mientras (número! = 0) pero, si el usuario ingresa un número entero que es <= 9, se supone que el sistema debe responder SU INtger ** escrito es *****. Lo que hace pero luego se repite infinito - mrroberts

while (Number >= 0) {

Está creando un ciclo while, donde por dentro no te veo disminuyendo tu número entero para detener el ciclo. ¿Necesitas usar un bucle aquí? Debería probar una declaración if en su lugar.

Además, es posible que desee considerar una declaración de cambio en lugar de si para la salida.

contestado el 16 de mayo de 11 a las 22:05

Pensé que necesitaría una declaración de bucle, ya que si el usuario ingresa algo mayor que 9, debería decirle que su número entero es demasiado largo y volver a intentarlo. Probé todo el interruptor con 9 casos, pero eso también me falló. - mrroberts

@Marc ¿Cuántas veces está interesado en que el usuario ingrese algo? Una vez, y solo si es mayor que nueve, ¿repetir? Por favor, aclare la tarea y trataré de ayudar. - Chalise

@Chalise .. Necesito que el usuario continúe ingresando hasta que ingrese un 0. Todo el programa debería hacer algo como esto: - mrroberts

¿Cuál es tu número entero? 9 Su número entero 9 se escribe como nueve ¿Cuál es su número entero? 10 Eso es demasiado grande, ingrese otro número entero ¿Cuál es su número entero? 0 Saliendo, gracias por jugar - mrroberts

@Marc - Creo que tienes tu respuesta :) Me alegra ver que está resuelto - Chalise

Bienvenido a StackOverflow.

Siento la necesidad de mencionar que tienes una clase Project2 y dos métodos, no clases. Obtienes un int no es un número entero y no puede leer la siguiente línea, lo cual sospecho que es su problema, a menos que espere que el usuario escriba todo en la primera línea.

Le sugiero que aprenda a usar un depurador, ya que puede ser muy útil para encontrar depuraciones y comprender lo que está haciendo su programa. esp para bucles que no terminan.

contestado el 16 de mayo de 11 a las 22:05

Gracias por la lección en clase y métodos. Soy muy nuevo en esto y estoy realmente tratando de entenderlo. Estoy ejecutando eclipse pero todavía tengo problemas con él. - mrroberts

//Main Method//
public static void main(String [] args) {
    //Create a Scanner//
    Scanner input = new Scanner(System.in);
    bool bPlay = true; 

    while (bPlay) {
        //Enter an Integer//   
        System.out.print(" What is your integer ? ");
        int Number= input.nextInt(); 

        if (Number != 0)
        validateLength(Number);

        else if(Number == 0) {
            System.out.print( "Thank you for playing! " + "Good bye! "); 
            bPlay = false; 
            break;

        }
    }   
}

contestado el 16 de mayo de 11 a las 22:05

  public static boolean validateLength(int userNum) {
    String Number = "" + userNum;
        while (userNum >= 0) {

    if (userNum < 10) 
    convertIntegerToWords(userNum);

    else if (userNum > 9){
    System.out.print("Your integer is too long !");
            break;
    }
  }

Este código es responsable del problema, nunca asigna a userNum un nuevo valor, sino que hace un bucle mientras userNum> 0. Esto crea un punto óptimo para un bucle infinito para número> = 0 y <10. (deja el bucle solo para el número> 9).

contestado el 16 de mayo de 11 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.