Update 'cv3/program.c'
This commit is contained in:
		
							parent
							
								
									0ac9d77192
								
							
						
					
					
						commit
						2f3fc5ad8a
					
				
							
								
								
									
										169
									
								
								cv3/program.c
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								cv3/program.c
									
									
									
									
									
								
							@ -1,84 +1,87 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#define STACK_SIZE 10
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    float values[STACK_SIZE];
 | 
			
		||||
    int size;
 | 
			
		||||
} stack;
 | 
			
		||||
 | 
			
		||||
void stack_print (stack* stack);
 | 
			
		||||
void stack_push (stack* stack,float value);
 | 
			
		||||
float stack_pop (stack* stack);
 | 
			
		||||
void my_exit(int flag, const char* input);
 | 
			
		||||
 | 
			
		||||
int main(void) {
 | 
			
		||||
    stack* p_stack = (stack*) malloc(sizeof(stack));
 | 
			
		||||
    memset(p_stack, 0, sizeof(stack));
 | 
			
		||||
    while(1) {
 | 
			
		||||
        char str[128] = { 0 };
 | 
			
		||||
        char* tres = fgets(str, 128, stdin);
 | 
			
		||||
        if(tres == NULL || str[0] == 0 || (str[1] == 0 && str[0] == '\n'))
 | 
			
		||||
            my_exit(1, "no_input");
 | 
			
		||||
        str[strlen(str) - 1] = 0;
 | 
			
		||||
        // if number
 | 
			
		||||
        if(strlen(str) > 1 || (str[0] >= '0' && str[0] <= '9')) {
 | 
			
		||||
            char *p;
 | 
			
		||||
            errno = 0;
 | 
			
		||||
            float res = strtod(str,&p);
 | 
			
		||||
            my_exit(str[0] == '.' || errno || (*p) != 0, "bad input");
 | 
			
		||||
            stack_push(p_stack, res);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            my_exit(p_stack->size < 2, "not enough operands");
 | 
			
		||||
            float b = stack_pop(p_stack);
 | 
			
		||||
            float a = stack_pop(p_stack);
 | 
			
		||||
            char op = str[0];
 | 
			
		||||
            float res;
 | 
			
		||||
            switch (op) {
 | 
			
		||||
                case '+':
 | 
			
		||||
                    res = a + b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '-':
 | 
			
		||||
                    res = a - b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '*':
 | 
			
		||||
                    res = a * b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '/':
 | 
			
		||||
                    my_exit(b == 0.f, "division by zero");
 | 
			
		||||
                    res = a / b;
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    my_exit(1, "bad input");
 | 
			
		||||
            }
 | 
			
		||||
            stack_push(p_stack, res);
 | 
			
		||||
        }
 | 
			
		||||
        stack_print(p_stack);
 | 
			
		||||
    }
 | 
			
		||||
    free(p_stack);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stack_print(stack* st) {
 | 
			
		||||
    for(int i = 0; i < st->size; i++)
 | 
			
		||||
        printf("%.2f ",st->values[i]);
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stack_push(stack* st, float push_value) {
 | 
			
		||||
    if(st->size < STACK_SIZE)
 | 
			
		||||
        st->values[st->size++] = push_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float stack_pop(stack* st) {
 | 
			
		||||
    if(st->size > 0)
 | 
			
		||||
        return st->values[--st->size];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void my_exit(int flag, const char* input) {
 | 
			
		||||
    if (flag) {
 | 
			
		||||
        printf("%s\n", input);
 | 
			
		||||
        exit(0);
 | 
			
		||||
    }
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#define STACK_SIZE 10
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    float values[STACK_SIZE];
 | 
			
		||||
    int size;
 | 
			
		||||
} stack;
 | 
			
		||||
 | 
			
		||||
void stack_print (stack* stack);
 | 
			
		||||
void stack_push (stack* stack,float value);
 | 
			
		||||
float stack_pop (stack* stack);
 | 
			
		||||
void my_exit(int flag, const char* input);
 | 
			
		||||
 | 
			
		||||
int main(void) {
 | 
			
		||||
    stack* p_stack = (stack*) malloc(sizeof(stack));
 | 
			
		||||
    memset(p_stack, 0, sizeof(stack));
 | 
			
		||||
    while(1) {
 | 
			
		||||
        char str[128] = { 0 };
 | 
			
		||||
        char* tres = fgets(str, 128, stdin);
 | 
			
		||||
        if(tres == NULL || str[0] == 0 || (str[1] == 0 && str[0] == '\n'))
 | 
			
		||||
            my_exit(1, "no_input");
 | 
			
		||||
        str[strlen(str) - 1] = 0;
 | 
			
		||||
        // if number
 | 
			
		||||
        if(strlen(str) > 1 || (str[0] >= '0' && str[0] <= '9')) {
 | 
			
		||||
            my_exit(str[0] == '.', "bad input");
 | 
			
		||||
            float res = 0.f;
 | 
			
		||||
            int dots = 0;
 | 
			
		||||
            for(int i = 0; i < strlen(str); i++)
 | 
			
		||||
                if(str[i]=='.') dots++;
 | 
			
		||||
                else my_exit(str[i] < '0' || str[i] > '9', "bad input");
 | 
			
		||||
            res = atof(str);
 | 
			
		||||
            stack_push(p_stack, res);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            my_exit(p_stack->size < 2, "not enough operands");
 | 
			
		||||
            float b = stack_pop(p_stack);
 | 
			
		||||
            float a = stack_pop(p_stack);
 | 
			
		||||
            char op = str[0];
 | 
			
		||||
            float res;
 | 
			
		||||
            switch (op) {
 | 
			
		||||
                case '+':
 | 
			
		||||
                    res = a + b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '-':
 | 
			
		||||
                    res = a - b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '*':
 | 
			
		||||
                    res = a * b;
 | 
			
		||||
                    break;
 | 
			
		||||
                case '/':
 | 
			
		||||
                    my_exit(b == 0.f, "division by zero");
 | 
			
		||||
                    res = a / b;
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    my_exit(1, "bad input");
 | 
			
		||||
            }
 | 
			
		||||
            stack_push(p_stack, res);
 | 
			
		||||
        }
 | 
			
		||||
        stack_print(p_stack);
 | 
			
		||||
    }
 | 
			
		||||
    free(p_stack);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stack_print(stack* st) {
 | 
			
		||||
    for(int i = 0; i < st->size; i++)
 | 
			
		||||
        printf("%.2f ",st->values[i]);
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stack_push(stack* st, float push_value) {
 | 
			
		||||
    if(st->size < STACK_SIZE)
 | 
			
		||||
        st->values[st->size++] = push_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float stack_pop(stack* st) {
 | 
			
		||||
    if(st->size > 0)
 | 
			
		||||
        return st->values[--st->size];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void my_exit(int flag, const char* input) {
 | 
			
		||||
    if (flag) {
 | 
			
		||||
        printf("%s\n", input);
 | 
			
		||||
        exit(0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user