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