1 /**************************************************************************** *
2 * nazev projektu: BETON *
4 * autor: Michal Rysavy xrysav17 *
5 * kultirizace kodu: Jakub Jelen xjelen06 *
7 * popis: hlavni logika aplikace *
9 ******************************************************************************/
13 * @author Michal Rysavy (korektura: Jakub Jelen)
14 * @brief Hlavni logika kalkulacky a volani GTK+
22 /** Jmeno souboru s XML formatem GUI */
23 #define BUILDER_XML_FILE "kal.glade"
26 * struktura s ukazateli na jednotlive widgety v aplikaci
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 */
54 /** deklarace globalnich promenych pro vysledky kalkulacky
56 Tvysledek hodnota1
, hodnota2
;
59 * Enumerace operaci kalkulacky pro promennou operace
62 NONE
= 0, // nic / nebylo zadano
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 */
78 * Pomocna promenna pro vypis
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
92 } else{ // Operace jiz vybrana
93 //zde by se mela provest operace, pokud jsou jiz dve cisla
99 * handler, ktery je v glade prirazen stisknuti tlacitka +
101 void plus_clicked (GtkObject
*object
, App
*app
){
106 * handler, ktery je v glade prirazen stisknuti tlacitka -
108 void minus_clicked (GtkObject
*object
, App
*app
){
113 * handler, ktery je v glade prirazen stisknuti tlacitka *
115 void nasobeni_clicked (GtkObject
*object
, App
*app
){
120 * handler, ktery je v glade prirazen stisknuti tlacitka :
122 void deleni_clicked (GtkObject
*object
, App
*app
){
127 * handler, ktery je v glade prirazen stisknuti tlacitka umocneni
129 void umocni_clicked (GtkObject
*object
, App
*app
){
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");
148 char* x
= malloc(sizeof(char)*15);
149 sprintf(x
,"%.5f",hodnota1
.result
);
150 gtk_label_set_text(app
->label1
,x
);
152 operace
=0; //uz nebude mozne zadavat hodnotu 1
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");
174 char* x
= malloc(sizeof(char)*15);
175 sprintf(x
,"%.5f",hodnota1
.result
);
176 gtk_label_set_text(app
->label1
,x
);
178 operace
=0; //uz nebude mozne zadavat hodnotu 1
185 * handler, ktery vynuluje kalkulacku
187 void CE_clicked (GtkObject
*object
, App
*app
)
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
){
210 hodnota1
.result
= hodnota1
.result
* 10 + number
;
212 hodnota1
.result
= hodnota1
.result
+ (number
/ pow(10, desetina
));
215 sprintf(x
,"%.5f",hodnota1
.result
);
216 gtk_label_set_text(app
->label1
,x
);
219 hodnota2
.result
= hodnota2
.result
* 10 + number
;
221 hodnota2
.result
= hodnota2
.result
+ (number
/pow(10,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
){
238 * Handler tlacitka s cislem 2
240 void n2_clicked (GtkObject
*object
, App
*app
){
245 * Handler tlacitka s cislem 3
247 void n3_clicked (GtkObject
*object
, App
*app
){
252 * Handler tlacitka s cislem 4
254 void n4_clicked (GtkObject
*object
, App
*app
){
259 * Handler tlacitka s cislem 5
261 void n5_clicked (GtkObject
*object
, App
*app
){
266 * Handler tlacitka s cislem 6
268 void n6_clicked (GtkObject
*object
, App
*app
){
273 * Handler tlacitka s cislem 7
275 void n7_clicked (GtkObject
*object
, App
*app
){
280 * Handler tlacitka s cislem 8
282 void n8_clicked (GtkObject
*object
, App
*app
){
287 * Handler tlacitka s cislem 9
289 void n9_clicked (GtkObject
*object
, App
*app
){
294 * Handler tlacitka s cislem 0
296 void n0_clicked (GtkObject
*object
, App
*app
){
301 * Nastavi desetinnou carku a pristi cislice jsou desetinna
303 void desetina_clicked (GtkObject
*object
, App
*app
)
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
)
320 hodnota1
= scitani(hodnota1
.result
, hodnota2
.result
);
321 sprintf(x
,"%.5f",hodnota1
.result
);
322 gtk_label_set_text(app
->label1
,x
);
326 hodnota1
= odcitani(hodnota1
.result
, hodnota2
.result
);
327 sprintf(x
,"%.5f",hodnota1
.result
);
328 gtk_label_set_text(app
->label1
,x
);
332 hodnota1
= nasobeni(hodnota1
.result
, hodnota2
.result
);
333 sprintf(x
,"%.5f",hodnota1
.result
);
334 gtk_label_set_text(app
->label1
,x
);
338 hodnota1
= deleni(hodnota1
.result
, hodnota2
.result
);
339 if (hodnota1
.error
!= 0){
340 gtk_label_set_text(app
->label1
,"ERROR");
346 sprintf(x
,"%.5f",hodnota1
.result
);
347 gtk_label_set_text(app
->label1
,x
);
352 hodnota1
= umocneni(hodnota1
.result
, hodnota2
.result
);
353 sprintf(x
,"%.5f", hodnota1
.result
);
354 gtk_label_set_text(app
->label1
, x
);
367 * ukonci hlavni smycku gtk pri zavreni okna
369 void on_window_destroy (GtkObject
*object
, gpointer user_data
)
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
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
);
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);