컴공 일기108
게시글 주소: https://orbi.kr/00057444833
스택이라는 자료구조로, 사칙 연산 계산기를 짠 프로그램입니다. C++로 작성된 것이긴 하지만, 기본적인 골자는 C언어로 표현해보고 참조를 한 코드입니다. 제가 짠 것은 아니고, 인터넷에서 잘 쓰여진 코드를 몇 개만 짜깁기해서 가져왔어요. 예술에서는 흔히 표절이 금지되곤 하지만, 개발에서는 표절이 예술을 만들어 낼 수도 있답니다.
가장 중요한 함수는 GetNextValue인 것 같습니다. 어제, 이 함수를 이해하는 데 8시간은 쓴 것 같거든요. 지금이야 이해 되지만, 굉장히 민감한 논리였습니다. (" " 띄어쓰기 또한 문자다) 덕택에, 문자열에 관한 논의들을 더 자세히 살펴볼 수 있는 기회가 되었네요.
Calculator.hpp
class Calculator {
private:
char NUM[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'};
enum symbol {
LEFT_PARENTHESES = '(',
RIGHT_PARENTHESES = ')',
MULTIPLY = '*',
DIVIDE = '/',
PLUS = '+',
MINUS = '-',
SPACE = ' ',
OPERAND
};
public:
unsigned int GetPriority(char op, int inStack);
bool isPrior(char op1, char op2);
bool isNum(char c);
};
Calculator.cpp
#include "Calculator.hpp"
unsigned int Calculator::GetPriority(char op, int inStack) {
unsigned int priority = -1;
switch(op) {
case LEFT_PARENTHESES:
if(inStack) priority = 3;
else priority = 0;
break;
case MULTIPLY:
case DIVIDE:
priority = 1;
break;
case PLUS:
case MINUS:
priority = 2;
break;
}
return priority;
}
bool Calculator::isPrior(char op1, char op2) {
return (GetPriority(op1, 1) < GetPriority(op2, 0));
}
bool Calculator::isNum(char c) {
for(int i=0;i<11;i++) {
if(NUM[i] == c) return true;
}
return false;
}
unsigned int Calculator::GetNextValue(char *__EXPRESSION__, char *value, int *type) {
unsigned int index = 0;
for(index=0;__EXPRESSION__[index] != 0;index++) {
if(isNum(__EXPRESSION__[index])) {
*type = OPERAND;
value[index] = __EXPRESSION__[index];
if(!isNum(__EXPRESSION__[index+1])) break;
} else {
*type = __EXPRESSION__[index];
value[index] = __EXPRESSION__[index];
break;
}
}
value[++index] = '\0';
return index;
}
double Calculator::Calculate(char *postfix__EXPRESSION__) {
LinkedListStack stack;
char *value = (char*)malloc(strlen(postfix__EXPRESSION__)+1);
unsigned int position = 0;
unsigned int length = (unsigned int)strlen(postfix__EXPRESSION__)+1;
int type = -1;
double result = 0;
char strResult[32];
while(length > position) {
position += GetNextValue(&postfix__EXPRESSION__[position], value, &type);
if(type == SPACE || type == -1 || type == '\0') continue;
if(type == OPERAND) {
stack.Push(stack.CreateNode(value));
} else {
Node *op2 = stack.Pop();
Node *op1 = stack.Pop();
double tempResult = 0;
memset(strResult, 0, 32);
switch(type) {
case MULTIPLY:
tempResult = atof(op1->Data) * atof(op2->Data);
break;
case DIVIDE:
tempResult = atof(op1->Data) / atof(op2->Data);
break;
case PLUS:
tempResult = atof(op1->Data) + atof(op2->Data);
break;
case MINUS:
tempResult = atof(op1->Data) - atof(op2->Data);
break;
}
gcvt(tempResult, 10, strResult);
stack.Push(stack.CreateNode(strResult));
stack.DestroyNode(op1);
stack.DestroyNode(op2);
}
}
result = atof(stack.Pop()->Data);
free(value);
stack.DestroyStack();
return result;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
인증 돌앗나 3
마려울지도
-
가능충안죄송합니다로 닉변한걸로 아눈데 왜 요즘 안보이심?
-
슉 7
조회 24 사람 많이 없어서 다행이네요
-
자퇴하실분 2
팀 자퇴 레쓰고
-
시즌2 미적분반 들어가려고 하는데 문제 난이도가 시중 문제집으로 치면 어느정도 될까요..??
-
ㄹㅈㄷ 능지
-
지전공도 전망이든 뭐든 제대로 모르는사람이 대다수일탠데 심지어 수험생이나...
-
아까글쓰던사람들 10
귀신같이 사라졋네..
-
어그로 ㅈㅅ 합니드 6모전까지 한완기 수1,수2,미적분 각각 3회독 빅포텐 시즌 1...
-
우우 노잼
-
ㅇㅈ 8
-
100000덬 모이면 얼굴깜 (진짜 되면 어떡하지 ㅅㅂㅅㅂ)
-
검사 법복 입고 법정 서고 싶음 근데 별로 공부할 머가리가 아닌거같고 적성도...
-
너무 쉽나 3
-
네
-
7급 외무영사직에서 학벌 많이 보나요? 공무원 인기 많던 7년전쯤에는 서성한이...
-
뭐했어 어? 뭐했노이기~
-
Log(-1) 2
=iπ
-
고2부터 정시 하겠다고 수능만 바라보면서 ㅈㄴ 달려서 원래 어떤 성격이었는지 인성이...
-
지난주돌아보기 0
-
본인한테 필요한/도움되는 강의는 한명한명 다 다르기 때문에 애초에 누군가한테 추천을...
-
원래 남는건가요? 남친 레이저 제모 한다길래
-
십려나 하 1
해설을 쳐 읽어도 이해가안되네
-
팔로워 자꾸 가지마세요 ㅠ 새르비여도 잡담 달게요....
-
지금 유동인구 어떤가요 맞팔구.
-
굿나잇 1
내일을 기약하며
-
ㅅㅂ 평소같았으면 걍 내가 양보하거나 별 생각 안하고 넘어갈 일인데 재수하니까...
-
뉴비때는 왜 덕코 달라는 사람들이 많은지 몰랏는데. 11
그냥 뭔가 많으면 기분 좋음
-
아니 뭐야 4
피터 힉스 박사님 별세하셨네.... 신의 입자를 발견한 자 R.I.P.
-
.. 3
..
-
ㅇㅈ 4
오전
-
제목이 다 근데로 시작하네
-
R is the only complete ordered filed 2
Up to isomorphism.
-
ㅈㄴ 고렙인 사람들은 교재나 강ㅇ의 사서 된건가요
-
그게 맞다 엄엄준식 화이팅
-
100명 추첨돌려서 3권 공짜로 사준다고함 벌써 17000명 몰려서 안될것 같긴한데...
-
엄 0
.
-
엄 19
ㅇ
-
성인되고 나니까 가끔 생각나더라..
-
히히 5
히히
-
인강 큐나 힘겹게 글쓰고 답변 달리는거 몇날 며칠 기다리느니 여기다 물어봐서...
-
투표
-
해석학 문제 풀이 13
엄밀한지는 보장 안함 먼저 모든 자연수 n에 대해 이므로 I는 Nested된...
-
솔직한 심정 24
요새 계속 오르비를 눈팅하게 되어서 이만 작별을 고해야 하나 고민중입니다.. 수능을...
-
ㅇㅈ 3
게임
-
현실에서 저런 애들 볼까봐 너무 무서움 내 공포의 근원임 ㄷㅅ ㅇㅂ 이런 데 가입한...
-
. 1
굿나잇 뽀뽀 쪽
-
재수 건동홍vs 재수+삼반수 중경외시 뭘 선택하실껀가요?
-
최애의아이 보고왔는데 15
카나 정실행동 뭔데
첫번째 댓글의 주인공이 되어보세요.