Manipulando caracteres

12 respostas
Ravnus

Pessoal, nunca pensei que eu fosse fazer um post desses, mas aqui estou eu. Um professor passou um exercício na faculdade e eu não sei como fazer. Vou postar o enunciado:

“Faça um programa que armazene uma frase e mostre a quantidade de cada vogal contida na mesma,
além do total geral de vogais. Considere as vogais sem distinção entre maiúsculo e minúsculo. O retorno
para o usuário deverá apresentar a quantidade de cada vogal, o total das vogais e o tamanho da frase
informada pelo usuário”

O que acontece, eu não sei manipular caracteres com Java, nunca precisei disso antes. No C, eu criaria um vetor de caracteres ou um ponteiro e mandava ver, mas e no Java, como eu faço?

Eu andei procurando uma classe chamada char, mas não consegui entender se ela faz o que eu quero.

Não estou pedindo para que resolvam para mim, só quero saber o que usar e como usar.

Abraço.

12 Respostas

L

Mais ou menos assim:

String texto = “Algum texto”;
char [] chars = texto.toCharArray();

Ai pra frente é igual a C, da um loop pelos caracteres verificando se é vogal e soma em uma variável.

Uma dica: a Classe Caracter tem os métodos estáticos toUpperCase e toLowerCase que pode te ajudar um pouco.

Ravnus

lsjunior:
Mais ou menos assim:

String texto = “Algum texto”;
char [] chars = texto.toCharArray();

Ai pra frente é igual a C, da um loop pelos caracteres verificando se é vogal e soma em uma variável.

Uma dica: a Classe Caracter tem os métodos estáticos toUpperCase e toLowerCase que pode te ajudar um pouco.

Obrigado, amigo. Agora tudo bem, como eu disse, eu nunca tinha feito isso em Java, daí o professor me pegou de surpresa.

Quando eu terminar, posto o código aqui. Eu vou fazer tudo dentro da classe Principal mesmo.

Abraço.

Ravnus

Trabalho pronto. Por enquanto só vou fazer isso, depois tento resolver outras coisas.

/* **********************************************************************************
 * Informações sobre o programa:												    *
 * 																				    *
 * O programa não está lendo frases inteiras, somente palavras. Corrigir isso.      *
 * O programa não trata vogais acentuadas, verificar se é preciso fazer isso ou não.*
 *                                                                                  *
 * **********************************************************************************/

import java.util.Scanner;


public class Principal {

	
	public static void main(String[] args) {
		
		String frase;
		char vetorFrase[];
		Scanner lerFrase = new Scanner(System.in);
		int qtdeA = 0, 
			qtdeE = 0, 
			qtdeI = 0, 
			qtdeO = 0, 
			qtdeU = 0,
			somaVogais =0;
		
		System.out.println("Digite uma frase, sem incluir acentos:");
		frase = lerFrase.next();
		
		vetorFrase = frase.toCharArray();
		
		for(int i = 0; i < vetorFrase.length; i++) {
			
			if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A')
				qtdeA++;
			else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E')
				 	 qtdeE++;
				 else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I')
					  	  qtdeI++;
				 	  else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O')
					       	   qtdeO++;
				 	  	   else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U')
						  	    	qtdeI++;
		}
		
		somaVogais = qtdeA + qtdeE + qtdeI + qtdeO + qtdeU;
		
		System.out.println("Quantidade de a-A = " + qtdeA 
						+ "\nQuantidade de e-E = " + qtdeE
						+ "\nQuantidade de i-I = " + qtdeI
						+ "\nQuantidade de o-O = " + qtdeO
						+ "\nQuantidade de u-U = " + qtdeU
						+ "\nQuantidade total de vogais = " + somaVogais);

	}

}
davidbuzatto

Só uma questão de estilo.
Essa “escada” não deveria existir. Formate assim o seu bloco de if, else ifs e else:

if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A') qtdeA++; else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E') qtdeE++; else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I') qtdeI++; else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O') qtdeO++; else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U') qtdeI++;

