Autor Tema: La clave de la programación Java es entender su lógica Ejercicio bucles CU00658B  (Leído 5077 veces)

Hquinn

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 23
    • Ver Perfil
A ver que tal que este ejercicio me ha costado un pelín más :P

Código: [Seleccionar]
import java.util.Scanner; //Importa la clase Scanner

public class DimeLetras{
   
    public static void main(String[]args){
       
        System.out.print("Escribe la palabra que quieras: ");
        Scanner entradaEscaner = new Scanner(System.in); //Creación de un objeto Scanner
        String entradaTeclado = entradaEscaner.nextLine();
        System.out.println("La palabra que has escrito es: " + entradaTeclado + ".");
        System.out.println("Sus letras son: ");
        int cuantasLetras = entradaTeclado.length(); //Guarda el número de letras que hay en la palabra introducida
        for(int i=0;i<cuantasLetras;i++){ 
            System.out.println("Letra "+(i+1)+": " + entradaTeclado.substring(i,i+1));
        if(i==(cuantasLetras-1)){
            break;
        }
   
    }
   
    }
   
}
« Última modificación: 12 de Enero 2016, 14:22 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:CU00658B - Bucle for en Java. Operadores ++ y --. Sentencia break
« Respuesta #1 en: 09 de Enero 2016, 21:59 »
Hola Hquinn.

Un par de cositas, que una vez explicadas, verás que se puede hacer más fácil.

Primero, indicar que un String viene a ser lo mismo que un vector (un array de 1 dimensión).
Es decir, puedes acceder a cada letra del String sin tener que usar el método .subString() (este es útil cuando queremos seleccionar más de un carácter del String) porque cada letra está guardada como si fuera un elemento individual con un número de indice que le identifica.

Aquí lo has hecho bien, porque de hecho el enunciado del ejercicio te pide que uses el subString() para que te familiarices con este método.
Pero esto te lo comento para que sepas que en realidad, no es necesario usar dicho método cuando queremos acceder a letras de manera individual.
Si será útil cuando queremos seleccionar varias letras seguidas juntas de una cadena.

Para acceder a cada letra, basta con indicar el nombre del String y junto a el, entre corchetes, el número de indice de cada letra.
Por ejemplo: entradaTeclado[0]

Con eso referimos a la primera letra del String, que están numeradas desde el 0 hasta la (longitud del String - 1).
Es decir, si un String tiene 5 letras, sus indices serán: 0, 1, 2, 3 y 4.

Entonces, en el bucle, puedes usar directamente la variable i para sacar cada letra del String por pantalla, que además ya la tienes establecida para que empiece desde 0 y vaya aumentando mientras no alcance la longitud del String, por lo que no tienes ni que sumarle ni restarle. Puedes usar la i tal cual:

