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