C программа для подсчета символов с наименьшей частотой - PullRequest
2 голосов
/ 29 мая 2020

Я написал этот код для поиска символа с минимальной частотой.

Итак, давая на входе «Привет, как сегодня погода, Дори», на выходе должно быть

буква с минимальной частотой - s, а частота - 1.

Но отображается

enter image description here

Как удалить это кома в чем тут моя ошибка

#include<stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000

int main()
{
    char str[MAX];
    int  fre[MAX],i,q,r,co=0,num;

    printf("The string : ");
    gets(str);

    for(q=0;str[q];q++);
    r=num=q;

    for(i=0;i<num;i++)
    {
        fre[i]=num;
        co=1;
        if(str[i])
        {

          for(q=i+1;q<num;q++)
          {

            if(tolower(str[i]) == tolower(str[q]))
         {
            {
                 co++;
                 str[q]='\0';
            }
          }
          fre[i]=co;
        if(co<=r)
         r=co;

       }

        }
    }
    printf("The letter with the minimum frequency is");
    for(q=0;q<num;q++)
        {

            if(fre[q]==r)
            {
                 printf(" '%c' ",str[q]);
            }
       }

    printf("and the frequency is %d \n ",r);

    return 0;
}

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Для начала, функция gets небезопасна и не поддерживается стандартом C. Вместо этого используйте стандартную функцию C fgets.

Поскольку введенная строка в целом может быть очень большой, тогда как буквы в строке, преобразованной в нижний регистр, могут находиться в диапазоне ['a', ' z '], то нет смысла объявлять такой большой массив как массив fre, объявленный как.

int  fre[MAX];

Так как вы уже включили заголовок <string.h>, то нет смысла вручную вычислять длина введенной строки.

for(q=0;str[q];q++);

Для исключения небуквенных символов из подсчета можно использовать стандартную C функцию isalpha объявленную в заголовке <ctype.h>.

Pay Обратите внимание, что в общем случае введенная строка не может содержать букв.

Вот демонстрационная программа, которая показывает, как можно реализовать ваш подход.

#include <stdio.h>
#include <ctype.h>

int main(void) 
{
    enum { MAX = 1000 };
    char s[MAX];
    size_t frequency[ 'z' - 'a' + 1] = { 0 };
    const size_t N = sizeof( frequency ) / sizeof( *frequency );

    printf( "The string: " );

    if ( fgets( s, MAX, stdin ) )
    {
        for ( const char *p = s; *p; ++p )
        {
            if ( isalpha( ( unsigned char )*p ) )
            {
                ++frequency[tolower( ( unsigned char )*p ) - 'a'];
            }
        }

        size_t min = 0;

        for ( size_t i = 0; i < N; i++ )
        {
            if ( frequency[i] != 0  && ( min == 0 || frequency[i] < min ) )
            {
                min = frequency[i];
            }
        }

        if ( min == 0 )
        {
            puts( "There ie no letters in the entered string." );
        }
        else
        {
            printf( "The letter with the minimum frequency is: " );
            for ( size_t i = 0; i < N; i++ )
            {
                if ( frequency[i] == min ) printf( "%c ", ( int )('a' + i ) );
            }

            printf( "\nand the frequency is %zu\n ", min );
        }
    }

    return 0;
}

Результат программы может выглядеть как

The string: Hi, how is the weather todayy Dor
The letter with the minimum frequency is: s 
and the frequency is 1
0 голосов
/ 29 мая 2020

На самом деле нет причин читать более одного символа за раз. В общем, это хороший образец, которому можно следовать. например:

#include <stdio.h>                                                                 
#include <string.h>                                                                
#include <limits.h>                                                                
#include <ctype.h>                                                                 

int main(void)                                                                     
{                                                                                  
        int c;                                                                     
        int fre[26] = {0};                                                         
        printf("The string : ");                                                   
        while( (c = getchar()) != EOF ) {                                          
                putchar(c);                                                        
                if( isalpha(c) ) {                                                 
                        fre[tolower(c) - 'a'] += 1;                                
                }                                                                  
        }                                                                          
        printf("The letter with the minimum frequency is");                        
        int idx = 0;                                                               
        int m = INT_MAX;                                                           
        for( int q = 0; q < 26; q++ ) {                                            
                if( fre[q] > 0 && fre[q] < m ) {                                   
                        idx = q;                                                   
                        m = fre[q];                                                
                }                                                                  
        }                                                                          
        printf(" '%c', with frequency %d\n", idx + 'a', fre[idx]);                 
        return 0;                                                                  
} 
...