Foro sobre Java SE > Contador de vocales
- la variable ccp debes inicializarla.
- los métodos en java empiezan con minúsculas.
- el mensaje que mostrara la respuesta debe estar fuera del ciclo
- intenta incrementando la i de manera positiva
- no use para variables String el = para denotar igual, debes usar los métodos equalsIgnoreCase o equals
import java.util.Arrays;
import java.util.List;
import javax.swing.JOptionPane;
public class CVocales {
private static List<Character> vocales = Arrays.asList('a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U');
public static void main(String args[]) {
int ccp = 0;
for (char letra : JOptionPane.showInputDialog(null, "Digite una palabra: ").toCharArray()) {
if (vocales.contains(letra)) {
ccp++;
}
}
JOptionPane.showMessageDialog(null, "El resultado es " + ccp);
}
}
@Jose
Ese código que has escrito no compila por muchas razones.
Incluso cuando se corrigen los errores de sintaxis, tampoco puede funcionar, por varias razones más.
Necesitas leer con atención el API de Java:
http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
* Tener en cuenta que las vocales pueden ser mayúsculas o minúsculas.
* No confundir la asignación con la igualdad, como haces en el bucle: estás asignando valores, no comparando.
* Comprobar si la variable de control del bucle provoca un "fuera de rango", como te sucede con ese substring
* Usar el XOR en vez de OR cuando no es necesario comprobar todas las condiciones, como es el caso: usas OR.
Por encima de todo, siempre se debe buscar la solución más simple, usando los recursos del API
Con un buen IDE, los problemas de errores de compilación ya los ves directamente en el Editor. Usa un buen IDE, por ejemplo NetBeans.
gracias por todo
soy principiante y apenas le entiendo
@Jose
Todos hemos sido principiantes ;)
Has hecho algo muy bueno, y poco frecuente en este foro: publicar tu propio código. Gracias a eso es posible conocer los errores que has cometido, y proponer soluciones concretas.
También se aprende, y mucho, leyendo y entendiendo código que funciona :)
Y no vayas a acomplejarte, porque todos "fabricamos" errores en nuestro código, todos los días :D
¡Y quien diga lo contrario, es un embustero... o no escribe código! ;P
hola @jose como ya te a respondido no entrare mucho en detalle en lo que tienes malo.
pero veo que eres nuevo y viendo tu esfuerzo en compuesto tu código con tu logica
la que te propuso el usuario @choces funciona perfectamente y es bastante interesante.
pero creo que te ayudara ver que no estas tan mal.
este codigo funciona perfectamente y solo modifique un poco el tuyo
import javax.swing.JOptionPane;
public class CVocales {
public static void main(String args[]){
int i,ccp=0;
String cat;
char lp;//debes de un string usaremos tu variable de tipo char
//ya que compararemos caracter por caracter
cat= JOptionPane.showInputDialog(null, "Digite una palabra: ");
for(i = 0; i< cat.length(); i++) {
//optienes un caracter del string
lp=cat.charAt(i);
//verificas si el caracter pertenece alguna vocal (ya sea mayuscula o minuscuña)
if (lp =='a'||lp =='e'||lp =='i'||lp =='o'||lp =='u'||lp =='A'||lp =='E'||lp =='I'||lp =='O'||lp =='U') {
ccp=ccp+1;
}
}
JOptionPane.showMessageDialog(null,"El resultado es " + ccp);
System.out.println("El resultado es " + ccp);
}
}
He modificado ligeramente el código de jhosep, solo para que veas otra manera de declarar las mismas variables. La lógica es la misma, y el resultado también.
public class CVocales {
public static void main(String args[]) {
int ccp = 0;
final String cat = JOptionPane.showInputDialog(null, "Digite una palabra: ");
for (int i = 0; i < cat.length(); i++) {
final char lp = cat.charAt(i);
if (lp == 'a' || lp == 'e' || lp == 'i' || lp == 'o' || lp == 'u' || lp == 'A' || lp == 'E' || lp == 'I' || lp == 'O' || lp == 'U') {
ccp += 1;
}
}
JOptionPane.showMessageDialog(null, "El resultado es " + ccp);
System.out.println("El resultado es " + ccp);
}
}
Imagina que necesitas un contador de vocales, que sea independiente del idioma, de tal manera que el código que las cuenta sea siempre el mismo, y solamente se necesite cambiar la definición de las vocales aceptables para el idioma en cuestión.
import java.util.Arrays;
import java.util.List;
import javax.swing.JOptionPane;
public class CVocales {
private static List<Character> vocalesIngles = Arrays.asList('a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U');
private static List<Character> vocalesCastellano = Arrays.asList('a', 'A', 'á', 'Á', 'e', 'E', 'é', 'É', 'i', 'I', 'í', 'Í', 'o', 'O', 'ó', 'Ó', 'u', 'U', 'ú', 'Ú', 'ü', 'Ü');
public static void main(String args[]) {
JOptionPane.showMessageDialog(null, "El resultado para inglés es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en inglés: "), vocalesIngles));
JOptionPane.showMessageDialog(null, "El resultado para castellano es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en castellano: "), vocalesCastellano));
}
private static int contar(final String texto, final List<Character> vocales) {
int contador = 0;
for (char letra : texto.toCharArray()) {
if (vocales.contains(letra)) {
contador++;
}
}
return contador;
}
}
Como puedes ver, el código que cuenta las vocales es siempre el mismo, independiente del idioma, y basta con cambiar el "modelo" de vocales para obtener un resultado diferente y específico.
Esta separación entre "modelo" y "lógica" te será muy útil cuando empieces a escribir código más complejo.
He cambiado el título porque me parece más representativo del contenido.
Otra posible solución, esta vez usando expresiones regulares.
import javax.swing.JOptionPane;
public class CVocales {
private static String vocalesIngles = "[^aeiouAEIOU]";
private static String vocalesCastellano = "[^aáAÁeEéÉiIíÍoOóÓuUúÚüÜ]";
public static void main(String args[]) {
JOptionPane.showMessageDialog(null, "El resultado para inglés es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en inglés: "), vocalesIngles));
JOptionPane.showMessageDialog(null, "El resultado para castellano es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en castellano: "), vocalesCastellano));
}
private static int contar(final String texto, final String vocales) {
return texto.replaceAll(vocales, "").length();
}
}
El método replaceAll devuelve una cadena con todas las letras que sean vocales.
Si se quiere saber qué vocales son:
char[] encontradas = texto.replaceAll(vocales, "").toCharArray();
@choces te has pasado muy buen código, pero me gustaria saber si a @jose le fue util, bueno @jose si pasa por aqui deja tu comentario si te sirvió el codigo o tienes algunas dudas
Espero que @Jose respire todavía :D
La verdad es que, aparte del esfuerzo que ha hecho intentándolo, y que merece toda la atención, el problema es interesante, por la cantidad de posibles soluciones que tiene, y el repaso que se puede dar a métodos útiles en cualquier situación.
Otro ejemplo más:
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
public class CVocales {
private static String vocalesIngles = "[^aeiouAEIOU]";
private static String vocalesCastellano = "[^aáAÁeEéÉiIíÍoOóÓuUúÚüÜ]";
public static void main(String args[]) {
final String palabraIngles = JOptionPane.showInputDialog(null, "Digite una palabra en inglés: ");
JOptionPane.showMessageDialog(null,
"El resultado para inglés es: " + contar(palabraIngles, vocalesIngles) + " " + printVocales(getVocales(palabraIngles, vocalesIngles)));
final String palabraCastellano = JOptionPane.showInputDialog(null, "Digite una palabra en castellano: ");
JOptionPane.showMessageDialog(null,
"El resultado para castellano es: " + contar(palabraCastellano, vocalesCastellano) + " " + printVocales(getVocales(palabraCastellano, vocalesCastellano)));
}
private static int contar(final String texto, final String vocales) {
return getVocales(texto, vocales).length;
}
private static char[] getVocales(final String texto, final String vocales) {
return Pattern.compile(vocales).matcher(texto).replaceAll("").toCharArray();
}
private static String printVocales(final char[] vocales) {
return new String(vocales);
}
}
El Pattern.compile es lo que usa internamente el método replaceAll de String.
la verdad que el problema es interesante, lo que me llama la atencion de tus soluciones choces es que puede aplicarse no solo en la búsqueda de cuantas vocales hay en una cadena si no también para cualquier carácter dejo una solución para que los lectores vean que de un solo problema puede resolverse de muchas maneras obteniendo el mismo resultado
import javax.swing.JOptionPane;
/**
*
* @author Jhosep
*/
public class CVocales {
//este metodo cuenta cuantas letra del string abc aparecen
//en el string texto
public static int contar(String texto,String abc){
int contador=0;
for(int i=0;i<texto.length();i++){
for(int j=0;j<abc.length();j++){
//ciclo interno compara el carácter de la cadena texto coincida con
//uno de la cadena abc.
if(texto.charAt(i)==abc.charAt(j)){
//al encontrar una concidencia aumenta el contador
contador++;
//sale del ciclo interno, ya que no es necesario seguir comparando
break;
}
}
}
return contador;
}//fin del metodo contar
public static void main(String[] a){
JOptionPane.showMessageDialog(null, "El resultado para inglés es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en inglés: "), "aeiouAEIOU"));
JOptionPane.showMessageDialog(null, "El resultado para castellano es: " + contar(JOptionPane.showInputDialog(null, "Digite una palabra en castellano: "), "aáàAÁÀeEéèÉÈiIiìíÍÌoOòóÓÒuUúÙÚüÜÙ"));
}
}
El mismo método de la solución anterior, pero usando los modelos de listas:
public class CVocales {
private static List<Character> vocalesIngles = Arrays.asList('a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U');
private static List<Character> vocalesCastellano = Arrays.asList('a', 'A', 'á', 'Á', 'e', 'E', 'é', 'É', 'i', 'I', 'í', 'Í', 'o', 'O', 'ó', 'Ó', 'u', 'U', 'ú', 'Ú', 'ü', 'Ü');
public static void main(String args[]) {
final String palabraIngles = JOptionPane.showInputDialog(null, "Digite una palabra en inglés: ");
JOptionPane.showMessageDialog(null,
"El resultado para inglés es: " + contar(palabraIngles, vocalesIngles) + " " + printVocales(getVocales(palabraIngles, vocalesIngles)));
final String palabraCastellano = JOptionPane.showInputDialog(null, "Digite una palabra en castellano: ");
JOptionPane.showMessageDialog(null,
"El resultado para castellano es: " + contar(palabraCastellano, vocalesCastellano) + " " + printVocales(getVocales(palabraCastellano, vocalesCastellano)));
}
private static int contar(final String texto, final List<Character> vocales) {
return getVocales(texto, vocales).size();
}
private static List<Character> getVocales(final String texto, final List<Character> vocales) {
final List<Character> encontradas = new ArrayList<Character>(2 * texto.length());
for (char letra : texto.toCharArray()) {
if (vocales.contains(letra)) {
encontradas.add(letra);
}
}
return encontradas;
}
private static String printVocales(final List<Character> vocales) {
final StringBuilder builder = new StringBuilder(vocales.size());
for (Iterator<Character> it = vocales.iterator(); it.hasNext();) {
builder.append(it.next());
}
return builder.toString();
}
}
hola quisiera que me ayuden
4- Elaborar un programa que me permita capturar una cadena de texto e imprima cuantas vocales hay en la cadena.
import javax.swing.JOptionPane;
public class CVocales {
public static void main(String args[]){
int i,ccp;
String cat,lp;
cat= JOptionPane.showInputDialog(null, "Digite una palabra: ");
for(i = 0; i<= cat.Length; i--) {
lp=cat.Substring(i, 1);
If (lp = "a"|lp = "e"|lp = "i"|lp = "o"|lp = "u") {
ccp=ccp+1;
}
JOptionPane.showMessageDialog(null,"El resultado es" + ccp);
System.out.println("El resultado es" + ccp);
}
}
}