From 8c39f4cc0705c21c3901ce6d47bab9032b7cd721 Mon Sep 17 00:00:00 2001 From: VIliam Date: Fri, 31 Jan 2025 22:14:34 +0100 Subject: [PATCH] sk2 --- sk2/calculator.c | 80 +++++++++++++++++++++++++++++++++--------------- sk2/main.c | 10 ++++-- 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/sk2/calculator.c b/sk2/calculator.c index e8c9b37..8c6595d 100644 --- a/sk2/calculator.c +++ b/sk2/calculator.c @@ -25,72 +25,104 @@ 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 odmocnin(double x) { return sqrt(x); } -double mocnina(double zaklad, double exponent) { - return pow(zaklad, exponent); // Funkcia 'pow' z matematickej knižnice -} +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]; +void infix_na_postfix(const char *infix, char **postfix) { + int capacity = 100; // Počiatočná kapacita + *postfix = malloc(capacity * sizeof(char)); + char *stack = malloc(capacity * sizeof(char)); int top = -1; int j = 0; - + for (int i = 0; infix[i] != '\0'; i++) { + // Ak je znak číslo alebo desatinná bodka, pridaj do postfix if (isdigit(infix[i]) || infix[i] == '.') { - postfix[j++] = infix[i]; - } else if (je_operator(infix[i])) { - postfix[j++] = ' '; + // Ak je číslo, spracuj celé číslo + while (isdigit(infix[i]) || infix[i] == '.') { + (*postfix)[j++] = infix[i++]; + if (j >= capacity) { + capacity *= 2; + *postfix = realloc(*postfix, capacity * sizeof(char)); + } + } + i--; // Zníž i, pretože cyklus už inkrementoval i + (*postfix)[j++] = ' '; // Oddelenie čísel + } + // Ak je operátor + else if (je_operator(infix[i])) { + (*postfix)[j++] = ' '; while (top != -1 && priorita(stack[top]) >= priorita(infix[i])) { - postfix[j++] = stack[top--]; - postfix[j++] = ' '; + (*postfix)[j++] = stack[top--]; + (*postfix)[j++] = ' '; } stack[++top] = infix[i]; - } else if (infix[i] == '(') { + } + // Ak je otvorená zátvorka + else if (infix[i] == '(') { stack[++top] = infix[i]; - } else if (infix[i] == ')') { + } + // Ak je zatvorená zátvorka + else if (infix[i] == ')') { while (top != -1 && stack[top] != '(') { - postfix[j++] = ' '; - postfix[j++] = stack[top--]; + (*postfix)[j++] = ' '; + (*postfix)[j++] = stack[top--]; } - top--; // Odstrániť '(' zo zásobníka + top--; // Odstrániť '(' zo zásobníka } } + // Vyprázdni zásobník while (top != -1) { - postfix[j++] = ' '; - postfix[j++] = stack[top--]; + (*postfix)[j++] = ' '; + (*postfix)[j++] = stack[top--]; } - postfix[j] = '\0'; + (*postfix)[j] = '\0'; + + free(stack); } // Vyhodnotenie postfixového výrazu double vyhodnot_postfix(const char *postfix) { - double stack[100]; + int capacity = 100; + double *stack = malloc(capacity * sizeof(double)); int top = -1; char *postfix_copy = malloc(strlen(postfix) + 1); strcpy(postfix_copy, postfix); char *token = strtok(postfix_copy, " "); while (token) { + // Ak je token číslo, pridaj na zásobník if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) { stack[++top] = atof(token); - } else if (je_operator(token[0]) && token[1] == '\0') { + } + // Ak je operátor, vykonaj operáciu + 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 '/': + if (b == 0) { + printf("Chyba: delenie nulou!\n"); + free(stack); + free(postfix_copy); + exit(1); + } + stack[++top] = del(a, b); + break; case '^': stack[++top] = mocnina(a, b); break; } } token = strtok(NULL, " "); } + double result = stack[top]; + free(stack); free(postfix_copy); - return stack[top]; + return result; } diff --git a/sk2/main.c b/sk2/main.c index 941d88f..6c724c1 100644 --- a/sk2/main.c +++ b/sk2/main.c @@ -3,17 +3,23 @@ #include int main() { - char infix[100], postfix[100]; + char infix[100], *postfix = NULL; printf("Zadajte matematický výraz: "); fgets(infix, sizeof(infix), stdin); + // Odstránenie nového riadku, ktorý fgets môže pridať + infix[strcspn(infix, "\n")] = 0; + // Konverzia na postfixovú notáciu - infix_na_postfix(infix, postfix); + 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); + // Uvoľnenie alokovanej pamäte pre postfix + free(postfix); + return 0; }