sk2
This commit is contained in:
parent
8c39f4cc07
commit
e01acdfb25
@ -25,104 +25,72 @@ 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); }
|
||||
double mocnina(double zaklad, double exponent) {
|
||||
return pow(zaklad, exponent); // Funkcia 'pow' z matematickej knižnice
|
||||
}
|
||||
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) {
|
||||
int capacity = 100; // Počiatočná kapacita
|
||||
*postfix = malloc(capacity * sizeof(char));
|
||||
char *stack = malloc(capacity * sizeof(char));
|
||||
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++) {
|
||||
// Ak je znak číslo alebo desatinná bodka, pridaj do postfix
|
||||
if (isdigit(infix[i]) || infix[i] == '.') {
|
||||
// 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++] = ' ';
|
||||
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++] = ' ';
|
||||
postfix[j++] = stack[top--];
|
||||
postfix[j++] = ' ';
|
||||
}
|
||||
stack[++top] = infix[i];
|
||||
}
|
||||
// Ak je otvorená zátvorka
|
||||
else if (infix[i] == '(') {
|
||||
} else if (infix[i] == '(') {
|
||||
stack[++top] = infix[i];
|
||||
}
|
||||
// Ak je zatvorená zátvorka
|
||||
else if (infix[i] == ')') {
|
||||
} 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
|
||||
}
|
||||
}
|
||||
// Vyprázdni zásobník
|
||||
while (top != -1) {
|
||||
(*postfix)[j++] = ' ';
|
||||
(*postfix)[j++] = stack[top--];
|
||||
postfix[j++] = ' ';
|
||||
postfix[j++] = stack[top--];
|
||||
}
|
||||
(*postfix)[j] = '\0';
|
||||
|
||||
free(stack);
|
||||
postfix[j] = '\0';
|
||||
}
|
||||
|
||||
// Vyhodnotenie postfixového výrazu
|
||||
double vyhodnot_postfix(const char *postfix) {
|
||||
int capacity = 100;
|
||||
double *stack = malloc(capacity * sizeof(double));
|
||||
double stack[100];
|
||||
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);
|
||||
}
|
||||
// Ak je operátor, vykonaj operáciu
|
||||
else if (je_operator(token[0]) && token[1] == '\0') {
|
||||
} 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 '/':
|
||||
if (b == 0) {
|
||||
printf("Chyba: delenie nulou!\n");
|
||||
free(stack);
|
||||
free(postfix_copy);
|
||||
exit(1);
|
||||
}
|
||||
stack[++top] = del(a, b);
|
||||
break;
|
||||
case '/': 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 result;
|
||||
return stack[top];
|
||||
}
|
||||
|
14
sk2/main.c
14
sk2/main.c
@ -1,25 +1,23 @@
|
||||
#include "calculator.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main() {
|
||||
char infix[100], *postfix = NULL;
|
||||
char infix[100], postfix[100];
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user