컴공 일기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를 선물하세요.
-
면접 평타친다는 가정하에 붙는 점수였나요?
-
웃김 ㅋㅋ 장이수 하드캐리
-
[속보] 형제자매에게 유산상속 강제' 유류분 제도 위헌 2
형제자매에게 유산상속 강제' 유류분 제도 위헌
-
셤 끝 0
오늘은 놀고 낼부터 다시 공부해야지..
-
원래 30분 발표인데 내가 마지막 순서니까 20분만 하고 일찍 끝내야지 야강이니까...
-
그리고 체감상 대여섯명 넘으면 그 안에 소그룹? 같은거 생기면서 소외되는 사람 나타나는거 같음
-
재밌었당! 무서운거 첨 타봄..! 신나서 눈 훼까닥해가지구 무서운 거면 줄 잔뜩...
-
영어 내신 문제 14
이런 식으로 만드는 거 맞나요?? ㅠㅠ 과외생 곧 시험이라 문제라도 만들어주려고...
-
드디어 책이 도착했음!!! 방금 언박싱하고 갑자기 자랑하고 싶어짐요 다시 공부 갈기러 감
-
공하...싫! >< 이런 느낌이랄까 ㅈㅅ
-
맨날 전원정답 아니면 복수정답 엔딩이었음..
-
이 둘은 뭐가 다를까 어차피 지식이 내 머리에 들어오는 거니까 똑같은 줄 알았는데...
-
황밸이 고대 스모빌=설사과대 고컴=설인문 연대 디스플레이=서울대 심리...
-
이의제기했는데 내일 한문제만 재시친다함 300명한테 욕먹는중 ㅅㅂ.
-
그럼 나는 몇점..?
-
국어4등급 사람 한 명 살린다 치고 도와주세요ㅠㅠㅠㅠㅠ 4
국어 내신은 강남8학군에서 2322(고1중간부터 고2기말)로 문학 개념어나 어휘같은...
-
옷질,노래.춤,사교성 등등 제로부터시작해서 힘들었지만 웃는연습하는게 젤힘들었음..
-
계란만 들어갔거나 해봐야 햄치즈만 추가된 젤 기본 토스트라고 생각함 반박 안받음
-
본인의 계획 3
1. 25수능으로 최저 맞춰서 지방의나 지방한을 들어간다. (의는 모르겠는데 한은...
-
ㅇㄷ감
-
레전드 공하싫 5
반드시 쓰는데 공하싫..
-
문과 경희 시립 1
동일 과 기준
-
솔직히 새학기시즌 때 술자리 한개도 안나가도 괜찮음 17
친구는 어떻게든 한명 이상이 생기기 때문에..
-
정말..
-
현 고1이고 작년 기준으로 대략 고3 모고 국영수 2~3나왔고 물지는 1~2나왔어요...
-
왜 대기업 취업 안하고 학원강사해? 그거 전망 안좋잖아? 왜 물리 강사를해?...
-
정말 안괜찮은데 교차로 문과가면 힘들텐데 그거 무시하고 학교 레벨만 높이려는 사람들...
-
R&D 삭감 한방으로 문이과 격차를 줄여버림 뭔가 이상한거 같지만 대석열 외치고 한잔해~
-
고2 고민 0
현 고2이고 모고 수학은 96,92점좀 늘 1등급인데 내신에서는 왜 3,4등급이...
-
대학가면 술자리 ㅈㄴ많지않아요? 내가 학생회하고 동아리 5개해서 그런건가
-
인싸가많으면 알아서 챙겨주지않음? 찐따가아닌이상 인싸많은곳가는게 이득아닌가요.
-
대학 옮겨도 못사귈려나
-
군대 7월에가면 0
12월에 들어오는 애들이랑 동기고 6월에 온사람이 선임이라는데 진짠가요
-
물리 전기력 1
23 09 문제 전기력 귀류법 말고는 방법 없나요 ??
-
클러치n 휴강 전까지 수1한거 같은데 휴강 끝나면 수2부터 하는건가요? 댓글 부탁드립니다!!
-
그래도 오늘 외진 겸 외출 다녀온만큼 앞으로도 열심히 하자. 화이팅:)
-
국어 > [리트 전개년 기출 언어이해] 2020 25~27 > [리트 전개년 기출...
-
그래도 이딴 성격에 좋은 친구 좋은 부모님 만났던거면 인복은 좋았던 것 같다
-
본인은 수의대>인설약>경한>지방약>>>>>>>>>>...
-
고삼현역입니다 우선 푸는 순서는 화작, 독서론 16분 독서 인문 지문 13분 문학...
-
중도 지하에 구석에 있는 책상에 맨날 앉아계신 아저씨 계신데 뭐죠 라는 글에 ‘그거...
-
근데 아싸 인싸 찐따 이런게 있다는게 신기하지않음? 7
똑같은사람인데.. 기가막히게 나뉨,,
-
연고서성한+중or경한 논술 다 쓸까 원래 연대냥대는 최저없어서 안썼었는데
-
시험기간엔 점심만 먹고 끝나는게 ㄹㅇ굿 오늘 순공 9시간 가야지
-
일단 확통이구요 수1,2파데 완강하고 킥오프하고있는데 너무안풀려요 개념을 이해해도...
-
재수생 임정환 0
문과 재수생입니다 3모 생윤 38 사문 44 4덮 42 41 4투스 35 38...
-
반수하면 거기로 가야겠다…
-
교차로 들어가려면 이과기쥰 정시 어느정도인가여
-
어차피 물2하는거 과학논술에도 써먹어야지
-
강의 듣다가 질문하고 싶은 내용이 있는데 수업에 관한 질문은 어디에 해야 하나요??...
첫번째 댓글의 주인공이 되어보세요.