8월 9일 오늘 과제가 주어졌다
사칙연산을 해주는 프로그렘을 만들되
-문자열 길이에 제한이 없고
-괄호와 곱셈 나눗셈의 우선순위를 생각하여
컴퓨터가 아닌 직접 답을 구하는 것 처럼 계산하는 프로그렘이다
힌트는 제귀함수
가장 먼저 생각건
string -> string으로 괄호를 제거해주는 재귀함수를 만들자
였다
입력값이 정상적이라고 가정할때
문자열을 받아
괄호가 없다면, 정상적인 계산을 하고
괄호가 있다면, 괄호 내부의 부분 문자열을 다시 재귀함수로 보내는 방식을 생각했다.
1. 괄호 분리 재귀 함수
2. 계산 함수
두개를 통해 문제를 해결하려했다
결론부터 말하면
+와 -까지의 연산은 잘 완성된 것 같다
하지만 *와 /의 우선순위를 높게 잡는 방법은 전혀 생각이 나지 않아
일단 여기까지 완성한 코드를 올리겠다
#include <iostream>
#include <stack>
#include <sstream>
std::string calculate(const std::string& expression) {
std::stringstream ss(expression);
int sum = 0;
int num;
char op = '+';
while (ss >> num) {
if (op == '+') {
sum += num;
}
else if (op == '-') {
sum -= num;
}
char nextop;
if (ss >> nextop) {
op = nextop;
}
else {
ss.unget();
}
}
return std::to_string(sum);
}
std::string antiGH(std::string& expression, size_t start, size_t end) {
std::string result;
std::stack<int> s;
for (size_t i = start; i < end; i++) {
char ch = expression[i];
if (ch == '(') {
s.push(i);
}
else if (ch == ')') {
if (!s.empty()) {
int start = s.top();
s.pop();
if (s.empty()) {
int end = i;
std::string inside = antiGH(expression, start + 1, end);
std::string left = expression.substr(0, start);
std::string right = expression.substr(end + 1, expression.length() - end - 1);
result = left + inside + right;
}
}
}
}
if (result.empty()) {
result = calculate(expression.substr(start, end - start + 1));
}
return result;
}
int main(void) {
std::string str;
std::cout<<"math lets go : ";
std::getline(std::cin, str);
std::string result = antiGH(str, 0, str.length());
std::cout<<calculate(result)<<std::endl;
}
이번 과제를 통해
- C++에서 string 이용 방법
- stringstream이란?
- C++의 '참조변수' (&표현)
에 대해 한번씩 훑어 보는 기회를 가졌다
antiGH 함수는 괄호를 없애주는 재귀함수이다
calculate 함수는 문자열에 괄호가 없다면 시작되는 계산 함수이다
특히 stringstream 이라는 아주 독특한 친구가
아주 독특한 일을 한다는 것을 알았다
Python, Java, C에서 보지 못한
이상한 것들이 많은 것 같다
'개인공부' 카테고리의 다른 글
콜드부팅이란? (1) | 2023.09.18 |
---|---|
C#은 리버스가 된다?? (0) | 2023.09.18 |
연결 리스트 (0) | 2023.08.16 |