어딘가 말씀하신 것 그대로 실현시킨 컴포넌트가 있을 듯 하지만요 저는 모르는 관계로
제가 짠 소스하나를 드리겠습니다
조금 허접한 소스라 양해부탁드립니다;
수식을 사용자가 문자로 입력하면 연산자와 숫자를 구분해서
값을 내놓는 그런 함수입니다
님이 요구하시는 것이랑 비슷 한것 같아서 올립니다. 참고하시길
int ParenthO = 0;
bool TextCalculate(char* CalculateText, int *Result) //48은 char로 0을 지칭
{
if(!CalculateText) { *Result = 0; return true; }
char *Text = CalculateText;
int i = 0;
int Parenth = ParenthO;
while(1) {
if (Text[i] == NULL) {
if(Parenth>0) { ShowMessage("괄호입력 오류"); ParenthO = 0; return false; }
break;
}
else if(Text[i] == '(') Parenth++;
else if(Text[i] == ')') Parenth--;
if(Parenth<0) { ShowMessage("괄호입력 오류"); ParenthO = 0; return false; }
i++;
}
int Buff , Temp , NUM;
char BuffOp, TempOp;
UnicodeString UT;
BuffOp = NULL;
TempOp = NULL;
NUM = 0;
i = 0;
while(1) {
if ((Text[i] > 47) && (Text[i] < 58)) { UT = Text[i]; NUM = NUM*10 + UT.ToInt(); }
else if((Text[i]=='+') || (Text[i]=='-')) {
switch (BuffOp) {
case '+': Buff = Buff + NUM; break;
case '-': Buff = Buff - NUM; break;
case '*': Buff = Buff * NUM; break;
case '/': Buff = Buff / NUM; break;
default : Buff = NUM; break;
}
if(TempOp!=NULL) {
if (TempOp=='+') Buff = Temp + Buff;
else if(TempOp=='-') Buff = Temp - Buff;
TempOp = NULL;
Temp = 0;
}
BuffOp = Text[i];
NUM = 0;
}
else if((Text[i]=='*') || (Text[i]=='/')) {
switch (BuffOp) {
case '+': Temp = Buff; TempOp = BuffOp; break;
case '-': Temp = Buff; TempOp = BuffOp; break;
case '*': Buff = Buff * NUM; break;
case '/': Buff = Buff / NUM; break;
default : Buff = NUM; break;
}
BuffOp = Text[i];
NUM = 0;
}
else if((Text[i]=='(') || (Text[i]==')')) {
int *pNUM; pNUM = &NUM;
char *pText; pText = &Text[i+1];
if (Text[i]=='(') {
int s = i;
Parenth = 0;
while(1) {
if (Text[s]=='(') Parenth++;
else if (Text[s]==')') Parenth--;
if(Parenth==0) { i = s; break; }
s++;
}
ParenthO++;
TextCalculate(pText, pNUM);
}
else if(Text[i]==')') { ParenthO--;
switch (BuffOp) {
case '+': Buff = Buff + NUM; break;
case '-': Buff = Buff - NUM; break;
case '*': Buff = Buff * NUM; break;
case '/': Buff = Buff / NUM; break;
default : Buff = NUM; break;
}
if(TempOp!=NULL) {
if (TempOp=='+') Buff = Temp + Buff;
else if(TempOp=='-') Buff = Temp - Buff;
}
ParenthO = 0;
*Result = Buff;
return true;
}
}
else if(Text[i]==NULL) {
switch (BuffOp) {
case '+': Buff = Buff + NUM; break;
case '-': Buff = Buff - NUM; break;
case '*': Buff = Buff * NUM; break;
case '/': Buff = Buff / NUM; break;
default : Buff = NUM; break;
}
if(TempOp!=NULL) {
if (TempOp=='+') Buff = Temp + Buff;
else if(TempOp=='-') Buff = Temp - Buff;
}
ParenthO = 0;
*Result = Buff;
return true;
}
else { ShowMessage("숫자, 사칙연산과 괄호만 입력해주세요"); ParenthO = 0; return false; }
i++;
}
}
홀로롤로로로롤롤로로 님이 쓰신 글 :
: 방정식 프로그램을 짜고 있는데;
: x기능이 문제더라구요
: 지금으로썬 그냥 체크박스로 int 로 때웠는데
: 것보단 edit 에 x를 쓰면
: 숫자와 x를 가려
: int x 에 저절로 들어가는 것을 하려구 하는데요
: 도와주세요
|