Update cv3/program.c
This commit is contained in:
		
							parent
							
								
									2a8785df19
								
							
						
					
					
						commit
						b4839ed949
					
				
							
								
								
									
										177
									
								
								cv3/program.c
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								cv3/program.c
									
									
									
									
									
								
							| @ -2,114 +2,111 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
| #include <ctype.h> | ||||
| 
 | ||||
| #define STACK_SIZE 10 | ||||
| 
 | ||||
| 
 | ||||
| struct stack { | ||||
|     float values[STACK_SIZE]; | ||||
|     int size; | ||||
| }; | ||||
| 
 | ||||
| void push_stack(struct stack* stack, float value); | ||||
| float pop_stack(struct stack* stack); | ||||
| void print_stack(struct stack* stack); | ||||
| int is_number(const char* str); | ||||
| 
 | ||||
| int main() { | ||||
|     struct stack mystack; | ||||
|     memset(&mystack, 0, sizeof(struct stack));  | ||||
| 
 | ||||
|     char input[50]; | ||||
|     int empty_input = 0;   | ||||
|      | ||||
|     while (1) { | ||||
|          | ||||
|         if (!fgets(input, sizeof(input), stdin)) { | ||||
|             break;  | ||||
|         } | ||||
| 
 | ||||
|         input[strcspn(input, "\n")] = 0;   | ||||
| 
 | ||||
|         if (strlen(input) == 0) { | ||||
|             empty_input = 1;   | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if (is_number(input)) { | ||||
|             float value = atof(input); | ||||
|             push_stack(&mystack, value); | ||||
|         } else if (strlen(input) == 1 && strchr("+-*/", input[0])) { | ||||
|             if (mystack.size < 2) { | ||||
|                 fprintf(stderr, "Error: Not enough values in stack.\n"); | ||||
|                 exit(EXIT_FAILURE); | ||||
|             } | ||||
|             float b = pop_stack(&mystack); | ||||
|             float a = pop_stack(&mystack); | ||||
|             float result; | ||||
| 
 | ||||
|             switch (input[0]) { | ||||
|                 case '+': | ||||
|                     result = a + b; | ||||
|                     break; | ||||
|                 case '-': | ||||
|                     result = a - b; | ||||
|                     break; | ||||
|                 case '*': | ||||
|                     result = a * b; | ||||
|                     break; | ||||
|                 case '/': | ||||
|                     if (b == 0) { | ||||
|                         fprintf(stderr, "Error: Division by zero.\n"); | ||||
|                         exit(EXIT_FAILURE); | ||||
|                     } | ||||
|                     result = a / b; | ||||
|                     break; | ||||
|                 default: | ||||
|                     fprintf(stderr, "Error: Invalid operator.\n"); | ||||
|                     exit(EXIT_FAILURE); | ||||
|             } | ||||
|             push_stack(&mystack, result); | ||||
|         } else { | ||||
|             fprintf(stderr, "Error: Invalid input.\n"); | ||||
|             exit(EXIT_FAILURE); | ||||
|         } | ||||
| 
 | ||||
|         print_stack(&mystack); | ||||
|     } | ||||
| 
 | ||||
|     | ||||
|     if (empty_input) { | ||||
|         printf("no input\n"); | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| void init_stack(struct stack* s) { | ||||
|     memset(s, 0, sizeof(struct stack)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void push_stack(struct stack* stack, float value) { | ||||
|     assert(stack->size < STACK_SIZE);  | ||||
|     stack->values[stack->size] = value; | ||||
|     stack->size += 1; | ||||
| void push_stack(struct stack* s, float value) { | ||||
|     assert(s->size < STACK_SIZE);  | ||||
|     s->values[s->size] = value; | ||||
|     s->size += 1; | ||||
| } | ||||
| 
 | ||||
| float pop_stack(struct stack* stack) { | ||||
|     assert(stack->size > 0);  | ||||
|     stack->size -= 1; | ||||
|     return stack->values[stack->size]; | ||||
| 
 | ||||
| float pop_stack(struct stack* s) { | ||||
|     assert(s->size > 0);  | ||||
|     s->size -= 1; | ||||
|     return s->values[s->size]; | ||||
| } | ||||
| 
 | ||||
| void print_stack(struct stack* stack) { | ||||
|      | ||||
|     for (int i = 0; i < stack->size; i++) { | ||||
|         printf("%.2f ", stack->values[i]); | ||||
| 
 | ||||
| void print_stack(struct stack* s) { | ||||
|     for (int i = 0; i < s->size; i++) { | ||||
|         printf("%.2f ", s->values[i]); | ||||
|     } | ||||
|     printf("\n"); | ||||
| } | ||||
| 
 | ||||
| int is_number(const char* str) { | ||||
|     char* endptr; | ||||
|     strtod(str, &endptr); | ||||
|     return *endptr == '\0' && endptr != str; | ||||
| int main() { | ||||
|     struct stack mystack; | ||||
|     init_stack(&mystack); | ||||
| 
 | ||||
|     char input[256]; | ||||
|     while (1) { | ||||
|         printf("Zadajte číslo alebo operáciu (+, -, *, /): "); | ||||
|         if (!fgets(input, sizeof(input), stdin)) { | ||||
|             break;  | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|         input[strcspn(input, "\n")] = 0; | ||||
| 
 | ||||
|          | ||||
|         char* endptr; | ||||
|         float value = strtof(input, &endptr); | ||||
|         if (endptr != input) {  | ||||
|             push_stack(&mystack, value); | ||||
|             print_stack(&mystack); | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|         if (strcmp(input, "+") == 0) { | ||||
|             if (mystack.size < 2) { | ||||
|                 printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); | ||||
|                 break; | ||||
|             } | ||||
|             float b = pop_stack(&mystack); | ||||
|             float a = pop_stack(&mystack); | ||||
|             push_stack(&mystack, a + b); | ||||
|             print_stack(&mystack); | ||||
|         } else if (strcmp(input, "-") == 0) { | ||||
|             if (mystack.size < 2) { | ||||
|                 printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); | ||||
|                 break; | ||||
|             } | ||||
|             float b = pop_stack(&mystack); | ||||
|             float a = pop_stack(&mystack); | ||||
|             push_stack(&mystack, a - b); | ||||
|             print_stack(&mystack); | ||||
|         } else if (strcmp(input, "*") == 0) { | ||||
|             if (mystack.size < 2) { | ||||
|                 printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); | ||||
|                 break; | ||||
|             } | ||||
|             float b = pop_stack(&mystack); | ||||
|             float a = pop_stack(&mystack); | ||||
|             push_stack(&mystack, a * b); | ||||
|             print_stack(&mystack); | ||||
|         } else if (strcmp(input, "/") == 0) { | ||||
|             if (mystack.size < 2) { | ||||
|                 printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); | ||||
|                 break; | ||||
|             } | ||||
|             float b = pop_stack(&mystack); | ||||
|             float a = pop_stack(&mystack); | ||||
|             if (b == 0) { | ||||
|                 printf("Chyba: Delenie nulou.\n"); | ||||
|                 break; | ||||
|             } | ||||
|             push_stack(&mystack, a / b); | ||||
|             print_stack(&mystack); | ||||
|         } else { | ||||
|             printf("Chyba: Neplatný vstup.\n"); | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user