好好学习,天天向上T^T
代码写的很恶心很混乱尤其是没贴上来的。。所以只贴上来主要的一段T^T,
写窗口时想复习一下暑假的东西。。可是很明显我太高估自己记忆力了。一个月完全没怎么接触就忘得差不得一干二净,只好把之前的代码再仔细地瞅一遍了T^T
身边的人都是大神,压力好大甚至最近开始觉得睡午觉时间长了都是一种罪过T^T。。
瞬间觉得脑子不够用了,bug找了好长时间才发现果然是粗心惹的祸T^T【论:一个*p可以浪费的时间】
【就在刚才的一瞬间又把窗口给弄坏了。。。
===========分界线先生=============
思路:
1、 定义运算符高低顺序;
2、 将表达式以字符串的形式读入;
3、 分离运算数字和运算符号,数字进数字栈,运算符进运算符栈;
4、 若栈外运算符高于栈内,则入栈,否则运算符出栈,运算数出栈两个,运算后将结果压入运算数栈;
5、 左括号入栈,遇到右括号则一直出栈运算直至左括号出栈;
int Level(char op)///定义运算级别
{
int x;
switch(op)
{
case '+': x=2;break;
case '-': x=2;break;
case '*': x=3;break;
case '/': x=3;break;
case '(': x=1;break;
case '@': x=0;break;
}
return x;
}
int Cal(char op,int x1,int x2)///计算
{
int x;
switch(op)
{
case '+': x=x2+x1;break;
case '-': x=x2-x1;break;
case '*': x=x2*x1;break;
case '/': x=x2/x1;break;
}
return x;
}
int Process(char s[])///表达式处理及计算过程
{
char sop[100],*p;
char op;
int snum[100];
int top=0,tnum=-1;
int y,x1,x2;
sop[top]='@';
p=s;
while(*p)
{
if(*p>='0'&&*p<='9')
{
y=0;
while(*p>='0'&&*p<='9')/数字处理
{
y=y*10+(*p-'0');
p++;
}
snum[++tnum]=y;
}
else if((*p=='+')||(*p=='-')||(*p=='*')||(*p=='/'))
{
while(Level(*p)<=Level(sop[top]))
{
op=sop[top--];
x1=snum[tnum--];
x2=snum[tnum--];
snum[++tnum]=Cal(op,x1,x2);
}
sop[++top]=*p++;
}
else if(*p=='(')
sop[++top]=*p++;
else if(*p==')')
{
while(sop[top]!='(')
{
op=sop[top--];
x1=snum[tnum--];
x2=snum[tnum--];
snum[++tnum]=Cal(op,x1,x2);
}
top--;
p++;
}
else p++;
}
while(sop[top]!='@')
{
op=sop[top--];
x1=snum[tnum--];
x2=snum[tnum--];
snum[++tnum]=Cal(op,x1,x2);
}
return snum[tnum];
}
/*==================窗口处理========================*/
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}
return FALSE;
}
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
char a[1000],c[1000];
int Res;
switch(id)
{
case IDC_dy:
{
GetDlgItemText(hwnd,IDC_1,a,sizeof(a));
Res=Process(a);
itoa(Res,c,10);
SetDlgItemText(hwnd,IDC_3,c);
}
break;
default: break;
}
}
void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}
p.s.上述代码中无主函数