Ir ao conteúdo
  • Cadastre-se

C Programação C Recebe um texto e mostrar vogais e consoantes em 2 vetores


Posts recomendados

Crie um programa que deverá solicitar a digitação de um texto de até 700 caracteres, após receber este texto o programa deverá limpar a tela e copiar o seu conteúdo, caractere a caractere, para outros dois vetores de forma condicional, um dos vetores deverá receber a cópia das posições que continham vogais e o outro vetor deverá receber a cópia das posições que contém consoantes. O conteúdo dos vetores auxiliares (vogais e consoantes) deverá ser listado ao final da execução.

 

Ainda estou começando essa parte de vetor então não entendo muito a respeito. Se puderem me ajudar.

segue abaixo o que fiz:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()

{
    char frase[700];
    char vogal[700];
    char consoante[700];
    int cont;
    int tam;
    int v;
    int c;

   

    printf("Digite a frase:\n");
    scanf("%[^\n]s",&frase[cont]);

   

    tam=strlen(frase);

   

    for(cont=0;cont<tam;cont++)
    {

        if((frase[cont]=='a')||(frase[cont]=='e')||(frase[cont]=='i')||(frase[cont]=='o')||(frase[cont]=='u'))
        {
            vogal[v++]=frase[cont];
        }
        else{
            consoante[c++]=frase[cont];
        }
    }


    printf("\nimprimindo todas as vogais:\n");
    for(v=0;v<tam;v++)
    {
        printf("%c",vogal[v]);
    }

    printf("\nimprimindo todas as consoantes:\n");
    for(c=0;c<tam;c++)
    {
        printf("%c",consoante[c]);
    }

    getchar();
}

 

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

Antes de tudo, procure conteúdo de qualidade para ler se ainda não tem.

printf("Digite a frase:\n");
scanf("%[^\n]s",&frase[cont]);
/** Apesar da função scanf ser prática eu lhe atribui pouca qualidade.
    Outra coisa, já que está no começo da aprendizagem então presta mais atenção 
    Na sintaxe, porque e de doer os olhos uma coisa assim &frase[0] ou algo do tipo
    Vou subir lá pra cima, se vai subir e para cima mesmo, ou seja, é redundante.
 */

CORRETO:

puts ("Digite a frase:");
gets (frase);
/** Existem muitos métodos na linguagem scanf não é melhor deles.
    Use-a apenas para pegar números.
 */

 

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

@Fabio M. Nascimento     seu código está bom,  mas está apresentado erro ,  e é por que precisa inicializar as variáveis lá no inicio, o v e o c pois senão ele insere os dados em posições indefinidas,  sendo que o vetor começa na posição zero sendo assim inicialize com o valor menos hum assim quando ele colocar na posição v++ estará colocando na posição zero e vai aumentando a posição até o final, então seu código com algumas modificações ficaria assim :

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char frase[700],vogal[700];
    char consoante[700];
    int j,tam,v=-1,c=-1;
    printf("Digite a frase:  ");
    fflush(stdin);
    gets(frase);
    tam=strlen(frase);
    for(j=0;j<tam;j++)
    {
        if(toupper(frase[j])=='A'||toupper(frase[j])=='E'||
           toupper(frase[j])=='I'||toupper(frase[j])=='O'||
           toupper(frase[j])=='U')
        {
            vogal[v++]=frase[j];
        }
        else{
            consoante[c++]=frase[j];
        }
    }
    vogal[v++]='\0';
    consoante[c++]='\0';
    printf("\nimprimindo todas as vogais:\n\n");
    for(v=0;v<tam;v++)
    {
        if(vogal[v]=='\0')break;
        printf("%c",vogal[v]);
    }
    printf("\n\nimprimindo todas as consoantes:\n\n");
    for(c=0;c<tam;c++)
    {
        if(consoante[c]=='\0')break;
        printf("%c",consoante[c]);
    }
    printf("\n\n");
    getch();
    return 0;
}

 

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

  • Membro VIP

Olá a todos.

 

@devair1010, testei sei código aqui e não funcionou. Veja:

tela.jpg

 

Estou usando o Dev++ 5.11.

 

Pelo que eu vi, pelo menos aqui no meu compilador, a falha está no valor da inicialização do v e c, pois o "++" só atualiza depois.. ou seja, pega o valor original, e após incrementa em 1.

 

int j,tam,v=0,c=0; //inicializa com 0 mesmo
vogal[v++]=frase[j]; //aqui, o program vai acessar o valor atual de v e só após faz "v=v+1"

 

 

 

