Autor Tema: CU00657B - Entrega nº57 del curso "Aprender programación Java desde cero".  (Leído 3730 veces)

MrClassic

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Cordial Saludo,


Entrega nº57 del curso "Aprender programación Java desde cero".

Como podria hacer en este caso para introducir una excepcion que me impida ingresar cadenas vacias?( " ") intente con el metodo x.equals(""), pero me arroja un error que creo que hace referencia a salir de el liminte de tamaño permitido.
de igual manera dejo comentado lo que intente hacer.

pero en conclusion creo que esta funcional la entrega.


Clases implementadas:

PideEntrada
CapturaDatos


Codigo:

PideEntrada

Código: [Seleccionar]
import java.util.Scanner;
public class PideEntrada{
    public static void main(String []args){
    //Properties
     CapturaDatos entrada;
     String entradaResultado, entradaDatos;
    //Constructor
        entrada = new CapturaDatos();
        System.out.println("\nINGRESE DATOS: ");
        entradaDatos = entrada.capturaStr();
   /*   if (entradaDatos.equals(" ")){
             String info ="No ha ingresado datos validos";
             System.out.println(info);
            }
        else{*/
        if(entradaDatos.length() < 5) {
                if (entradaDatos.substring(0,1).equals("A")){
                   System.out.println("La cadena introducida tiene menos de 5 caracteres y comienza por A");
                 }else{
                   System.out.println("La cadena introducida tiene menos de 5 caracteres y no comienza por A");
                }
            }
         else if (entradaDatos.length() >=5 && entradaDatos.length() <= 15){
                if (entradaDatos.substring(0,1).equals("A")){
                   System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y comienza por A");
                  }else{
                    System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y no comienza por A");
                 }
        }else if(entradaDatos.length() > 15){
                 if (entradaDatos.substring(0,1).equals("A")){
                      System.out.println("La cadena introducida es mayor a 15 caracteres y comienza por A");
                 }else{ 
                      System.out.println("La cadena introducida es mayor a 15 caracteres y no comienza por A");
                 }
        }
   // }
       
        //Imprimimos
         System.out.println(entradaDatos);
   }
}

CapturaDatos

Código: [Seleccionar]
import java.util.Scanner;
public class CapturaDatos{
    String datoStr;
    int datoInt;
    double datoDbl;
    Scanner datoIngresado =null;
   
 
    public String capturaStr(){
         datoIngresado=new Scanner(System.in);
         datoStr = datoIngresado.nextLine();
        return datoStr.toUpperCase(); 
    }
   /*
     * public String capturaStr(){
         datoIngresado=new Scanner(System.in);
         datoStr = datoIngresado.nextLine();
        if (datoStr != " "){
         return datoStr.toUpperCase();
        }else{
             String info ="No ha ingresado datos validos";
             System.out.println(info);
             return  info;
        }
    }
     */
}
Quedo en espera de sus recomendaciones y/o correcciones.

Gracias.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola MrClassic

La clase cumple el cometido respecto a la longitud de la cadena y al valor de la primera letra.

Para usos posteriores te apunto un método de la clase String:
    equalsIgnoreCase(cadenaTexto)
que no distingue entre mayúsculas y minúsculas.

Respecto a controlar las cadenas vacías. Te adjunto una clase con método estático.
Nota: Para usar un método estático, no se crea una instancia de la clase. Se usa directamente así:
    Clase.metodo();
Como el método pow() de la clase Math

clase Teclado
Código: [Seleccionar]
import java.util.Scanner;

public class Teclado {       
    /**
     * Espera una entrada de teclado excluyendo entradas vacias
     */
    public static String lee() {
        String texto = "";
        do {
            texto = escucha();
//             if (texto.length() == 0) {
//                 System.out.print("No ha ingresado datos validos.");
//             }
        } while(texto.length() == 0);
        return texto;
    }

    private static String escucha() {
        Scanner entrada = new Scanner(System.in);
        return entrada.nextLine();
    }
} // Fin de la clase Teclado

En tu main tendrás que hacer modificaciones y en algún lugar habrás de poner:
    entradaDatos = Teclado.lee();

Saludos

MrClassic

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Cordial saludo,


Excelente, todo funciono de maravilla,

pude notar que intente hacer la condicion usando el String vacio, es decir if(x =" "); pero según tu indicación el enfoque se basa en la posición mas que en el contenido,if( x.length == 0);
lo que me resulta logico pero ingenioso, lo que me recuerda a lo comentado por mi anteriormente sobre encontrar soluciones sencillas para problemas.

en el main() solo tube que cambiar el metodo que retorna la cadena, y con el cambio de equals(); por equalsIgnoreCase(); todo funciono de perlas.

