제가 중위표기법을 후위표기법으로 바꿔서 계산결과가 나오게할려고 하는중인데요.
입력받을때 11*(2+3)/2 이렇게 문자열로 입력받으면
char [0 1 2 3 4 5 6 7 8 9 ]
1 1 * ( 2 + 3 ) / 2
이런식으로 문자열이 입력되버리는데 여기서 11을 붙여서 넣는방법은없나요..??
저런식으로 떨어져서 11이 아니라 1, 1 이렇게 되버리니깐 결과값도 아예 이상하게 나와버리네요...;;;
어떻게 입력받으면되는지 갈켜주세요..ㅠ
1 1 따로가아니라 11은 char0에 한꺼번에 넣는방법...이 필요해요..
----------------------------------------------------------------------------------------------------------------------------------------------
문자열로 입력을 받았다면 위와 같이 한개의 방에 한개의 값이 들어가는 것이 당연합니다.
따라서 다른방법으로 처리를 해 주어야만 합니다.
[1] 문자는 부호가 없을 경우 0부터 255사이의 값을 가집니다.
그런데 *,+,-,/ 등의 연산부호도 문자이기 때문에 아스키코드 값을 가집니다.
+ 43
- 45
* 42
/ 47
의 값을 가지고 있습니다.
'0' 은 48
'1' 은 49
.......
'9' 는 57 의 값을 가지고 있습니다.
그런데 질문자가 원하는 방식대로 처리를 할려면
"42" 라는 입력과 * 라는 입력을 구별할수가 없게 됩니다.
심각한 문제입니다.
또 255를 넘는 값도 표현할 수가 없다는 문제가 있습니다.
[2] 가령 입력의 범위가 255를 넘지 않는다고 하더라도
수와 연산자를 구분해야 합니다.
한가지 방법은 2자리씩를 사용하는 방법입니다.
0, 11 이면 수자이다.
1, 42 이면 연산자이다.
0이면 피연산자, 1이면 연산자 이렇게 구분을 해주면 일단 문제가 없어집니다.
문자열을 그대로 사용하고서(피연산자가 충분히 작다고 가정합니다)
프로그램으로 표현할 수는 있습니다.
#include <stdio.h>
int main() {
int i, j, x;
char ch;
char ex[100]={0,};
char buf[100];
printf("중위표현: ");
gets(buf);
i=0;
j=0;
while(buf[i]>0) {
if(buf[i]<48) {
//ex[j++]=1;
ex[j++]=buf[i];
i=i+1;
}
else {
x=0;
while(0<buf[i] && buf[i]>47) {
x=10*x+buf[i]-'0';
i=i+1;
}
//ex[j++]=0;
ex[j++]=x;
}
}
for(i=0;i<j;++i) printf("%d ",ex[i]);
return 0;
}
위의 아이디어를 접목한 프로그램입니다.
위의 프로그램에서는 피연산자와 연산자를 모두 한개의 방에 표시하였습니다.
//ex[j++] 을 살려주면 두개의 방으로 표시한 것이 됩니다.
출력을 해보면 수들을 모아서 그 값을 그대로 표현하고
연산자나 괄호는 그 아스키 코드값을 그대로 사용하였습니다.
만약 입력하는 수가 위의 아스키 코드와 겹친다면
두개의 방을 사용하여 구별해야 합니다.
'c·c++ > c 프로그래밍' 카테고리의 다른 글
하노이탑의 움직임을 배열을 이용하여 보여주기. (0) | 2012.04.21 |
---|---|
2진수의 자리이동 (0) | 2012.04.19 |
입력받은 단어 랜덤으로 나열하고 하나만 뽑아내는 프로그램 (0) | 2012.04.15 |
3개의 정수중 최대수는? (0) | 2012.04.15 |
vc++ 2010 에서 cntrl+F5 가 제대로 안먹힐때 (0) | 2012.04.15 |