Drobne upravy k finalni verzi (Doxy a knihovna.c
[BETON.git] / main.c
blob99cc78e7fe710f0fe56335a5be87d33b90ad1f45
1 /**************************************************************************** *
2 * nazev projektu: BETON *
3 * soubor: main.c *
4 * autor: Michal Rysavy xrysav17 *
5 * kultirizace kodu: Jakub Jelen xjelen06 *
6 * *
7 * popis: hlavni logika aplikace *
8 * *
9 ******************************************************************************/
10 /**
11 * @file main.c
13 * @author Michal Rysavy (korektura: Jakub Jelen)
14 * @brief Hlavni logika kalkulacky a volani GTK+
16 #include <gtk/gtk.h>
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <limits.h>
20 #include "knihovna.h"
22 /** Jmeno souboru s XML formatem GUI */
23 #define BUILDER_XML_FILE "kal.glade"
25 /**
26 * struktura s ukazateli na jednotlive widgety v aplikaci
28 typedef struct
30 GtkWidget *window; /**< Okno aplikace */
31 GtkWidget *plus; /**< Tlacitko + */
32 GtkWidget *minus; /**< Tlacitko - */
33 GtkWidget *nasobeni; /**< Tlacitko * */
34 GtkWidget *deleni; /**< Tlacitko : */
35 GtkWidget *umocni; /**< Tlacitko X^n */
36 GtkWidget *button5; /**< Tlacitko log */
37 GtkWidget *button6; /**< Tlacitko n! */
38 GtkWidget *CE; /**< Tlacitko Resetu kalkula4ky */
39 GtkWidget *n1; /**< Tlacitko 1 */
40 GtkWidget *n2; /**< Tlacitko 2 */
41 GtkWidget *n3; /**< Tlacitko 3 */
42 GtkWidget *n4; /**< Tlacitko 4 */
43 GtkWidget *n5; /**< Tlacitko 5 */
44 GtkWidget *n6; /**< Tlacitko 6 */
45 GtkWidget *n7; /**< Tlacitko 7 */
46 GtkWidget *n8; /**< Tlacitko 8 */
47 GtkWidget *n9; /**< Tlacitko 9 */
48 GtkWidget *n0; /**< Tlacitko 0 */
49 GtkWidget *desetina; /**< Tlacitko , */
50 GtkWidget *spocitej; /**< Tlacitko = */
51 GtkLabel *label1; /**< Pole pro zobrazeni vysledku */
52 } App;
54 /** deklarace globalnich promenych pro vysledky kalkulacky
56 Tvysledek hodnota1, hodnota2;
58 /**
59 * Enumerace operaci kalkulacky pro promennou operace
60 */
61 enum OP{
62 NONE = 0, // nic / nebylo zadano
63 PLUS, // scitani
64 MINUS, // odcitani
65 NASOB, // nasobeni
66 DEL, // deleni
67 MOCNI, // mocnina
68 LOG, // logaritmus
69 FACT, // faktorial
70 VYPOCTENO // vypocteno
71 } operace; /**< Priznak operace pro stav kalkulacky */
73 int desetina=0; /**< pri hodnote 1 se už tvori desetina cisla */
74 int cislic=0; /**< Pocet zadanych cislic */
75 int omezeni=8; /**< omezeni kolik maximalne muze uzivatel zadat cislic na jedno cislo */
77 /**
78 * Pomocna promenna pro vypis
80 char* x;
82 /**
83 * @brief Funkce nastavujici operaci do globalni promenne, spolecne s resenim drobnosti pri prechodu na dalsi vstupni cislo.
85 * @param op Konstanta symbolizujici opeaci z pole OP
87 void setOperation( int op ){
88 if( (operace == NONE) || (operace == VYPOCTENO)){ //zadano jen jedno cislo
89 operace = op;
90 cislic = 0;
91 desetina = 0;
92 } else{ // Operace jiz vybrana
93 //zde by se mela provest operace, pokud jsou jiz dve cisla
98 /**
99 * handler, ktery je v glade prirazen stisknuti tlacitka +
101 void plus_clicked (GtkObject *object, App *app){
102 setOperation(PLUS);
106 * handler, ktery je v glade prirazen stisknuti tlacitka -
108 void minus_clicked (GtkObject *object, App *app){
109 setOperation(MINUS);
113 * handler, ktery je v glade prirazen stisknuti tlacitka *
115 void nasobeni_clicked (GtkObject *object, App *app){
116 setOperation(NASOB);
120 * handler, ktery je v glade prirazen stisknuti tlacitka :
122 void deleni_clicked (GtkObject *object, App *app){
123 setOperation(DEL);
127 * handler, ktery je v glade prirazen stisknuti tlacitka umocneni
129 void umocni_clicked (GtkObject *object, App *app){
130 setOperation(MOCNI);
134 * handler, ktery je v glade prirazen stisknuti tlacitka log a rovnou vypocita
136 void on_button5_clicked (GtkObject *object, App *app)
138 hodnota1=logaritmus(hodnota1.result);
139 if (hodnota1.error!=0){
140 gtk_label_set_text(app->label1,"ERROR");
141 operace=0;
142 desetina=0;
143 hodnota1.result=0;
144 hodnota2.result=0;
145 cislic=0;
147 else{
148 char* x = malloc(sizeof(char)*15);
149 sprintf(x,"%.5f",hodnota1.result);
150 gtk_label_set_text(app->label1,x);
151 hodnota2.result=0;
152 operace=0; //uz nebude mozne zadavat hodnotu 1
153 cislic=8;
154 desetina=1;
155 free(x);
160 * handler, ktery je v glade prirazen stisknuti tlacitka faktorial a rovnou vypocita
162 void on_button6_clicked (GtkObject *object, App *app)
164 hodnota1=faktorial(hodnota1.result);
165 if (hodnota1.error!=0){
166 gtk_label_set_text(app->label1,"ERROR");
167 operace=0;
168 desetina=0;
169 hodnota1.result=0;
170 hodnota2.result=0;
171 cislic=0;
173 else{
174 char* x = malloc(sizeof(char)*15);
175 sprintf(x,"%.5f",hodnota1.result);
176 gtk_label_set_text(app->label1,x);
177 hodnota2.result=0;
178 operace=0; //uz nebude mozne zadavat hodnotu 1
179 cislic=8;
180 desetina=1;
181 free(x);
185 * handler, ktery vynuluje kalkulacku
187 void CE_clicked (GtkObject *object, App *app)
189 operace=0;
190 desetina=0;
191 hodnota1.result=0;
192 hodnota1.error=0;
193 hodnota2.result=0;
194 hodnota2.error=0;
195 cislic=0;
196 gtk_label_set_text(app->label1,"Kalkulacka BETON");
201 * @brief Prida cislo zadane parametrem podle stavu kalkulacky do spravneho cisla a vypise aktualni stav
202 * @param app GTK Aplikace
203 * @param number Jednociferne cislo k zadani
205 void addNumber(App* app, double number){
206 if (cislic < omezeni){
207 cislic++;
208 if (operace == 0){
209 if (desetina == 0){
210 hodnota1.result = hodnota1.result * 10 + number;
211 } else{
212 hodnota1.result = hodnota1.result + (number / pow(10, desetina));
213 desetina++;
215 sprintf(x,"%.5f",hodnota1.result);
216 gtk_label_set_text(app->label1,x);
217 } else {
218 if (desetina == 0){
219 hodnota2.result = hodnota2.result * 10 + number;
220 } else {
221 hodnota2.result = hodnota2.result + (number/pow(10,desetina));
222 desetina++;
224 sprintf(x,"%.5f",hodnota2.result);
225 gtk_label_set_text(app->label1,x);
231 * Handler tlacitka s cislem 1
233 void n1_clicked (GtkObject *object, App *app){
234 addNumber(app, 1);
238 * Handler tlacitka s cislem 2
240 void n2_clicked (GtkObject *object, App *app){
241 addNumber(app, 2);
245 * Handler tlacitka s cislem 3
247 void n3_clicked (GtkObject *object, App *app){
248 addNumber(app, 3);
252 * Handler tlacitka s cislem 4
254 void n4_clicked (GtkObject *object, App *app){
255 addNumber(app, 4);
259 * Handler tlacitka s cislem 5
261 void n5_clicked (GtkObject *object, App *app){
262 addNumber(app, 5);
266 * Handler tlacitka s cislem 6
268 void n6_clicked (GtkObject *object, App *app){
269 addNumber(app, 6);
273 * Handler tlacitka s cislem 7
275 void n7_clicked (GtkObject *object, App *app){
276 addNumber(app, 7);
280 * Handler tlacitka s cislem 8
282 void n8_clicked (GtkObject *object, App *app){
283 addNumber(app, 8);
287 * Handler tlacitka s cislem 9
289 void n9_clicked (GtkObject *object, App *app){
290 addNumber(app, 9);
294 * Handler tlacitka s cislem 0
296 void n0_clicked (GtkObject *object, App *app){
297 addNumber(app, 0);
301 * Nastavi desetinnou carku a pristi cislice jsou desetinna
303 void desetina_clicked (GtkObject *object, App *app)
305 if (desetina==0){
306 desetina=1;
307 //mozna jeste neco
309 else{ //vypsani chyby pokud se vickrat klikne na desetinu
314 * Podle typu operace zavola prislusnou funkci z nasi uchvatne knihovny
316 void spocitej_clicked (GtkObject *object, App *app)
318 switch (operace){
319 case PLUS:
320 hodnota1 = scitani(hodnota1.result, hodnota2.result);
321 sprintf(x,"%.5f",hodnota1.result);
322 gtk_label_set_text(app->label1,x);
323 break;
325 case MINUS:
326 hodnota1 = odcitani(hodnota1.result, hodnota2.result);
327 sprintf(x,"%.5f",hodnota1.result);
328 gtk_label_set_text(app->label1,x);
329 break;
331 case NASOB:
332 hodnota1 = nasobeni(hodnota1.result, hodnota2.result);
333 sprintf(x,"%.5f",hodnota1.result);
334 gtk_label_set_text(app->label1,x);
335 break;
337 case DEL:
338 hodnota1 = deleni(hodnota1.result, hodnota2.result);
339 if (hodnota1.error != 0){
340 gtk_label_set_text(app->label1,"ERROR");
341 desetina=0;
342 hodnota1.result = 0;
343 cislic=0;
345 else{
346 sprintf(x,"%.5f",hodnota1.result);
347 gtk_label_set_text(app->label1,x);
349 break;
351 case MOCNI:
352 hodnota1 = umocneni(hodnota1.result, hodnota2.result);
353 sprintf(x,"%.5f", hodnota1.result);
354 gtk_label_set_text(app->label1, x);
355 break;
356 default:
357 // ...
358 break;
361 hodnota2.result = 0;
362 operace = VYPOCTENO;
367 * ukonci hlavni smycku gtk pri zavreni okna
369 void on_window_destroy (GtkObject *object, gpointer user_data)
371 free(x);
372 gtk_main_quit();
376 * @brief Main funkce programu, nastavi globalni promenne, GUI a vse spusti
377 * Vynuluje globalni promenne a nastavi GTK a vytovori GUI.
379 int main (int argc, char *argv[])
381 // Vychozi nastaveni kalkulacky
382 hodnota1.result=0;
383 hodnota1.error=0;
384 hodnota2.result=0;
385 hodnota2.error=0;
386 App *app;
387 GtkBuilder *builder;
389 // retezec pro vypis cisel
390 x = malloc(sizeof(char)*15);
392 // alokuje pamet pro app
393 app = g_slice_new(App);
395 gtk_init (&argc, &argv);
397 // nacte GUI z XML
398 builder = gtk_builder_new ();
399 gtk_builder_add_from_file (builder, BUILDER_XML_FILE, NULL);
402 // priradi do struktury jednotlive widgety
403 app->window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
404 app->plus = GTK_WIDGET (gtk_builder_get_object (builder, "plus"));
405 app->minus = GTK_WIDGET (gtk_builder_get_object (builder, "minus"));
406 app->nasobeni = GTK_WIDGET (gtk_builder_get_object (builder, "nasobeni"));
407 app->deleni = GTK_WIDGET (gtk_builder_get_object (builder, "deleni"));
408 app->umocni = GTK_WIDGET (gtk_builder_get_object (builder, "umocni"));
409 app->button5 = GTK_WIDGET (gtk_builder_get_object (builder, "button5"));
410 app->button6 = GTK_WIDGET (gtk_builder_get_object (builder, "button6"));
411 app->CE = GTK_WIDGET (gtk_builder_get_object (builder, "CE"));
412 app->n1 = GTK_WIDGET (gtk_builder_get_object (builder, "n1"));
413 app->n2 = GTK_WIDGET (gtk_builder_get_object (builder, "n2"));
414 app->n3 = GTK_WIDGET (gtk_builder_get_object (builder, "n3"));
415 app->n4 = GTK_WIDGET (gtk_builder_get_object (builder, "n4"));
416 app->n5 = GTK_WIDGET (gtk_builder_get_object (builder, "n5"));
417 app->n6 = GTK_WIDGET (gtk_builder_get_object (builder, "n6"));
418 app->n7 = GTK_WIDGET (gtk_builder_get_object (builder, "n7"));
419 app->n8 = GTK_WIDGET (gtk_builder_get_object (builder, "n8"));
420 app->n9 = GTK_WIDGET (gtk_builder_get_object (builder, "n9"));
421 app->n0 = GTK_WIDGET (gtk_builder_get_object (builder, "n0"));
422 app->desetina = GTK_WIDGET (gtk_builder_get_object (builder, "desetina"));
423 app->spocitej = GTK_WIDGET (gtk_builder_get_object (builder, "spocitej"));
424 app->label1 = GTK_LABEL (gtk_builder_get_object (builder, "label1"));
426 gtk_builder_connect_signals (builder, app);
427 g_object_unref (G_OBJECT (builder));
429 gtk_widget_show (app->window);
430 gtk_widget_set_size_request(app->window, 250, 300);
431 //hlavni smycka gtk
432 gtk_main ();
434 free(x);
435 return 0;