This commit is contained in:
Džubara 2025-01-31 22:16:44 +01:00
parent 8c39f4cc07
commit e01acdfb25
2 changed files with 31 additions and 65 deletions

View File

@ -25,104 +25,72 @@ double scitaj(double a, double b) { return a + b; }
double odcitaj(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 nasob(double a, double b) { return a * b; }
double del(double a, double b) { return a / b; } double del(double a, double b) { return a / b; }
double sinus(double x) { return sin(x); } double sinus(double x) { return sin(x); }
double cosinus(double x) { return cos(x); } double cosinus(double x) { return cos(x); }
double odmocnin(double x) { return sqrt(x); } double odmocnin(double x) { return sqrt(x); }
double mocnina(double zaklad, double exponent) { return pow(zaklad, exponent); } double mocnina(double zaklad, double exponent) {
return pow(zaklad, exponent); // Funkcia 'pow' z matematickej knižnice
}
double logaritmus(double x) { return log(x); } double logaritmus(double x) { return log(x); }
// Funkcia na konverziu infixového výrazu na postfixový (Shunting-yard algoritmus) // Funkcia na konverziu infixového výrazu na postfixový (Shunting-yard algoritmus)
void infix_na_postfix(const char *infix, char **postfix) { void infix_na_postfix(const char *infix, char *postfix) {
int capacity = 100; // Počiatočná kapacita char stack[100];
*postfix = malloc(capacity * sizeof(char));
char *stack = malloc(capacity * sizeof(char));
int top = -1; int top = -1;
int j = 0; int j = 0;
for (int i = 0; infix[i] != '\0'; i++) { for (int i = 0; infix[i] != '\0'; i++) {
// Ak je znak číslo alebo desatinná bodka, pridaj do postfix
if (isdigit(infix[i]) || infix[i] == '.') { if (isdigit(infix[i]) || infix[i] == '.') {
// Ak je číslo, spracuj celé číslo postfix[j++] = infix[i];
while (isdigit(infix[i]) || infix[i] == '.') { } else if (je_operator(infix[i])) {
(*postfix)[j++] = infix[i++]; postfix[j++] = ' ';
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])) { while (top != -1 && priorita(stack[top]) >= priorita(infix[i])) {
(*postfix)[j++] = stack[top--]; postfix[j++] = stack[top--];
(*postfix)[j++] = ' '; postfix[j++] = ' ';
} }
stack[++top] = infix[i]; stack[++top] = infix[i];
} } else if (infix[i] == '(') {
// Ak je otvorená zátvorka
else if (infix[i] == '(') {
stack[++top] = infix[i]; stack[++top] = infix[i];
} } else if (infix[i] == ')') {
// Ak je zatvorená zátvorka
else if (infix[i] == ')') {
while (top != -1 && stack[top] != '(') { while (top != -1 && stack[top] != '(') {
(*postfix)[j++] = ' '; postfix[j++] = ' ';
(*postfix)[j++] = stack[top--]; 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) { while (top != -1) {
(*postfix)[j++] = ' '; postfix[j++] = ' ';
(*postfix)[j++] = stack[top--]; postfix[j++] = stack[top--];
} }
(*postfix)[j] = '\0'; postfix[j] = '\0';
free(stack);
} }
// Vyhodnotenie postfixového výrazu // Vyhodnotenie postfixového výrazu
double vyhodnot_postfix(const char *postfix) { double vyhodnot_postfix(const char *postfix) {
int capacity = 100; double stack[100];
double *stack = malloc(capacity * sizeof(double));
int top = -1; int top = -1;
char *postfix_copy = malloc(strlen(postfix) + 1); char *postfix_copy = malloc(strlen(postfix) + 1);
strcpy(postfix_copy, postfix); strcpy(postfix_copy, postfix);
char *token = strtok(postfix_copy, " "); char *token = strtok(postfix_copy, " ");
while (token) { while (token) {
// Ak je token číslo, pridaj na zásobník
if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) { if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) {
stack[++top] = atof(token); 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 b = stack[top--];
double a = stack[top--]; double a = stack[top--];
switch (token[0]) { switch (token[0]) {
case '+': stack[++top] = scitaj(a, b); break; case '+': stack[++top] = scitaj(a, b); break;
case '-': stack[++top] = odcitaj(a, b); break; case '-': stack[++top] = odcitaj(a, b); break;
case '*': stack[++top] = nasob(a, b); break; case '*': stack[++top] = nasob(a, b); break;
case '/': case '/': stack[++top] = del(a, b); break;
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; case '^': stack[++top] = mocnina(a, b); break;
} }
} }
token = strtok(NULL, " "); token = strtok(NULL, " ");
} }
double result = stack[top];
free(stack);
free(postfix_copy); free(postfix_copy);
return result; return stack[top];
} }

View File

@ -1,25 +1,23 @@
#include "calculator.h" #include "calculator.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
int main() { int main() {
char infix[100], *postfix = NULL; char infix[100], postfix[100];
printf("Zadajte matematický výraz: "); printf("Zadajte matematický výraz: ");
fgets(infix, sizeof(infix), stdin); fgets(infix, sizeof(infix), stdin);
// Odstránenie nového riadku, ktorý fgets môže pridať
infix[strcspn(infix, "\n")] = 0; 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); printf("Postfixová notácia: %s\n", postfix);
// Vyhodnotenie výrazu
double vysledok = vyhodnot_postfix(postfix); double vysledok = vyhodnot_postfix(postfix);
printf("Výsledok: %.2f\n", vysledok); printf("Výsledok: %.2f\n", vysledok);
// Uvoľnenie alokovanej pamäte pre postfix
free(postfix);
return 0; return 0;
} }