Problemas com char e String

Nesse exercício, estou com alguns problemas:
Se eu fizer com char:
Quando coloco ele como vetor e peço para fazer uma leitura do seu código e vou inserindo os dados, vai aparecer de forma bugada. Como faço para que isso não ocorra?

Se eu fizer com String:
Não vai acontecer como foi em char (de forma bugada), mas tambem não estou conseguindo fazer com que os caracteres sejam contabilizados, como faço para que ele faça a contagem só das vogais e que depois exiba o valor das vogais com o número de vogais?

Exercício:
Faça um algoritmo para:
• Ler um conjunto de letras e as armazenar em um vetor (máximo 50 posições) de Caracteres. Caso o usuário digite o valor “#”, a leitura deve ser interrompida;
• Imprimir cada palavra do vetor de trás para frente, informando quantas vogais possuem;
• Imprimir quantas vogais cada palavra possui;
Exemplo:
A - C A S A - D E - M A R I A - É - B O N I T A
Resultado:
BONITA – 3
É – 1
MARIA – 3
DE – 1
CASA – 2
A – 1

Código com char:
import java.io.IOException;
import java.util.Scanner;

public class Exercício{

public static void main(String[] args) throws Exception{
	Scanner input = new Scanner(System.in);
	char[] letras = new char[50];
	int i, vogais;
	
	
	vogais = 0;
	for(i = 0; i < letras.length; i++){
		System.out.println("Informe um conjunto de letras: ");
		letras[i] = (char) System.in.read();
		if(letras[i] == '#'){
			break;
		}
				
		if(letras[i] == 'A' || letras[i] == 'E' || letras[i] == 'I' || letras[i] == 'O' || letras[i] == 'U'){
			vogais++;
		}
		
	}
	
	System.out.println("ordem decrescente: ");
	for(i = letras.length-1; i > -1; i--){
		System.out.println(letras[i] + " - " + vogais + " vogais");
	}
	


	
	input.close();
}

}

Código com String:
import java.util.Scanner;

public class Exercicio{

public static void main(String[] args){
	Scanner input = new Scanner(System.in);
	int cont_vog, limite;
	String[] letras = new String[50];
	String[] decrescente = new String[50];
	
	//1º
	cont_vog = 0;
	limite = 0;
	for (int i = 0; i < letras.length; i++) {
		System.out.println("informe a " + (i+1) + " letra: ");
		letras[i] = input.next();
		limite++;
		if(letras[i].equals("E") || letras[i].equals("I") || letras[i].equals("O") || letras[i].equals("U")){
			cont_vog++;
		}
				
		if(letras[i].equals("#")){
			break;
		}
	}
	
	//2º
	System.out.println("ordem decrescente: ");
	for(int i = limite-1; i > -1; i--){
		System.out.println(letras[i] + " - " + cont_vog);
					
	}
	
	input.close();
}

}

Brugger,

package ajudaGUJ;

import java.util.Arrays;
import java.util.Scanner;

public class Exercicio {

public static void main(String[] args){
	Scanner input = new Scanner(System.in);
	char[] letras = new char[50];
	int limite = 0;
	String vogais = "AEIOUÀÁÃÂÉÈÊÌÍÎÓÒÕÔÚÙÛ";
	/* Captura */
	for (int i = 0; i < 50; i++) {
		System.out.println("informe a " + (i+1) + " letra: ");
		letras[i] = input.next().charAt(0);
		limite++;
		if(letras[i] == '#'){
			break;
		}
	}
	/* Como String*/
	String frase = Arrays.toString(letras);
	frase = frase.replace(" ", "").replace(",", "").replace("[", "").replace("]", "");
	if(frase.contains("#"))
		frase = frase.split("#")[0];
	String[] palavras = frase.split("-");
	for(int i = palavras.length - 1; i >= 0 ; i--){
		String palavra = palavras[i];
		int contVogais = 0;
		for(int j = 0 ; j < palavra.length() ; j++){
			if(vogais.indexOf(palavra.charAt(j)) >= 0)
				contVogais++;
		}
		System.out.println(palavra + " - " + contVogais);
	}
	/*Como array*/
	if(letras[limite - 1] == '#')
		limite = limite - 1;
	int ponteiro = limite - 1;
	for(int i = limite - 1; i >=0 ; i--){
		if(letras[i] == '-' || i == 0){
			int contVogais = 0;
			if(i == 0)
				i--;
			for(int j = i + 1; j <= ponteiro ; j++){
				System.out.print(letras[j]);
				if(vogais.indexOf(letras[j]) >= 0)
					contVogais++;
			}
			System.out.println(" - " + contVogais);
			ponteiro = i-1;
		}
	}
	
	input.close();
}

}

