Ir ao conteúdo
  • Cadastre-se

C++ String - Contar vogais (c++)


Visitante

Posts recomendados

Boa noite! Eu preciso fazer um programa em c++ que dada uma string sai a quantidade de vogais, eu fiz de uma maneira e não está dando certo, pois não sai nada. Alguém pode me ajudar? Com certeza tem muita coisa errada, sou iniciante e não sei como corrigir.

#include <iostream>
using namespace std;
int main()
{
	string vogais[5]={"a","e","i","o","u"}, palavra;
	int s = 0, i;
	cin>>palavra;
	for (i=0; i>0; i++)
	{
		if (palavra == vogais[i])
		{
			s++;
			cout<<s;
		}
		i++;
	}
	
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Então meu brother,não conheço o C++ porém programo em C e aparentemente seu código não imprime nada pois você não instruiu ele a fazer isso. Você teria q usar uma função de imprimir semelhante ao C tipo " printf("blabla"); " dentro seu ciclo for. Outro erro que notei é que seu ciclo nem mesmo começa,pois como você define o i=0 e o ciclo inicia apenas se i>0. você teria que colocar i>=0 para isso. 

 

Espero ter ajudado,

Luis Xavier. 

Link para o comentário
Compartilhar em outros sites

 

@Luis Gustavo Xavier tentei fazer assim em linguagem c 

#include <stdio.h>
#include <assert.h>

int contarVogais(char palavra[]) {
    char vogais[] = "aeiouAEIOU";
    int numVogais = 0, i, j;

    for (i = 0; palavra[i] != '\0'; i++) {
        for (j = 0; vogais[j] != '\0'; j++) {
            if (vogais[j] == palavra[i]) {
                numVogais++;
                break;
            }
        }
    }

    return numVogais;
}
int main() {

    char palavra;
    scanf("%d", &palavra);
    printf ("%d", contarVogais(palavra));

    return 0;
}

porém está dando alguns erros, você pode me falar o que ta errado?

Link para o comentário
Compartilhar em outros sites

@farnyy

51 minutos atrás, farnyy disse:


char palavra;
scanf("%d", &palavra);

Declarou um caractere, não uma string, e "d" é o especificador de inteiros.

Você também não precisa do & para ler strings.

Tente isso:

char palavra[201]; // Espaço para 200 caracteres + '\0'
scanf("%200s", palavra); // Limitado a ler 200 caracteres (não-nulos)
// Ou
fgets(palavra, sizeof(palavra), stdin); // Alternativa comum e segura
Link para o comentário
Compartilhar em outros sites

Então,pelo que eu to vendo,é o que o colega falou aqui que cima,erro no scan e erro na hora da declaração do char, e você pode deixar ele mais eficiente invertendo os dois for,em vez de passar as 5 vogais em cada caractere,passar as 5 vogais na extensão inteira do array.

Manda o código atual para avaliar também

 

Espero ter Ajudado,

Luis Xavier

Link para o comentário
Compartilhar em outros sites

5 horas atrás, farnyy disse:

string vogais[5]={"a","e","i","o","u"}, palavra;

 

Sim, tem muita coisa errada, em C++ ou C.

 

  • não declare mais de uma variável por linha. Só atrapalha.
  • declarou vogais[5] como string. Então declarou 5 strings, cada uma inicializada com uma letra. Por certo não era isso que queria. O simples seria
     
    	string vogais { "aeiouAEIOU" };
    	string palavra{};
     
        for (i = 0; palavra[i] != '\0'; i++) {

     

  • Muito trabalho para escrever 0
     
  • NUNCA use
     
        scanf("%d", &palavra);


    sem testar o valor de retorno. Qual o sentido de continuar com o programa se não leu a palavra? Vai contar que vogais?

   char palavra;
   scanf("%d", &palavra);

 

  • Quantos char cabe em palavra  que é um char? Resposta: 1. Como pode ler uma string em um char? Uma string mesmo vazia já tem uma letra, o zero do fim. E uma string em C++ é algo mais complicado...
	for (i=0; i>0; i++){}

 

  • nesse comando a expressão do meio é o teste de saída. A primeira é a inicialização e a última o que roda depois de cada execução do que esteja entre {}, e nesse caso um incremento. Com a condição de saída já falsa,  com i = 0, quantas vezes vai rodar seu loop? Resposta: nenhuma vez.
     
  • Em geral nem precisa de um vetor com as vogais, já que as letras tem valores em sequência o normal é testar se um valor é >= 'a' E <= 'u' para uma minúscula por exemplo.
     
  • Por outro lado, para iterar numa string em C o mais simples é usar um char* mesmo, porque aí já pode ver as letras uma a uma sem índice. No seu caso o índice não importa afinal: precisa apenas saber quantas vogais são...

    De volta ao programa, em C

    considere essa função
     
    	int  conta(char* alvo, char* palavra)

E entenda que pode facilitar as coisas para si mesmo desde antes de começar a escrever o programa: conta() procura letras da string alvo dentro de palavra e devolve o total. Simples. Se usar uma letra só, tipo

	int n = conta( "e", "esse" );

 


Deve retornar 2. Mas se passar 
 

	n = conta( "", "esse" ); // sem letra pra procurar = 0
	n = conta( "es", "" ); // palavra vazia = 0
	n = conta( "", "" ); // tudo vazio, ok, retorna 0
	n = conta( "aeiouAEIOU", "vogais" ); // deve retornar 3

 

Então é mais simples de testar e ao mesmo tempo serve para mais coisas. Pense nisso.

 

E como seria uma função assim?

 

Tem muitas maneiras de escrever, mas o comum seria algo assim
 

int         conta(char* alvo, char* palavra)
{	// procura letras de 'alvo' em 'palavra'
    char* p = palavra;  // a proxima letra na palavra
    int v = 0; // o total de letras;
    while (*p != 0) // ate o fim da palavra
    {  // entao compara com cada letra do alvo
        char* p_alvo = alvo; // a proxima letra no alvo
        while (*p_alvo != 0) // ate o fim do alvo
        {   // mesma coisa: se o alvo for "" vai sair ok
            if (*p_alvo == *p)
            {   v += 1; // conta 1
                break; // sai fora
            };
            p_alvo += 1; // proxima letra do alvo
        };  // while()
        p += 1; // proxima letra da palavra
    }   // while()
    return v;
}

 

Veja como fica mais claro escrevendo assim: não precisa de índices e testes, e funciona para qualquer conjunto. Entende a diferença?

 

Um teste seria como?

 

Faça o seu programa se testar antes de ficar pensando: já crie um vetor com as situações mais comuns que sempre dão pau:

  • strings vazias,
  • uma letra só,
  • uma string comum,

e já rode o programa COM os testes.


Veja um exemplo:

 

int main(void)
{
    char* alvo = "ou";
    char* teste[] = {
        "forum",
        "Clube do Hardware",
        "c",    // uma letra so: bom teste
        ""      // vazia: bom teste
    };
    for (int n = 0; n < 4; n += 1)
        printf("\"%s\" tem %d vezes alguma letra de \"%s\"\n",
            teste[n], conta(alvo, teste[n]), alvo);

    printf("\"%s\" tem %d vezes alguma letra de \"%s\"\n",
        "Valor", conta("valor", "Valor"), "valor" );

    return 0;
}

 

Em teste[] já tem os testes mais comuns, e um loop vaio chamar a função para esses valores, assim não é preciso ficar inventando nada.

 

O segundo printf() serve apenas para mostrar que pode chamar direto com valores constantes, não precisa sequer de variáveis em main():
 

	conta("valor", "Valor")


E em C++ funciona?

 

Sim, igualzinho. Mas em C++ não se faz assim. Mesmo que não se use uma classe com um método para contar as vogais, em C++ talvez fosse o caso de declarar
 

	int  conta(const string& alvo, const string& palavra)

 

E main() poderia ser, usando o mesmo exemplo
 

int main(void)
{
    string  alvo{ "ou" };
    string  teste[] = {
        "C++ forum",
        "Clube do Hardware",
        "c",    // uma letra so: bom teste
        ""      // vazia: bom teste
    };
    for (auto str : teste)
        cout << "\"" << str << "\" tem " << conta(alvo, str) <<
        " vezes alguma letra de " << alvo << "\"\n";

    cout << "\"Valor\" tem " << conta("valor", "Valor") <<
        " vezes alguma letra de \"valor\"\n";
    return 0;
}

 

Uma possível função teria apenas uma diferença: extraindo o valor da string no modo "C" da string em C++, assim:
 

int         conta(const string& alvo, const string& palavra)
{
    char* p = (char*) palavra.c_str();  // a proxima letra na palavra
    int v = 0; // o total de letras;
    while (*p != 0) // ate o fim da palavra
    {  // entao compara com cada letra do alvo
        char* p_alvo = (char*) alvo.c_str(); // a proxima letra no alvo
        while (*p_alvo != 0) // ate o fim do alvo
        {   // mesma coisa: se o alvo for "" vai sair ok
            if (*p_alvo == *p)
            {
                v += 1; // conta 1
                break; // sai fora
            };
            p_alvo += 1; // proxima letra do alvo
        };  // while()
        p += 1; // proxima letra da palavra
    }   // while()
    return v;
}

 

O resultado, claro, é o mesmo.

 

C++ tem conjunto (set) de qualquer coisa, e porque não de letras?

 

C++ tem muitos recursos para abstração de problemas simples ou não tão simples. Usando set a função poderia ficar bem mais clara:
 

int         conta(const set<char>& alvo, const string& palavra)
{
    int v = 0; // o total de letras;
    for (auto letra : palavra) if (alvo.count(letra) > 0) v = v + 1;
    return v;
}

 

alvo é um conjunto de letras, count() retorna quantas letra tem no conjunto é bem mais legível. Em 3 linhas.

 

E main()?

 

int main(void)
{
    set<char> alvo{ 'o', 'u' };
    string  teste[] = {
        "C++ forum",
        "Clube do Hardware",
        "c",    // uma letra so: bom teste
        ""      // vazia: bom teste
    };
    for (auto str : teste)
        cout << "\"" << str << "\" tem " <<
        conta(alvo, str) <<
        " vezes alguma letra do conjunto\n";

    set<char> outro { 'v', 'a',  'l', 'o', 'r' };
    cout << "\"Valor\" tem " <<
        conta(outro, "Valor") <<
        " vezes alguma letra de \"valor\"\n";

    return 0;
}

 

Não muda muito... É claro que pode usar um conjunto de vogais, ou de qualquer coisa

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!