Outra coisa:

22 horas atrás, Fabio M. Nascimento disse:

    printf("\nimprimindo todas as vogais:\n");
    for(v=0;v<tam;v++)
    {
        printf("%c",vogal[v]);
    }

    printf("\nimprimindo todas as consoantes:\n");
    for(c=0;c<tam;c++)
    {
        printf("%c",consoante[c]);
    }

 

Para imprimir, tem que usar o limite do próprio vetor, usam tam, seria como se o vetor de vogais e consoantes tivessem o mesmo tamanho da frase.

 

Poderia usar a própria referência de posição do vetor... algo como:

    //vogal[v++]='\0';
    //consoante[c++]='\0';

    printf("\nimprimindo todas as vogais:\n\n");
    for(int i=0;i<v;i++)
        printf("%c",vogal[i]);

    printf("\n\nimprimindo todas as consoantes:\n\n");
    for(int i=0;i<c;i++)
        printf("%c",consoante[i]);

 

 

RESUMINDO:

(pelo menos de acordo com meu compilador)

 

- Inicializem a variável com 0, em vez de -1.

 

Ou com vocês está funcionando normalmente?

 

 

No aguardo.

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

@Simon Viegas, eu iniciei com 0 também, porque ao iniciar com -1 ele elimina a primeira letra começando após ela e fiz um if dentro do else para eliminar os espaços digitados.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()

{
    char frase[700];
    char vogal[700];
    char consoante[700];
    int cont;
    int tam;
    int v=0;
    int c=0;

   

    printf("Digite a frase:\n");
    fflush(stdin);
    gets(frase);

   

    tam=strlen(frase);

   

    for(cont=0;cont<tam;cont++)
    {

        if((frase[cont]=='a')||(frase[cont]=='e')||(frase[cont]=='i')||(frase[cont]=='o')||(frase[cont]=='u'))
        {
            vogal[v++]=frase[cont];
        }
        else{
            if(frase[cont]!=' '){
            consoante[c++]=frase[cont];
            }
        }
    }

    system("cls");


    vogal[v++]='\0';
    consoante[c++]='\0';


    printf("---------------------------\nimprimindo todas as vogais:\n---------------------------\n");
    for(v=0;v<tam;v++)
    {
        if(vogal[v]=='\0')break;
        printf(" %c \n",vogal[v]);
    }

    printf("-------------------------------\nimprimindo todas as consoantes:\n-------------------------------\n");
    for(c=0;c<tam;c++)
    {
        if(consoante[c]=='\0')break;
        printf(" %c \n",consoante[c]);
    }

    getchar();
}

 

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

  • Membro VIP

Olá @Fabio M. Nascimento.

 

1. Seu código não está aceitando vogais MAIÚSCULAS... Uma solução seria, como demonstrado no código do @devair1010, usando o toupper().

 

2. Sugiro não limpar a tela após ler o nome, assim ajuda da verificação (vide tela abaixo);

 

3. Achei melhor exibir os caracteres sem quebra de linha (vide tela abaixo). Mas vai do gosto...

 

4. Não sou muito fã do break... ou seja, fazer interromper um laço predeterminado.. Nesse caso, sugeriria usar um while... mas não tenho experiência sobre as boas práticas do C/C++... ai para "revisar" seria os mais experientes, como  @devair1010...  na dúvida deixe com o for mesmo.

 

5. Sugiro evitar esses excessos de espaços entre linhas... uma linha basta... Mas vai do gosto também.

 

Tela:

tela2.jpg

 

 

Adendo:

Apenas para efeito de demonstração, segue forma que sugiro estruturar... deixei alguns comentários tentando explicar algumas coisas.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() { //particularmente eu prefiro as chaves ao lado (APENAS GOSTO, use da forma que preferir. Creio eu que é mais comum usar em baixo mesmo...)
	
    char frase[700], vogal[700], consoante[700]; //para tipos iguais e "próximos", fica interessente agrupar
    int cont, tam;
    int v=0, c=0;

    printf("Digite a frase:\n");
    fflush(stdin);
    gets(frase);

    tam=strlen(frase);

    for (cont=0;cont<tam;cont++) { //acho mais interessante dar um espaço após o comando (for) e ao final também (chaves não colada)
        if ((frase[cont]=='a') || (frase[cont]=='e') || (frase[cont]=='i') || (frase[cont]=='o') || (frase[cont]=='u'))
            vogal[v++]=frase[cont]; //quando as chaves não são necessárias, é interessante remové-las... deixa o código ainda mais limpo
        else
            if (frase[cont]!=' ') 
            	consoante[c++]=frase[cont];
    }

    system("cls"); //essa linha acho que deveria desabilitar

    vogal[v++]='\0';
    consoante[c++]='\0';

    printf("---------------------------\nimprimindo todas as vogais:\n---------------------------\n");
    for (v=0;v<tam;v++) {
        if(vogal[v]=='\0') break; //na minha visão (que pode está errada), não seria bacana "quebrar" o laço. Melhor seria restruturar para usar while...
       	printf(" %c \n",vogal[v]);
    }

    printf("-------------------------------\nimprimindo todas as consoantes:\n-------------------------------\n");
    for (c=0;c<tam;c++) {
        if(consoante[c]=='\0') break;
        printf(" %c \n",consoante[c]);
    }

    getchar();
}

 

 

