Ir ao conteúdo

C Contador de letras em C


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

Olá, preciso criar um código onde o usuário pode digitar um texto de até 200 caracteres, e imprimir a quantidade de vezes que cada letra foi digitada, por exemplo: A=0; B=2; etc. Além disso, o código deve ignorar todos os "Enters" que o usuário digitar, e encerrar apenas quando ele digitar "~" (Obs: pode implementar outras bibliotecas). Estou com muita dificuldade, e até o momento só fiz isso (não sei como fazer um acumulador para cada letra):
<

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

int main() {
    int contador=0, i, x;
    char texto[200], letra = "abcdefghijklmonpqrtuvwxyzABCDEFGHIJKLMONOPQSTUVWXYZ";

    printf("Escreva seu texto, digite ~ para parar: \n");
    do{
    scanf("%c", &texto[200]);

    for (i=0;i<texto[200];i++)
        for (i=0;i<letra;i++)
          if (texto[200] == letra)
    contador++;
 } while (texto[200] != '\n' || '~');
    return 0;
}

>
 

  • Obrigado 1
Postado

Acho melhor usar um vetor para representar a lista de caracteres, aí é só incrementar a posição com a quantidade de vezes que foi digitado,

 

#include <stdio.h>

int main(){
    int letra[128] = {0}, i = 0;
    char c;
    
    printf("Escreva o texto: ");
    
    while((c=fgetc(stdin))!='\n'){
        if(c=='~'){break;}
        if(c!=' '){letra[c]++;}
    }
    
    while(i < 128){
        if(letra[i]){
            printf("Letra %c = %d\n",i,letra[i]);
        }
        i++;
    }
    return 0;
}

 

  • Curtir 2
  • Amei 1
Postado

@Midori Mas sabe como eu posso fazer para uma letra minúscula e maiúscula irem para o mesmo acumulador? Por exemplo: "a" e "A" vão ser considerados com "a".

 

  • Curtir 1
Postado

@oTRG

9 minutos atrás, oTRG disse:

Por exemplo: "a" e "A" vão ser considerados com "a".

Apenas verifique se a letra é maiúscula, e então, caso seja, converta-a para minúscula.

A diferença entre maiúsculas e minúsculas em decimal na tabela ASCII é 32:

if(frase[i] >= 'A' && frase[i] <= 'Z'){
    frase[i] = frase[i] + 32;
}
  • Curtir 1
Postado

@oTRG  Pode ser como @Lucca Rodrigues comentou. Comparar se o caractere está entre A e Z e converter.

 

No código que postei o loop pode ficar assim,

 

while((c=fgetc(stdin))!='\n'){
    if(c=='~'){break;}
    if(c>='A' && c<='Z'){c+=32;}
    if(c!=' '){letra[c]++;}
}

 

  • Curtir 2
  • Obrigado 1
Postado
24 minutos atrás, Midori disse:

if(c=='~'){break;}

Está parte está certa? Porque ele não responde ao "~"

  • Obrigado 1
Postado

Olá, gostaria de saber como eu faço para o meu programa não finalizar com os "Enters" do usuário, somente com uma tecla específica ("~" no caso)" :)

  • Amei 1
Postado
1 hora atrás, oTRG disse:

Está parte está certa? Porque ele não responde ao "~"

Essa parte não é necessária, só coloquei para deixar mais próximo do que vi no seu código.

 

No meu exemplo o loop só será encerrado mesmo quando digitar enter. Para sair do loop apenas digitando '~' você vai ter que adaptar isso com alguma função que processe o que foi pressionado sem a necessidade de enter. Você pode tentar usar getch de conio.h ou outra compatível com o seu compilador.

  • Curtir 2
  • Obrigado 1
  • Solução
Postado

@oTRG

1 hora atrás, oTRG disse:

Está parte está certa? Porque ele não responde ao "~"

Você entendeu o que foi feito? Ou só testou o programa sem mais nem menos? 😕

fgetc() efetua a leitura caractere por caractere até encontrar um \n, porém, se antes encontrar um til, então break entra em ação e sai do loop. Todo o resto é ignorado.

 

De volta ao enunciado:

5 horas atrás, oTRG disse:

o código deve ignorar todos os "Enters" que o usuário digitar, e encerrar apenas quando ele digitar "~"

Talvez a condição do while() devesse ser c=fgetc(stdin)!='~', já que os "Enters" devem ser ignorados, e o que vale para sair do loop é o '~'. Se bem que dessa forma também seria necessário apertar a tecla Enter depois de inserir um til...

Talvez getch() sirva no lugar de fgetc().

 

5 horas atrás, oTRG disse:

o usuário pode digitar um texto de até 200 caracteres

Há essa condição também, o texto não pode passar de 200 caracteres (não-nulos).

 

Dê uma olhada nisso, eu expliquei bem o que se passa no programa com comentários:

#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>

int main()
{
    setlocale(LC_ALL, "Portuguese");

    int ch;
    char letras[201]; // 200 não-nulos + 1 nulo (terminador)
    int i = 0;

    printf("Insira os caracteres:\n");

    /* Caso o caractere seja o '~' ou a string seja
    completamente preenchida, então sai do loop while */
    while ((ch = getch()) != '~' && i < sizeof(letras) - 1)
    {
        if (ch == '\b' && i > 0)
        {
            // Caso o usuário dar um backspace
            printf("\b \b");
            i--;
            letras[i] = '\0';
        }
        if(ch >= 'A' && ch <= 'Z'){
            /* Caso sejam letras maiúsculas,
            converter para minúsculas */
            ch = ch + 32;
        }
        if(ch >= 'a' && ch <= 'z')
        {
            // Imprimindo caractere digitado
            printf("%c", ch);
            letras[i++] = (char)ch;
        }
    }

    /* Limpando o buffer de entrada da console, já que é preciso
    digitar dois '~' para que o mesmo seja impresso, e um deles
    fica no buffer */
    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));

    // Finalizando a string
    letras[i] = '\0';

    printf ("\n\nCaracteres inseridos: %s\n", letras);
    return 0;
}

