Programa em Java para ler vogais e mostrar quantas são de cada uma

Olá, galera. Estou precisando de uma ajuda aqui. Preciso de um programa que calcule a quantidade de cada vogal em uma frase inserida pelo usuário e diga o tamanho da frase. A questão é que isso precisa ser resolvido em dois métodos separados. Meu programa está assim:

/**Síntese

  • Objetivo: Armazenar um frase informada pelo usuário e onstrar a quantidade de cada vogal e o número total de vogais.
  • Entrada: String
  • Saída: Quantidade de cada vogal, quantidade de vogais
  • @author delfi

*/

import java.util.Scanner;

public class Aula2Exer8 {

// Método limpa tela
public static void limpaTela(){ 
    // Instruções
	for(int aux=1;aux<=25;aux++)
	System.out.println();
}

//Método Contar vogais
public static int[] contaVogal(String frase){
	//Declarações
	int totalConsoantes = 0, totalA = 0, totalE = 0, totalI = 0, totalO = 0, totalU = 0;
	int dados[] = new int[6];
	//Instruções
	for (int aux=0;aux<frase.length();aux++){
		if(frase.charAt(aux)=='a' || frase.charAt(aux)=='A'){
			totalA+=1;
			dados[0] = totalA;
		}
		else if(frase.charAt(aux)=='e' || frase.charAt(aux)=='E'){
			totalE+=1;
			dados[1] = totalE;
		}
		else if(frase.charAt(aux)=='i' || frase.charAt(aux)=='I'){
			totalI+=1;
			dados[2] = totalI;
		}
		else if(frase.charAt(aux)=='o' || frase.charAt(aux)=='P'){
			totalO+=1;
			dados[3] = totalO;
		}
		else if(frase.charAt(aux)=='u' || frase.charAt(aux)=='U'){
			totalU+=1;
			dados[4] = totalU;
		}
		else{
			totalConsoantes+=1;
			dados[5] = totalConsoantes;
			
		}
	}
	
	
	return dados;
}

//Método Somar Vogais
public static int somaVogal(int dados[]){
	//Declarações
	int totalVogal;
	
	//Instruções
	totalVogal = dados[0] + dados[1] + dados[2] + dados[3] + dados[4];
	return totalVogal;
	
}

public static void main(String[] args) {
	//Declarações
	//String vogais = "aeiou";
	//String consoantes = "bcdfghjklmnpqrstuvwyxz";
	int dados[] = new int[7];
	Scanner ler = new Scanner(System.in);
	String frase;
	
	//Instruções
	System.out.print("Digita uma String: ");
	frase = ler.nextLine();
	
	dados = contaVogal(frase);
	
	dados[6] = somaVogal(dados);
	
	for(int i:dados)
		System.out.println(dados[i]);
	

}

}

Mas ele apresenta um erro. O que posso fazer para dar certo? Agradeço desde já

Qual o erro que ele apresenta ? e outra, procure por regex, acho que irá te ajudar.

Quando eu digito a string, ele apresenta um erro de exception.

Quando tu ta fazendo a comparação voce deveria usar “.equals” para comparar as strings
if(frase.charAt(aux).equals(‘a’) || frase.chatAt(aux).equals(‘A’)){

}

A exceção é provavelmente apontada na seguinte linha
dados[6] = somaVogal(dados);

Vc colocou dados = new int[6], mas o tamanho deveria ser 7, pois com tamanho 7, os indices vão de 0 a 6.

//Método Contar vogais
public static int[] contaVogal(String frase){
	//Declarações
	int totalConsoantes = 0, totalA = 0, totalE = 0, totalI = 0, totalO = 0, totalU = 0;
	int dados[] = new int[7]; // <- Aqui
2 curtidas

Caramba! Eu tava fazendo a maior resposta e o @diego12 resumiu tudo em poucas linhas! kkk

Bom, só pra não desperdiçar o trabalho vou postar minha resposta também, aproveito e já dou umas sugestões de melhoria pro seu código.

Identifiquei seu erro, é o ArrayIndexOutOfBoundsException que quer dizer que você está tentando acessar um indice do seu array que está além da sua capacidade, simples.

No seu método main você cria um array chamado dados da seguinte forma:

int dados[] = new int[7];

// em Java é recomendado colocar os colchetes depois do tipo, assim:

int[] dados = new int[7];

// mera formalidade, mas é bom seguir ^^

E mais tarde você tem acessar o indice de número 6, assim:

dados[6] = somaVogal(dados);

Nada demais, não é? Afinal teu array tem 7 posições, do 0 ao 6, deveria funcionar, não é verdade?

Até funcionaria se na linha logo acima desta você não tivesse feito isso:

dados = contaVogal(frase);

Quer saber o que tem demais nesta linha?

Analizando o método contaVogal podemos ver que ele retorna um array de ints, certo? Mas que array é esse?

Dentro deste método você cria um array também chamado dados só que com 6 posições!!!

E ao final dele você retorna esse array de 6 posições.

Voltando pro método main… Lembra daquele array de 7? Pois então, ele deixa de existir, ou melhor, você descarta a referencia que você tinha pra ele e a variável dados passa a referenciar um novo array, o array retornado por contaVogal e que só tem 6 posições, ou seja, de 0 a 5.

Reveja sua lógica e tudo dará certo!!

Posso fazer uma sugestão para seu método contaVogal?

Tente algo como isso:

public static int[] contaVogal(String frase) {
    char[] chars = frase.toLowerCase().toCharArray();

    /* ... */
}

Independente da frase, você transforma todas as letra em minúscula e depois transforma a String em um array de char. Acho que nesse caso é melhor trabalhar com o array, pois dentro deu seu for, em cada if você não precisaria usar frase.charAt(aux) e sim chars[ aux ], bem mais legivel, não?

E o lance de transformar todas em minusculas é pra não precisar fazer isso:

if(frase.charAt(aux)=='a' || frase.charAt(aux)=='A') {
    /* ... */
}

Você seguramente poderia fazer assim:

if ( chars[ aux ] == 'a' ) {
    /* ... */
}

Mais uma vez um aumento na legibilidade!!!

Outra coisa… Você poderia substituir os ifs por um switch:

switch( chars[ aux ] ) {
    case 'a':
        /* ... */
    case 'e':
        /* ... */
    case 'i':
        /* ... */
    case 'o':
        /* ... */
    case 'u':
        /* ... */
    default:
        /* se for consoante... */
}

Por último, as variáveis totalA, totalE e companhia não desnecessárias.

Você já criou o array dados, você já sabe que em dados[0] estará a quantidade de a, em dados[1], a quantidade de e… Então bastaria fazer assim:

if(frase.charAt(aux)=='a' || frase.charAt(aux)=='A'){
    dados[0]++;
}

// Ou melhor...

if(frase.charAt(aux)=='a'){
    dados[0]++;    
}

// Ou melhor ainda...

switch( chars[ aux ] ) {
case 'a':
    dados[0]++;
    break;

    /* ... */
}

Espero ter ajudado!

1 curtida

Obrigado! Ajudou demais! Me deu quase uma aula! hahaha

1 curtida