128 lines
4.5 KiB
C
128 lines
4.5 KiB
C
#include <gtk/gtk.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// 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;
|
|
}
|