Autor Tema: Ejercicio Stack o pila en java métodos básicos ejemplo contar vocales CU00923C#  (Leído 7700 veces)

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Buenas a todos.

Esta es mi solución al ejercicio de la entrega CU00923C del curso Lenguaje de Programación Java Nivel Avanzado I.

Citar
Crea una clase denominada VerificadorVocales con un método capaz de recibir una cadena y una vocal y devolver un resultado que será 1 si el número de la vocal pasada como parámetro es par (hay equilibrio en esa vocal), -1 si el número de la vocal pasada como parámetro es impar (no hay equilibrio en esa vocal) ó 0 (no existe esa vocal en la cadena). Para ello debes utilizar una pila (Stack).

Crea una clase con el método main donde se pida al usuario una cadena y se le devuelva un mensaje informativo sobre si el números de a’s, e’s, i’s, o’s, u’s es par o impar. El programa debe dar opción al usuario a seguir introduciendo cadenas si lo desea.

Clase VerificadorVocales.
Código: [Seleccionar]
import java.util.Stack;
import java.util.Scanner;
public class VerificadorVocales {
    public static void main (String [] args) {
        Scanner entrada = new Scanner(System.in);
        String respuesta = "S";
        String cadena="";
        String numeroA="";
        String numeroE="";
        String numeroI="";
        String numeroO="";
        String numeroU="";

        while (respuesta.equalsIgnoreCase("S")){
            System.out.println ("¿Qué cadena desea analizar?");
            cadena=entrada.nextLine();
            switch (analizarA(cadena)){
                case 1: numeroA="par"; break;
                case -1: numeroA="impar"; break;
                case 0: numeroA= "cero"; break;
            }
            switch (analizarE(cadena)){
                case 1: numeroE="par"; break;
                case -1: numeroE="impar"; break;
                case 0: numeroE= "cero"; break;
            }
            switch (analizarI(cadena)){
                case 1: numeroI="par"; break;
                case -1: numeroI="impar"; break;
                case 0: numeroI= "cero"; break;
            }
            switch (analizarO(cadena)){
                case 1: numeroO="par"; break;
                case -1: numeroO="impar"; break;
                case 0: numeroO= "cero"; break;
            }
            switch (analizarU(cadena)){
                case 1: numeroU="par"; break;
                case -1: numeroU="impar"; break;
                case 0: numeroU= "cero"; break;
            }
            System.out.println ("El número de letras a es "+numeroA+", el número de letras e es "+numeroE+", el número de letras i es "+numeroI+", el número de letras o es "+numeroO+" y el número de letras u es "+numeroU+".");
            System.out.print ("¿Desea analizar otra cadena? (S/N) ");
            respuesta = entrada.nextLine();
        }
    }

    public static int analizarA (String cadena) {
        Stack<String> pila = new Stack<String>(); int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (cadena.charAt(i)=='a'&&pila.empty()) {pila.push("a"); auxiliar++;}
            else if (cadena.charAt(i)=='a'&&!pila.empty()) {pila.pop();}
            i++;
        }
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}     
    }

    public static int analizarE (String cadena) {
        Stack<String> pila = new Stack<String>(); int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (cadena.charAt(i)=='e'&&pila.empty()) {pila.push("e"); auxiliar++;}
            else if (cadena.charAt(i)=='e'&&!pila.empty()) {pila.pop();}
            i++;
        }
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}
    }

    public static int analizarI (String cadena) {
        Stack<String> pila = new Stack<String>(); int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (cadena.charAt(i)=='i'&&pila.empty()) {pila.push("i"); auxiliar++;}
            else if (cadena.charAt(i)=='i'&&!pila.empty()) {pila.pop();}
            i++;
        }       
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}
    }

    public static int analizarO (String cadena) {
        Stack<String> pila = new Stack<String>(); int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (cadena.charAt(i)=='o'&&pila.empty()) {pila.push("o"); auxiliar++;}
            else if (cadena.charAt(i)=='o'&&!pila.empty()) {pila.pop();}
            i++;
        }
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}     
    }

    public static int analizarU (String cadena) {
        Stack<String> pila = new Stack<String>(); int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (cadena.charAt(i)=='u'&&pila.empty()) {pila.push("u"); auxiliar++;}
            else if (cadena.charAt(i)=='u'&&!pila.empty()) {pila.pop();}
            i++;
        }
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}
    }
}

Un saludo.
« Última modificación: 03 de Octubre 2020, 14:47 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas Erik el código funciona perfectamente. Como detalle de diseño veo que utilizas cinco métodos cuyo código es repetitivo (los métodos analaizarA, analizarE, analizarI, analizarO, analizarU).

Una mejora interesante sería unificar esos cinco métodos en uno solo que además de la cadena reciba el carácter a analizar, de esa forma nos ahorraríamos la repetición de código, quedando más compacto.

Salu2

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
¡Hola Ogramar!

Te agradezco mucho la observación. He estado pensando de nuevo el ejercicio y he unido los métodos en uno solo. También he modificado el main para que baste con un switch. El código se ha reducido notablemente. Ha quedado así:

Código: [Seleccionar]
import java.util.Stack;
import java.util.Scanner;
public class VerificadorVocales {
    public static void main (String [] args) {
        Scanner entrada = new Scanner(System.in);
        String respuesta = "S";
        String cadena="";

        while (respuesta.equalsIgnoreCase("S")){
            System.out.println ("¿Qué cadena desea analizar?");
            cadena=entrada.nextLine();
            String textoPorPantalla="";
            char[] array = {'a','e','i','o','u'};
            for (int i=0; i<array.length; i++) {
                switch (analizarVocal(cadena,array[i])){
                    case 1: textoPorPantalla=textoPorPantalla+"El número de letras "+array[i]+" es par. "; break;
                    case -1: textoPorPantalla=textoPorPantalla+"El número de letras "+array[i]+" es impar. "; break;
                    case 0: textoPorPantalla=textoPorPantalla+"El número de letras "+array[i]+" es cero. "; break;
                }
            }
                System.out.println (textoPorPantalla);
                System.out.print ("¿Desea analizar otra cadena? (S/N) ");
                respuesta = entrada.nextLine();           
        }
    }

    public static int analizarVocal (String cadena, char vocalParaAnalizar) {
        Stack<String> pila = new Stack<String>(); char v=vocalParaAnalizar; String vocal=String.valueOf(vocalParaAnalizar);
        int i=0; int auxiliar=0;
        while (i<cadena.length()) {
            if (Character.toLowerCase(cadena.charAt(i))==v&&pila.empty()) {pila.push(vocal); auxiliar++;}
            else if (Character.toLowerCase(cadena.charAt(i))==v&&!pila.empty()) {pila.pop();}
            i++;
        }
        if (auxiliar==0) {return 0;} else { if (pila.empty()) {return 1;} else {return -1;}}     
    }

}

De nuevo, muchas gracias por tus revisiones. Son siempre muy acertadas.
¡Un saludo!

 

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