Ah, e para ler uma linha inteira (o que você chamou de frase) use o método nextLine de Scaner.

[]'s

Ravnus

davidbuzatto:
Só uma questão de estilo.
Essa “escada” não deveria existir. Formate assim o seu bloco de if, else ifs e else:

Também acho feia essa escada, mas me ensinaram desse jeito, por isso eu mati a idéia. Vou corrigir daqui pra frente. Inclusive o eclipse corrige o else pra baixo do if e eu sempre achei que fosse teimosia.


Ah, e para ler uma linha inteira (o que você chamou de frase) use o método nextLine de Scaner.
[]'s

Obrigado pela dica, vou corrigir.

==================================================================

Editando: Postando o código com as alterações sugeridas:

/* **********************************************************************************
 * Informações sobre o programa:													*
 *								 												    *
 * Data: 11/11/2011																	*
 * 																				    *
 * O programa não está lendo frases inteiras, somente palavras. Corrigir isso.      *
 * O programa não trata vogais acentuadas, verificar se é preciso fazer isso ou não.*
 * 																					*
 * Data: 12/11/2011																	*
 * 																					*
 * Problema de não ler frases inteiras resolvido.   								*
 * Estilo do if-else modificado, retirado a "escada"	                            *
 * **********************************************************************************/

import java.util.Scanner;


public class Principal {

	
	public static void main(String[] args) {
		
		String frase;
		char vetorFrase[];
		Scanner lerFrase = new Scanner(System.in);
		int qtdeA = 0, 
			qtdeE = 0, 
			qtdeI = 0, 
			qtdeO = 0, 
			qtdeU = 0,
			somaVogais =0;
		
		System.out.println("Digite uma frase, sem incluir acentos:");
		frase = lerFrase.nextLine(); //Corrigido de lerFrase.next() para lerFrase.nextLine().
		
		vetorFrase = frase.toCharArray();
		
		for(int i = 0; i < vetorFrase.length; i++) {
			
			if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A')
				qtdeA++;
			else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E')
				qtdeE++;
			else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I')
				qtdeI++;
			else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O')
				qtdeO++;
			else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U')
				qtdeI++;
		}
		
		somaVogais = qtdeA + qtdeE + qtdeI + qtdeO + qtdeU;
		
		System.out.println("Quantidade de a-A = " + qtdeA 
						+ "\nQuantidade de e-E = " + qtdeE
						+ "\nQuantidade de i-I = " + qtdeI
						+ "\nQuantidade de o-O = " + qtdeO
						+ "\nQuantidade de u-U = " + qtdeU
						+ "\nQuantidade total de vogais = " + somaVogais);

	}

}
L

Aproveitando seu código,como vc mostraria cada letra digitada ao invés da soma dela ?

Ravnus
for(int i = 0; i < vetorFrase.length; i++) {  
   System.out.print(vetorFrase[i]);            
}
Luizao

Dica: contar quantas letras “a” possui uma string:

String frase = "frase bem longa";
int qtde = frase.split("a").length - 1;
System.out.println("Frase tem " + qtde + " 'a'");

O split vai quebrar a string em vários arrays, aí basta contar quantos arrays foram retornados ;).

Luizao

Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1;
Ravnus

Luizao:
Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1;

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS

Luizao

Ravnus:
Luizao:
Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1;

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS


Não disse que era mais simples ou fácil de entender, só quis ACRESCENTAR ao tópico uma outra forma de fazer.

Ravnus

Luizao:
Ravnus:
Luizao:
Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1;

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS


Não disse que era mais simples ou fácil de entender, só quis ACRESCENTAR ao tópico uma outra forma de fazer.

Ah, entendi. Perdão pelo meu entendimento equivocado. Eu pensei que você fosse mais um daqueles que querem mostrar como são bons em programação e não se importam se vão confundir ou não a pessoa que está com dúvida.

Criado 11 de novembro de 2011
Ultima resposta 18 de set. de 2012
Respostas 12
Participantes 5