/*----------------------------------------------------------------------------------------- * Project Name : Report05 - Calculator * Programmed by : Young Min Jo * Student Number : 2008060021 * Date : Wendsday 30 April 2014 * (c) Copyright by Department of Computer Education at Chungbuk * National University, Chungbuk, Republic of Korea ------------------------------------------------------------------------------------------*/ #include #include #include #define MAX 100 /*----------------------------------- Postfix_bracket ------------------------------------- /* Function : °ýÈ£ ¾ÈÀÇ ÈÄÀ§¿¬»ê º¯È¯ /* Parameter : ¼ö½Ä, ¼ö½Ä°Ë»çÀ§Ä¡, ÈÄÀ§¿¬»ê½Ä, ÈÄÀ§¿¬»ê½ÄÀÔ·ÂÀ§Ä¡ /* Return : None ------------------------------------------------------------------------------------------*/ void Postfix_bracket(char *formula, int *i, char **postfix, int *postfixcount){ char operstack[MAX] = {}; int stacktop = 0; int length = strlen(formula); int j; (*i)++; while(1){ if(formula[*i] == ')'){ break; } if (formula[*i] == '+' || formula[*i] == '-' || formula[*i] == '/' || formula[*i] == '*'){ if (formula[*i] == '*' || formula[*i] == '/'){ if (stacktop != 0){ if (operstack[stacktop - 1] == '+' || operstack[stacktop - 1] == '-'){ operstack[stacktop++] = formula[*i]; } else{ for (j = stacktop - 1; j >= 0; j--){ (*postfix)[(*postfixcount)++] = operstack[j]; } stacktop = 0; operstack[stacktop++] = formula[*i]; } } else{ operstack[stacktop++] = formula[*i]; } } else{ for (j = stacktop - 1; j >= 0; j--){ (*postfix)[(*postfixcount)++] = operstack[j]; } stacktop = 0; operstack[stacktop++] = formula[*i]; } } else if(formula[*i] == '('){ Postfix_bracket(formula, &*i, &*postfix, &*postfixcount); } //ÇÇ¿¬»êÀÚ. else{ (*postfix)[(*postfixcount)++] = formula[*i]; } (*i)++; } for (j = stacktop - 1; j >= 0; j--){ (*postfix)[(*postfixcount)++] = operstack[j]; } } /*-------------------------------------- Postfix ------------------------------------------ /* Function : ÁßÀ§¿¬»ê½ÄÀ» ÈÄÀ§¿¬»ê½ÄÀ¸·Î º¯È¯ /* Parameter : ÁßÀ§½Ä, ÀúÀåÇÒ ÈÄÀ§½Ä /* Return : None ------------------------------------------------------------------------------------------*/ void Postfix(char *formula, char *postfix){ char operstack[MAX] = {}; int postfixcount = 0; int stacktop = 0; int length = strlen(formula); int i, j; for (i = 0; i < length; i++){ //¿¬»êÀÚ ÀÏ°æ¿ì if (formula[i] == '+' || formula[i] == '-' || formula[i] == '/' || formula[i] == '*'){ if (formula[i] == '*' || formula[i] == '/'){ if (stacktop != 0){ if (operstack[stacktop - 1] == '+' || operstack[stacktop - 1] == '-'){ operstack[stacktop++] = formula[i]; } else{ for (j = stacktop - 1; j >= 0; j--){ postfix[postfixcount++] = operstack[j]; } stacktop = 0; operstack[stacktop++] = formula[i]; } } else{ operstack[stacktop++] = formula[i]; } } else{ for (j = stacktop - 1; j >= 0; j--){ postfix[postfixcount++] = operstack[j]; } stacktop = 0; operstack[stacktop++] = formula[i]; } } else if(formula[i] == '('){ Postfix_bracket(formula, &i, &postfix, &postfixcount); } //ÇÇ¿¬»êÀÚ. else{ postfix[postfixcount++] = formula[i]; } } for (i = stacktop - 1; i >= 0; i--){ postfix[postfixcount++] = operstack[i]; } } /*------------------------------- evaluation_bracket ------------------------------------- /* Function : °ýÈ£¾ÈÀÇ ¼ö½Ä°è»ê /* Parameter : ¼ö½Ä, ¼ö½Ä °è»êÁßÀÎ À§Ä¡ /* Return : None ------------------------------------------------------------------------------------------*/ float evaluation_bracket(char *formula, int *i){ float result[MAX] = {}; char stack[MAX] = {}; int resulttop = 0; int stacktop = 0; int j; (*i)++; //°ýÈ£ ´ÙÀ½ ±âÈ£ºÎÅÍ while(1){ if(formula[*i] == ')'){ *i++; break; } if (formula[*i] == '+' || formula[*i] == '-' || formula[*i] == '/' || formula[*i] == '*'){ // °ö¼ÀÀÏ °æ¿ì Àü¿¡ ½×¿©ÀÖ´ø ¿¬»êÀÚ¿Í ¿ì¼±¼øÀ§ ºñ±³·Î °è»êÀ» ÇØÁØ´Ù if (formula[*i] == '*' || formula[*i] == '/'){ if (stacktop != 0){ if (stack[stacktop - 1] == '+' || stack[stacktop - 1] == '-'){ stack[stacktop++] = formula[*i]; } else{ for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } stacktop = 0; stack[stacktop++] = formula[*i]; } } else{ stack[stacktop++] = formula[*i]; } } //°ö¼Àor ³ª´°¼ÀÀÌ ¾Æ´Ñ°æ¿ì ¹«Á¶°Ç ½×¿©ÀÖ´ø ¿¬»êÀÚ¸¦ °è»êÇØÁØ´Ù. else{ for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } stacktop = 0; stack[stacktop++] = formula[*i]; } } else if(formula[*i] == '('){ stack[stacktop++] = evaluation_bracket(formula, &*i); } //ÇÇ¿¬»êÀÚÀÏ °æ¿ì else{ result[resulttop++] = formula[*i] - 48; } (*i)++; } //½ÄÀÌ ³¡³µÀ¸¸é ½×¿©ÀÖ´Â ¿¬»êÀÚ¸¦ ¸ðµÎ °è»ê ÇØÁØ´Ù. for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } return result[0]; } /*----------------------------------- evaluation ----------------------------------------- /* Function : ¼ö½Ä°è»ê /* Parameter : ÁßÀ§¿¬»ê½Ä /* Return : None ------------------------------------------------------------------------------------------*/ float evaluation(char *formula){ float result[MAX] = {}; char stack[MAX] = {}; int resulttop = 0; int stacktop = 0; int length = strlen(formula); int i, j; for (i = 0; i < length; i++){ //¿¬»êÀÚÀÏ °æ¿ì if (formula[i] == '+' || formula[i] == '-' || formula[i] == '/' || formula[i] == '*'){ // °ö¼ÀÀÏ °æ¿ì Àü¿¡ ½×¿©ÀÖ´ø ¿¬»êÀÚ¿Í ¿ì¼±¼øÀ§ ºñ±³·Î °è»êÀ» ÇØÁØ´Ù if (formula[i] == '*' || formula[i] == '/'){ if (stacktop != 0){ if (stack[stacktop - 1] == '+' || stack[stacktop - 1] == '-'){ stack[stacktop++] = formula[i]; } else{ for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } stacktop = 0; stack[stacktop++] = formula[i]; } } else{ stack[stacktop++] = formula[i]; } } //°ö¼Àor ³ª´°¼ÀÀÌ ¾Æ´Ñ°æ¿ì ¹«Á¶°Ç ½×¿©ÀÖ´ø ¿¬»êÀÚ¸¦ °è»êÇØÁØ´Ù. else{ for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } stacktop = 0; stack[stacktop++] = formula[i]; } } else if(formula[i] == '('){ result[resulttop++] = evaluation_bracket(formula, &i); } //ÇÇ¿¬»êÀÚÀÏ °æ¿ì else{ result[resulttop++] = formula[i] - 48; } } //½ÄÀÌ ³¡³µÀ¸¸é ½×¿©ÀÖ´Â ¿¬»êÀÚ¸¦ ¸ðµÎ °è»ê ÇØÁØ´Ù. for (j = stacktop - 1; j >= 0; j--){ switch (stack[j]){ case '+': result[resulttop - 2] = result[resulttop - 2] + result[resulttop - 1]; break; case '-': result[resulttop - 2] = result[resulttop - 2] - result[resulttop - 1]; break; case '*': result[resulttop - 2] = result[resulttop - 2] * result[resulttop - 1]; break; case '/': result[resulttop - 2] = result[resulttop - 2] / result[resulttop - 1]; break; } resulttop = resulttop - 1; } return result[0]; } void main(){ char formula[MAX] = "5*(2+7)*4-4*2"; char postfix[MAX] = {}; int length; float result; //printf("½ÄÀÔ·Â : "); //scanf("%s",formula); length = strlen(formula); Postfix(formula, postfix); result = evaluation(formula); printf("ÁßÀ§¿¬»ê½Ä : %s\n", formula); printf("ÈÄÀ§¿¬»ê½Ä : %s\n", postfix); printf("°è»ê °á°ú : %.2f\n",result); }