컴공 일기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
하
-
빨리 기출 2회독을 해야겠음
-
기상 2
시발
-
모의고사 풀 세트 형식인가요 아님 문제들이 독립적으로 배치되어있나요? (쉬운...
-
빨리 3
내 방으로와 지금 아무도 없어
-
92점(19,20틀) 씨발
-
걍 한마디만 함 1
잠
-
이거 30분동안 해설해야하는데 진짜 10분이면 설명 끝날거같은데 어카지 걍 빠르게빠르게 할까
-
방광암 걸리면 죽나요 11
할머니가 걸렸다곤 하는데 아직 정밀검사를 해본건 아닌듯요.전이랑 하혈이 좀 됐다곤...
-
나는 한완수로 기출 4회독 째 하러감
-
하.. 양으로 밀고가보게 주간지벅벅벅ㅂ거겁더거겁벅ㄷ법ㄷㄱ할건데...
-
헤ㅔㅎ 어삼쉬사
-
쎈인가
-
이근갑 4
왠지 헷갈릴때 에..그래서 이거 답이 이근갑? 하고 갸웃갸웃할꺼 생각하니까...
-
우울해서 6
빵삿어
-
동사 ox 0
(가) 정부는 조선과 약조 체결 이후 부산포, 염포, 제포 등에는 세견선이 50척,...
-
나는 어려운 3점 쉬운 4점 기출 모아놓은 기출문제집인줄 알았는데 아니었네...
-
07 현역이고 국어 1~1.5(?) 등급 정도고 기출은 4-5회독 정도 했고 아직...
-
강은양 정규반 0
지금 강은양 정규 라이브반 들어가도 무리 없을까요?
-
3모, 5모 84점인 현역 학생입니다. 지금 4의규칙 시즌1 풀고 있는데 중간중간에...
-
수학의 본질을 물어보는 문제들이 많음 사설 N제하고는 또 다른느낌이라 재밌기도 하고
-
그냥불러봣슴
-
덥춥
-
님들님들!!!! 1
ㄱㅁ ㄴㄴ
-
코코이낸내
-
저녁도머것겟다 5
멋지게 자볼가 흐흐흐흐흐 책상에 앉기가 힘드내
-
무한 반복임 이거왜이럼?
-
뒤에 없음? 아니 내가풀어야하느데 지가 다풀고 해설해둠
-
증량을 할까 0
재수땐 콘서타빨이었나 그땐 한 54미리 먹었던 거 같은데 지금은 콘서타가 없어서...
-
마을을 위해 헌신하신 나뭇잎의 빛들이여...오늘도 감사하며 살아갑니다.....
-
공부 어케 하나요
-
인문이라서 이번에 스투 반수반 붙었는데 거기에선 시대 단과 추가로 듣는 경우도...
-
ㄹㅇ 함 해보고 싶다는 생각까지 듬 근데 시간 없음
-
아니 70점은 넘길 수 있을까 아니 60점은 넘길 수 있을까 ...
-
15분 안에 풀 자신이 없어서 찍을숫자 구함
-
사탐설의 도전. 9
응원점여
-
국내선 '펀쿨섹좌'로 유명한 이분…日 농림상 되더니 "즉석밥도 사봤다" 1
고이즈미 준이치로 전 일본 총리의 차남인 고이즈미 신지로 중의원이 일본의 신임...
-
더 재미없어서 오십배로 어려울 듯
-
과탐 어려움 4
재미도 없어가지고 열배로 어려운거 같음 수능에서 국어보다 재미없는게 잇을 줄 상상도...
-
부럽다 8
부러워하면 안된다는 걸 아는데 나랑 애초에 급이 다르다는 걸 아는데 태생이 다르다는...
-
6모는 어렵고 9모는 쉬운거 맞죠?
-
유튜브 보는데 한 번 읽고 지문 안돌아가고 풀기 공부법 있던데 뇌지컬 좀 올라가나요?
-
개념기출 1회독 후 5덮 응시 47 ㅋㅋㅋㅋ
-
서성한? 중경? 로스쿨은 학교 최대한 높이는게 최고인건 알고있는데 마지노선이 어딘지 궁금해서요!
-
확통 62 / 22 84점 표점 몇 나오셨나요??
-
한쪽은 빨강 응원단이 한쪽은 파랑 응원단이 서로 목소리 높여가며 응원중 의자에...
-
1인실이고 불켜져 있는거보니까 사람들이 아니 분명 한 20명정도있는데 인기척이 아예...
-
대체 왜 07이 현역인건데
첫번째 댓글의 주인공이 되어보세요.