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 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];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								sk2/main.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								sk2/main.c
									
									
									
									
									
								
							@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user