Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado

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
Postado

@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
Postado
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
Postado
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

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...