Отсортировать слова по частоте букв - C (СИ)
Формулировка задачи:
Ввести текст. Рассортировать слова текста в соответствии с частотой, встречающейся в нем введенной с клавиатуры буквы (сортировка по возрастанию). Слова с одинаковым количеством букв расположить в алфавитном порядке
Решение задачи: «Отсортировать слова по частоте букв»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void flush_input(void){
char c;
while ( scanf("%c", &c) == 1 && c != '\n' )
;
}
int symbols_count(const char * s, const char c) {
return ( s = strchr(s, c) ) ? 1 + symbols_count(s + 1, c) : 0;
}
int smart_cmp(const void * a, const void * b) {
extern char cControlSymbol;
char * sA = *(char**)a;
char * sB = *(char**)b;
int nA = symbols_count(sA, cControlSymbol);
int nB = symbols_count(sB, cControlSymbol);
return ( nA == nB ) ? strcmp(sA, sB) : nA - nB;
}
#define STR_LEN 256
#define STR_MASK "%255[^\n]%*c"
#define DELIM " \t\n"
char cControlSymbol;
int main(void) {
char str[STR_LEN];
while ( printf("String: ") && scanf(STR_MASK, str) == 1 && printf("Symbol: ") && scanf("%c", &cControlSymbol) == 1 ) {
char ** pWords = NULL, * pWord;
size_t nCount = 0, i;
for ( pWord = strtok(str, DELIM); pWord; pWord = strtok(NULL, DELIM) ) {
if ( ! ( pWords = realloc(pWords, sizeof(char*) * (nCount + 1)) ) ) {
perror("realloc");
exit(1);
}
pWords[nCount++] = pWord;
}
if ( nCount ) {
qsort(pWords, nCount, sizeof(char*), smart_cmp);
for ( i = 0; i < nCount; ++i )
printf("%s\n", pWords[i]);
free(pWords);
}
else
printf("Empty string!\n");
flush_input();
}
exit(0);
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, string.h
- Определяются функции:
- void flush_input(void) - функция для очистки входных данных, считывает символ до конца строки и игнорирует его
- int symbols_count(const char * s, const char c) - функция для подсчета количества символов в строке
- int smart_cmp(const void a, const void b) - функция для сортировки массива строк по количеству символов
- Определяются макросы:
-
define STR_LEN 256 - определяет максимальную длину строки
-
define STR_MASK
%255[^\n]%*c- используется для чтения строки с помощью scanf, включает все символы, кроме символа новой строки -
define DELIM
\t\n- определяет разделитель слов в строке
-
- Определяются переменные:
- char cControlSymbol; - используется в функции smart_cmp для сравнения количества символов
- char str[STR_LEN]; - используется для хранения введенной строки
- В функции main происходит основной процесс:
- Строка вводится с помощью scanf
- Если строка не пустая, то она разбивается на слова с помощью функции strtok
- Сортировка массива слов происходит с помощью функции qsort и функции smart_cmp
- Отсортированные слова выводятся на экран
- В конце каждой операции производится очистка входных данных с помощью функции flush_input