diff --git a/calculator/calc.c b/calculator/calc.c index 00da2fb0a097add0f7eb94580895816acf283a48..7f95ad2bea4760349c21554e950a20ec8f2d831a 100644 --- a/calculator/calc.c +++ b/calculator/calc.c @@ -22,8 +22,63 @@ bool isOpperator(char ch) { return ch == '+' || ch == '-' || ch == 'x' || ch == '/' || ch == '^' || ch == '*'; } + +void print_array(char *arr, int len) { + for (int i = 0; i < len; i++) { + printf("%c", arr[i]); + } + printf("\n"); +} + +void print_stack_double(stack s){ + while(!is_empty(s)){ + printf("%.2f ",*(double*)pop(&s)); + } + +} +double eval_postfix(char* postfix) { + printf("%s\n\n\n",postfix); + stack s; + int len=strlen(postfix); + stack_init(&s, len); + double res, nb1, nb2; + for (int i = 1; i < len; i++) { + //printf("%c\n",postfix[i]); + if (postfix[i] < '0' || '9' < postfix[i]) { //if operator + nb1 = *(double*)pop(&s); + nb2 = *(double*)pop(&s); + } + switch (postfix[i]) { + case '+': + res = nb2 + nb1; + break; + case '-': + res = nb2 - nb1; + break; + case 'x': + case '*': + res = nb2 * nb1; + break; + case '/': + res = nb2 / nb1; + break; + case '^': + res= pow(nb1,nb2); + break; + default: + res = atoi(postfix); + } + push(&s, &res); + } + print_stack_double(s); + printf("%f\n", *(double*)pop(&s)); + stack_destroy(&s); + return 12; +} + char *infix_to_postfix(char *infix) { - int infix_size=strlen(infix); + int infix_size = strlen(infix); + printf("input: %s\n", infix); int postfix_size = infix_size + 1; stack s; stack_init(&s, infix_size); @@ -34,10 +89,10 @@ char *infix_to_postfix(char *infix) { // postfix_size--; // } // } - + char *postfix = malloc(sizeof(char) * postfix_size); int j = 0; // index for returned array - + //print_array(postfix, postfix_size); for (int i = 0; i < infix_size; i++) { if (infix[i] >= '0' && infix[i] <= '9') { // number postfix[j] = infix[i]; @@ -46,21 +101,21 @@ char *infix_to_postfix(char *infix) { push(&s, &infix[i]); } else if (infix[i] == ')') { // ) while (!is_empty(s) && *(char *)peek(s) != '(') { - printf("%c\n",*(char*)peek(s)); + // printf("%c\n", *(char *)peek(s)); postfix[j] = *(char *)pop(&s); j++; } - if (!is_empty(s) && *(char *)peek(s) == '(') { //ici ? + if (!is_empty(s) && *(char *)peek(s) == '(') { // ici ? pop(&s); } - } else if (isOpperator(infix[i])) { // opp - + } else if (isOpperator(infix[i])) { + // opp while (!is_empty(s) && (getPrio(infix[i]) <= getPrio(*(char *)peek(s)))) { postfix[j] = *(char *)pop(&s); j++; } push(&s, &infix[i]); - }else{ + } else { printf("NULL ahhh!!\n"); free(postfix); stack_destroy(&s); @@ -71,10 +126,10 @@ char *infix_to_postfix(char *infix) { postfix[j] = *(char *)pop(&s); j++; } - printf("%d\n",j); - postfix[j]='\0'; - printf("%s",postfix); - printf("\n"); + // printf("%d\n", j); + postfix[j] = '\0'; + printf("output: %s\n", postfix); + // printf("%d\n",j); stack_destroy(&s); return postfix; diff --git a/calculator/calc.h b/calculator/calc.h index 9e9a342608b95b44dc8c3ead0080275f47a2a0db..4c61f63c6aee34f28a47c432e268bc5f7c7c5d65 100644 --- a/calculator/calc.h +++ b/calculator/calc.h @@ -9,7 +9,7 @@ char* infix_to_postfix(char* infix); char* toPostfix(char* infix,int len); - +double eval_postfix(char* postfix); int getPrio(char opp); diff --git a/calculator/main.c b/calculator/main.c index 747033994ff370bfabf28b7b33aabaac97fc2942..647bd5361b31c7f5fc84aaaf1d0a0bcf76ec682f 100644 --- a/calculator/main.c +++ b/calculator/main.c @@ -4,9 +4,9 @@ int main() { -char *infix="2/(7-3*2)"; +char *infix="7+2*3"; char *postfix=infix_to_postfix(infix); - +eval_postfix(postfix); // for(int i=0;i<len;i++){ // printf("%c ",postfix[i]); // }