Вывести на экран все слова, в которых имеется максимальное количество различных букв - C (СИ)

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

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

Дана последовательность символов, состоящая из слов. Вывести на экран все слова, в которых имеется максимальное количество различных букв.

Решение задачи: «Вывести на экран все слова, в которых имеется максимальное количество различных букв»

textual
Листинг программы
#include <stdio.h>
#include <glib.h>
 
size_t dif_letters(const char * s) {
    GHashTable * hash = g_hash_table_new(g_direct_hash, g_direct_equal);
    size_t cnt = 0;
    
    for ( ; *s; ++s )
        g_hash_table_insert(hash, GINT_TO_POINTER((int)*s), NULL);
    
    cnt = g_hash_table_size(hash);
    
    g_hash_table_destroy(hash);
    
    return cnt;
}
 
int keycmp(const void * pa, const void * pb) {
    size_t a = GPOINTER_TO_SIZE(pa);
    size_t b = GPOINTER_TO_SIZE(pb);
    
    return ( a < b ) - ( a > b );
}
 
gboolean print_words(void * k, GHashTable * words, void * dummy) {
    void * key, * val;
    GHashTableIter iter;
    
    g_hash_table_iter_init(&iter, words);
    while ( g_hash_table_iter_next(&iter, &key, &val) )
        g_print("%s ", (char*)key);
    g_print("\n");
    
    return TRUE;
}
 
gboolean remove_hashes(void * key, GHashTable * hash, void * dummy) {
    g_hash_table_destroy(hash);
    return FALSE;
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        char ** words, ** ptr;
        GTree * tree;
        size_t letters;
        
        words = g_strsplit_set(buf, DELIM, -1);
        tree = g_tree_new(keycmp);
        
        for ( ptr = words; *ptr; ++ptr ) {
            if ( **ptr ) {
                letters = dif_letters(*ptr);
                GHashTable * hash = g_tree_lookup(tree, GSIZE_TO_POINTER(letters));
                if ( ! hash ) {
                    hash = g_hash_table_new(g_str_hash, g_str_equal);
                    g_tree_insert(tree, GSIZE_TO_POINTER(letters), hash);
                }
                g_hash_table_insert(hash, *ptr, NULL);
            }
        }
        
        printf("Word(s) with max different letters:\n");
        g_tree_foreach(tree, (GTraverseFunc)print_words, NULL);
        
        g_tree_foreach(tree, (GTraverseFunc)remove_hashes, NULL);
        g_tree_destroy(tree);
        g_strfreev(words);
    }
    
    return 0;
}

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

  1. Ввод строки от пользователя
  2. Разделение строки на слова с помощью функции g_strsplit_set
  3. Создание дерева с помощью функции g_tree_new и сравнение элементов в нем с помощью функции keycmp
  4. Для каждого слова в строке:
    • Вычисление количества различных букв в слове с помощью функции dif_letters
    • Поиск хеш-таблицы в дереве, которая содержит слова с таким количеством различных букв
    • Если хеш-таблицы нет, то ее создание и добавление в дерево
    • Добавление слова в найденную хеш-таблицу
  5. Вывод на экран всех слов с максимальным количеством различных букв с помощью функции print_words
  6. Удаление всех хеш-таблиц из дерева с помощью функции remove_hashes
  7. Выход из программы с помощью функции g_tree_destroy и g_strfreev

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


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

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

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