hw11: New homework
This commit is contained in:
15
11_Toolkits/CMakeLists.txt
Normal file
15
11_Toolkits/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(11_Toolkits)
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_search_module(GLIB REQUIRED glib-2.0)
|
||||
|
||||
include_directories(${GLIB_INCLUDE_DIRS})
|
||||
link_directories(${GLIB_LIBRARY_DIRS})
|
||||
|
||||
add_executable(main main.c)
|
||||
|
||||
add_definitions(${GLIB_CFLAGS_OTHER})
|
||||
target_link_libraries(main ${GLIB_LIBRARIES})
|
||||
|
||||
82
11_Toolkits/main.c
Normal file
82
11_Toolkits/main.c
Normal file
@@ -0,0 +1,82 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
const int BUF_SIZE = 90;
|
||||
|
||||
gboolean process_new_line(GHashTable* counts) {
|
||||
gchar buf[BUF_SIZE];
|
||||
char* p = fgets(buf, BUF_SIZE - 1, stdin);
|
||||
if (p == NULL)
|
||||
return FALSE;
|
||||
g_strchomp(buf);
|
||||
|
||||
gchar** words = g_strsplit(buf, " ", -1);
|
||||
for (int word_ind = 0; words[word_ind] != NULL; ++word_ind) {
|
||||
gchar* cur_word = words[word_ind];
|
||||
g_strchomp(cur_word);
|
||||
if (cur_word[0] == '\0') {
|
||||
// removing empty strings
|
||||
continue;
|
||||
}
|
||||
gpointer value_pointer = g_hash_table_lookup(counts, cur_word);
|
||||
int* new_value = g_malloc(sizeof(int));
|
||||
if (value_pointer != NULL) {
|
||||
*new_value = *((int*)value_pointer) + 1;
|
||||
} else {
|
||||
*new_value = 1;
|
||||
}
|
||||
g_hash_table_replace(counts, g_strdup(cur_word), (gpointer)new_value);
|
||||
}
|
||||
g_strfreev(words);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gint array_comparator(gconstpointer a, gconstpointer b, gpointer word_counts) {
|
||||
// negative value if a < b ; zero if a = b ; positive value if a > b
|
||||
int first = *(int*)g_hash_table_lookup(word_counts, *(char**)a);
|
||||
int second = *(int*)g_hash_table_lookup(word_counts, *(char**)b);
|
||||
gint res;
|
||||
if (first < second)
|
||||
res = 1;
|
||||
else if (first == second)
|
||||
res = 0;
|
||||
else
|
||||
res = -1;
|
||||
return res;
|
||||
}
|
||||
|
||||
void hash_table_destroyer(gpointer data) {
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
GHashTable* word_counts = g_hash_table_new_full(
|
||||
g_str_hash, g_str_equal, hash_table_destroyer, hash_table_destroyer);
|
||||
while (1) {
|
||||
if (!process_new_line(word_counts)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
GArray* words_array = g_array_new(TRUE, FALSE, sizeof(char*));
|
||||
GList* keys_list = g_hash_table_get_keys(word_counts);
|
||||
while (keys_list != NULL) {
|
||||
int* value = g_hash_table_lookup(word_counts, keys_list->data);
|
||||
g_array_append_val(words_array, keys_list->data);
|
||||
keys_list = keys_list->next;
|
||||
}
|
||||
|
||||
g_array_sort_with_data(words_array, array_comparator, word_counts);
|
||||
|
||||
g_printf("Total %d words\n", words_array->len);
|
||||
for (int i = 0; i < words_array->len; ++i) {
|
||||
char* cur_str = g_array_index(words_array, char*, i);
|
||||
int* value = g_hash_table_lookup(word_counts, cur_str);
|
||||
g_printf("%s -> %d\n", cur_str, *(int*)value);
|
||||
}
|
||||
|
||||
g_list_free(keys_list);
|
||||
g_hash_table_destroy(word_counts);
|
||||
g_array_free(words_array, TRUE);
|
||||
return 0;
|
||||
}
|
||||
7
11_Toolkits/test_data.txt
Normal file
7
11_Toolkits/test_data.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
hello world
|
||||
hello world
|
||||
hello here
|
||||
here
|
||||
here
|
||||
allow
|
||||
|
||||
Reference in New Issue
Block a user