sk2
This commit is contained in:
		
							parent
							
								
									38359bf836
								
							
						
					
					
						commit
						8c39f4cc07
					
				| @ -25,72 +25,104 @@ 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) { | double mocnina(double zaklad, double exponent) { return pow(zaklad, 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) { | ||||||
|     char stack[100]; |     int capacity = 100;  // Počiatočná kapacita
 | ||||||
|  |     *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] == '.') { | ||||||
|             postfix[j++] = infix[i]; |             // Ak je číslo, spracuj celé číslo
 | ||||||
|         } else if (je_operator(infix[i])) { |             while (isdigit(infix[i]) || infix[i] == '.') { | ||||||
|             postfix[j++] = ' '; |                 (*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])) { |             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) { | ||||||
|     double stack[100]; |     int capacity = 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 '/': 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; |                 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 stack[top]; |     return result; | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								sk2/main.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								sk2/main.c
									
									
									
									
									
								
							| @ -3,17 +3,23 @@ | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
| int main() { | int main() { | ||||||
|     char infix[100], postfix[100]; |     char infix[100], *postfix = NULL; | ||||||
|     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; | ||||||
|  | 
 | ||||||
|     // Konverzia na postfixovú notáciu
 |     // 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
 |     // 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