Contador de Consoantes e Vogais

Pessoal, sou iniciante na linguagem Java e gostaria de uma força. Vejam o código abaixo:

Nesse código consigo capturar o o usuário digitou no teclado e exibir quantas vogais e consoantes existem na frase.

Porém, queria que me retorna-se quantas vogais e consoantes através de um método get, para cumprir uma exigência do professor que solicitou. podem dar uma ajuda?

package teste;

import java.util.Scanner;

public class ContadorLetras {
   
    public static void main(String[] args){
            
        Scanner scan = new Scanner (System.in);
      
        System.out.println("Digite sua frase:");
            
        String frase = scan.nextLine();
        
        System.out.println("Sua frase é: " + frase);
        
             int vog = 0, cons = 0;
        
        frase = frase.toLowerCase();
        for(int i = 0; i < frase.length(); i++){
            char c = frase.charAt(i);
            if(c == 32) continue;
            if(c == 97 | c == 101 | c == 105 | c == 111 | c == 117){
                vog++;
                continue;
            }
            if(c >= 98 && c <= 122) cons++;
        }
        System.out.println("Na frase \""+frase+"\" temos:\nVogais: "+vog+"\nConsoantes: "+cons);
        
       
}
}

vc já fez tudo cara só adicionar isso:

public class ContadorLetras {
private int vog;
private int cons;

public ContadorLetras(){
    this.vog = 0;
    this.cons = 0;
}
 
public static void main(String[] args){

    Scanner scan = new Scanner (System.in);

    System.out.println("Digite sua frase:");

    String frase = scan.nextLine();

    System.out.println("Sua frase é: " + frase);

         int vog = 0, cons = 0;

    frase = frase.toLowerCase();
    for(int i = 0; i < frase.length(); i++){
        char c = frase.charAt(i);
        if(c == 32) continue;
        if(c == 97 | c == 101 | c == 105 | c == 111 | c == 117){
            vog++;
            continue;
        }
        if(c >= 98 && c <= 122) cons++;
    }

ContadorLetras cl = new ContadorLetras();
    System.out.println("Na frase \""+frase+"\" temos:\nVogais: "+cl.getVog()+"\nConsoantes: "+cl.getCons());
}

public int getVog(){
  return this.vog;
}

public int getCons(){
   return this.cons;
}

}

Perfeito meu velho! Muito obrigado! Era isso mesmo! Desculpe a pergunta idiota! Estou aprendendo ainda! Abraço!

Agora tem um porém! Ele está retornando zero para as vogais e consoantes! Sabe dizer porque?

Pelo que vi ele está retornando zero porque ele puxando a variavel de dentro do metodo main:

int vog = 0, cons = 0;

ou seja,

o metodo get está retornando aqueles valores.

como puxar do metodo construtor. Tentei mas ele diz que nao podemos referenciar de um contexto estatico.

Tem que remover as variáveis vog e cons de dentro do método, pois caso contrário vc vai ter problemas de escopo, uma vez que a atribuição de valores aponta para vog++ e cons++.
Veja, é perfeitamente possível utilizar uma variável de método com o mesmo nome da variável de instância, porém, quando vc precisa manipular os valores destas no mesmo método, conforme sugerido acima, entra no problema de identificar quem é quem. Resumindo:

private vog = 15;
private cons = 20;

// ...suponha que os gets() estejam devidamente criados.

public void metodoQualquer(){
 int cons = 0, vog = 0;
System.out.println(cons) // 0
System.out.println(this.cons) // 20
System.out.println(vog) // 0
System.out.println(this.vog) // 15
}

Porém, caso vc não tenha dentro do método uma variável com o mesmo nome da variável de instância, o uso do this não é obrigatório.

private vog = 15;
private cons = 20;

// ...suponha que os gets() estejam devidamente criados.

public void metodoQualquer(){
System.out.println(cons) // 20
System.out.println(vog) // 15

}

No entanto, um ponto muito importante deve ser observado ao excluir as variáveis do método para passar a usar as de instância, métodos estáticos não tem acesso a atributos não estáticos. Logo, vc precisará alterar tb os atributos para private static

Por fim, não tem necessidade desse construtor settando 0 pros atributos de forma explícita, pois quando uma instância é gerada, os atributos assumem valores padrão, no caso o primitivo int recebe 0 por default.

Abraço

Danielcoar só uma observação cara no segundo if seu de dentro do loop vc ta comparando com binario usando apenas um “pipe” | já q é char num tem importância sempre use o OU do java com dois “pipes” || a não ser que vc realmente precisa usar apenas um. Me dei ao luxo tbm de melhorar um pokinho seu código, se vc já achou as vogais porque perguntar quais são as consoantes veja:

public class ContadorLetras {

    private int vog;
    private int cons;

