skuska2
This commit is contained in:
		
							parent
							
								
									0f9977f603
								
							
						
					
					
						commit
						e7b4ea33f3
					
				
							
								
								
									
										17
									
								
								sk2/Makefile
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								sk2/Makefile
									
									
									
									
									
								
							| @ -0,0 +1,17 @@ | ||||
| CC=gcc | ||||
| CFLAGS=-Wall -Wextra -std=c11 | ||||
| OBJ=main.o calculator.o | ||||
| 
 | ||||
| all: calculator | ||||
| 
 | ||||
| kalkulacka: $(OBJ) | ||||
| 	$(CC) $(CFLAGS) -o calculator $(OBJ) -lm | ||||
| 
 | ||||
| main.o: main.c calculator.h | ||||
| 	$(CC) $(CFLAGS) -c main.c | ||||
| 
 | ||||
| calculator.o: calculator.c calculator.h | ||||
| 	$(CC) $(CFLAGS) -c calculator.c | ||||
| 
 | ||||
| clean: | ||||
| 	rm -f calculator $(OBJ) | ||||
| @ -0,0 +1,46 @@ | ||||
| Zadanie | ||||
| 
 | ||||
|     Naprogramuj vedeckú kalkulačku, ktorá bude vyhodnocovať aj zložitejšie výrazy v infixnej notácii. | ||||
| 
 | ||||
|     Kalkulačka by mala podporovať tieto operácie: | ||||
| 
 | ||||
|     Načítanie a prácu s číslami s presnosťou min. 2 desatinné miesta. | ||||
| 
 | ||||
|     Sčítanie, odčítanie, násobenie, delenie, zátvorky. | ||||
| 
 | ||||
|     Sinus, cosinus, odmocnina, druhá mocnina, logaritmus. | ||||
| 
 | ||||
| Príklad použitia: | ||||
| 
 | ||||
|     (2 + 3) * 2 | ||||
|     10 | ||||
|     (10 * 2) + (6 / 2) | ||||
|     23 | ||||
| 
 | ||||
| Opis funkčnosti | ||||
| 
 | ||||
|     Program vykonáva vyhodnotenie matematických výrazov zapísaných v infixnej notácii. Pre tento účel prevádza infixovú notáciu na postfixovú a následne vyhodnocuje výraz pomocou algoritmu "zásobníkovej" kalkulačky. | ||||
| 
 | ||||
|     Podporované operácie zahŕňajú aritmetické operácie (+, -, *, /) a vedecké funkcie ako sinus, cosinus, odmocnina, druhá mocnina a logaritmus. | ||||
| 
 | ||||
| Opis riešenia | ||||
| 
 | ||||
|     Infixový výraz je najprv konvertovaný na postfixovú notáciu. | ||||
| 
 | ||||
|     Postfixový výraz je vyhodnotený pomocou zásobníka. | ||||
| 
 | ||||
|     Matematické operácie sú implementované samostatne pre zabezpečenie presnosti. | ||||
| 
 | ||||
| Podmienky spustenia | ||||
| 
 | ||||
|     Program beží v prostredí s podporou jazyka C a knižnice math.h. | ||||
| 
 | ||||
|     Na kompiláciu je potrebné použiť príkaz make. | ||||
| 
 | ||||
|     Spustenie programu sa vykoná príkazom ./kalkulacka. | ||||
| 
 | ||||
| Zoznam použitých zdrojov | ||||
| 
 | ||||
|     Dokumentácia k infixovej a postfixovej notácii: https://en.wikipedia.org/wiki/Shunting-yard_algorithm | ||||
| 
 | ||||
|     Dokumentácia k vedeckým funkciám: https://en.cppreference.com/w/c/numeric/math | ||||
| @ -0,0 +1,91 @@ | ||||
| #include "calculator.h" | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| #include <math.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| // Overenie, či je znak operátor
 | ||||
| bool je_operator(char c) { | ||||
|     return c == '+' || c == '-' || c == '*' || c == '/' || c == '^'; | ||||
| } | ||||
| 
 | ||||
| // Určenie priority operátorov
 | ||||