Código: [Seleccionar]
for(int i=0;i<cuantasLetras;i++){ 
            System.out.println("Letra "+(i+1)+": " + entradaTeclado[i]);

Pero insisto, tú lo has hecho bien usando el método subString() porque así te lo pide el ejercicio.


Segundo, la comprobación que haces con el if dentro del bucle for, es innecesaria porque el bucle for ya tiene una condición de salida, ya le hemos dicho que se ejecute mientras "i sea menor que cuantasLetras".
En cuanto i deje de ser menor, el bucle for dejará de ejecutarse y no hay riesgo de que intentemos acceder a una letra que no existe.

Puedes quitar el if y verás que el programa funciona igual.

En ejercicios más complejos, si puede interesar usar el break para que en según que condicion, interrumpir el bucle antes de que alcance la condición de salida principal.

Otro detalle, menos importante.
Guardar la longitud del String en la variable cuantasLetras para usarla como condición del bucle for, es correctísimo y no supone ningún problema.

Sin embargo, si quisieras, puedes ahorrarte esa variable y escribir el bucle for directamente usando el metodo .length() de este modo:

Código: [Seleccionar]
for(int i=0; i < (entradaTeclado.length() - 1); i++){ 
            System.out.println("Letra "+(i+1)+": " + entradaTeclado[i]);

El resultado, como digo, es el mismo. La ventaja es que te ahorras declarar una nueva variable.
En algunos casos, puede que necesites emplear la longitud del String para más cosas a parte de como condición de un bucle, entonces si vale la pena crear una variable para guardar este dato y ahorrarte escribir varias veces el método .length() en el mismo programa.

Por lo demás, todo parece estar bien.
« Última modificación: 09 de Enero 2016, 22:13 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Hquinn

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 23
    • Ver Perfil
Re:CU00658B - Bucle for en Java. Operadores ++ y --. Sentencia break
« Respuesta #2 en: 10 de Enero 2016, 09:25 »
Gracias por la respuesta tan extensa!

Creo (remarco creo xD) que he entendido todo bien! También he probado lo del if y si funciona. Es que me paso algo que no se porqué era que me salía en plan:

Letra 1: P
Letra 2: a
Letra 3: t
Letra 4: o
Letra 5:

Al quitar el if  funciona igual de bien aunque de verdad recuerdo haberlo puesto por eso xD no se que tocaría.

De verdad que dais mejores explicaciones que muchos profesores de ciclos que hay... motiva un montón tanto el curso como las respuestas :)


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:CU00658B - Bucle for en Java. Operadores ++ y --. Sentencia break
« Respuesta #3 en: 10 de Enero 2016, 12:50 »
Cuando no te salió bien quizás era porque introduciste un espacio en blanco después de la palabra
Por ejemplo: "pato "

Lo normal es que si "nos pasamos" e intentamos acceder a una letra que no existe, el programa se detenga dando un error "Exception. Out of bounds..." o algo parecido.

Puedes probarlo, basta que en el bucle for, en la condición de salida, en lugar de i<cuantasLetras pon i<=cuantasLetras.

Es decir, supongamos la palabra "pato". Su .length() es igual a 4, porque tiene 4 letras. Guardamos ese valor en cuantasLetras.
Aunque su longitud sea 4, el indice de la última letra será 3, porque como dijimos empiezan a numerarse desde el 0.
Así que el String "pato" tiene los indices: 0(p), 1(a), 2(t) y 3(o).

Entonces, si ponemos como condición en el bucle que se ejecute mientras i<cuantasLetras.
Todo irá bien porque la i solo llegará hasta el 3.
Cuando valga 4, ya no se cumplirá la condición (4 no es menor que 4) y no ejecutará las instrucciones del bucle.

Pero si por error pusieramos como condición i<=cuantasLetras, cuando i llegara a valer 4, la condición sí se cumplirá (4 si es menor o igual que 4) y por lo tanto ejecutará las instrucciones del bucle. Pero entonces intentará acceder a la letra con indice número 4, que no existe porque "pato" tiene del 0 al 3 únicamente.
Entonces se produce una "excepción" (un error) y normalmente (depende del compilador) se para la ejecución del programa mostrando un mensaje de error.

Puedes probarlo para que veas que efecto produce.

Sobre mis explicaciones, je je, a veces me extiendo mucho, pero es que quiero ser bastante detallista, porque yo también soy estudiante, estoy cursando un CFGS de DAM y como bien dices, hay profesores que parece que olvidaron lo que es ser estudiante de algo totalmente nuevo y dan explicaciones muy genéricas, como dando por hecho que todo el mundo lo va a entender.
Y yo toda esta parte "básica" de Java y algorítmia en general, ya me la sé (pero no mucho más) así que las vagas explicaciones de algunos profesores no me afectan, pero tengo compañeros de clase que es la primera vez que teclean código de programación y algo tan "sencillo" como este ejercicio, recorrer un String y sacar cada una de sus letras, a algunos se les atraganta y otros lo hacen porque han visto un código de ejemplo, pero en realidad no entienden el proceso "interno" ni la lógica que sigue el programa para hacer lo que le estamos ordenando.

Que esa es la clave de todo, entender la lógica de la programación, y no tanto aprenderse de memoria cómo usar instrucciones y métodos.
Si no se entiende, si no se comprende como "piensa" un ordenador, luego es muy complicado meterse en asuntos más serios.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Hquinn

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 23
    • Ver Perfil
Re:CU00658B - Bucle for en Java. Operadores ++ y --. Sentencia break
« Respuesta #4 en: 10 de Enero 2016, 13:00 »
Jo pues se agradece mil... de verdad

Yo también estoy apuntada a DAM! Pero este curso llegué tarde y solo pude pillar 3 asignaturas de 2º... xD imagina que lio!

Encima es online, aunque público... los materiales de la asignatura de Desarrollo de interfaces, por ejemplo, son de 2006 fácil... necesitas versiones antiguas de Java y Eclipse y los "apuntes" que cuelgan son de verdadera vergüenza y para resolver dudas... en fin!!

Así que este año solo estoy haciendo al final la de Empresa e iniciativa emprendedora que no requiere conocimientos de nada (Aunque si voluntad, porque es horrenda jajaja) y empezando por mi cuenta para el año que viene porque me da pánico saber que apuntes me voy a encontrar.


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:CU00658B - Bucle for en Java. Operadores ++ y --. Sentencia break
« Respuesta #5 en: 10 de Enero 2016, 21:16 »
Puf.. yo estoy haciendo el el primer curso, presencial, y con algunos profesores ya cuesta entender la materia (hay otros que son una maravilla)
Tú, online y sin poder empezar desde el principio.... tiene mucho mérito, tio. ¡¡Ánimo!! ;)
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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".