Caracteres especiais são então ignorados, e a única coisa que é impressa são letras de A a Z minúsculas. Se são maiúsculas, são convertidas para minúsculas, e se o usuário der um Backspace, a letra anterior é "apagada".

Depois do loop, eu limpei o buffer com a função FlushConsoleInputBuffer(), já que quando digitamos '~', é preciso apertar a tecla duas vezes para que este caractere seja impresso, deve ser porque é esperado que apertemos uma letra em seguida, para que a mesma fique acentuada.

 

Bom, o que resta agora é imprimir a quantidade de cada letra. Você já tem a string em mãos, agora é com você :D

  • Curtir 2
  • Amei 1
Postado

@oTRG    você pode usar o comando 

getch();

de huma biblioteca antiga dos anos 70 , chamada 

#include <conio.h>

, e ao pressionar a tecla TIL o programa termina , assim :

#include <stdio.h>
#include <conio.h>
int main()
{
    char a;
    do
    {
        a = (char)getch();
        printf("%c",a);
    }while( a != '~');
    printf("\n\n    Finalizou pressionando TIL \n\n\n");
    return 512;
}

 

  • Curtir 3
Postado

@Lucca Rodrigues Muito obrigado pela ajuda, consegui entender tudo que foi explicado e detalhado no exercício. Desculpe pelas perguntas, pois sou iniciante nesta área kkk. Então se pudesse me ajudar em uma ultima coisa eu agradeceria. Estou o dia todo tentando fazer com que o programa fique como o da foto anexada, porém nao estou sabendo fazer com que o programa printe os caracteres que nao foram digitados. O trecho é esse aqui(Não coloquei algumas coisas que você recomendou pois o professor acabou pedindo um pouco diferente, mas ficaram excelentes :D ) 

       {letra[c]++;}}

    while(i < 200){

        if(letra[i]){
    printf("N de vezes %c ",i);
        printf("%d\n",letra[i]);
        }      i++; } letra[i] = '\0';

    printf("Letras:      a b c d e f g h i j k l m n o p q r s t u v w x y z");
    return 0;
}
 

image.png.777a6da1f9e6d0156ff0cd119c2c8428.png

  • Obrigado 1
Postado

Para mostrar os caracteres assim você pode usar dois loops, um para mostrar os caracteres e outro para a quantidade.

 

#include <stdio.h>
#include <conio.h>

int main(){
    int letra[128] = {0}, i = 'a';
    char c;    

    while((c=getche()) != '~'){
        if(c>='A' && c<='Z'){c+=32;}
        if(c>='a' && c<='z'){
            letra[c]++;
        }
    }
    printf("\n\nOcorrencias:\nLetras:  ");
    while(i <= 'z'){printf("%2c",i++);}
    i = 'a';
    printf("\nN vezes: ");
    while(i <= 'z'){printf("%2d",letra[i++]);}
    printf("\n");
    return 0;
}

 

  • Curtir 2
  • Obrigado 1
Postado

@oTRG Dê uma olhada na tabela ASCII:

image.png.51f1c36bffe87def0aa89aa2e9344de5.png

Percebe que em decimal, considerando letras minúsculas, A a Z corresponde a 97 a 122?

Faça um loop for, inicialize uma variável do tipo int (chamarei de P) com valor 97, e que a mesma seja incrementada até atingir valor 122. Dentro deste loop, faça um outro loop for que irá percorrer toda a string, e faça uma verificação (com uma condicional if, por exemplo) para que se uma letra (ou mais) da string corresponder ao valor em decimal de P, um contador deve ser incrementado.

Depois é só imprimir o contador e dar um espaço.

 

Para ficar igual na imagem, faça algo como:

printf("\nOcorrencias:\nLetras:\t\t");
printf("a b c d e f g h i j k l m n o p q r s t u v w x y z");
printf("\nN vezes:\t");

/* Loop para contar as letras */

printf("\n");
  • Curtir 1
  • Amei 1
Postado
15 horas atrás, Midori disse:

Para mostrar os caracteres assim você pode usar dois loops, um para mostrar os caracteres e outro para a quantidade.

 Isso já foi acrescentado, acho q você mesmo que deu a dica na postagem anterior, o problema é conseguir printar as letras não digitadas (desculpem a quantidade de perguntas, sou novo nisso ;-;).

<

        printf("\n\nOcorrencias: \nN de vezes:\n");

    while(i < 200){
       if(letra[i]){
         printf("%c = %d\n",i, letra[i]);}
           i++; }

    printf("Letras: a b c d e f g h i j k l m n o p q r s t u v w x y z");
    return 0; }

>

  • Obrigado 1
  • Confuso 1
Postado

@oTRG

7 horas atrás, oTRG disse:

o problema é conseguir printar as letras não digitadas

Do jeito que eu te falei pra fazer, no segundo loop for, você pode inicializar o contador com 0, assim, se a condição do if não for satisfeita, então 0 é impresso.

Tente!!

Se não entendeu isso, vou assumir que não entendeu o que fiz para cobrar os caracteres também... A parte fácil é imprimir 😕

  • Curtir 1
  • Triste 1

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!