Preciso de ajuda em uma questão[RESOLVIDA}

São os tipos de dados do Java, veja: Tipos de Dados do Java. Resumindo, é um tipo de dado primitivo que corresponde a metade de um int, ou seja, enquanto o int tem 32 bits, o short tem 16. Como são valores pequenos para que usar 32 bits? É só por isso que utilizei o short.

Lembrando que esse código tem problemas que você deve resolver, como por exemplo, se for digitado símbolos especiais e número no nome, vai contar tudo como consoante, o que não é verdade. Logo, tens que melhorá-lo.

1 curtida

eu adaptei o que tem no seu ao meu, ficou mais simples, mas de uma forma que eu saiba explicar ao professor. muito obrigada !!!

pode ajudar novamente? meu professor quer que passe para uma classe, como faço isso, presico usar get e set.

package vog;
import javax.swing.JOptionPane;

public class Vog {

public static void main(String[] args) {
    String txt;
    int i;
    int vogA = 0, vogE = 0, vogI = 0, vogO = 0, vogU = 0;
    int cons, vog;
    short tamNome;
    
    txt = JOptionPane.showInputDialog("Digite um nome: ");
    tamNome = (short)txt.length();
    for(i=0;i<txt.length();i++){
        
        if(txt.charAt(i)=='a'||txt.charAt(i)=='A'){
           vogA++;
        }
        if(txt.charAt(i)=='e'||txt.charAt(i)=='E'){
           vogE++;
        }
        if(txt.charAt(i)=='i'||txt.charAt(i)=='I'){
           vogI++;
        }
        if(txt.charAt(i)=='o'||txt.charAt(i)=='O'){
           vogO++;
        }
        if(txt.charAt(i)=='u'||txt.charAt(i)=='U'){
           vogU++;
        }
    }
    vog = (vogA+vogE+vogI+vogO+vogU);
    cons = tamNome-vog;
    
    JOptionPane.showMessageDialog(null,"Nome: "+txt);
    JOptionPane.showMessageDialog(null,"Nº de Vogais: "+(vogA+vogE+vogI+vogO+vogU));
    JOptionPane.showMessageDialog(null,"Nº de Consonates: "+cons);
    JOptionPane.showMessageDialog(null,"Tamanho:"+tamNome);
     
}

}

???

não sei como passar esses comandos para uma classe, criar o método e chamar na classe principal

Continuo sem entender. O que você tem que passar para uma classe? Qual é a sua dificuldade? O que é “comando”? Quais “comandos”?

eu preciso criar uma classe que opere a contagem de vogais, consoantes e o número de letras, no caso métodos, esses métodos serão importados para a classe principal, deu pra entender?

Na verdade ele quer que você faz orientação ao objetos, não é isso ?

Eu creio que quando disse ‘importar’, queria dizer utilizar uma classe em outra, ou melhor um objeto da classe A em uma classe B:

public class VerificaLetra {
	private int numeroVogais = 0;
	private int numeroConsoantes = 0;
	private int tamanhoNome = 0;
	private char[] vogais = new char[44];
	private char[] consoantes = new char[42];
	
	public VerificaLetra(){
		setVogais();
		setConsoantes();
	}
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setNumeroVogais(int numeroVogais){
		this.numeroVogais = numeroVogais;
	}
	
	public int getNumeroVogais(){
		return numeroVogais;
	}
	
	public void setNumeroConsoantes(int numeroConsoantes){
		this.numeroConsoantes = numeroConsoantes;
	}
	
	public int getNumeroConsoantes(){
		return numeroConsoantes;
	}
	
	public void setTamanhoNome(int tamanhoNome){
		this.tamanhoNome = tamanhoNome;
	}
	
	public int getTamanhoNome(){
		return tamanhoNome;
	}
	
	private void setVogais(){
		char[] listaVogais = {
			'a', 'á', 'à', 'ã', 'â', 'A', 'Á', 'À', 'Ã', 'Â',
			'e', 'é', 'è', 'ê', 'E', 'É', 'È', 'Ê',
			'i', 'í', 'ì', 'I', 'Í', 'Ì',
			'o', 'ó', 'ò', 'õ', 'ô', 'O', 'Ó', 'Ò', 'Õ', 'Ô',
			'u', 'ú', 'ù', 'ü', 'U', 'Ú', 'Ù', 'Ü',
			'y', 'Y'
		};
		
		for(short i = 0; i < listaVogais.length; i++){
			vogais[i] = listaVogais[i];
		}
	}
	
	public char[] getVogais(){
		return vogais;
	}
	
	private void setConsoantes(){
		char[] listConsoantes = {
			'b', 'B', 'c', 'C', 'ç', 'Ç', 
			'd', 'D', 'f', 'F', 'g', 'G',
			'h', 'H', 'j', 'J', 'k', 'K', 
			'l', 'L', 'm', 'M', 'n', 'N',
			'p', 'P', 'q', 'Q', 'r', 'R', 
			's', 'S', 't', 'T', 'v', 'V',
			'x', 'X', 'z', 'Z', 'w', 'W',
		};
		
		for(short i = 0; i < listConsoantes.length; i++){
			consoantes[i] = listConsoantes[i];
		}
	}
	
	public char[] getConsoantes(){
		return consoantes;
	}
	
