Find the most frequent character in a text

0

I did, but I would like printf not to repeat itself ... Is there any way to display only the most common character?

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

int main()
{
  char string[100];
  char letras[] = "abcdefghijklmnopqrstuvxzwyABCDEFGHIJKLMNOPQRSTUVXZWY";
  int n1, n2, cont=0;

    printf ("\nEscreva um texto: \n");
    gets(string);

    for (n1=0; n1<strlen(letras); n1++)
    {
        for (n2=0; n2<strlen(string); n2++)
        {
            if (string[n2] == letras[n1])
            {
                cont++;
                printf ("\nA letra %c contem %d\n", string[n2], cont);
            }
        }

        cont=0;
    }

  system("pause");
  return 0;
}
    
asked by anonymous 06.06.2018 / 21:33

2 answers

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

int main(int argc, char* argv[]) 
{
    char texto[82];
    char *p;
    int frequencia[256]; // São 256 caracteres ASCII.
    char caractere;
    int maiorFrequencia = 0x80000000; // Inicializado com o número mais negativo possível.

    // Informa da e aguarda a entrada do texto.
    fflush(stdin);
    printf("Digite um texto:\n");
    fgets(texto, 80, stdin);

    // Inicializa frequencias.
    for (i = 0; i < 256; ++i)
    {
        frequencia[i] = 0;
    }

    // Popula frequencia com o texto digitado.
    p = texto;
    while (*p) {
        ++frequencia[*p++];
    }

    // Procura maior frequencia.
    for (i = 0; i < 256; ++i) 
    {
        if (frequencia[i] > maiorFrequencia)
        {
            maiorFrequencia = frequencia[i];
            caractere = (char)i;
        }
    }

    // Imprime caractere de maior frequencia.
    switch (caractere)
    {
        case '\n':
            strcpy(texto, "Quebra de linha");
            break;
        case ' ':
            strcpy(texto, "Espaco");
            break;
        default:
            texto[0] = '"';
            texto[1] = caractere;
            texto[2] = '"';
            texto[3] = '
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) 
{
    char texto[82];
    char *p;
    int frequencia[256]; // São 256 caracteres ASCII.
    char caractere;
    int maiorFrequencia = 0x80000000; // Inicializado com o número mais negativo possível.

    // Informa da e aguarda a entrada do texto.
    fflush(stdin);
    printf("Digite um texto:\n");
    fgets(texto, 80, stdin);

    // Inicializa frequencias.
    for (i = 0; i < 256; ++i)
    {
        frequencia[i] = 0;
    }

    // Popula frequencia com o texto digitado.
    p = texto;
    while (*p) {
        ++frequencia[*p++];
    }

    // Procura maior frequencia.
    for (i = 0; i < 256; ++i) 
    {
        if (frequencia[i] > maiorFrequencia)
        {
            maiorFrequencia = frequencia[i];
            caractere = (char)i;
        }
    }

    // Imprime caractere de maior frequencia.
    switch (caractere)
    {
        case '\n':
            strcpy(texto, "Quebra de linha");
            break;
        case ' ':
            strcpy(texto, "Espaco");
            break;
        default:
            texto[0] = '"';
            texto[1] = caractere;
            texto[2] = '"';
            texto[3] = '%pre%';
            break;
    }
    printf("O caractere com maior frequencia e %s, com frequencia %d\n",
        texto, maiorFrequencia);

    return 0;
}
'; break; } printf("O caractere com maior frequencia e %s, com frequencia %d\n", texto, maiorFrequencia); return 0; }
    
07.06.2018 / 01:16
1
  • Never use gets . Use fgets . I'll explain more about this here and > here .

  • Your approach is wrong. To find the most common letter, use a table (with an array) to compute these letters.

  • Remember that char occupies only one byte of memory. This means that the table has 256 numbered positions from 0 to 255.

  • The strlen function is slow because it runs through the string to the end of it to find the size. When using it as a condition of stopping for , it will be traversed entirely in each iteration. The solution is to use strlen only once and save the result to a variable.

  • Logo:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char string[100];
        char tabela[256];
    
        // Limpa a tabela.
        for (int i = 0; i < 256; i++) {
            tabela[i] = 0;
        }
    
        // Lê a frase do usuário.
        printf ("\nEscreva um texto: \n");
        fgets(string, 100, stdin);
        int tamanho = strlen(string);
    
        // Monta a tabela de frequências.
        for (int i = 0; i < tamanho; i++) {
            tabela[string[i]]++;
        }
    
        // Busca o índice de maior ocorrência na tabela.
        int maior = 0;
        char letra = '
    oRatoRoeuARoupaDoReiDeRomaEARainhaRoeuOResto.
    
    '; for (int i = 0; i < 256; i++) { int t = tabela[i]; if (t > maior) { maior = t; letra = (char) i; } } // Mostra o resultado. printf("\nO caractere '%c' aparece %d vezes.\n", letra, maior); // Fim. return 0; }

    With this entry:

    O caractere 'R' aparece 8 vezes.
    

    It generates this result:

    O rato roeu a roupa do rei de Roma e a rainha roeu o resto.
    

    See here working on ideone.

    There is a still though. If I use this entry:

        // Monta a tabela de frequências.
        for (int i = 0; i < tamanho; i++) {
            char c = string[i];
    
            // Ignora o espaço.
            if (c == ' ') continue;
    
            // Se for uma letra minúscula, troca por maiúscula.
            if (c >= 'a' && c <= 'z') c = c - 'a' + 'A';
    
            // Contabiliza na tabela.
            tabela[c]++;
        }
    

    The most often occurring character is white space. This is probably not what you want. It also happens that r (lowercase) and R (uppercase) are different characters. To solve this, you can change the for that mounts the table to this:

    O rato roeu a roupa do rei de Roma e a rainha roeu o resto.
    

    With this entry:

    O caractere 'O' aparece 9 vezes.
    

    It generates this result:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char string[100];
        char tabela[256];
    
        // Limpa a tabela.
        for (int i = 0; i < 256; i++) {
            tabela[i] = 0;
        }
    
        // Lê a frase do usuário.
        printf ("\nEscreva um texto: \n");
        fgets(string, 100, stdin);
        int tamanho = strlen(string);
    
        // Monta a tabela de frequências.
        for (int i = 0; i < tamanho; i++) {
            tabela[string[i]]++;
        }
    
        // Busca o índice de maior ocorrência na tabela.
        int maior = 0;
        char letra = '
    oRatoRoeuARoupaDoReiDeRomaEARainhaRoeuOResto.
    
    '; for (int i = 0; i < 256; i++) { int t = tabela[i]; if (t > maior) { maior = t; letra = (char) i; } } // Mostra o resultado. printf("\nO caractere '%c' aparece %d vezes.\n", letra, maior); // Fim. return 0; }

    See here working on ideone.

        
    07.06.2018 / 00:01