No aguardo.

 

 

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

@Simon Viegas

A questão do toupper() eu usei no código final sim. Sobre a quebra de linha, realmente fica melhor em sequencia. No caso de dar clear no texto é uma exigência do programa igual voce pode ver lá no post. Os espaços entre linha é coisa do forum kkkk porque no programa não tava assim.

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

@Fabio M. Nascimento fiz usando fgets em vez de gets/scanf para evitar que o usuário digite mas de 700 caracteres assim ficando da forma que o exercício pediu: "Crie um programa que deverá solicitar a digitação de um texto de até 700 caracteres".

A função gets/scanf não é possível limitar isso, podendo ocorrer até estouros de memória se escrever uma palavra com caracteres maior que 700. Podendo ocasionar resultados imprevisíveis.

#include <stdio.h>                    // printf
#include <stdlib.h>                   // fgets, system
#include <ctype.h>                    // tolower
#include <conio.h>                    // getchar

#define MAX_LETRAS                    700

/// <summary>
/// Verifica se o caractere passado no argumento c é uma vogal.
/// </summary>
/// </param name ="c">
/// Caractere que deseja verificar.
/// </param>
/// <returns>
/// Retorna true se for uma vogal ou false caso contrário.
/// </returns>
bool ehVogal(char c)
{
    c = tolower(c); // Uso de tolower para poder verificar com letras minúsculas já que a linguagem C é uma linguagem case sensitive
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'); // Retorna true se for igual a uma das seguintes vogais: a e i o u
}

/// <summary>
/// Verifica se o caractere passado no argumento c é uma consonte.
/// </summary>
/// </param name ="c">
/// Caractere que deseja verificar.
/// </param>
/// <returns>
/// Retorna true se for uma consoante ou false caso contrário.
/// </returns>
bool ehConsoante(char c)
{
    c = tolower(c); // Uso de tolower para poder verificar com letras minusculas já que a linguagem C é uma linguagem case sensitive
    return (c >= 'a' && c <= 'z' && !ehVogal(c)); // Retorna true se for igual a alguma letra do alfabeto minúsculo e se não for uma vogal
}

int main()
{
    char frase[MAX_LETRAS] = { 0 }, vogais[MAX_LETRAS] = { 0 }, consoantes[MAX_LETRAS] = { 0 };
    int numVogais = 0, numConsoantes = 0;
    
    printf("Insira a frase: ");
    
    // Pega até 700 caracteres(MAX_LETRAS) ou até encontrar um \n
    fgets(frase, MAX_LETRAS, stdin);
    
    // Limpa a a tela
    system("cls");
    
    // Verifica caractere por caractere do array frase se é uma vogal ou consoante
    for (int i = 0; frase[i] != 0; i++)
    {
        if (ehVogal(frase[i])) // Verifica se é uma vogal
            vogais[numVogais++] = frase[i]; // Adiciona para o array vogais e incrementa o número de vogais(numVogais) em + 1
        else if (ehConsoante(frase[i])) // Verifica se é uma consoante
            consoantes[numConsoantes++] = frase[i]; // Adiciona para o array consoantes e incrementa o número de consoantes(numConsoantes) em + 1
    }
    
    printf("Mostrando todas as vogais: ");
    
    // Mostra todas as vogais que foram salva no array vogais
    for (int i = 0; i < numVogais; i++) 
        printf("%c ", vogais[i]); // Escreve o caractere atual na saida
    
    // Escreve uma nova linha na tela para dar uma organizada na saida
    printf("\n");
    
    printf("Mostrando todas as consoantes: ");
    
    // Mostra todas as consoantes que foram salva no array consoantes
    for (int i = 0; i < numConsoantes; i++) 
        printf("%c ", consoantes[i]); // Escreve o caractere atual na saida
    
    // Escreve uma nova linha na tela para dar uma organizada na saida
    printf("\n");
    
    getchar();
    return 0;
}

 

 

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