Não sou fã de postar o código pronto, só que vi que você entendeu a essência do exercício, vou explicar algumas coisas a mais.

Primeiramente, o exercício começou errado pois não existe uma forma de capturar caractere por caractere via console. Seria ideal uma string mesmo, mas como o interesse era pelo tratamento de um array, então deixa pra lá…

Não sou muito fã de envolver o tratamento de dados durante a captura dos mesmos. Pode ocorrer um atraso no processamento ou um erro levando a uma exceção que, se não tratada, pode finalizar o programa, deixando o usuário sem entender o que houve. Mantive a captura como você fez, só tirei o tratamento das vogais.

Os métodos usados:

  • Arrays.toString(_array_)
    é um método que transforma um array em um objeto tipo String. O problema é que ele transforma todo o array em String, ou seja, a saída dele nesse caso é:

[A, -, C, A, S, A, -, D, E, -, M, A, R, I, A, -,...

  • replace(char, char)
    Você troca caracteres presentes numa string para outro tipo de caractere. No caso, troca o primeiro parâmetro pelo segundo parâmetro. No nosso caso, será necessário para tirarmos colchetes, virgulas e espaços do caso anterior.

  • indexOf(char)
    É um método que retorna a posição que o caractere no parâmetro possui sua primeira ocorrência na String. Se não existir o caractere na String em questão, ele retorna -1. No nosso caso, estamos verificando se o caractere em questão retorna uma posição no objeto String vogais = "AEIOUÀÁÃÂÉÈÊÌÍÎÓÒÕÔÚÙÛ". Portanto, se lá estiver, significa que é uma vogal. Você pode acrescentar outros caracteres como Ä para envolver mais elementos na busca.

  • split(char)
    Esse método “fatia” a String em todos os casos em que o caractere for encontrado, retornando um array de String (String[]). No caso, fatiamos a frase em todos os lugares que encontramos um traço. Ele elimina o traço e retorna as palavras. No caso do frase = frase.split("#")[0] ele fatia a frase no # e já pega a primeira parte, que contém as palavras, descartando a segunda.

  • contains(String)
    Esse método verifica se o parâmetro em questão está contido de forma integra na String.

Bem… por enquanto é isso… debuga o código acima e verifica a ideia de cada caso… qualquer dúvida, é só falar…

1 curtida

Agora quando fizer com string, não teria como separar cada palavra como no exemplo do exercício?

Boa tarde, você pode usar o split("-") para separar as palavras, levando em conta que cada palavra é separada por um “-”. O Logusmao usou esse método no código que te passou…

Olá, mas como o programa vai saber separar as palavras?
Onde é feito uma leitura de cada letra, não da palavra inteira e no final junta tudo como uma string.

Quando você aplica o split("-") na string A-CASA-DE-MARIA-É-BONITA você observar um array de string da seguinte forma

String[] palavras
palavras[0] = "A"
palavras[1] = "CASA"
palavras[2] = "DE"
palavras[3] = "MARIA"
palavras[4] = "É"
palavras[5] = “BONITA”

não é que ele sabe que é uma palavra. Ele entende que cada elemento limitado por traços é uma string. Ele não trata letra por letra… Se eu fizesse split(“A”) ao invés do traço, ficaria

String[] palavras
palavras[0] = ""
palavras[1] = "-C"
palavras[2] = "S"
palavras[3] = "-DE-M"
palavras[4] = "RI"
palavras[5] = “-É-BONIT”

1 curtida