출처 : 난 정말 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의 경우 잘못된 입력을 처리하기도 쉽다.