Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Contador de vocales

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);
}
}
}

septiembre 7, 2012 | Unregistered CommenterJose

- 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

septiembre 7, 2012 | Unregistered Commenterresalpa84

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);
}
}

septiembre 7, 2012 | Registered Commenterchoces

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

septiembre 7, 2012 | Registered Commenterchoces

gracias por todo
soy principiante y apenas le entiendo

septiembre 7, 2012 | Unregistered CommenterJose

@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

septiembre 7, 2012 | Registered Commenterchoces

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);
}
}

septiembre 8, 2012 | Registered Commenterjhosep

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);
}
}

septiembre 8, 2012 | Registered Commenterchoces

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.

septiembre 8, 2012 | Registered Commenterchoces

He cambiado el título porque me parece más representativo del contenido.

septiembre 8, 2012 | Registered Commenterchoces

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();

septiembre 8, 2012 | Registered Commenterchoces

@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

septiembre 8, 2012 | Registered Commenterjhosep

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.

septiembre 8, 2012 | Registered Commenterchoces

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úÙÚüÜÙ"));


}

}

septiembre 8, 2012 | Registered Commenterjhosep

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();
}
}

septiembre 8, 2012 | Registered Commenterchoces