변경이력

돌아가기
3 29개 문자 추가 3개 문자 삭제

2016/11/15 06:45

황 승태

댓글을 본 뒤 수정했습니다. p.s. 그러고보니 그냥 스택을 쓸껄 그랬군요.. ```{.cpp} #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define PLUS 0 #define MINU 1 #define MULT 2 #define DIVD 3 int pos; float Lisp(string input) { float result = 0; int mark = -1; float nFirstNum = 0.0; //앞 숫자 float nSecondNum = 0.0; //뒷 숫자 float returnResult = 0.0; bool bFristInput = false; bool bSecondInput = false; //printf("input: %s\n", input.c_str()); while(1) { //입력받은 수식의 끝 체크 if(pos >= input.length()) { break; } //닫는 괄호 연산 끝 리턴 if(input[pos] == ')') break; //여는 괄호가 나오면 다시 함수 호출 if(input[pos] == '(') { pos++; returnResult = Lisp(input); if(!bFristInput) { nFirstNum = returnResult; bFristInput = true; } else { nSecondNum = returnResult; bSecondInput = true; } } #pragma region 부호결정 //부호 결정 if(mark == -1)//부호가 아직 결정이 안됐다면 { if(input[pos] == '+') mark = PLUS; else if(input[pos] == '-' ) mark = MINU; else if(input[pos] == '*' ) mark = MULT; else if(input[pos] == '/' ) mark = DIVD; } #pragma endregion #pragma region 문자열을 숫자로 //숫자 범위면 if(input[pos] >= '0' && input[pos] <= '9') { int i = 0; //첫 번째 숫자가 비어있으면 if(!bFristInput) { for(i = pos; input[i] >= '0' && input[i] <= '9'; i++) { nFirstNum *= 10; // 자리수 증가 nFirstNum += input[i] - '0'; } bFristInput = true; } //두 번째 숫자를 구한다. else { for(i = pos; input[i] >= '0' && input[i] <= '9'; i++) { nSecondNum *= 10; // 자리수 증가 nSecondNum += input[i] - '0'; } bSecondInput = true; } pos = i - 1; } #pragma endregion #pragma region 연산 //연산 if(bSecondInput) { switch(mark) { case PLUS: //printf("%d + %d\n", nFirstNum, nSecondNum); nFirstNum += nSecondNum; break; case MINU: //printf("%d - %d\n", nFirstNum, nSecondNum); nFirstNum -= nSecondNum; break; case MULT: //printf("%d * %d\n", nFirstNum, nSecondNum); nFirstNum *= nSecondNum; break; case DIVD: if(nSecondNum == 0) return -999; nFirstNum /= nSecondNum; break; } nSecondNum = 0; bSecondInput = false; } #pragma endregion pos++; result = nFirstNum; } //printf("return: %d\n", result); return result; } int main (int argc, char *argv[]) { string input[7]; input[0]= "(* (+ 2 3) (- 5 3))"; input[1] ="(/ (+ 9 1) (+ 2 3))"; input[2] = "(* (- 10 3 5) (+ 2 5) (/ 10 2))"; input[3] = "(/ (* 12 12 12 12) (* 2 6) (/ 10 5))"; input[4] = "(+ (+ (- 3 5) (* 1 3)) (+ 2 5))"; input[5] = "(* (/ (+ (- 3 5) (+ 4 1)) (+ 1 1)) (- 1 2)) "; input[6] = "(+ (* 2 2 2 2) (/ 64 2 2 2))"; int i = 0; for(i = 0; i < 7; i ++) { pos = 0; printf("result: %.3f\n", Lisp(input[i])); } return 0; } ```
댓글을 본 뒤 수정했습니다. p.s. 그러고보니 그냥 스택을 쓸껄 그랬군요.. ```{.cpp} #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define PLUS 0 #define MINU 1 #define MULT 2 #define DIVD 3 int pos; float Lisp(string input) { float result = 0; int mark = -1; float nFirstNum = 0.0; //앞 숫자 float nSecondNum = 0.0; //뒷 숫자 float returnResult = 0.0; bool bFristInput = false; bool bSecondInput = false; //printf("input: %s\n", input.c_str()); while(1) { //입력받은 수식의 끝 체크 if(pos >= input.length()) { break; } //닫는 괄호 연산 끝 리턴 if(input[pos] == ')') break; //여는 괄호가 나오면 다시 함수 호출 if(input[pos] == '(') { pos++; returnResult = Lisp(input); if(!bFristInput) { nFirstNum = returnResult; bFristInput = true; } else { nSecondNum = returnResult; bSecondInput = true; } } #pragma region 부호결정 //부호 결정 if(mark == -1)//부호가 아직 결정이 안됐다면 { if(input[pos] == '+') mark = PLUS; else if(input[pos] == '-' ) mark = MINU; else if(input[pos] == '*' ) mark = MULT; else if(input[pos] == '/' ) mark = DIVD; } #pragma endregion #pragma region 문자열을 숫자로 //숫자 범위면 if(input[pos] >= '0' && input[pos] <= '9') { int i = 0; //첫 번째 숫자가 비어있으면 if(!bFristInput) { for(i = pos; input[i] >= '0' && input[i] <= '9'; i++) { nFirstNum *= 10; // 자리수 증가 nFirstNum += input[i] - '0'; } bFristInput = true; } //두 번째 숫자를 구한다. else { for(i = pos; input[i] >= '0' && input[i] <= '9'; i++) { nSecondNum *= 10; // 자리수 증가 nSecondNum += input[i] - '0'; } bSecondInput = true; } pos = i - 1; } #pragma endregion #pragma region 연산 //연산 if(bSecondInput) { switch(mark) { case PLUS: //printf("%d + %d\n", nFirstNum, nSecondNum); nFirstNum += nSecondNum; break; case MINU: //printf("%d - %d\n", nFirstNum, nSecondNum); nFirstNum -= nSecondNum; break; case MULT: //printf("%d * %d\n", nFirstNum, nSecondNum); nFirstNum *= nSecondNum; break; case DIVD: if(nSecondNum == 0) return -999; nFirstNum /= nSecondNum; break; } nSecondNum = 0; bSecondInput = false; } #pragma endregion pos++; result = nFirstNum; } //printf("return: %d\n", result); return result; } int main (int argc, char *argv[]) { string input[7]; input[0]= "(* (+ 2 3) (- 5 3))"; input[1] ="(/ (+ 9 1) (+ 2 3))"; input[2] = "(* (- 10 3 5) (+ 2 5) (/ 10 2))"; input[3] = "(/ (* 12 12 12 12) (* 2 6) (/ 10 5))"; input[4] = "(+ (+ (- 3 5) (* 1 3)) (+ 2 5))"; input[5] = "(* (/ (+ (- 3 5) (+ 4 1)) (+ 1 1)) (- 1 2)) "; input[6] = "(+ (* 2 2 2 2) (/ 64 2 2 2))"; int i = 0; for(i = 0; i < 7; i ++) { pos = 0; printf("result: %.3f\n", Lisp(input[i])); } return 0; } ```
2 1355개 문자 추가 535개 문자 삭제

2016/11/15 06:43

황 승태

1 Original

2016/11/10 07:37

황 승태

코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.