문자열로 입력된 연산문의 분석
출처 : 난 정말 C PROGRAMMING을 공부한 적이 없다구요! P502 21장 문제 5
날짜 : 2018/02/17
프로그램 사용자로부터 다음과 같은 형식의 수식을 문자열의 형태로 입력 받는다.
- 23+25
- 105-25
- 120*4
- 365/15
그리고 나서 읽어 들인 문자열을 분석하여 두 개의 피연산자와 하나의 연산자 정보를 추출하여 연산을 진행하고, 연산의 결과를 출력해야 한다. 단 문제의 수준을 조금 낮추기 위해서 다음과 같은 제한사항을 두겠다.
- 다음의 형태로 문자열을 읽어 들일 수 있도록, 수식에는 공백을 삽입하면 안 된다.
- scanf("%s", buf);
- 연산의 종류는 사칙연산으로 제한을 둔다.
- 정수형 연산을 진행한다. 피연산자는 반드시 정수여야 한다.
- 두 개의 피연산자와 하나의 연산자로만 문장을 구성해야 한다.
- 피연산자는 반드시 양의 정수여야 한다
bool isOperator(char n)
{
switch (n){
case '+':
case '-':
case '*':
case '/':
return true;
}
return false;
}
bool isDigit(char n)
{
return '0'<= n && n <= '9';
}
int calculCharOp(int opd1, char oper, int opd2)
{
switch (oper)
{
case '+':
return opd1 + opd2;
case '-':
return opd1 - opd2;
case '*':
return opd1 * opd2;
case '/':
if(opd2 == 0) cerr << "divided by zero/n";
return opd1 / opd2;
}
return 0;
}
void main()
{
char buff[32];
cin >> buff;
char chOpr = 0;
int iOpd1 = 0, iOpd2 = 0;
for(int i = 0; buff[i] != 0; ++i)
{
if (isOperator(buff[i]))
chOpr = buff[i];
else if (isDigit(buff[i]))
chOpr == 0 ? iOpd1 = (iOpd1 * 10 + buff[i] - '0') : iOpd2 = (iOpd2 * 10 + buff[i] - '0');
}
cout << " = " << calculCharOp(iOpd1, chOpr, iOpd2);
}
사실 cin을 이용하면 다음과 같이 간단하게 시작할 수도 있을 것이다.
int iOpd1 = 0, iOpd2 = 0;
char chOpr = 0;
cin >> iOpd1 >> chOpr >> iOpd2;
cin의 경우 잘못된 입력을 처리하기도 쉽다.
'프로그래밍 > C, C++ 공부' 카테고리의 다른 글
문자열 상수는 어디에 저장될까? (0) | 2018.02.18 |
---|---|
scanf와 cin 의 비교 (0) | 2018.02.17 |
이중배열, N중배열 (0) | 2018.02.17 |
배열의 이름 (0) | 2018.02.16 |
C/C++의 컴파일러는 왜 배열의 크기를 알아야 할까? (0) | 2018.02.16 |