Отсортировать слова по частоте букв - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д