当前位置:文档之家› C++ 科学计算器-课程设计报告

C++ 科学计算器-课程设计报告

str+=insert_char;
screen.SetWindowTextW(str);
have_num=true;
have_point=true;
}
// TODO:在此添加控件通知处理程序代码
}
四则运算按钮事件加法为例
void C计算器Dlg::OnBnClickedadd()
{
if(have_num||have_left) //判断条件,运算符必须在数字后与右括号后
//栈的实现
//初始化
stack::stack(int len)
{
lengh=len;
date=new double[len];
date[0]=0;
top=0;
}
stack::stack()
{
date=new double[100];
date[0]=0;
top=0;
}
//判断为空
bool stack::is_empty()
result=cal.eval(char_arr,char_arr+lengh);
if(cal.geterror()=="null")
{
str.Format(_T("%g"),result);
screen.SetWindowTextW(str);
}
else
{
MessageBox(cal.geterror());
if(str.GetLength()!=0)
{
check_char(str); //删除前检查一下
str=str.Left(str.GetLength()-1);
screen.SetWindowTextW(str);
}
else
{
have_num=false;
}
// TODO:在此添加控件通知处理程序代码
have_left=true;
}
// TODO:在此添加控件通知处理程序代码
}
有括号
void C计算器Dlg::OnBnClickedleft()
{
if(have_left)
{
insert_char=')';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
have_right=false;
// TODO:在此添加控件通知处理程序代码
}
0~9的数字按钮的单击事件
void C计算器Dlg::OnBnClickedOne()
{
insert_char='1';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
{
return false;
}
}
检查括号是否使用正确
bool calculator::check_bracket(char *q)
{
int flag1=0,flag2=0;
while(*q!='\0')
{
if(*q=='(')
{
flag1++;
}
if(*q==')')
{
flag2++;
}
q++;
}
if(flag1!=flag2) //若左括号不等于有括号,出错返回真,正确返回假
美观的视觉效果。
截图
界面:
计算演示:
结果:
错误判断:
数据结构:应用了栈,做数值缓存,应用了递归处理括号内算式。
其他知识:mfc界面设计;c++类的封装(.h与.cpp分离)。
编译环境:使用了vs2012,通过修改vs2010也可以打开。
(注:eval的代码在下面。。。)
功能实现原理与代码:
{
if(is_num(*head))
{
number1=atof(head); //char*转换为浮点型
while(is_num(*head))
{
head++;
}
head--;
}
if(*head=='+'||*head=='-'||*head=='*'||*head=='/') //替换op
{
op=*head;
have_num=true;
have_op=false;
// TODO:在此添加控件通知处理程序代码
}
小数点按钮事件
void C计算器Dlg::OnBnClickedpoint()
{
if(!have_point && have_num)
{
insert_char='.';
screen.GetWindowTextW(str);
if(error=="null")
{
while(!s.is_empty()) //将栈内所有数累加得出结果
{
number2 = s.pop();
number1 += number2;
}
return number1;
}
else
{
return 0;
}
}
错误获取
CString calculator::geterror()
{
have_point=false; //这些变量是为了;
have_num=false; //尽量使用户输入的;
have_op=false; //公式合法;
have_right=false; //但是还是有点问题;
have_left=false; //不能用键盘输入。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
if(flag=='+'||flag=='-'||flag=='*'||flag=='/')
{
have_op=false;
}
else if(flag=='.')
{
have_point=false;
}
else if(flag=='(')
{
have_left=false;
}
else if(flag==')')
{
insert_char='+';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
have_num=false;
have_op=true;
}
// TODO:在此添加控件通知处理程序代码
}
括号按钮事件
void C计算器Dlg::OnBnClickedright()
have_num=false;
have_right=true;
}
// TODO:在此添加控件通知处理程序代码
}
等号事件
void C计算器Dlg::OnBnClickedequal()
{
int lengh;
screen.GetWindowTextW(str);
c_str2char_arr(str);
lengh=strlen(char_arr);
{
have_right=false;
}
else if('0'<=flag&&flag<='9')
{
if(flag2<='0'||flag2>='9')
{
have_num=false;
}
}
}
删除按钮事件
void C计算器Dlg::OnBnClickeddel()
{
screen.GetWindowTextW(str);
}
清空函数
void C计算器Dlg::OnBnClickedclear()
{
screen.GetWindowTextW(str);
str.Format(_T(""));
screen.SetWindowTextW(str);
have_num=false;
have_point=false;
have_left=false;
}
head++;
}
number1=eval(p,--head); //递归调用
}
if(op=='+') //加法存入栈
{
s.push(number1);
}
if(op=='-') //减法存入目标的负数
{
s.push(-number1);
}
if(op=='*') //遇到乘法进行计算,结果进栈
{
number2=s.pop();
{
return true;
}
else
{
return false;
}
}
解析算式
double calculator::eval(char *head,char *end)
{
stack s;
相关主题