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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <glib.h>
  3.  
  4. size_t dif_letters(const char * s) {
  5.     GHashTable * hash = g_hash_table_new(g_direct_hash, g_direct_equal);
  6.     size_t cnt = 0;
  7.    
  8.     for ( ; *s; ++s )
  9.         g_hash_table_insert(hash, GINT_TO_POINTER((int)*s), NULL);
  10.    
  11.     cnt = g_hash_table_size(hash);
  12.    
  13.     g_hash_table_destroy(hash);
  14.    
  15.     return cnt;
  16. }
  17.  
  18. int keycmp(const void * pa, const void * pb) {
  19.     size_t a = GPOINTER_TO_SIZE(pa);
  20.     size_t b = GPOINTER_TO_SIZE(pb);
  21.    
  22.     return ( a < b ) - ( a > b );
  23. }
  24.  
  25. gboolean print_words(void * k, GHashTable * words, void * dummy) {
  26.     void * key, * val;
  27.     GHashTableIter iter;
  28.    
  29.     g_hash_table_iter_init(&iter, words);
  30.     while ( g_hash_table_iter_next(&iter, &key, &val) )
  31.         g_print("%s ", (char*)key);
  32.     g_print("\n");
  33.    
  34.     return TRUE;
  35. }
  36.  
  37. gboolean remove_hashes(void * key, GHashTable * hash, void * dummy) {
  38.     g_hash_table_destroy(hash);
  39.     return FALSE;
  40. }
  41.  
  42. #define DELIM " \t\n"
  43.  
  44. int main(void) {
  45.     char buf[BUFSIZ];
  46.    
  47.     while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
  48.         char ** words, ** ptr;
  49.         GTree * tree;
  50.         size_t letters;
  51.        
  52.         words = g_strsplit_set(buf, DELIM, -1);
  53.         tree = g_tree_new(keycmp);
  54.        
  55.         for ( ptr = words; *ptr; ++ptr ) {
  56.             if ( **ptr ) {
  57.                 letters = dif_letters(*ptr);
  58.                 GHashTable * hash = g_tree_lookup(tree, GSIZE_TO_POINTER(letters));
  59.                 if ( ! hash ) {
  60.                     hash = g_hash_table_new(g_str_hash, g_str_equal);
  61.                     g_tree_insert(tree, GSIZE_TO_POINTER(letters), hash);
  62.                 }
  63.                 g_hash_table_insert(hash, *ptr, NULL);
  64.             }
  65.         }
  66.        
  67.         printf("Word(s) with max different letters:\n");
  68.         g_tree_foreach(tree, (GTraverseFunc)print_words, NULL);
  69.        
  70.         g_tree_foreach(tree, (GTraverseFunc)remove_hashes, NULL);
  71.         g_tree_destroy(tree);
  72.         g_strfreev(words);
  73.     }
  74.    
  75.     return 0;
  76. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы