Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: MrClassic en 25 de Febrero 2015, 09:29

Título: CU00657B - Entrega nº57 del curso "Aprender programación Java desde cero".
Publicado por: MrClassic en 25 de Febrero 2015, 09:29
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;
        }
    }
     */
}
Título: Re:CU00657B - Entrega nº57 del curso "Aprender programación Java desde cero".
Publicado por: toni_apr en 25 de Febrero 2015, 22:12
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
Título: Re:CU00657B - Entrega nº57 del curso "Aprender programación Java desde cero".
Publicado por: MrClassic en 26 de Febrero 2015, 02:10
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);
   }
}
Título: Re:CU00657B - Entrega nº57 del curso "Aprender programación Java desde cero".
Publicado por: toni_apr en 27 de Febrero 2015, 20:23
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