#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; }