Ayuda en Java

Publicado en 'Programación' por Zaraki_Ken, 11 Oct 2015.





  1. Zaraki_Ken

    Zaraki_Ken Miembro frecuente

    Registro:
    21 Ene 2014
    Mensajes:
    140
    Likes:
    6




    Buenas tengo un problema de Java pequeño.
    Me piden:
    Generar código de la venta, la cual debe estar formada por el texto “Boleta N“, seguido de un número entero aleatorio de 3 dígitos cuyo último dígito es 7.
    Se que hay otras maneras más fáciles de hacer, pero quiero aprender a usar lenght y char

    Y yo lo puse así:
    public void generarCodVenta(){
    Random randito=new Random();
    char ultimo;
    do{
    codVenta="Boleta N"+randito.nextInt(999-100+1)+100;
    int longitud=codVenta.length();
    ultimo=codVenta.charAt(longitud-2);
    }while(ultimo!='7');

    El problema es que al momento de iniciar en el Public class:
    (ya lo importé)
    VentaFruta ventita1=new VentaFruta("U");
    ventita1.generarCodVenta();
    System.out.println(ventita1.verDatos());

    Se queda en "running" y no pasa nada

    Me podrían señalar qué está mal?

    Gracias por su tiempo :giggle: :chau:
     


  2. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Elimina ese do/while que te genera el loop infinito, solo genera un aleatorio de dos cifras y le concatenas el 7 al final.
     
    A Zaraki_Ken le gustó este mensaje.
  3. Zaraki_Ken

    Zaraki_Ken Miembro frecuente

    Registro:
    21 Ene 2014
    Mensajes:
    140
    Likes:
    6
    El do while lo puse para que se repita mientras el ultimo dígito sea 7.
    También podría poner el 7 después, pero quiero saber porqué está mal. Tal vez usé mal el char o length
     
  4. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Mientras el ultimo dígito No sea 7, pero no estas preguntando por el ultimo sino por el antepenúltimo cuando generas números entre 0 y 900 y al concatenarlo primero con una cadena el segundo signo mas "+" actua como concatenación de String, entonces cualquier numero que generas al final le va a agregar 100 , ie 899100 y como preguntas por 7 en el antepenúltimo nunca va ha ser igual a "0" y por eso entra en loop infinito.

    Deberia quedar así tu código :
    Código:
    Random randito=new Random();
    codVenta="Boleta N"+randito.nextInt(99) + "7";
    
    Te queda como tarea meterle 0's por delante al aleatorio.
     
    A ExosAnonimus le gustó este mensaje.
  5. Zaraki_Ken

    Zaraki_Ken Miembro frecuente

    Registro:
    21 Ene 2014
    Mensajes:
    140
    Likes:
    6
    Graciias
    Si me equivoqué en escribir, es mientras el ultimo no sea 7(no se porqué puse -2, tal vez estaba probando).
     
  6. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Corrección me equivoque no es antepenúltimo (estaba pensando en otro leng) es el penúltimo.
     
    A Zaraki_Ken le gustó este mensaje.
  7. Zaraki_Ken

    Zaraki_Ken Miembro frecuente

    Registro:
    21 Ene 2014
    Mensajes:
    140
    Likes:
    6
    Ya lo resolví :aplausos::
    public void generarCodVenta(){
    Random randito=new Random();
    char ultimo;
    String sn;

    do{
    sn=String.valueOf(randito.nextInt(999-100+1)+100);
    codVenta="Boleta N: "+sn;
    int longitud=codVenta.length();
    ultimo=codVenta.charAt(longitud-1);
    }while(ultimo!='7');

    Con esto me devuelve un codigo con el ultimo digito diferente a 7, ejemplo:
    Boleta N: 397

    Tenía que convertir el valor random a String, porque estaba en integer. ya que codVenta es String
     
  8. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Te devuelve un código cuando el ultimo dígito es igual a 7. Muchas operaciones de comparación para resolver tu enunciado en el peor de los casos, se demora exponencialmente si el random no devuelve una secuencia que finalice en 7, que probabilidad hay que se demore 0s a 1 minuto :mmm:.

    Código:
    public static String generarCodVenta()() {
         return "NroBoleta: " + new String().format("%03d",(new java.util.Random().nextInt(99)*10+7));   
      }
    
     
    A Zaraki_Ken le gustó este mensaje.