From 6a047a3e64aed7965d328650600c8f4169c87e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Frankovi=C4=8D?= Date: Thu, 9 Apr 2026 22:07:30 +0200 Subject: [PATCH] du4 --- a2/test_main | Bin 0 -> 20704 bytes a2/test_main.c | 36 +++++++ du1/gui | Bin 0 -> 22448 bytes du1/gui.c | 127 +++++++++++++++++++++++ du2/gui | Bin 0 -> 27240 bytes du2/gui.c | 259 +++++++++++++++++++++++++++++++++++++++++++++++ du2/gui_backup.c | 229 +++++++++++++++++++++++++++++++++++++++++ du2/program | Bin 0 -> 16480 bytes du3/program | Bin 0 -> 16192 bytes du4/snake.c | 104 +++++++++++++++++++ du4/snake.h | 112 ++++++++++++++++++++ 11 files changed, 867 insertions(+) create mode 100755 a2/test_main create mode 100644 a2/test_main.c create mode 100755 du1/gui create mode 100644 du1/gui.c create mode 100755 du2/gui create mode 100644 du2/gui.c create mode 100644 du2/gui_backup.c create mode 100755 du2/program create mode 100755 du3/program create mode 100644 du4/snake.c create mode 100644 du4/snake.h diff --git a/a2/test_main b/a2/test_main new file mode 100755 index 0000000000000000000000000000000000000000..2ab03119e0d51d66df2c053a3393aad9fc6fe516 GIT binary patch literal 20704 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 +#include +#include +#include "pig_latin.h" + +#define CHECK(phrase, expected) do { \ + char *r = translate(phrase); \ + if (strcmp(r, expected) == 0) printf("OK: %s -> %s\n", phrase, r); \ + else printf("FAIL: %s -> got '%s', expected '%s'\n", phrase, r, expected); \ + free(r); \ +} while(0) + +int main() { + CHECK("apple", "appleay"); + CHECK("ear", "earay"); + CHECK("igloo", "iglooay"); + CHECK("equal", "equalay"); + CHECK("xray", "xrayay"); + CHECK("yttria", "yttriaay"); + CHECK("pig", "igpay"); + CHECK("koala", "oalakay"); + CHECK("xenon", "enonxay"); + CHECK("qat", "atqay"); + CHECK("chair", "airchay"); + CHECK("queen", "eenquay"); + CHECK("square", "aresquay"); + CHECK("therapy", "erapythay"); + CHECK("thrush", "ushthray"); + CHECK("school", "oolschay"); + CHECK("yellow", "ellowyay"); + CHECK("rhythm", "ythmrhay"); + CHECK("my", "ymay"); + CHECK("liquid", "iquidlay"); + CHECK("quick fast run", "ickquay astfay unray"); + return 0; +} diff --git a/du1/gui b/du1/gui new file mode 100755 index 0000000000000000000000000000000000000000..edd2a2bb17beee55b73e71aa130d30692dfeae68 GIT binary patch literal 22448 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 HC@lFeuwQ?v literal 0 HcmV?d00001 diff --git a/du1/gui.c b/du1/gui.c new file mode 100644 index 0000000..325cd7d --- /dev/null +++ b/du1/gui.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include + +// Widgets we need to access globally +static GtkWidget *entry_x; +static GtkWidget *text_coeffs; +static GtkWidget *label_result; + +static void calculate(GtkWidget *widget, gpointer data) { + (void)widget; (void)data; + + // Read x + const char *x_str = gtk_entry_get_text(GTK_ENTRY(entry_x)); + double x; + if (sscanf(x_str, "%lf", &x) != 1) { + gtk_label_set_text(GTK_LABEL(label_result), "Chyba: Nepodarilo sa nacitat zaklad x"); + return; + } + + // Read coefficients from text view + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_coeffs)); + GtkTextIter start, end; + gtk_text_buffer_get_start_iter(buf, &start); + gtk_text_buffer_get_end_iter(buf, &end); + char *text = gtk_text_buffer_get_text(buf, &start, &end, FALSE); + + double coeffs[256]; + int n = 0; + char *line = strtok(text, "\n"); + while (line != NULL && n < 256) { + // skip empty lines + if (strlen(line) == 0 || line[0] == '\r') { + line = strtok(NULL, "\n"); + continue; + } + if (sscanf(line, "%lf", &coeffs[n]) != 1) { + char msg[128]; + snprintf(msg, sizeof(msg), "Chyba: Nepodarilo sa nacitat polynom na %d mieste.", n + 1); + gtk_label_set_text(GTK_LABEL(label_result), msg); + g_free(text); + return; + } + n++; + line = strtok(NULL, "\n"); + } + g_free(text); + + if (n == 0) { + gtk_label_set_text(GTK_LABEL(label_result), "Chyba: Nepodarilo sa nacitat polynom na 2 mieste."); + return; + } + + // Horner's method + double result = 0.0; + for (int i = 0; i < n; i++) { + result = result * x + coeffs[i]; + } + + char msg[128]; + snprintf(msg, sizeof(msg), "Vysledok je: %.2f", result); + gtk_label_set_text(GTK_LABEL(label_result), msg); +} + +static void activate(GtkApplication *app, gpointer user_data) { + (void)user_data; + + GtkWidget *window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "Polynóm kalkulačka"); + gtk_window_set_default_size(GTK_WINDOW(window), 350, 450); + gtk_container_set_border_width(GTK_CONTAINER(window), 16); + + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); + gtk_container_add(GTK_CONTAINER(window), box); + + // X input + GtkWidget *lbl_x = gtk_label_new("Hodnota x:"); + gtk_widget_set_halign(lbl_x, GTK_ALIGN_START); + gtk_box_pack_start(GTK_BOX(box), lbl_x, FALSE, FALSE, 0); + + entry_x = gtk_entry_new(); + gtk_entry_set_placeholder_text(GTK_ENTRY(entry_x), "napr. 4 alebo 2.5"); + gtk_box_pack_start(GTK_BOX(box), entry_x, FALSE, FALSE, 0); + + // Coefficients input + GtkWidget *lbl_c = gtk_label_new("Koeficienty (každý na novom riadku, od najvyššieho rádu):"); + gtk_widget_set_halign(lbl_c, GTK_ALIGN_START); + gtk_label_set_line_wrap(GTK_LABEL(lbl_c), TRUE); + gtk_box_pack_start(GTK_BOX(box), lbl_c, FALSE, FALSE, 0); + + GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll), 150); + gtk_box_pack_start(GTK_BOX(box), scroll, TRUE, TRUE, 0); + + text_coeffs = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_coeffs), TRUE); + gtk_container_add(GTK_CONTAINER(scroll), text_coeffs); + + // Calculate button + GtkWidget *btn = gtk_button_new_with_label("Vypočítať"); + g_signal_connect(btn, "clicked", G_CALLBACK(calculate), NULL); + gtk_box_pack_start(GTK_BOX(box), btn, FALSE, FALSE, 0); + + // Result label + label_result = gtk_label_new("Vysledok sa zobrazí tu."); + gtk_widget_set_halign(label_result, GTK_ALIGN_START); + gtk_label_set_selectable(GTK_LABEL(label_result), TRUE); + + // Style the result label + GtkStyleContext *ctx = gtk_widget_get_style_context(label_result); + GtkCssProvider *provider = gtk_css_provider_new(); + gtk_css_provider_load_from_data(provider, "label { font-size: 16px; font-weight: bold; }", -1, NULL); + gtk_style_context_add_provider(ctx, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); + + gtk_box_pack_start(GTK_BOX(box), label_result, FALSE, FALSE, 0); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *app = gtk_application_new("sk.tuke.pvjc.polynom", G_APPLICATION_DEFAULT_FLAGS); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + return status; +} diff --git a/du2/gui b/du2/gui new file mode 100755 index 0000000000000000000000000000000000000000..2119eb3fcb46c0a80aed9af20d8e25b3f3285108 GIT binary patch literal 27240 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 vI?87f{#3oy_1RViVxmjI#j^haDyT-# literal 0 HcmV?d00001 diff --git a/du2/gui.c b/du2/gui.c new file mode 100644 index 0000000..66d641c --- /dev/null +++ b/du2/gui.c @@ -0,0 +1,259 @@ +#include +#include +#include +#include +#include +#include + +#define MAX_STUDENTS 1024 +#define MAX_NAME 256 + +typedef struct { + char name[MAX_NAME]; + int votes; +} Student; + +static GtkWidget *text_input; +static GtkWidget *text_output; +static GtkWidget *drawing_area; + +static Student chart_students[MAX_STUDENTS]; +static int chart_count = 0; + +static const double bar_colors[][3] = { + {0.96, 0.76, 0.05}, + {0.75, 0.75, 0.75}, + {0.80, 0.50, 0.20}, + {0.26, 0.53, 0.96}, + {0.20, 0.78, 0.35}, + {0.90, 0.30, 0.30}, + {0.60, 0.20, 0.80}, + {0.10, 0.70, 0.80}, +}; +#define NUM_COLORS 8 + +static int find_student(Student *students, int count, const char *name) { + for (int i = 0; i < count; i++) + if (strcmp(students[i].name, name) == 0) return i; + return -1; +} + +static int cmp(const void *a, const void *b) { + const Student *sa = (const Student *)a; + const Student *sb = (const Student *)b; + if (sb->votes != sa->votes) return sb->votes - sa->votes; + return strcmp(sa->name, sb->name); +} + +static void set_output(const char *text) { + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_output)); + gtk_text_buffer_set_text(buf, text, -1); +} + +static gboolean on_draw(GtkWidget *widget, cairo_t *cr, gpointer data) { + (void)data; + int width = gtk_widget_get_allocated_width(widget); + int height = gtk_widget_get_allocated_height(widget); + + // White background to match GTK theme + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_paint(cr); + + if (chart_count == 0) { + cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 13); + cairo_move_to(cr, 20, height / 2.0); + cairo_show_text(cr, "Zadajte hlasy a kliknite Spočítať"); + return FALSE; + } + + int margin_left = 20, margin_right = 20, margin_top = 30, margin_bottom = 90; + int max_votes = chart_students[0].votes; + int n = chart_count > 20 ? 20 : chart_count; + + // Calculate total votes for percentage + int total_votes = 0; + for (int i = 0; i < n; i++) total_votes += chart_students[i].votes; + + // Draw total votes at the top + cairo_set_source_rgb(cr, 0.2, 0.2, 0.2); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 12); + char total_str[64]; + snprintf(total_str, sizeof(total_str), "Celkový počet hlasov: %d", total_votes); + cairo_text_extents_t te; + cairo_text_extents(cr, total_str, &te); + cairo_move_to(cr, (width - te.width) / 2.0, 18); + cairo_show_text(cr, total_str); + + double bar_area_w = width - margin_left - margin_right; + double bar_area_h = height - margin_top - margin_bottom; + double slot = bar_area_w / n; + double bar_w = slot - 6; + + for (int i = 0; i < n; i++) { + double bar_h = (bar_area_h * chart_students[i].votes) / (double)max_votes; + double x = margin_left + i * slot + 3; + double y = margin_top + bar_area_h - bar_h; + + int ci = i < 3 ? i : (3 + (i % (NUM_COLORS - 3))); + cairo_set_source_rgb(cr, bar_colors[ci][0], bar_colors[ci][1], bar_colors[ci][2]); + cairo_rectangle(cr, x, y, bar_w, bar_h); + cairo_fill(cr); + + // Vote count and percentage above bar + cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 10); + char vs[32]; + double pct = 100.0 * chart_students[i].votes / total_votes; + snprintf(vs, sizeof(vs), "%d (%.1f%%)", chart_students[i].votes, pct); + cairo_text_extents_t ext; + cairo_text_extents(cr, vs, &ext); + // If bar is wide enough, center above it; else rotate + if (ext.width < bar_w) { + cairo_move_to(cr, x + (bar_w - ext.width) / 2.0, y - 5); + cairo_show_text(cr, vs); + } else { + cairo_save(cr); + cairo_translate(cr, x + bar_w / 2.0, y - 5); + cairo_rotate(cr, -G_PI / 4.0); + cairo_move_to(cr, 0, 0); + cairo_show_text(cr, vs); + cairo_restore(cr); + } + + // Name horizontal, centered below bar, clipped to slot width + cairo_save(cr); + cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 10); + + char short_name[28]; + // Truncate name to fit slot + strncpy(short_name, chart_students[i].name, sizeof(short_name) - 1); + short_name[sizeof(short_name) - 1] = '\0'; + cairo_text_extents_t ne; + cairo_text_extents(cr, short_name, &ne); + // Shorten until it fits + while (ne.width > slot - 4 && strlen(short_name) > 3) { + short_name[strlen(short_name) - 1] = '\0'; + short_name[strlen(short_name) - 1] = '~'; + cairo_text_extents(cr, short_name, &ne); + } + double name_x = x + (bar_w - ne.width) / 2.0; + cairo_move_to(cr, name_x, height - margin_bottom + 14); + cairo_show_text(cr, short_name); + cairo_restore(cr); + } + return FALSE; +} + +static void calculate(GtkWidget *widget, gpointer data) { + (void)widget; (void)data; + + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_input)); + GtkTextIter start, end; + gtk_text_buffer_get_start_iter(buf, &start); + gtk_text_buffer_get_end_iter(buf, &end); + char *text = gtk_text_buffer_get_text(buf, &start, &end, FALSE); + + Student students[MAX_STUDENTS]; + int count = 0, loaded = 0; + + char *line = strtok(text, "\n"); + while (line != NULL) { + if (strlen(line) == 0 || line[0] == '\r') { line = strtok(NULL, "\n"); continue; } + int votes; char name[MAX_NAME]; + if (sscanf(line, "%d %255[^\n\r]", &votes, name) != 2 || votes <= 0) break; + loaded++; + int idx = find_student(students, count, name); + if (idx >= 0) { students[idx].votes += votes; } + else if (count < MAX_STUDENTS) { strncpy(students[count].name, name, MAX_NAME-1); students[count].votes = votes; count++; } + line = strtok(NULL, "\n"); + } + g_free(text); + + if (loaded == 0) { set_output("Nepodarilo nacitat nic"); chart_count = 0; gtk_widget_queue_draw(drawing_area); return; } + + qsort(students, count, sizeof(Student), cmp); + chart_count = count; + memcpy(chart_students, students, count * sizeof(Student)); + gtk_widget_queue_draw(drawing_area); + + char output[MAX_STUDENTS * (MAX_NAME + 16)]; + int pos = 0; + pos += snprintf(output + pos, sizeof(output) - pos, "Vysledky:\n"); + for (int i = 0; i < count; i++) + pos += snprintf(output + pos, sizeof(output) - pos, "%d %s\n", students[i].votes, students[i].name); + set_output(output); +} + +static void clear_all(GtkWidget *widget, gpointer data) { + (void)widget; (void)data; + gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_input)), "", -1); + set_output(""); + chart_count = 0; + gtk_widget_queue_draw(drawing_area); +} + +static void activate(GtkApplication *app, gpointer user_data) { + (void)user_data; + GtkWidget *window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "Anketa Študent roka"); + gtk_window_set_default_size(GTK_WINDOW(window), 900, 650); + gtk_container_set_border_width(GTK_CONTAINER(window), 12); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12); + gtk_container_add(GTK_CONTAINER(window), hbox); + + // Left panel + GtkWidget *left = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_box_pack_start(GTK_BOX(hbox), left, FALSE, FALSE, 0); + gtk_widget_set_size_request(left, 280, -1); + + gtk_box_pack_start(GTK_BOX(left), gtk_label_new("Hlasy (počet meno):"), FALSE, FALSE, 0); + GtkWidget *scroll_in = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll_in), 220); + gtk_box_pack_start(GTK_BOX(left), scroll_in, TRUE, TRUE, 0); + text_input = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_input), TRUE); + gtk_container_add(GTK_CONTAINER(scroll_in), text_input); + + GtkWidget *btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_start(GTK_BOX(left), btn_box, FALSE, FALSE, 0); + GtkWidget *btn_calc = gtk_button_new_with_label("Spočítať hlasy"); + g_signal_connect(btn_calc, "clicked", G_CALLBACK(calculate), NULL); + gtk_box_pack_start(GTK_BOX(btn_box), btn_calc, TRUE, TRUE, 0); + GtkWidget *btn_clear = gtk_button_new_with_label("Vymazať"); + g_signal_connect(btn_clear, "clicked", G_CALLBACK(clear_all), NULL); + gtk_box_pack_start(GTK_BOX(btn_box), btn_clear, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(left), gtk_label_new("Výsledky:"), FALSE, FALSE, 0); + GtkWidget *scroll_out = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll_out), 180); + gtk_box_pack_start(GTK_BOX(left), scroll_out, TRUE, TRUE, 0); + text_output = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_output), TRUE); + gtk_text_view_set_editable(GTK_TEXT_VIEW(text_output), FALSE); + gtk_container_add(GTK_CONTAINER(scroll_out), text_output); + + // Right panel: chart + GtkWidget *right = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); + gtk_box_pack_start(GTK_BOX(hbox), right, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(right), gtk_label_new("Graf hlasov:"), FALSE, FALSE, 0); + drawing_area = gtk_drawing_area_new(); + gtk_box_pack_start(GTK_BOX(right), drawing_area, TRUE, TRUE, 0); + g_signal_connect(drawing_area, "draw", G_CALLBACK(on_draw), NULL); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *app = gtk_application_new("sk.tuke.pvjc.anketa", G_APPLICATION_DEFAULT_FLAGS); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + return status; +} diff --git a/du2/gui_backup.c b/du2/gui_backup.c new file mode 100644 index 0000000..9745b7d --- /dev/null +++ b/du2/gui_backup.c @@ -0,0 +1,229 @@ +#include +#include +#include +#include +#include +#include + +#define MAX_STUDENTS 1024 +#define MAX_NAME 256 + +typedef struct { + char name[MAX_NAME]; + int votes; +} Student; + +static GtkWidget *text_input; +static GtkWidget *text_output; +static GtkWidget *drawing_area; + +static Student chart_students[MAX_STUDENTS]; +static int chart_count = 0; + +static const double bar_colors[][3] = { + {0.96, 0.76, 0.05}, + {0.75, 0.75, 0.75}, + {0.80, 0.50, 0.20}, + {0.26, 0.53, 0.96}, + {0.20, 0.78, 0.35}, + {0.90, 0.30, 0.30}, + {0.60, 0.20, 0.80}, + {0.10, 0.70, 0.80}, +}; +#define NUM_COLORS 8 + +static int find_student(Student *students, int count, const char *name) { + for (int i = 0; i < count; i++) + if (strcmp(students[i].name, name) == 0) return i; + return -1; +} + +static int cmp(const void *a, const void *b) { + const Student *sa = (const Student *)a; + const Student *sb = (const Student *)b; + if (sb->votes != sa->votes) return sb->votes - sa->votes; + return strcmp(sa->name, sb->name); +} + +static void set_output(const char *text) { + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_output)); + gtk_text_buffer_set_text(buf, text, -1); +} + +static gboolean on_draw(GtkWidget *widget, cairo_t *cr, gpointer data) { + (void)data; + int width = gtk_widget_get_allocated_width(widget); + int height = gtk_widget_get_allocated_height(widget); + + cairo_set_source_rgb(cr, 0.15, 0.15, 0.15); + cairo_paint(cr); + + if (chart_count == 0) { + cairo_set_source_rgb(cr, 0.6, 0.6, 0.6); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 13); + cairo_move_to(cr, 20, height / 2.0); + cairo_show_text(cr, "Zadajte hlasy a kliknite Spočítať"); + return FALSE; + } + + int margin_left = 20, margin_right = 20, margin_top = 24, margin_bottom = 70; + int max_votes = chart_students[0].votes; + int n = chart_count > 20 ? 20 : chart_count; + + double bar_area_w = width - margin_left - margin_right; + double bar_area_h = height - margin_top - margin_bottom; + double slot = bar_area_w / n; + double bar_w = slot - 6; + + for (int i = 0; i < n; i++) { + double bar_h = (bar_area_h * chart_students[i].votes) / (double)max_votes; + double x = margin_left + i * slot + 3; + double y = margin_top + bar_area_h - bar_h; + + int ci = i < 3 ? i : (3 + (i % (NUM_COLORS - 3))); + cairo_set_source_rgb(cr, bar_colors[ci][0], bar_colors[ci][1], bar_colors[ci][2]); + cairo_rectangle(cr, x, y, bar_w, bar_h); + cairo_fill(cr); + + // Vote count on top + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 11); + char vs[16]; + snprintf(vs, sizeof(vs), "%d", chart_students[i].votes); + cairo_text_extents_t ext; + cairo_text_extents(cr, vs, &ext); + cairo_move_to(cr, x + (bar_w - ext.width) / 2.0, y - 5); + cairo_show_text(cr, vs); + + // Name rotated below bar + cairo_save(cr); + cairo_translate(cr, x + bar_w / 2.0, height - margin_bottom + 10); + cairo_rotate(cr, -G_PI / 4.0); + cairo_set_source_rgb(cr, 0.9, 0.9, 0.9); + cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 10); + char short_name[24]; + if (strlen(chart_students[i].name) > 20) { + strncpy(short_name, chart_students[i].name, 19); + short_name[19] = '\0'; + strcat(short_name, "~"); + } else { + strncpy(short_name, chart_students[i].name, sizeof(short_name) - 1); + short_name[sizeof(short_name)-1] = '\0'; + } + cairo_move_to(cr, 0, 0); + cairo_show_text(cr, short_name); + cairo_restore(cr); + } + return FALSE; +} + +static void calculate(GtkWidget *widget, gpointer data) { + (void)widget; (void)data; + + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_input)); + GtkTextIter start, end; + gtk_text_buffer_get_start_iter(buf, &start); + gtk_text_buffer_get_end_iter(buf, &end); + char *text = gtk_text_buffer_get_text(buf, &start, &end, FALSE); + + Student students[MAX_STUDENTS]; + int count = 0, loaded = 0; + + char *line = strtok(text, "\n"); + while (line != NULL) { + if (strlen(line) == 0 || line[0] == '\r') { line = strtok(NULL, "\n"); continue; } + int votes; char name[MAX_NAME]; + if (sscanf(line, "%d %255[^\n\r]", &votes, name) != 2 || votes <= 0) break; + loaded++; + int idx = find_student(students, count, name); + if (idx >= 0) { students[idx].votes += votes; } + else if (count < MAX_STUDENTS) { strncpy(students[count].name, name, MAX_NAME-1); students[count].votes = votes; count++; } + line = strtok(NULL, "\n"); + } + g_free(text); + + if (loaded == 0) { set_output("Nepodarilo nacitat nic"); chart_count = 0; gtk_widget_queue_draw(drawing_area); return; } + + qsort(students, count, sizeof(Student), cmp); + chart_count = count; + memcpy(chart_students, students, count * sizeof(Student)); + gtk_widget_queue_draw(drawing_area); + + char output[MAX_STUDENTS * (MAX_NAME + 16)]; + int pos = 0; + pos += snprintf(output + pos, sizeof(output) - pos, "Vysledky:\n"); + for (int i = 0; i < count; i++) + pos += snprintf(output + pos, sizeof(output) - pos, "%d %s\n", students[i].votes, students[i].name); + set_output(output); +} + +static void clear_all(GtkWidget *widget, gpointer data) { + (void)widget; (void)data; + gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_input)), "", -1); + set_output(""); + chart_count = 0; + gtk_widget_queue_draw(drawing_area); +} + +static void activate(GtkApplication *app, gpointer user_data) { + (void)user_data; + GtkWidget *window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "Anketa Študent roka"); + gtk_window_set_default_size(GTK_WINDOW(window), 900, 650); + gtk_container_set_border_width(GTK_CONTAINER(window), 12); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12); + gtk_container_add(GTK_CONTAINER(window), hbox); + + // Left panel + GtkWidget *left = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_box_pack_start(GTK_BOX(hbox), left, FALSE, FALSE, 0); + gtk_widget_set_size_request(left, 280, -1); + + gtk_box_pack_start(GTK_BOX(left), gtk_label_new("Hlasy (počet meno):"), FALSE, FALSE, 0); + GtkWidget *scroll_in = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll_in), 220); + gtk_box_pack_start(GTK_BOX(left), scroll_in, TRUE, TRUE, 0); + text_input = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_input), TRUE); + gtk_container_add(GTK_CONTAINER(scroll_in), text_input); + + GtkWidget *btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_start(GTK_BOX(left), btn_box, FALSE, FALSE, 0); + GtkWidget *btn_calc = gtk_button_new_with_label("Spočítať hlasy"); + g_signal_connect(btn_calc, "clicked", G_CALLBACK(calculate), NULL); + gtk_box_pack_start(GTK_BOX(btn_box), btn_calc, TRUE, TRUE, 0); + GtkWidget *btn_clear = gtk_button_new_with_label("Vymazať"); + g_signal_connect(btn_clear, "clicked", G_CALLBACK(clear_all), NULL); + gtk_box_pack_start(GTK_BOX(btn_box), btn_clear, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(left), gtk_label_new("Výsledky:"), FALSE, FALSE, 0); + GtkWidget *scroll_out = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll_out), 180); + gtk_box_pack_start(GTK_BOX(left), scroll_out, TRUE, TRUE, 0); + text_output = gtk_text_view_new(); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(text_output), TRUE); + gtk_text_view_set_editable(GTK_TEXT_VIEW(text_output), FALSE); + gtk_container_add(GTK_CONTAINER(scroll_out), text_output); + + // Right panel: chart + GtkWidget *right = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); + gtk_box_pack_start(GTK_BOX(hbox), right, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(right), gtk_label_new("Graf hlasov:"), FALSE, FALSE, 0); + drawing_area = gtk_drawing_area_new(); + gtk_box_pack_start(GTK_BOX(right), drawing_area, TRUE, TRUE, 0); + g_signal_connect(drawing_area, "draw", G_CALLBACK(on_draw), NULL); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *app = gtk_application_new("sk.tuke.pvjc.anketa", G_APPLICATION_DEFAULT_FLAGS); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + return status; +} diff --git a/du2/program b/du2/program new file mode 100755 index 0000000000000000000000000000000000000000..eab24bff51ac11d9b022f9c121771fe790a28a93 GIT binary patch literal 16480 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 AIRF3v literal 0 HcmV?d00001 diff --git a/du3/program b/du3/program new file mode 100755 index 0000000000000000000000000000000000000000..5ee334043942b6526b1cec37d8d67267f9c12ae3 GIT binary patch literal 16192 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 literal 0 HcmV?d00001 diff --git a/du4/snake.c b/du4/snake.c new file mode 100644 index 0000000..762d2d0 --- /dev/null +++ b/du4/snake.c @@ -0,0 +1,104 @@ +#include +#include "snake.h" + +struct snake* add_snake(struct snake* snake, int x, int y) { + struct snake* new_part = (struct snake*)malloc(sizeof(struct snake)); + if (new_part == NULL) { + return snake; + } + new_part->x = x; + new_part->y = y; + new_part->next = snake; + + return new_part; +} + +struct snake* remove_snake(struct snake* snake) { + if (snake == NULL) { + return NULL; + } + if (snake->next == NULL) { + free(snake); + return NULL; + } + + struct snake* current = snake; + while (current->next->next != NULL) { + current = current->next; + } + + free(current->next); + current->next = NULL; + + return snake; +} + +int is_snake(struct snake* snake, int x, int y) { + struct snake* current = snake; + while (current != NULL) { + if (current->x == x && current->y == y) { + return 1; + } + current = current->next; + } + return 0; +} + +void free_snake(struct snake* sn) { + while (sn != NULL) { + struct snake* temp = sn; + sn = sn->next; + free(temp); + } +} + +int step_state(struct state* state) { + if (state == NULL || state->snake == NULL) { + return END_USER; + } + + int new_x = state->snake->x + state->sx; + int new_y = state->snake->y + state->sy; + + if (new_x < 0 || new_x >= state->width || new_y < 0 || new_y >= state->height) { + return END_WALL; + } + + int food_index = -1; + int items_left = 0; + + for (int i = 0; i < FOOD_COUNT; i++) { + if (state->foodx[i] == new_x && state->foody[i] == new_y) { + food_index = i; + } else if (state->foodx[i] >= 0 && state->foody[i] >= 0) { + items_left++; + } + } + + if (food_index >= 0) { + state->foodx[food_index] = -1; + state->foody[food_index] = -1; + + if (is_snake(state->snake, new_x, new_y)) { + state->snake = add_snake(state->snake, new_x, new_y); + return END_SNAKE; + } + + state->snake = add_snake(state->snake, new_x, new_y); + + if (items_left == 0) { + return END_FOOD; + } + return END_CONTINUE; + } else { + state->snake = remove_snake(state->snake); + + if (is_snake(state->snake, new_x, new_y)) { + state->snake = add_snake(state->snake, new_x, new_y); + return END_SNAKE; + } + + state->snake = add_snake(state->snake, new_x, new_y); + return END_CONTINUE; + } +} diff --git a/du4/snake.h b/du4/snake.h new file mode 100644 index 0000000..c0ab1ad --- /dev/null +++ b/du4/snake.h @@ -0,0 +1,112 @@ +#ifndef snake_h_INCLUDED +#define snake_h_INCLUDED + +// Number of food items on the plane +#define FOOD_COUNT 5 + +/** + * One part of the snake; + * + * The snake is a linked list; + */ + +struct snake { + // x position of the snake part + int x; + // y position of the snake part + int y; + // Pointer to the next snake part. + // The last part of the snake has NULL pointer to the next part. + struct snake* next; +}; + +// End game reason constants, return value of step_state +enum endgame { + // Continue the game + END_CONTINUE = 0, + // Snake hit a wall + END_WALL, + // Snake hit itself + END_SNAKE, + // No food left + END_FOOD, + // Other reason to end + END_USER +}; + +/** + * State of the game. + * + * The state consists of the snake, its speed and food on the plane. + * + * The snake is a linked list of snake parts. + * + * Speed vector is a vector added to the last head position to create a new head. + * + * Food are points on the plane. Food with negative coordinates meads food is already eaten. + */ + +struct state { + // Snake as a linked list + struct snake* snake; + // X of the food positions + int foodx[FOOD_COUNT]; + // Y of the food positions + int foody[FOOD_COUNT]; + int sx; + int sy; + int width; + int height; +}; + +/** + * Add a new snake part with given position. The new snake part becomes the new head. + * + * @param head of the snake. + * @param x coordinate of the new head; + * @param y coordinate of the new head. + * @return new head of the snake. + */ +struct snake* add_snake(struct snake* snake,int x,int y); + +/** + * Remove the last snake part. + * The last snake part should always have NULL next pointer. + * + * @param head of the snake. + * @return new head of the snake. + */ +struct snake* remove_snake(struct snake* snake); + +/** + * Finds out if given coordinates are part of the snake. + * @param snake + * @param x coordinate to search in snake + * @param y coordinate to search in snake + * @return True, if there is a snake part with coordinates x,y. False otherwise + * + */ +int is_snake(struct snake* snake,int x, int y); +/** + * Remove and free each snake part; + * @param head of the snake. + */ +void free_snake(struct snake* sn); +/** + * Change game state. + * + * The function shoud calculate new posision of the snake head + * from the current position and speed vector. + * Then it should modify snake parst or food coordinates according to the rules: + * + * - If the new position is on the snake, end the game, return END_SNAKE. + * - If the new position is on the food, mark food as eaten + * (set its coordinates to -1) and add new snake part on the position of the food. If there is no food left, return END_FOOD. else return END_CONTINUE. + * - If the new position is on the plane, add new snake part on the new position and remove the last part of the snake, return END_CONTINUE. + * + * @param current state of the game + * @return reason to end the game according to enum endgame. + */ +int step_state(struct state* state); + +#endif // snake_h_INCLUDED