Вывести на экран все слова, в которых имеется максимальное количество различных букв - 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; }
Объяснение кода листинга программы
- Ввод строки от пользователя
- Разделение строки на слова с помощью функции
g_strsplit_set
- Создание дерева с помощью функции
g_tree_new
и сравнение элементов в нем с помощью функцииkeycmp
- Для каждого слова в строке:
- Вычисление количества различных букв в слове с помощью функции
dif_letters
- Поиск хеш-таблицы в дереве, которая содержит слова с таким количеством различных букв
- Если хеш-таблицы нет, то ее создание и добавление в дерево
- Добавление слова в найденную хеш-таблицу
- Вычисление количества различных букв в слове с помощью функции
- Вывод на экран всех слов с максимальным количеством различных букв с помощью функции
print_words
- Удаление всех хеш-таблиц из дерева с помощью функции
remove_hashes
- Выход из программы с помощью функции
g_tree_destroy
иg_strfreev
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д