Для каждого слова первого предложения определить, входит ли оно во второе предложение - 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;
}
Объяснение кода листинга программы
- Объявление переменных:
firstStrиsecondStr- массивы символов (строки) для хранения первых и вторых строк соответственно.DELIM- строка, содержащая разделители (пробел, табуляция, символ новой строки).BUFSIZ- размер буфера в символах.
- Ввод первых и вторых строк с помощью
fgets(). - Разделение каждой строки на слова с помощью
g_strsplit_set(). - Создание хеш-таблицы для каждого набора слов.
- Вставка каждого слова в соответствующую хеш-таблицу с подсчетом количества вхождений с помощью
g_hash_table_insert(). - Перебор всех слов в каждом наборе с помощью
g_hash_table_iter_init()иg_hash_table_iter_next(). - Проверка наличия слова во втором наборе с помощью условного оператора.
- Вывод результата в консоль с помощью
printf(). - Освобождение памяти, выделенной для слов и хеш-таблиц, с помощью
g_strfreev()иg_hash_table_destroy(). - Цикл основного тела программы повторяется до тех пор, пока пользователь не введет
Ctrl + D. - Возврат 0 из функции
main(), что означает успешное выполнение программы.