/****************************************************************************************** *TITE : calculator * *FILE : calculator.c * *Include Fucntion : input_data(), Formula(), GetToken(), Post(), Cal(), Main() * *DATE : From Dec 04, 2013 to Dec 07, 2013 * *METHOD : °ýÈ£¸¦ Æ÷ÇÔÇÑ ¼ö½ÄÀ» ÀÔ·Â ¹Þ´Â´Ù. * * : ÀԷ¹ÞÀº ¼ö½Ä¿¡¼­ »ý·« °¡´ÉÇÑ °ýÈ£´Â »ý·« * * : »ý·« °¡´ÉÇÑ °ýÈ£°¡ Á¦°ÅµÈ ¼ö½ÄÀ» Ãâ·Â * * : ¼ö½ÄÀ» ÅäÅ« ´ÜÀ§·Î ³ª´«µÚ Ãâ·Â * * : ÅäÅ«´ÜÀ§·Î ³ª´« ÁßÀ§½ÄÀ» ÈÄÀ§½ÄÀ¸·Î º¯È¯ * * : ÈÄÀ§½ÄÀ¸·Î º¯È¯µÈ ½ÄÀ» °è»êÇÏ¿© °á°ú Ãâ·Â * ******************************************************************************************/ #define INSERT 1 #define CONVERSION 2 #define TOKEN 3 #define POSTFIX 4 #define CALCULATE 5 #define EXIT -1 #define MAX_SIZE 40 #include #include #include char numbers[MAX_SIZE][MAX_SIZE]; char oper[MAX_SIZE]; float num[MAX_SIZE]; char cal_oper[MAX_SIZE]; char mod[MAX_SIZE]; char check[MAX_SIZE]; int mod_leng; char result_mod[MAX_SIZE]; int input_data() { int i, lparen = 0, rparen = 0; system("cls"); memset(mod, '\0', MAX_SIZE); printf("¼ö½ÄÀ» ÀÔ·ÂÇϼ¼¿ä : "); gets(mod); mod_leng = strlen(mod); /*********************************************************************************** °ýÈ£ÀÇ ¼ö¸¦ °è»ê ************************************************************************************/ for( i = 0 ; i < mod_leng ; i++){ if('(' == mod[i]) lparen++; else if(')' == mod[i]) rparen++; }//end_of_for /*********************************************************************************** °ýÈ£ÀÇ Â¦ÀÌ ¸Â´ÂÁö¸¦ °Ë»ç ************************************************************************************/ if(lparen != rparen){ printf("°ýÈ£ ¦ÀÌ ¸ÂÁö ¾Ê½À´Ï´Ù.[(°ýÈ£ = %d°³, )°ýÈ£ = %d°³]", lparen, rparen); exit(EXIT); } /*********************************************************************************** °ýÈ£¸¦ Æ÷ÇÔ»ê ¼ö½ÄÀÌ ¿Ã¹Ù¸£°Ô ÀԷµƴÂÁö¸¦ °Ë»ç ************************************************************************************/ for( i = 0 ; i < mod_leng ; i++){ if(mod[i] >= '0' && mod[i] <= '9' && mod[i+1] == '('){ printf("À߸øµÈ ¼ö½ÄÀ» ÀÔ·ÂÇÏ¿´½À´Ï´Ù.\n"); exit(EXIT); } }//end_of_for printf("ÀÔ·ÂµÈ ¼ö½ÄÀº [ %s ] ÀÔ´Ï´Ù.\n\n\n", mod); return (rparen); } void formula(int right_count) { int i, j = 0; int k, l, m = -1, n = 0; char leftCharacter, centCharacter, rightCharacter; typedef struct tmpData{ char tmp_mod; int index; }data; typedef struct parenCount{ int left; int right; }paren; data tmp[MAX_SIZE]; paren *parenNum; int *tmpParen; /********************************************************************************** ÀÔ·ÂµÈ ¼ö½Ä¿¡¼­ ¿¬»êÀÚ¿Í °ýÈ£¸¸ ÃßÃâ ÇÏ´Â ¹Ýº¹¹® ***********************************************************************************/ for ( i = 0 ; i < mod_leng ; i++){ if(mod[i] >= '1' && mod[i] <= '9'){ continue; }else if (mod[i] == '+' || mod[i] == '-' || mod[i] == '*' || mod[i] == '/' || mod[i] == '(' || mod[i] == ')'){ tmp[j].tmp_mod = mod[i]; tmp[j].index = i; j++; } }//end_of_for /********************************************************************************** ¿ÞÂÊ ¿À¸¥ÂÊ °ýÈ£ ÁÂÇ¥°ªÀ» ÀúÀåÇÒ ¹è¿­ »ý¼º ***********************************************************************************/ parenNum = (paren*)malloc(sizeof(paren)*right_count); if(parenNum == NULL){ printf("Memory ERROR\n"); exit(EXIT); } else memset(parenNum, 0, sizeof(data)*right_count); /********************************************************************************** ¿ÞÂÊ ¿À¸¥ÂÊ °ýÈ£ ÁÂÇ¥°ªÀ» ÀúÀåÇÒ ¹è¿­ »ý¼º ***********************************************************************************/ tmpParen = (int*)malloc(sizeof(int)*right_count); if(tmpParen == NULL){ printf("Memory ERROR\n"); exit(EXIT); } else memset(tmpParen, 0, sizeof(int)*right_count); /********************************************************************************** °ýÈ£ ½ÖµéÀ» ¹­¾î¼­ ÀúÀå ÇÏ´Â ¹Ýº¹¹® ***********************************************************************************/ for ( l = 0 ; l < j ; l++){ if(tmp[l].tmp_mod == '('){ m++; tmpParen[m] = tmp[l].index; } else if (tmp[l].tmp_mod == ')') { parenNum[n].left = tmpParen[m]; m--; parenNum[n].right = tmp[l].index; n++; } }//end_of_for /********************************************************************************** °ýÈ£¸¦ »ý·«ÇØ¾ß ÇÏ´ÂÁö ¸»¾Æ¾ß ÇÏ´ÂÁö ÆÇ´ÜÇÏ´Â ¹Ýº¹¹® ***********************************************************************************/ for( i = 0 ; i < right_count ; i++){ /************ ¿ÞÂÊ °ýÈ£ ¿¬»êÀÚ Ã£±â *********/ for( j = parenNum[i].left ; j >= 0 ; j--){ if(mod[j] == '+' || mod[j] == '-' || mod[j] == '*' || mod[j] == '/' ){ leftCharacter = mod[j]; break; } }//end_of_for /************ ¿À¸¥ÂÊ °ýÈ£ ¿¬»êÀÚ Ã£±â *********/ for( j = parenNum[i].right ; j < mod_leng ; j++){ if(mod[j] == '+' || mod[j] == '-' || mod[j] == '*' || mod[j] == '/' ){ rightCharacter = mod[j]; break; } }//end_of_for centCharacter = NULL; /*********************************************************************** °ýÈ£ »çÀÌ¿¡ ÀÖ´Â ¿¬»êÀÚ Ã£±â ************************************************************************/ for( j = parenNum[i].left ; j < parenNum[i].right ; j++){ if(mod[j] == '(' || mod[j] == ')'){ continue; }else if(mod[j] >= '1' && mod[j] == '9'){ continue; }else if(mod[j] == '+' || mod[j] == '-'){ if(check[j] == '0'){ centCharacter = mod[j]; check[j] = '2'; } }else if(mod[j] == '*' || mod[j] == '/' ){ if(centCharacter == '+' || centCharacter == '-'){ check[j] = '2'; continue; }else if(centCharacter == '*' || centCharacter == '/'){ check[j] = '2'; }else if(centCharacter == NULL){ centCharacter = mod[j]; check[j] = '2'; } } }//end_of_for if(centCharacter == '+' || centCharacter == '-'){ if(leftCharacter == '*' || leftCharacter == '/' || rightCharacter == '*' || rightCharacter == '/') check[parenNum[i].left] = check[parenNum[i].right] = '0'; else check[parenNum[i].left] = check[parenNum[i].right] = '1'; } else if (centCharacter == '*' || centCharacter == '/'){ if(leftCharacter == '+' || leftCharacter == '-' || leftCharacter == '*' || leftCharacter == '/' || rightCharacter == '+' || rightCharacter == '-' || rightCharacter == '*' || rightCharacter == '/') check[parenNum[i].left] = check[parenNum[i].right] = '1'; else check[parenNum[i].left] = check[parenNum[i].right] = '1'; } }//end_of_for /******************************************************************************** °ýÈ£°¡ Á¤¸®µÈ ¼ö½ÄÀ» Ãâ·ÂÇÏ´Â ¹Ýº¹¹® *********************************************************************************/ printf("\n»ý·«ÀÌ °¡´ÉÇÑ °ýÈ£¸¦ Á¦°ÅÇÑ ½ÄÀº\n[ "); for( i = 0, j = 0 ; i < mod_leng ; i++){ if(check[i] != '1'){ printf("%c", mod[i]); result_mod[j] = mod[i]; j++; } } printf(" ]\nÀÔ´Ï´Ù.\n\n"); } /************************************************************************************* Token ´ÜÀ§·Î ºÐ¸® **************************************************************************************/ int get_token() { int i, length; int j = 0, numcount = 1; int k = 0, l = 0; int parencheck = 0; length = strlen(result_mod); // ÀÔ·ÂµÈ ¼ö½ÄÀÇ ±æÀÌ ±¸Çϱâ /********************************************************************************** ÀÔ·ÂµÈ ¼ö½ÄÀ¸·Î ºÎÅÍ ¿¬»êÀÚ¿Í ÇÇ¿¬»êÀÚ¸¦ ±¸º°ÇÏ´Â ¹Ýº¹¹® ***********************************************************************************/ for( i = 0 ; i < length ; i++){ if(result_mod[i] >= '0' && result_mod[i] <= '9' || result_mod[i] == '.'){ // ¼ýÀÚ(½Ç¼öÆ÷ÇÔ) µû·Î ÀúÀå numbers[j][k] = result_mod[i]; k++; } else if ( result_mod[i] == '+' || result_mod[i] == '-' || result_mod[i] == '*' || result_mod[i] == '/' || result_mod[i] == '(' || result_mod[i] == ')' ) { // ¿¬»êÀÚ µû·Î ÀúÀå oper[l] = result_mod[i]; if(result_mod[i] != '(' && result_mod[i] != ')'){ numcount++; j++; } l++,k = 0; // ¿¬»êÀÚ ´ÜÀ§·Î ÇÇ¿¬»êÀÚ°¡ ±¸º°ÀÌ µÇ±â ´ë¹®¿¡ 0À¸·Î ÃʱâÈ­ ÇØÁØ´Ù. } else if ( result_mod[i] == ' ') // °ø¹é ¹®ÀÚ¿­ ¹«½Ã continue; }//end_of_for /********************************************************************************** ÃßÃâµÈ ÇÇ¿¬»êÀÚ(¼ýÀÚ)¸¦ ½Ç¼ö·Î º¯È¯½ÃÅ°´Â ¹Ýº¹¹® ***********************************************************************************/ for ( i = 0 ; i <= numcount ; i++){ num[i] = atof(numbers[i]); }//end_of_for printf("\n"); /********************************************************************************** ÅäÅ« ´ÜÀ§·Î ºÐ¸®µÈ ¼ö½ÄÀ» Çϳª·Î Ç¥Çö ***********************************************************************************/ for ( i = 0, j = 0 ; i < numcount ; i++, j++){ /***************************************************************************** ½ÄÀÌ °ýÈ£ºÎÅÍ ½ÃÀÛÇÒ °æ¿ì ******************************************************************************/ if(oper[j] == '('){ printf("%c", oper[j]); j++; } printf("%3.2f", num[i]); if( i != numcount){ printf("%c", oper[j]); /************************************************************************ °ýÈ£¸¦ ¸¸³µÀ»¶§ ¿¬»êÀÚ¸¦ Ãâ·ÂÇØ ÁÖ´Â ±ÔÄ¢ *************************************************************************/ if(oper[j+1] == '('){ while(oper[j+1] == '('){ j++; printf("%c", oper[j]); } } else if (oper[j] == ')' && oper[j+1] == ')') { while(oper[j+1] == ')') { j++; printf("%c", oper[j]); } if(oper[j+1] == '+' || oper[j+1] == '-' || oper[j+1] == '*' || oper[j+1] == '/'){ j++; printf("%c", oper[j]); } } else if (oper[j] == ')'){ if(oper[j+1] == '+' || oper[j+1] == '-' || oper[j+1] == '*' || oper[j+1] == '/'){ j++; printf("%c", oper[j]); } } } else{ printf("\n"); break; }//end_of_if }//end_of_for printf("\n\n"); return numcount; } /************************************************************************************* ÁßÀ§½Ä -> ÈÄÀ§½Ä **************************************************************************************/ int post(int nums) { int i, j = 0, k = 0, chk = 0, opchk = 0; int parencheck = 0; // °ýÈ£°¡ ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ´Â º¯¼ö char stack_oper[MAX_SIZE] = "\0"; // ½ºÅà printf("\n"); memset(check, '\0', MAX_SIZE); for( i = 0 ; i < nums ; i++){ printf("%3.2f ", num[i]); check[chk] = '1'; chk++; /********************************************************** ½ºÅÃÀÌ °ø¹éÀÏ ¶§ ***********************************************************/ if( j == 0 ) { if(oper[k] != '('){ stack_oper[j] = oper[k]; j++, k++; if(oper[k] == '('){ while(oper[k] == '('){ stack_oper[j] = oper[k]; j++, k++; } } }else { while(oper[k] == '('){ stack_oper[j] = oper[k]; j++, k++; } stack_oper[j] = oper[k]; j++, k++; } /********************************************************* ½ºÅÃÀÌ °ø¹éÀÌ ¾Æ´Ò ¶§ **********************************************************/ } else if (j != 0) { if(oper[k] == '+' || oper[k] == '-'){ if(stack_oper[j-1] == '('){ stack_oper[j] = oper[k]; j++, k++; }else { printf("%c ", stack_oper[j-1]); cal_oper[opchk] = stack_oper[j-1]; stack_oper[j-1] = oper[k]; opchk++; k++; check[chk] = '0'; chk++; } } else if (oper[k] == '*' || oper[k] == '/'){ if(stack_oper[j-1] == '('){ stack_oper[j] = oper[k]; j++, k++; }else { if(stack_oper[j-1] == '*' || stack_oper[j-1] == '/'){ printf("%c ", stack_oper[j-1]); cal_oper[opchk] = stack_oper[j-1]; opchk++; stack_oper[j-1] = oper[k]; k++; check[chk] = '0'; chk++; } else if (stack_oper[j-1] == '+' || stack_oper[j-1] == '-'){ stack_oper[j] = oper[k]; j++, k++; } } }else if ( oper[k] == '(') { stack_oper[j] = oper[k]; j++, k++; }else if (oper[k] == ')'){ while(stack_oper[j-1] != '('){ j--; printf("%c ", stack_oper[j]); cal_oper[opchk] = stack_oper[j]; opchk++; stack_oper[j] = '\0'; check[chk] = '0'; chk++; if(stack_oper[j-1] == '('){ j--, k++; if(oper[k] != '\0') stack_oper[j] = oper[k]; else stack_oper[j] = '\0'; if( i+1 == nums && oper[k] == '\0'){ while(j != 0){ printf("%c ", stack_oper[j-1]); cal_oper[opchk] = stack_oper[j-1]; check[chk] = '0'; chk++; j--; } } if(stack_oper[j] == '+' || stack_oper[j] == '-'){ if(stack_oper[j-1] != '('){ printf("%c ", stack_oper[j-1]); cal_oper[opchk] = stack_oper[j-1]; stack_oper[j-1] = stack_oper[j]; j--; opchk++; check[chk] = '0'; chk++; } }else if(stack_oper[j] == '*' || stack_oper[j] == '/') { if(stack_oper[j-1] != '('){ if(stack_oper[j-1] == '*' || stack_oper[j-1] == '/'){ printf("%c ", stack_oper[j-1]); cal_oper[opchk] = stack_oper[j-1]; stack_oper[j-1] = stack_oper[j]; j--; opchk++; check[chk] = '0'; chk++; } } } j++; break; } }//end_of_while k++; } else if( oper[k] == '\0') { for( j -= 1 ; j >= 0 ; j--){ printf("%c ", stack_oper[j]); cal_oper[opchk] = stack_oper[j]; opchk++; check[chk] = '0'; chk++; } } }//end_of_if }//end_of_for printf("\n\n"); return chk; } void cal(int nums) { int i, j = 0, k = 0, l = 0; float num_stack[MAX_SIZE]; memset(num_stack, 0, MAX_SIZE); for(i = 0 ; i <= nums ; i++ ){ if(check[i] == '1'){ num_stack[k] = num[l]; k++, l++; } else if (check[i] == '0'){ if(cal_oper[j] == '+'){ num_stack[k-2] = num_stack[k-2] + num_stack[k-1]; num_stack[k-1] = '\0'; j++, k--; }else if (cal_oper[j] == '-'){ num_stack[k-2] = num_stack[k-2] - num_stack[k-1]; num_stack[k-1] = '\0'; j++, k--; }else if (cal_oper[j] == '*'){ num_stack[k-2] = num_stack[k-2] * num_stack[k-1]; num_stack[k-1] = '\0'; j++, k--; }else if (cal_oper[j] == '/'){ num_stack[k-2] = num_stack[k-2] / num_stack[k-1]; num_stack[k-1] = '\0'; j++, k--; } } }//end_of_for printf("\n¼ö½Ä °è»ê °á°ú´Â [ %5.2f ] ÀÔ´Ï´Ù.\n\n", num_stack[0]); } void main() { int set, i, count, num; char tmp; for( i = 0 ; i < MAX_SIZE ; i++){ check[i] = '0'; } while(1){ printf("[1]INSERT [2]CONVERSION [3]TOKENING [4]POSTFIX [5]CALCULATE [-1]EXIT\n-->"); scanf("%d%c", &set, &tmp); switch(set){ case INSERT : count = input_data(); break; case CONVERSION : formula(count); break; case TOKEN : num = get_token(); break; case POSTFIX : num = post(num); break; case CALCULATE : cal(num); break; case EXIT : exit(EXIT); default : printf("Out Of Range\n"); break; }//end_of_switch }//end_of_while }