| int priorita(char op) { | ||||
|     switch (op) { | ||||
|         case '+': case '-': return 1; | ||||
|         case '*': case '/': return 2; | ||||
|         case '^': return 3; | ||||
|         default: return 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // Matematické operácie
 | ||||
| double scitaj(double a, double b) { return a + b; } | ||||
| double odcitaj(double a, double b) { return a - b; } | ||||
| double nasob(double a, double b) { return a * b; } | ||||
| double del(double a, double b) { return a / b; } | ||||
| 
 | ||||
| double sinus(double x) { return sin(x); } | ||||
| double cosinus(double x) { return cos(x); } | ||||
| double odmocnina(double x) { return sqrt(x); } | ||||
| double mocnina(double zaklad, double exponent) { return pow(zaklad, exponent); } | ||||
| double logaritmus(double x) { return log(x); } | ||||
| 
 | ||||
| // Funkcia na konverziu infixového výrazu na postfixový (Shunting-yard algoritmus)
 | ||||
| void infix_na_postfix(const char *infix, char *postfix) { | ||||
|     char stack[100]; | ||||
|     int top = -1; | ||||
|     int j = 0; | ||||
| 
 | ||||
|     for (int i = 0; infix[i] != '\0'; i++) { | ||||
|         if (isdigit(infix[i]) || infix[i] == '.') { | ||||
|             postfix[j++] = infix[i]; | ||||
|         } else if (je_operator(infix[i])) { | ||||
|             postfix[j++] = ' '; | ||||
|             while (top != -1 && priorita(stack[top]) >= priorita(infix[i])) { | ||||
|                 postfix[j++] = stack[top--]; | ||||
|                 postfix[j++] = ' '; | ||||
|             } | ||||
|             stack[++top] = infix[i]; | ||||
|         } else if (infix[i] == '(') { | ||||
|             stack[++top] = infix[i]; | ||||
|         } else if (infix[i] == ')') { | ||||
|             while (top != -1 && stack[top] != '(') { | ||||
|                 postfix[j++] = ' '; | ||||
|                 postfix[j++] = stack[top--]; | ||||
|             } | ||||
|             top--; // Odstrániť '(' zo zásobníka
 | ||||
|         } | ||||
|     } | ||||
|     while (top != -1) { | ||||
|         postfix[j++] = ' '; | ||||
|         postfix[j++] = stack[top--]; | ||||
|     } | ||||
|     postfix[j] = '\0'; | ||||
| } | ||||
| 
 | ||||
| // Vyhodnotenie postfixového výrazu
 | ||||
| double vyhodnot_postfix(const char *postfix) { | ||||
|     double stack[100]; | ||||
|     int top = -1; | ||||
|     char *token = strtok(strdup(postfix), " "); | ||||
| 
 | ||||
|     while (token) { | ||||
|         if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) { | ||||
|             stack[++top] = atof(token); | ||||
|         } else if (je_operator(token[0]) && token[1] == '\0') { | ||||
|             double b = stack[top--]; | ||||
|             double a = stack[top--]; | ||||
|             switch (token[0]) { | ||||
|                 case '+': stack[++top] = scitaj(a, b); break; | ||||
|                 case '-': stack[++top] = odcitaj(a, b); break; | ||||
|                 case '*': stack[++top] = nasob(a, b); break; | ||||
|                 case '/': stack[++top] = del(a, b); break; | ||||
|                 case '^': stack[++top] = mocnina(a, b); break; | ||||
|             } | ||||
|         } | ||||
|         token = strtok(NULL, " "); | ||||
|     } | ||||
|     return stack[top]; | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| #ifndef CALCULATOR_H | ||||
| #define CALCULATOR_H | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| // Konverzia infixového výrazu na postfixový
 | ||||
| void infix_na_postfix(const char *infix, char *postfix); | ||||
| 
 | ||||
| // Vyhodnotenie postfixového výrazu
 | ||||
| double vyhodnot_postfix(const char *postfix); | ||||
| 
 | ||||
| // Overenie, či je znak operátor
 | ||||
| bool je_operator(char c); | ||||
| 
 | ||||
| // Určenie priority operátorov
 | ||||
| int priorita(char op); | ||||
| 
 | ||||
| // Matematické operácie
 | ||||
| double scitaj(double a, double b); | ||||
| double odcitaj(double a, double b); | ||||
| double nasob(double a, double b); | ||||
| double del(double a, double b); | ||||
| 
 | ||||
| // Vedecké funkcie
 | ||||
| double sinus(double x); | ||||
| double cosinus(double x); | ||||
| double odmocnina(double x); | ||||
| double mocnina(double zaklad, double exponent); | ||||
| double logaritmus(double x); | ||||
| 
 | ||||
| #endif // CALCULATOR_H
 | ||||
							
								
								
									
										19
									
								
								sk2/main.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								sk2/main.c
									
									
									
									
									
								
							| @ -0,0 +1,19 @@ | ||||
| #include "calculator.h" | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| int main() { | ||||
|     char infix[100], postfix[100]; | ||||
|     printf("Zadajte matematický výraz: "); | ||||
|     fgets(infix, sizeof(infix), stdin); | ||||
|      | ||||
|     // Konverzia na postfixovú notáciu
 | ||||
|     infix_na_postfix(infix, postfix); | ||||
|     printf("Postfixová notácia: %s\n", postfix); | ||||
|      | ||||
|     // Vyhodnotenie výrazu
 | ||||
|     double vysledok = vyhodnot_postfix(postfix); | ||||
|     printf("Výsledok: %.2f\n", vysledok); | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user