컴공 일기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를 선물하세요.
-
덕코복권 0
8000정도 있어서 다쓸생각으로 광클했는데 왜인지 모르게 늘어나있다...3등만...
-
고3입니다 제가 아직 국어 기출을 한 번도 돌린 적이 없어요 간쓸개같은 문제집만...
-
지문이해는 됬는데 문제가 어려웠던거임? 아니면 지문도 와장창 문제도 와장창이었던거임?
-
자랑 0
강아지 자랑
-
구라로점철됨
-
연세대 가고싶은데 ㅠㅠ
-
고2붕이 물리 0
물리노베 고2붕이 3개월동안 필수본+3순환+플랜비1,2 끝내는거 ㄱㄴ할까용?
-
체인쏘맨 보다가 오랜만에 그림 끄적임 프사로 제가 잘 쓰겠습니다
-
걍 공부좀 친다 이느낌인가,,?
-
님들 수학 서바 1
22 30 어려운거 맞죠? 수능에서는 이거보다 난이도 낮게 나올거같은디
-
수학 보고서 탐구 대회 2등이랑 과학경시대회 1등 중에 뭘 넣을까요? 과는...
-
우리가 점수가없지 가오가없어?
-
8시간 됐을때 쾌감오짐
-
강대K 0
진짜 개어렵네 진짜 서바관두고 강K로 이사갈까
-
잔다 1
0630칼기상
-
꼭 2학기는 모든과목 1등급으로 해서 1.3까지 올려야하는데 40일 과함? 고1
-
아직도 상품 준비중이네 홍수때문인가
-
그런데 너무 너무 너무 너무 너무 너무 너무 두꺼움
-
버스드라이버임
-
제2외국어 가장 빠르게 혹은 쉽게 준비할 수 있는 과목이 뭔가요 ? 0
한문 일본어 노베이스라 보심 됩니다 9평 끝나고부터 준비하려고 해요 프랑스어 생각...
-
수학 스킬 4
고1인데 내신에서 시간단축하려면 스킬 필요하다는데 ㄹㅇ인가요? 그리고 대치동...
-
2합 4라서 사탐을 하나 하려는데 사탐 뭘로 할까요? 생윤으로 할까 생각 중이긴...
-
논술80% 생기부 20% 보는 대학에서 일반고 기준으로 내신 몇등급이내면 발목 안잡히나요?
-
저랑 은선진t랑 독해스타일이 완전 똑같은데 둘이 비슷하다는 글을 봐서요
-
수완 0
수완 푸는게ㅜ좋나요?굳이 안풀어도 되는 과목 있을까요?
-
피자 또먹고 싶네용
-
선택은 확률과 통계인데 이건 겨울 방학 쯤에 기출 봐도 괜찮을 것 같아서 잠시...
-
쿨쿨
-
ㅈㄱㄴ
-
얼마 전에 법의 해석 어쩌구 문언 그대로 어쩌구 법률의 목적 어쩌구 중심부와 주변부...
-
예쁘신분 2
하
-
현우진 성대모가 0
ㄹㅇ 너무 똑같아서 울었어ㅠㅠ
-
이 시간이 됏네 ㅋㅋ.. 그래도 완벽하게 짠 거 같아서 기분 좋다 앞으로도 잘...
-
미친 12
문닫으러갔는데 개깜짝놀랬네진짜 울뻔했어
-
. 0
스터디 카페.. 지금 이 공간에 저 포함 두 명 나랑 내 앞에 앞에 자리에 앉은...
-
아니 뭔 절반을 틀리는 지문도 나옴 근데 해설을 들을수록 수능에서 이정도까진 묻지 않을거같은데
-
피곤해서 공부 많이 못했따.. 걍 과탐은 기말끝난다음에 하는걸로 하고 내신준비...
-
은근이 아니라 엄청 많이 몰려있는거같음ㄷㄷㄷㄷ
-
국어 1 수학높3 영1 탐구 만점 냥대 정치외교 ㅈㅂ
-
저는 개인적으로 김채원씨라고 생각하는데 요즘 너무 걸그룹들이 많더라고요...ㅋㅋㅋㅋ...
-
지금까지 1단원 개념 인강 다 들음
-
큐브 0
질문 받은 적 없는데 나 찜하는 건 뭐지 매크로인가
-
1/2랑 로그 사이에 플러스 왜 안 쓴거ㅜ실수..
-
역제곱 법칙은 광도자체가 다른걸 보면 의미가 없다는걸 생각하면서 221120은 같은...
-
진짜생각을많이했더니 14
이렇ㅎ게됨
-
f(g(x)) 극점 찾을 때 g(x)가 x=a일 때 극점이면 저 합성함수도 무조건...
-
저는 한국노래 주로 듣는데 이노래는 아련함+슬픔+잔잔함 모두 가지고 있더라고요....
-
ㄹㅇ
-
지우개 활용 팁 24
커터칼로 이렇게 사선으로 잘라 쓰면 뾰족한 부분으로 세밀한 수정(+를 -로 잘못...
첫번째 댓글의 주인공이 되어보세요.