#include #include #include #define MAX 50 char formula[MAX] = {}; //½ÄÀ» ÀԷ¹޴ º¯¼ö char newfor[MAX][MAX] = {}; //ÇÇ¿¬»êÀÚ¿Í ¿¬»êÀÚ¸¦ ºÐ¸®Çؼ­ ÀúÀåÇÏ´Â º¯¼ö char newop[MAX] = {}; //¿¬»êÀÚ¸¦ ÈÄÀ§½ÄÀ¸·Î º¯ÇüÇϱâÀ§ÇÑ Àӽà ÀúÀå º¯¼ö char num[1][10] = {}; // ÀԷ¹ÞÀº ½Ä¿¡¼­ ÇÇ¿¬»êÀÚ¸¦ ÀúÀåÇÏ´Â º¯¼ö char operate[1] = {}; // ÀԷ¹ÞÀº ½Ä¿¡¼­ ¿¬»êÀÚ¸¦ Àӽ÷ΠÀúÀåÇÏ´Â º¯¼ö int fmlength = 0; // ÀԷ¹ÞÀº ½ÄÀÇ ±æÀ̸¦ ÀúÀåÇÏ´Â º¯¼ö void Token(char x[]){ //ÇÇ¿¬»êÀÚ¿Í ¿¬»êÀÚ ºÐ¸® int ncount = 0; //ÇÇ¿¬»êÀÚ °³¼ö int ocount = 0; //¿¬»êÀÚ °³¼ö int fcount= 0; //ÇÇ¿¬»êÀÚ¿Í ¿¬»êÀÚÀÇ °³¼ö int xlength; // ¸Å°³º¯¼ö ¹®ÀÚ¿­xÀÇ ±æÀÌ int tcount = 0; // ¿¬»êÀÚ ÀüÀÇ ¹®ÀÚ °³¼ö xlength = strlen(x); for(int i = 0; i < xlength; i++){ if(x[i] == '*'|| x[i] == '/'|| x[i] == '+'|| x[i] == '-'){ strcpy(newfor[fcount],num[0]);//ÇÇ¿¬»êÀÚ º¹»ç fcount++; memset(num[0], '\0', sizeof(num[0])); //ÇÇ¿¬»êÀÚ ÀÓ½ÃÀúÀå º¯¼ö ÃʱâÈ­ tcount = 0; // ÇÇ¿¬»êÀÚ ÀÓ½ÃÀúÀåÀ§Ä¡ ÃʱâÈ­ operate[0] = x[i]; strcpy(newfor[fcount],operate); // ¿¬»êÀÚ º¹»ç fcount++; ocount++; ncount++; } else if(x[i] == '('){ operate[0] = x[i]; strcpy(newfor[fcount],operate); fcount++; ocount++; } else if(x[i] == ')'){ strcpy(newfor[fcount],num[0]); fcount++; memset(num[0], '\0', sizeof(num[0])); tcount = 0; operate[0] = x[i]; strcpy(newfor[fcount],operate); fcount++; ocount++; ncount++; } else if(x[i] == ' '){ continue; } else{ num[0][tcount]= x[i]; tcount++; } } strcpy(newfor[fcount],num[0]);// ¸¶Áö¸· ÇÇ¿¬»êÀÚ º¹»ç ncount++; // ¸¶Áö¸· ÇÇ¿¬»êÀÚ fmlength = ncount + ocount; //ÇÇ¿¬»êÀÚ °³¼ö¿Í ¿¬»êÀÚ °³¼öÀÇ ÇÕÀ» ÀúÀå } void sort(){ //ÈÄÀ§¿¬»ê º¯È¯ int lcount = 0; //¿¬»êÀÚ °³¼ö ÀúÀå À§Ä¡ int ncount = 0; // ÈÄÀ§½Ä º¯°æ ÀúÀå int ocount = 0; // ¿¬»êÀÚ ÀúÀå À§Ä¡ int left[MAX] = {}; //'(' ÀÌÀü±îÁöÀÇ ¿¬»êÀÚ °³¼ö ÀúÀå int barket = 0; // '(' °³¼ö ÀúÀå char nnewfor[MAX][MAX] = {}; for(int i = 0; i < fmlength; i++){ strcpy(nnewfor[i],newfor[i]); } memset(newfor, '\0', sizeof(newfor)); for(int i = 0; i < fmlength; i++){ if(nnewfor[i][0] == '+' || nnewfor[i][0] == '-'){ // ¿¬»êÀÚ¸¦ ¸¸³ª¸é ÀúÀåÇÏ°í ´ÙÀ½ ¼ö½ÄÀ» ºñ±³ newop[ocount] = nnewfor[i][0]; ocount++; i++; if(nnewfor[i][0] == '('){ // ´ÙÀ½¼ö½ÄÀÌ '(' Áö±Ý±îÁöÀÇ ¿¬»êÀÚ °³¼ö ÀúÀå barket++; left[lcount] = ocount; } else{ strcpy(newfor[ncount],nnewfor[i]); ncount++; } } else if(nnewfor[i][0] == '*' || nnewfor[i][0] == '/'){ newop[ocount] = nnewfor[i][0]; ocount++; i++; if(nnewfor[i][0] == '('){ barket++; left[lcount] = ocount; } else if(nnewfor[i][0] == ')'){ barket--; if(barket == 0){ for(int j = ocount - 1; j >= 0; j--){ //¼ö½Ä¿¡¼­ newop¿¡ ÀúÀåµÇÀÖ´ø ³ª¸ÓÁö newfor¿¡ÀúÀå newfor[ncount][0] = newop[j]; ncount++; } ocount = 0; } else{ for(int j = ocount - 1; j >= left[lcount]; j--){ // ')'°¡ ³²¾ÆÀÖÀ¸¸é ±×Àü±îÁö ¿¬»êÀÚ Ãâ·Â newfor[ncount][0] = newop[j]; ncount++; } ocount = left[lcount]; lcount--; } } else{ if(barket == 0){ strcpy(newfor[ncount],nnewfor[i]); ncount++; for(int j = ocount - 1; j >= 0; j--){ newfor[ncount][0] = newop[j]; ncount++; } ocount = 0; } } } else if(nnewfor[i][0] == '('){//¼öÀÇ °³¼ö ÀúÀå barket++; lcount++; left[lcount] = ocount; } else if(nnewfor[i][0] == ')'){ barket--; if(barket == 0){ for(int j = ocount - 1; j >= 0; j--){ newfor[ncount][0] = newop[j]; ncount++; } ocount = 0; } else{ for(int j = ocount - 1; j >= left[lcount]; j--){ newfor[ncount][0] = newop[j]; ncount++; } ocount = left[lcount]; lcount--; } } else{ strcpy(newfor[ncount],nnewfor[i]); ncount++; } } for(int j = ocount - 1; j >= 0; j--){ //¼ö½Ä¿¡¼­ newop¿¡ ÀúÀåµÇÀÖ´ø ³ª¸ÓÁö ÀúÀå newfor[ncount][0] = newop[j]; ncount++; } ocount = 0; } double calculate(char x[][MAX]){//ÈÄÀ§¿¬»ê½Ä °è»ê double numeric[MAX] = {}; double result = 0; int count = 0; int ncount = 0; for(int i = 0; i < fmlength; i++){ // ÈÄÀ§½ÄÀ¸·Î ¿¬»êÀÚ ¾ÕÀÇ µÎ°³ÀÇ ¼ö·Î °è»ê if(x[i][0] == '+'){ numeric[ncount-2] = numeric[ncount-2] + numeric[ncount-1]; ncount--; } else if(x[i][0] == '-'){ numeric[ncount-2] = numeric[ncount-2] - numeric[ncount-1]; ncount--; } else if(x[i][0] == '/'){ numeric[ncount-2] = numeric[ncount-2] / numeric[ncount-1]; ncount--; } else if(x[i][0] == '*'){ numeric[ncount-2] = numeric[ncount-2] * numeric[ncount-1]; ncount--; } else{ // ¿¬»êÀÚ°¡ ¾Æ´Ï¸é ÀÚ·áÇü º¯Çü numeric[ncount] = atof(x[i]); ncount++; } } result = numeric[0]; return result; } void main(){ double result = 0; printf("¼ö½Ä ÀÔ·Â : "); gets(formula); Token(formula); printf("ÅäÅ« : \n"); for(int i = 0; i < fmlength; i++){ printf("%s\n", newfor[i]); } printf("\n"); sort(); printf("ÈÄÀ§ ¿¬»ê½Ä : "); for(int i = 0; i < fmlength; i++){ printf("%s", newfor[i]); } printf("\n"); result = calculate(newfor); printf("°á°ú°ª : %0.2f", result); }