Отсортировать слова по частоте букв - 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);
}

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

  1. Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, string.h
  2. Определяются функции:
    • void flush_input(void) - функция для очистки входных данных, считывает символ до конца строки и игнорирует его
    • int symbols_count(const char * s, const char c) - функция для подсчета количества символов в строке
    • int smart_cmp(const void a, const void b) - функция для сортировки массива строк по количеству символов
  3. Определяются макросы:
    • define STR_LEN 256 - определяет максимальную длину строки

    • define STR_MASK %255[^\n]%*c - используется для чтения строки с помощью scanf, включает все символы, кроме символа новой строки

    • define DELIM \t\n - определяет разделитель слов в строке

  4. Определяются переменные:
    • char cControlSymbol; - используется в функции smart_cmp для сравнения количества символов
    • char str[STR_LEN]; - используется для хранения введенной строки
  5. В функции main происходит основной процесс:
    • Строка вводится с помощью scanf
    • Если строка не пустая, то она разбивается на слова с помощью функции strtok
    • Сортировка массива слов происходит с помощью функции qsort и функции smart_cmp
    • Отсортированные слова выводятся на экран
    • В конце каждой операции производится очистка входных данных с помощью функции flush_input

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


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

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

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