	/*
	* Método de verificação
	*/
	public void analisarNome(String nome){
		short tamanhoTexto = (short) nome.length();
		setTamanhoNome(tamanhoTexto);
		
		if(validarTexto(nome)){
			/*
			* Verifica a quantidade de vogais
			*/
			for(short letra = 0; letra < tamanhoTexto; letra++){
				for(short posicao = 0; posicao < vogais.length; posicao++){
					if(nome.charAt(letra) == getVogais()[posicao])
						setNumeroVogais(getNumeroVogais() + 1);
				}
			}
			
			
			/*
			* Verifica a quantidade de consoantes
			*/
			for(short letra = 0; letra < tamanhoTexto; letra++){
				for(short posicao = 0; posicao < consoantes.length; posicao++){
					if(nome.charAt(letra) == getConsoantes()[posicao])
						setNumeroConsoantes(getNumeroConsoantes() + 1);
				}
			}
		}else
			System.out.println("\nO nome informado não é válido!");
		
	}
	
	private boolean validarTexto(String texto){
		boolean letra = true;
		
		for(short i = 0; i < texto.length(); i++){
			letra = Character.isLetter(texto.charAt(i));
		}
		return letra;
	}
}

import java.util.Scanner;

public class Principal {
	public static void main(String[] args){
		Scanner leitor = new Scanner(System.in);
		VerificaLetra verificaLetra = new VerificaLetra();
		
		System.out.print("Informe o nome: ");
		verificaLetra.analisarNome(leitor.nextLine());
		
		System.out.println("Tamanho do nome: " + verificaLetra.getTamanhoNome());
		System.out.println("Número de vogais: " + verificaLetra.getNumeroVogais());
		System.out.println("Número de consoantes: " + verificaLetra.getNumeroConsoantes());
	}
}

Rodando…

2 curtidas

exatamente isso. muito obrigada!!!

O que é melhor:
a) fazer em case b) fazer em array. c) usar if e else?

Qual desses casos é o melhor ou mais recomendado, viável, bom?

É sobre o exercício? Se for, a resposta está na resolução do exercício. Nesse caso, eu julguei que seria melhor se fosse dessa forma. Mas um resposta mais abrangente: depende. Eu geralmente uso case para situações que envolvem alternativas na forma de menu, mas podem acontecer situações fora dessas em que se apresente como a melhor alternativa. If...else sempre são usados, então não há resposta adequada para essa pergunta. No entanto utilizar um número elevado de if...else me incomoda, tenho a impressão de que o código está ‘sujo’. A alternativa melhor, a meu ver sempre é um array ou lista, porque o código fica mais ‘limpo’ (quando dá para ser usado), mas como eu disse: depende!

1 curtida

Pode ser feito deste modo ?

 switch (valor) {

  case 1: "'a','â','ã','á','à','A','Â','Ã','Á','À'" 
       System.out.println ("vogais");
       break;

  case 2: "'e', 'ê', 'é', 'è', 'E', 'Ê', 'É', 'È'" 
       System.out.println ("vogais");
       break;

  case 3: "'i', 'í', 'ì', 'I', 'Í', 'Ì'"
       System.out.println ("vogais");
       break;

  case 4: "'o', 'ô', 'õ', 'ó', 'ò', 'O', 'Ô', 'Õ', 'Ó', 'Ò'"
       System.out.println ("vogais");
       break;

  case 5: "'u', 'ú', 'ù', 'U', 'Ú', 'Ù'"
       System.out.println ("vogais");
       break;

  default:
       System.out.println ("O valor da variavel não é consoante, nenhum dos anteriores");


  }

É possível chamar um array dentro de um case? Para a solução anterior observei essa resposta Método CASE

Bom, eu não usei dessa forma, então creio que eu tenha respondido a pergunta. Mas como disse há vários posts atrás: há várias formas de resolver. Você testou? Funciona? Ficou elegante? O código ficou limpo? Resolveu o seu problema?

1 curtida

Que eu saiba, os valores para os cases devem ser dados constantes/estáticos, ou seja, devem ser informados em tempo de compilação. Como arrays são resolvidos em tempo de execução (quando o laço itera), então não podem ser usados arrays. Mas faça um teste em uma IDE, creio que ela irá gerar um aviso (erro) sobre isso.

A instrução de seleção múltipla switch realiza ações diferentes com base nos possíveis valores de uma expressão integral constante do tipo byte, short, int ou char, podendo admitir String e enumerações.

Fonte: Java Como Programar 8, pág. 129.

1 curtida

Tente assim. Vale dar uma lida em expressões regulares
// Tamanho da frase
System.out.println("Tamanho palavra: " + entrada.length());

// Espaço em branco não é letra. O \W limpar os não letras
System.out.println(“Total caracteres: " + entrada.replaceAll(”\W", “”).length());

// Remove tudo que não for vogal
System.out.println(“Total consoantes: " + entrada.replaceAll(”[^aeiou]", “”).length());

O “==” compara (no caso das Strings) o endereço de memória qual foi alocado para aquela String, por decorrência do famoso pool de Strings, o uso do “==” para a comparação de Strings não é recomendado. Por isso, o certo ao fazermos a comparação de Strings é usar um dos métodos da classe String, o “equals()”.

Reativar um topico dois anos depois para dizer algo que não se aplica?
Neste tópico o == é usado (corretamente) para comparar char, não String.

String a = "Uma string";
String b = "Uma" + " string";

if (a == b) { // false, apesar do mesmo conteudo, as strings são diferentes
(...)

Mas…

char a = 'x';
char b = 'w' + 1;

if (a == b) {   // true, ambos tem o character x (ascii 0x78)
(...)