    public ContadorLetras () {
        this.vog = 0;
        this.cons = 0;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.println("Digite sua frase:");

        String frase = scan.nextLine();

        System.out.println("Sua frase é: " + frase);

        frase = frase.toLowerCase();

        ContadorLetras cl = new ContadorLetras ();

        int vogal = 0, consoante = 0;
        for (int i = 0; i < frase.length(); i++) {
            char c = frase.charAt(i);
            if (c == 97 || c == 101 || c == 105 || c == 111 || c == 117) {
                vogal++;
            }else{
                consoante++;
            }
            
        }

        cl.setVog(vogal);
        cl.setCons(consoante);

        System.out.println("Na frase \"" + frase + "\" temos:\nVogais: " + cl.getVog() + "\nConsoantes: " + 
                cl.getCons());

    }

    public int getVog() {
        return vog;
    }

    public void setVog(int vog) {
        this.vog = vog;
    }

    public int getCons() {
        return cons;
    }

    public void setCons(int cons) {
        this.cons = cons;
    }
}

Consegui fazer as referenciais com o uso do private. Porém, continua puxando “zero”: veja:

public class ContadorLetras {
private static int vog;
private static int cons;

public ContadorLetras(){
ContadorLetras.vog = 0;
ContadorLetras.cons = 0;
}

public static void main(String[] args){

Scanner scan = new Scanner (System.in);

System.out.println("Digite sua frase:");

String frase = scan.nextLine();

System.out.println("Sua frase é: " + frase);

frase = frase.toLowerCase();
for(int i = 0; i < frase.length(); i++){
    char c = frase.charAt(i);
    if(c == 32) continue;
    if(c == 97 | c == 101 | c == 105 | c == 111 | c == 117){
        ContadorLetras.vog++;
        continue;
    }
    if(c >= 98 && c <= 122) ContadorLetras.cons++;
}

ContadorLetras cl = new ContadorLetras();
System.out.println(“Na frase “”+frase+”" temos:\nVogais: “+cl.getVog()+”\nConsoantes: "+cl.getCons());
}

public int getVog(){
return ContadorLetras.vog;
}

public int getCons(){
return ContadorLetras.cons;
}

}

blayd2015 deu certo amigo! Era isso que precisava! obrigado!

Agradeço ao raphaeloneves, que acabou me ajudando com as referenciações.

Muito obrigado amigos!

Só um comentário sobre essa soluçao que encontrou, apesar de funcionar, provavelmente nao era isso que seu professor queria quando pediu pra usar get (seja lá porque ele pediu pra usar isso, mas enfim…)

Quando você usa aquele static, mesmo que crie duas variáveis do tipo ContadorLetras, ambas sempre terao o mesmo valor, e nao é isso que você quer geralmente.

Um exemplo abaixo mais ou menos de como fazer:

class ContadorLetras {

  private int vogais;
  private int consoantes;

  ContadorLetras(String frase) {
    //coloque sua lógica para contar vogais e consoantes aqui
  };

  public getVogais() {  return vogais; }
  public getConsoantes() { return consoantes; }

  public static void main() {
    Scanner scan.... // tudo que tinha antes até 
    System.out.print("Sua frase é").....

    ContadorLetras contador = new ContadorLetras(frase);

    //E aqui use get
    System.out.println("vogais: " + contador.getVogais() )....

  }
}

Se criar duas variáveis agora, do tipo ContadorLetras, cada uma terá seus valores diferentes.

1 curtida

MUITO mais elegante essa forma proposta! Porém, só não acho bacana colocar a lógica no construtor. Isso por questão de de design da classe mesmo. Criaria somente um método que pudesse ser invocado no construtor. Ao meu ver, fica mais legível e divide melhor as responsabilidades.

1 curtida

Perfeito Abel! Gostei muito da sua dica! Muito obrigado! Aproveitando sua generosidade em contribuir… Queria da uma melhorada no programa, acrescentando um contador para total de letras da frase, um quantidade especifica de uma letra, por exemplo, na frase temos 5 letras “a”. Não conheço os métodos para realizar essa contagem.

Na verdade com o código que você fez, já está bem perto de fazer isso.
Veja seu if anterior:

if(c == 97 | c == 101 | c == 105 | c == 111 | c == 117)

O que esses números significam? Na verdade como chars, eles representam letras.
Você poderia (e pra deixar o código mais claro, deveria) ter feito o if assim:

if(c == 'a' | c == 'e' | c == 'i' | c == 'o' | c == 'u')

Você usou isso para contar vogais.
Se quiser contar apenas a letra a:

if(c == 'a')

Se quiser contar qualquer outra letra? É só substituir o ‘a’ pela letra que quer.

É possível fazer um cast implícito de char para int. Acredito que estes valores sejam o resultado dos respectivos casts em int.

Foi uma pergunta retórica :slight_smile: