Ir ao conteúdo
  • Cadastre-se

C++ Continuação de um programa que gera letra e detecta se é vogal ou consoante


phbgarcia

Posts recomendados

Bom pessoal, preciso criar um programa que gere uma letra aleatória do alfabeto, e que depois, seja avaliado se essa letra que foi "sorteada" é uma consoante ou vogal. Sei que é tarefa besta, eu consigo gerar a letra, porém na hora de saber se é vogal/consoante fico preso. Irei postar o código que tenho até aqui. Aos que ajudarem ficarei muito feliz. Entrei para faculdade e tô tendo dificuldades de fazer essa questão de Programação em C++.

 

#include <iostream>

using namespace std;

 

string letras[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","y","z"};

int main()

{

srand(time(NULL));

int x = rand() % 26;

 

cout << "Letra: " << letras[x] << endl;

 

cin.ignore();

}

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@phbgarcia Se for permitido resolver com funções pode usar find,

 

string vogais = "aeiou";

if(vogais.find(letras[x]) != string::npos){
    cout << "Vogal\n";
}else{
    cout << "Consoante\n";
}

 

Mas não precisa de um vetor para pegar a letra, poderia usar o código da tabela ascii assim,

char letra = (rand() % 26) + 97;

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Peguei as informações de vocês, mas devo testar os códigos que vcs mandaram onde?

 

Se puderem colocar onde a parte de vocês vão ficar ficarei grato

@Midori devo colocar essa parte do código logo após o int main? ou logo dps do string letras? testei de algumas formas aqui e tava dando alguns erros no compilador

 

@Um mero usuário também fiz essa comparação, mas ainda assim da erro no compilador, será que coloquei na posição errada?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@phbgarcia O ideal é deixar a string letras em main e evitar variáveis globais, mas seu código pode ficar assim,

int main(){
    srand(time(NULL));
    int x = rand() % 26;
    string vogais = "aeiou";
    
    cout << "Letra: " << letras[x] << endl;

    if(vogais.find(letras[x]) != string::npos){
        cout << "Vogal\n";
    }else{
        cout << "Consoante\n";
    }
    cin.ignore();
} 

 

E a forma que comentei com o código ascii pode ser assim,

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main(){
    string vogais = "aeiou";
    char letra;
    
    srand(time(NULL));
    
    letra = (rand() % 26) + 97;
    cout << letra << endl;
    
    if(vogais.find(letra) != string::npos){
        cout << "Vogal\n";
    }else{
        cout << "Consoante\n";
    }
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Em 18/06/2021 às 15:04, phbgarcia disse:

também fiz essa comparação, mas ainda assim da erro no compilador, será que coloquei na posição errada?

talvez, eu só mandei a lógica do negócio... e eu nem fiz pensando na escrita certa, é possivel que um ctrl+c/ctrl+v nao funcione... o ideal é você pegar a logica e escrever seu proprio codigo, assim é o melhor jeito de aprender, entende?


edit: viu, marque a resposta de quem mais te ajudou como solução, assim ajuda os amiguinhos :)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 18/06/2021 às 02:14, phbgarcia disse:

string letras[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","y","z"};

 

 

Não precisa desse vetor. E se precisasse não seria de string mas apenas de letrinhas, char ou const char, já que não vai ser alterado. string é uma classe. tem construtores, aloca memória, e tem um vetor delas. Está errado. Use
 

    const char*  valor  {"abcdefghijklmnopqrstuvxywz"};

 

nesses casos. Mas entenda que o valor das letras é o mesmo da ordem alfabética, a partir de 'a'. Não precisa sequer das letras nesse programa

 

Em 18/06/2021 às 10:01, Midori disse:

char letra = (rand() % 26) + 97;

 

Evite esses números 'mágicos".  'a' é mesmo 97 na tabela ASCII. mas antes de tudo 'a' é 'a'. Só isso. E não precisa dos parênteses porque % (módulo) tem precedência sobre a soma.

 

    char letra = (rand() % 26) + 97;

é a mesma coisa que 

    char letra = rand() % 26 + 97;

que é a mesma coisa que 

    char letra = 'a' + rand() % 26;

 

Só que o último é mais fácil de ler e é isso que importa. São 26 letras. rand() retorna um int. O resto da divisão desse valor por 26 vai dar claro um numero entre 0 e 25. E esse valor somado a seja lá qual for o valor de 'a' vai dar algo então entre 'a' e 'z', algo entre 'a' + 0 e 'a' + 25...

 

Um exemplo
 

#include <ctime>
#include <iostream>
using namespace std;

int main(void)
{
    srand(time(NULL));
    switch ( char letra = 'a' + rand() % 26 )
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            cout << "letra sorteada: " << letra << " [vogal]\n ";
            break; 
        default:
            cout << "letra sorteada: " << letra << " [consoante]\n ";
            break; 
    };  // switch()
    return 0; 
};
// fim

 

Só isso. Mais fácil de ler.
 

Outro exemplo:
 

Como as vogais são bem conhecidas, bem como o alfabeto, uma alternativa seria sortear a posição da letra e assim não precisaria usar nenhuma lógica: apenas mostrar o resultado.

 

#include <ctime>
#include <iostream>
int main(void)
{ 
    // tabela              "abcdefghijklmnopqrstuvxywz";
    const char*  valor   { "10001000100000100000100000" };
    const char*  tipo[]  { " [vogal]", " [consoante]" };
    srand(time(NULL)); // inicia o gerador rand()
    int          posicao = rand() % 26; // o sorteio
    std::cout << "letra sorteada: '" << (char) (posicao+'a') << "' " << tipo[ (valor[posicao] == '0') ] << "\n";
    return 0; 
};

 

sorteia a letra pela posição e vê na tabela se está marcada como vogal --- as vogais aparecem com valor '1'. E o comentário ajuda a alinhar os valores. Sem lógica, sem loops. sem if ou switch. Isso funciona porque qualquer expressão em C ou C++ ou C# vale 0 se falsa e 1 se verdadeira.

 

Em 18/06/2021 às 02:14, phbgarcia disse:

cin.ignore();

 

Para que isso?

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!