Olá... boa tarde, 'caraca' eu erraria essa questão porque pegaria as posições, e não as letras.

Enunciado

[...] um dos vetores 
deverá receber a cópia das posições que continham vogais e o outro vetor deverá receber 
a cópia das posições que contém consoantes. [...]

 preciso urgente de ler mais, e os professores serem mais diretos, custava colocar...

[...] um dos vetores 
deverá receber a cópia das vogais e o outro vetor deverá receber 
a cópia das consoantes. [...]

>.<

 

Editado:

Minha ideia a lógica é a mesma ... só código que não, aguardo Debug...

/*  Programa: forum.c
    Escrito por: Mauro Britivaldo e Outros ...
    Data da Criação: 03/10/2018

    Propósito: CdHardware
    */


#include<stdio.h>  // Incluir as rotinas que fazem Entra e Saída .
#include<stdlib.h> // Incluir as rotinas que fazem uso de memória / conversão de dados.

// Converte Inteiro para Strings rsrs
void ShowUIntDecimal (unsigned int ValInt) {
   char UIntCharacter[22], u = 0;
   unsigned int IntModulos = ValInt;

   if (ValInt < 10) putchar ('0' + ValInt);
   else {
      UIntCharacter[u] = '0' + ValInt - ((IntModulos /= 10 ) * 10);
      ValInt = IntModulos;
      ++u;
      while (ValInt) {
            UIntCharacter[u] = '0' + ValInt - ((IntModulos /= 10 ) * 10);
            ValInt = IntModulos;
            ++u;
            }
      if (u > 1 && UIntCharacter[u - 1] == '0') UIntCharacter[u - 1] = '1';
      else if (u == 1) { UIntCharacter[++u] = '0'; UIntCharacter[u - 1] = '1'; }

      while (u > 0) { --u; putchar (UIntCharacter[u]); }
      }
   return ;
   }
// Analiza se é vogal
char IsVogal (char ValCharacter) {
   if (ValCharacter < ('Z' + 1)) ValCharacter = (ValCharacter - 'A') + 'a';
   switch (ValCharacter) {
      case 'a':case 'e':case 'i':case 'o':case'u': return 1;
      default: return 0;
      }
   }
// Analiza se é Alfabético
inline char IsAlpha (char ValCharacter) {
   return (('a'  - 1) < ValCharacter && ValCharacter < ('z' + 1) ||
           ('A'  - 1) < ValCharacter && ValCharacter < ('Z' + 1));
   }
// Captura Strings com Tamanho Personalizado.
char* GetString (int ValQtdLetras, char *RefLinha) {
   int count = 0, ch;

   while ((ch = getchar ()) == '\n') continue;
   while (ValQtdLetras > count && ch != EOF && ch != '\n') {
         *(RefLinha+(count)) = ch,
         ch = getchar ();
         ++count;
         }
   *(RefLinha+(count)) = '\0';
   return RefLinha;
   }
int main (void) {
   char Linha[701], *PointString;
   int PosVagais[700], v;
   int PosConsoantes[700], c;

R: PointString = (char*)0;
   puts ("ENTRE COM FRASE DE NO MAXIMO 700 CARACTERES");
   putchar ('<');
   PointString = GetString(700, Linha);

   system ("cls"); // Somente para windows!?

   v = 0;
   c = 0;
   if (PointString) {                // Verdadeiro se for diferente de 0.
      while (*PointString) {         // Continua até chegar o fim da linha '\0'
         if (IsAlpha (*PointString)) // Analiza se é alfabetico
            if (IsVogal (*PointString)) { // Analiza se alfabetico e também vogal
                  PosVagais[v] = PointString - Linha + 1;
                  ++v;
                  }
            else { PosConsoantes[c] = PointString - Linha + 1; ++c; } // Se não vogal então é Consoante.
         ++PointString;
         }

      PosVagais[v] = 701;     // Limite é de apenas 700 então 701 é marco.
      PosConsoantes[c] = 701; // ||

      if (c) { puts ("OCORRENCIAS DE CONSOANTES NAS posições");
      putchar ('>'); c = 0;
      while (PosConsoantes[c] < 701) {
            ShowUIntDecimal (PosConsoantes[c]); // Conversão de Inteiro em Strings e exibindo no prompt.
            putchar (' ');
            ++c;
            }
      putchar ('\n');
      }
      if (v) { puts ("OCORRENCIAS DE VOGAIS NAS posições");
      putchar ('>'); v = 0;
      while (PosVagais[v] < 701) {
            ShowUIntDecimal (PosVagais[v]); // Conversão de Inteiro em Strings e exibindo no prompt.
            putchar (' ');
            ++v;
            }
      putchar ('\n');
      }
      }
   else puts ("SEM PALAVRAS ...");

   putchar ('\n');
   puts ("MAIS UMA VEZ, GOSTARIA DE EXECUTAR O APP? (S- PARA SIM)");
   putchar ('<');

   if ('S' ==  getchar ()) goto R;
   return 0;
   }

 

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

