Для каждого слова первого предложения определить, входит ли оно во второе предложение - C (СИ) (149874)

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

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

даны два предложения. Для каждого слова первого предложения (в том числе для повторяющихся в этом предложении слов) определить, входит ли оно во второе предложение.

Решение задачи: «Для каждого слова первого предложения определить, входит ли оно во второе предложение»

textual
Листинг программы
/* ANSI C 99 with glib-2.0 */
 
#include <stdio.h>
#include <glib.h>
 
#define DELIM " \t\n"
 
int main(void) {
    char firstStr[BUFSIZ], secondStr[BUFSIZ];
    
    while ( printf("First string: ") && fgets(firstStr, BUFSIZ, stdin) && *firstStr != '\n'
        && printf("Second string: ") && fgets(secondStr, BUFSIZ, stdin) && *secondStr != '\n' ) {
            char ** firstWords = g_strsplit_set(firstStr, DELIM, -1);
            char ** secondWords = g_strsplit_set(secondStr, DELIM, -1);
            
            GHashTable * firstHash = g_hash_table_new(g_str_hash, g_str_equal);
            for ( char ** wrd = firstWords; *wrd; ++wrd ) 
                if ( **wrd )
                    g_hash_table_insert(firstHash, *wrd, GINT_TO_POINTER(GPOINTER_TO_INT(g_hash_table_lookup(firstHash, *wrd)) + 1));
            
            GHashTable * secondHash = g_hash_table_new(g_str_hash, g_str_equal);
            for ( char ** wrd = secondWords; *wrd; ++wrd ) 
                if ( **wrd )
                    g_hash_table_insert(secondHash, *wrd, GINT_TO_POINTER(GPOINTER_TO_INT(g_hash_table_lookup(secondHash, *wrd)) + 1));
            
            gpointer wrd, cnt;
            GHashTableIter iter;
            
            g_hash_table_iter_init(&iter, firstHash);
            while ( g_hash_table_iter_next(&iter, &wrd, &cnt) )
                printf("%s -> %s\n", (char*)wrd, ( GPOINTER_TO_INT(g_hash_table_lookup(secondHash, wrd)) >= GPOINTER_TO_INT(cnt) ) ? "OK" : "FAIL");
            
            g_hash_table_destroy(firstHash);
            g_hash_table_destroy(secondHash);
            g_strfreev(firstWords);
            g_strfreev(secondWords);
        }
    
    return 0;
}

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

  1. Объявление переменных:
    • firstStr и secondStr - массивы символов (строки) для хранения первых и вторых строк соответственно.
    • DELIM - строка, содержащая разделители (пробел, табуляция, символ новой строки).
    • BUFSIZ - размер буфера в символах.
  2. Ввод первых и вторых строк с помощью fgets().
  3. Разделение каждой строки на слова с помощью g_strsplit_set().
  4. Создание хеш-таблицы для каждого набора слов.
  5. Вставка каждого слова в соответствующую хеш-таблицу с подсчетом количества вхождений с помощью g_hash_table_insert().
  6. Перебор всех слов в каждом наборе с помощью g_hash_table_iter_init() и g_hash_table_iter_next().
  7. Проверка наличия слова во втором наборе с помощью условного оператора.
  8. Вывод результата в консоль с помощью printf().
  9. Освобождение памяти, выделенной для слов и хеш-таблиц, с помощью g_strfreev() и g_hash_table_destroy().
  10. Цикл основного тела программы повторяется до тех пор, пока пользователь не введет Ctrl + D.
  11. Возврат 0 из функции main(), что означает успешное выполнение программы.

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


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

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

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