Сортировка символов в строке по частоте их встречаемости - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться с кодом. Ошибка возникает на этапе суммирования частоты встречаемости символов.
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
void bubbleSort(char *a, int *b,  int size );
struct str
{char sim;
 int skl;};
 
int main(void)
{setlocale(LC_ALL,"rus");
struct str s [256], *str1[256];
int i,j,len;
char tmpc;
char string[21];
memset( s, 0, sizeof(s)); 
len = strlen( string ); 
printf( "Введите строку: \n" ); 
gets (string);
i=0;
  while(string[i]!='\0')
    {s[i].sim=string[i];
    printf( "%d Строка %c\n",i+1, s[i].sim );
    i++;
    }
  
   for(i=0;i<256;i++)
    {if(s[i].sim)
    s[i].skl+=1;
    }  
    printf( "Символ'%c'. Встречался%d раз\n", s[1].sim, s[1].skl );
}

/*  void bubbleSort(struct str *a, struct str *b,  int size )
{
    struct str tmp;
    int i, j;
    struct str tmpc;
    for(i = 0; i < size - 1; ++i)
    {            
        for(j = 0; j < size - 1; ++j)
        {     
            if (b[j + 1].skl < b[j].skl) 
            {
                tmp = b[j + 1]; 
                b[j + 1] = b[j]; 
                b[j] = tmp;
                tmpc = a[j + 1]; 
                a[j + 1] = a[j]; 
                a[j] = tmpc;
            }
        }
    }
}*/

Решение задачи: «Сортировка символов в строке по частоте их встречаемости»

textual
Листинг программы
void sort_by_frequency(char* str);
 
#ifndef SORT_BY_FREQUENCY_H
#define SORT_BY_FREQUENCY_H
 
#include <limits.h>
 
static int frequencies[256];
 
static void count_frequencies(const char* str)
{
    int i;
    for( i = 0; i < 256; ++i ) {
        frequencies[i] = 0;
    }
    while( i = (unsigned char)*str++ ) {
        frequencies[i]++;
    }
}
 
static int find_next_rare_symbol()
{
    int idx_min = 0;
    int min = INT_MAX;
    for( int i = 1; i < 256; ++i ) {
        if( frequencies[i] && frequencies[i] < min ) {
            idx_min = i;
            min = frequencies[idx_min];
        }
    }
    frequencies[idx_min] = 0;
    return idx_min;
}
 
void sort_by_frequency(char* str)
{
    count_frequencies(str);
    int c;
    while( c = find_next_rare_symbol() ) {
        *str++ = (char)c;
    }
    *str = '\0';
}
 
#endif

Объяснение кода листинга программы

В данном коде реализована сортировка символов в строке по частоте их встречаемости.

  1. В функции sort_by_frequency происходит сортировка символов в строке.
  2. В начале происходит инициализация массива frequencies, который отвечает за подсчет количества каждого символа в строке.
  3. Далее, в функции count_frequencies, происходит подсчет количества каждого символа в строке и запись этого количества в соответствующий элемент массива frequencies.
  4. В функции find_next_rare_symbol происходит поиск следующего редкого символа, то есть символа, который встречается в строке наименьшее количество раз. Редкий символ заменяется на самый часто встречающийся символ.
  5. В функции sort_by_frequency происходит вызов функции count_frequencies для подсчета количества каждого символа в строке.
  6. Далее, в цикле, происходит замена каждого редкого символа на самый часто встречающийся символ до тех пор, пока все редкие символы не будут заменены.
  7. В конце, добавляется нулевой символ в конец строки для корректного завершения строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.286 из 5
Похожие ответы