5 horas atrás, Fabio M. Nascimento disse:

@Simon Viegas, eu iniciei com 0 também, porque ao iniciar com -1 ele elimina a primeira letra começando após ela e fiz um if dentro do else para eliminar os espaços digitados.

 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()

{
    char frase[700];
    char vogal[700];
    char consoante[700];
    int cont;
    int tam;
    int v=0;
    int c=0;

   

    printf("Digite a frase:\n");
    fflush(stdin);
    gets(frase);

   

    tam=strlen(frase);

   

    for(cont=0;cont<tam;cont++)
    {

        if((frase[cont]=='a')||(frase[cont]=='e')||(frase[cont]=='i')||(frase[cont]=='o')||(frase[cont]=='u'))
        {
            vogal[v++]=frase[cont];
        }
        else{
            if(frase[cont]!=' '){
            consoante[c++]=frase[cont];
            }
        }
    }

    system("cls");


    vogal[v++]='\0';
    consoante[c++]='\0';


    printf("---------------------------\nimprimindo todas as vogais:\n---------------------------\n");
    for(v=0;v<tam;v++)
    {
        if(vogal[v]=='\0')break;
        printf(" %c \n",vogal[v]);
    }

    printf("-------------------------------\nimprimindo todas as consoantes:\n-------------------------------\n");
    for(c=0;c<tam;c++)
    {
        if(consoante[c]=='\0')break;
        printf(" %c \n",consoante[c]);
    }

    getchar();
}

 

ENTRADA

Oi tudoo bem?

SAÍDA

---------------------------
imprimindo todas as vogais:
---------------------------
 i
 u
 o
 e
-------------------------------
imprimindo todas as consoantes:
-------------------------------
 O
 t
 d
 B
 m
 ?

 

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

@Simon Viegas    você tem razão,   eu não havia observado esse detalhe  que a primeira letra não aparecia no vetor de vogais e é por causa da inicialização mesmo que precisa ser inicializada com valor zero , pois o comando v++ acessa primeiro a posição do vetor na posição indicada por v e só depois ele incrementa a variável v, então o código com alguns ajustes ficaria assim :

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char frase[700],vogal[700];
    char consoante[700];
    int j,k,tam,v=0,c=0;
    printf("Digite a frase:\n");
    fflush(stdin);
    gets(frase);
    tam=strlen(frase);
    for(j=0;j<tam;j++)
    {
        if(toupper(frase[j])=='A'||toupper(frase[j])=='E'||
           toupper(frase[j])=='I'||toupper(frase[j])=='O'||
           toupper(frase[j])=='U')
        {
            vogal[v++] = frase[j];/*acessa a posição e depois incrementa a variável*/
        }
        else{
            k=(int)frase[j];      /* pega o código ascii do caractere */
            if( k > 64 && k < 91 ||/* letras maiúsculas */
                k > 96 && k < 123 )/* letras minúsculas*/
                consoante[c++]=frase[j];
        }
    }
    vogal[v++]='\0';
    consoante[c++]='\0';
    printf("\nimprimindo todas as vogais:\n\n");
    for(v=0;v<tam;v++)
    {
        if(vogal[v]=='\0')break;
        printf("%c",vogal[v]);
    }
    printf("\n\nimprimindo todas as consoantes:\n\n");
    for(c=0;c<tam;c++)
    {
        if(consoante[c]=='\0')break;
        printf("%c",consoante[c]);
    }
    printf("\n\n");
    getch();
    return 0;
}

 

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

@devair1010 nem havia pensado assim

Citação

else{
            k=(int)frase[j];      /* pega o código ascii do caractere */
            if( k > 64 && k < 91 ||/* letras maiúsculas */
                k > 96 && k < 123 )/* letras minúsculas*/
                consoante[c++]=frase[j];
        }
 

eu tinha feito letra por letra...B,C,D... :oops:

 

  • Curtir 1
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...