Сортировка символов в строке по частоте их встречаемости - 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
Объяснение кода листинга программы
В данном коде реализована сортировка символов в строке по частоте их встречаемости.
- В функции
sort_by_frequency
происходит сортировка символов в строке. - В начале происходит инициализация массива
frequencies
, который отвечает за подсчет количества каждого символа в строке. - Далее, в функции
count_frequencies
, происходит подсчет количества каждого символа в строке и запись этого количества в соответствующий элемент массиваfrequencies
. - В функции
find_next_rare_symbol
происходит поиск следующего редкого символа, то есть символа, который встречается в строке наименьшее количество раз. Редкий символ заменяется на самый часто встречающийся символ. - В функции
sort_by_frequency
происходит вызов функцииcount_frequencies
для подсчета количества каждого символа в строке. - Далее, в цикле, происходит замена каждого редкого символа на самый часто встречающийся символ до тех пор, пока все редкие символы не будут заменены.
- В конце, добавляется нулевой символ в конец строки для корректного завершения строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д