otra cosa que note es que en el metodo static se tienen que declarar las variables dentro del metodo y no de manera global en cabezera, al igual que cambiar el metodo capturaStr de private a public para que pueda ser leido por el main();

muchas gracias muy ilustrativas tus indicaciones.

adjunto codigo corregido.

datosCapturados();
Código: [Seleccionar]
import java.util.Scanner;
public class CapturaDatos{
   
    //Scanner datoIngresado =null;
   
    //Metodo para capturar una entrada de teclado excluyendo entradas vacias
   
    public static String lee(){
       String texto = capturaStr();
       do{
           texto = capturaStr();
            if(texto.length()==0){
                System.out.println("No ha ingresado datos validos.");
            }
        }while(texto.length()==0);
         return texto;
        }
    //Metodo que captura un String
    public static String capturaStr(){
         Scanner datoIngresado=new Scanner(System.in);
         return datoIngresado.nextLine();
        //return datoStr;//.toUpperCase(); 
    }
}

PideEntrada

Código: [Seleccionar]
import java.util.Scanner;
public class PideEntrada{
    public static void main(String []args){
    //Properties
     CapturaDatos entrada;
     String entradaResultado, entradaDatos;
    //Constructor
        entrada = new CapturaDatos();
        System.out.println("\nINGRESE DATOS: ");
        entradaDatos = entrada.lee();
 
        if(entradaDatos.length() < 5) {
                if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
                   System.out.println("La cadena introducida tiene menos de 5 caracteres y comienza por A");
                 }else{
                   System.out.println("La cadena introducida tiene menos de 5 caracteres y no comienza por A");
                }
            }
         else if (entradaDatos.length() >=5 && entradaDatos.length() <= 15){
                if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
                   System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y comienza por A");
                  }else{
                    System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y no comienza por A");
                 }
        }else if(entradaDatos.length() > 15){
                 if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
                      System.out.println("La cadena introducida es mayor a 15 caracteres y comienza por A");
                 }else{ 
                      System.out.println("La cadena introducida es mayor a 15 caracteres y no comienza por A");
                 }
        }
   // }
       
        //Imprimimos
         System.out.println(entradaDatos);
   }
}
Quedo en espera de sus recomendaciones y/o correcciones.

Gracias.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola MrClassic

Citar
otra cosa que note es que en el metodo static se tienen que declarar las variables dentro del metodo y no de manera global en cabezera, al igual que cambiar el metodo capturaStr de private a public para que pueda ser leido por el main();

Todo método puede declarar las variables que va a utilizar. También se pueden declarar en el encabezado de la clase (como campos o atributos de la clase). Pero si los va a utilizar un método estático, deben declararse estáticos también esos campos/atributos.
Es nuestra elección si deben ser variables internas y exclusivas del método, o deben ser visibles a toda la clase.

Tu clase funcionará igual si el método capturaStr es private. Otra cosa, es que tu quieras que sea visible porque lo vas a llamar desde otra clase. Como private solo lo pueden usar los métodos de la propia clase CapturaDatos.

-----
Tu ejercicio incorpora la gestión de entradas vacías, Bien.
Pero hay dos cosas a mejorar:


Cuando ejecutas el método lee() de la clase CapturaDatos, tienes estas dos instrucciones:
a)       String texto = capturaStr();
b)        texto = capturaStr();
La primera captura de texto -a)- la descartas (no la gestionas) y la segunda, la -b)- sí la gestionas.

No sé que propósito tiene pedir una entrada que no se gestiona. Tu petición de texto a ingresar, ahora funciona así:
Primero un ENTER con o sin texto previo, luego el texto a gestionar y al final un ENTER

Si quieres que tus entradas de texto tengan esta estructura, deberías anunciarlo para no dar lugar a equívocos.

A mi parecer la instrucción a) estaría bien inicializarla de otra manera como:
a)       String texto = "";
a)       String texto = "                  ";
a)       String texto = "Texto temporal";
Es igual el texto que pongas, pues será reemplazado por la instrucción b), que pide una entrada de texto por teclado para gestionarla después.


En el método main tienes una variable:
    entradaResultado
que no utilizas para nada, se habrá quedado de otra línea de código.

Y las siguientes instrucciones:
     CapturaDatos entrada;
     entrada = new CapturaDatos();
     entradaDatos = entrada.lee();
pueden sustituirse las tres, por la siguiente:
     entradaDatos = CapturaDatos.lee();

Esto --CapturaDatos.lee();-- se puede hacer porque el método lee() es estático.

Si comprendes lo expuesto, no hace falta que envíes de nuevo el ejercicio, excepto que me haya dejado algo sin responder.

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".