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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(have_op) //由于括号使用很灵活,情况很多一个have_op不能适应所有情况哦
{
insert_char='(';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
have_num=false;
}
}
检查将要删除的字符
void C计算器Dlg::check_char(CString the_c)
{
char flag,flag2;
flag=the_c.GetAt(the_c.GetLength()-1);
if(the_c.GetLength()==1)
{
flag2='+';
}
else
{
flag2=the_c.GetAt(the_c.GetLength()-2);
if(error=="null")
{
while(!s.is_empty()) //将栈内所有数累加得出结果
{
number2 = s.pop();
number1 += number2;
}
return number1;
}
else
{
return 0;
}
}
错误获取
CString calculator::geterror()
{
if(top==0)
{
return true;
}
return false;
}
//进栈
void stack::push(double number)
{
date[top++]=number;
}
//出栈
double stack::pop()
{
if(!is_empty())
return date[--top];
}
if(flag=='+'||flag=='-'||flag=='*'||flag=='/')
{
have_op=false;
}
else if(flag=='.')
{
have_point=false;
}
else if(flag=='(')
{
have_left=false;
}
else if(flag==')')
{
have_right=false;
}
else if('0'<=flag&&flag<='9')
{
if(flag2<='0'||flag2>='9')
{
have_num=false;
}
}
}
Βιβλιοθήκη Baidu删除按钮事件
void C计算器Dlg::OnBnClickeddel()
{
screen.GetWindowTextW(str);
{
insert_char='+';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
have_num=false;
have_op=true;
}
// TODO:在此添加控件通知处理程序代码
}
括号按钮事件
void C计算器Dlg::OnBnClickedright()
{
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) //若左括号不等于有括号,出错返回真,正确返回假
number2*=number1;
s.push(number2);
}
if(op=='/')
{
if(number1==0)
{
error="除数不为0"; //除数为0的判断
break;
}
number2=s.pop();
number2/=number1;
s.push(number2);
}
}
number1=0;
have_num=false;
have_right=true;
}
// TODO:在此添加控件通知处理程序代码
}
等号事件
void C计算器Dlg::OnBnClickedequal()
{
int lengh;
screen.GetWindowTextW(str);
c_str2char_arr(str);
lengh=strlen(char_arr);
//栈的实现
//初始化
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()
}
//calculator类(核心代码)
初始化
calculator::calculator()
{
error="null";
}
是否为数字
bool calculator::is_num(char num)
{
if(num<='9' && num>='0'||num=='.')
{
return true;
}
else
str+=insert_char;
screen.SetWindowTextW(str);
have_num=true;
have_point=true;
}
// TODO:在此添加控件通知处理程序代码
}
四则运算按钮事件加法为例
void C计算器Dlg::OnBnClickedadd()
{
if(have_num||have_left) //判断条件,运算符必须在数字后与右括号后
continue;
}
if (*head=='(')
{
if(check_bracket(head))
{
error="括号使用有问题";
break;
}
flag=1;
p=++head; //括号起始位置
while(flag)
{
if(*head=='(')
{
flag++;
}
if(*head==')')
{
flag--;
美观的视觉效果。
截图
界面:
计算演示:
结果:
错误判断:
数据结构:应用了栈,做数值缓存,应用了递归处理括号内算式。
其他知识:mfc界面设计;c++类的封装(.h与.cpp分离)。
编译环境:使用了vs2012,通过修改vs2010也可以打开。
(注:eval的代码在下面。。。)
功能实现原理与代码:
have_num=true;
have_op=false;
// TODO:在此添加控件通知处理程序代码
}
小数点按钮事件
void C计算器Dlg::OnBnClickedpoint()
{
if(!have_point && have_num)
{
insert_char='.';
screen.GetWindowTextW(str);
if(str.GetLength()!=0)
{
check_char(str); //删除前检查一下
str=str.Left(str.GetLength()-1);
screen.SetWindowTextW(str);
}
else
{
have_num=false;
}
// TODO:在此添加控件通知处理程序代码
DONGFANG COLLEGE,FUJIAN AGRICULTURE AND FORESTRY UNIVERSITY
课程名称:
堆栈计算器
系 别:
计算机
年级专业:
11级计算机科学与技术
学 号:
1150303040
姓 名:
蔡新云
任课教师:
林励
成绩:
2013

6

13

引言
堆栈计算器
简介:
计算带括号的数学算式,可以判断优先级,错误判断等功能。友好的操作界面,
}
清空函数
void C计算器Dlg::OnBnClickedclear()
{
screen.GetWindowTextW(str);
str.Format(_T(""));
screen.SetWindowTextW(str);
have_num=false;
have_point=false;
have_left=false;
}
CString转换成char*的函数
void C计算器Dlg::c_str2char_arr(CString c_str)
{
int lengh;
lengh=c_str.GetLength();
for(int i=0;lengh>=i;i++)
{
char_arr[i]=c_str.GetAt(i);
{
return true;
}
else
{
return false;
}
}
解析算式
double calculator::eval(char *head,char *end)
{
stack s;
int flag;
char *p;
double number1,number2;
char op='+';
for(;head<end;head++) //大循环
cal.seterror(_T("null"));
}
// TODO:在此添加控件通知处理程序代码
}
个人感想:
这次的课程设计让我学到了,团队合作的重要性,一个人的尽力有限,只有多个人互相协作,合理分工。这样才能提高效率。
{
if(is_num(*head))
{
number1=atof(head); //char*转换为浮点型
while(is_num(*head))
{
head++;
}
head--;
}
if(*head=='+'||*head=='-'||*head=='*'||*head=='/') //替换op
{
op=*head;
{
return error;
}
设置错误
void calculator::seterror(CString s)
{
error=s;
}
// 计算器Dlg.cpp : 实现文件
C计算器Dlg::C计算器Dlg(CWnd* pParent /*=NULL*/) //修改窗口类的析构函数,,就是初始化变量
: CDialogEx(C计算器Dlg::IDD, pParent)
have_right=false;
// TODO:在此添加控件通知处理程序代码
}
0~9的数字按钮的单击事件
void C计算器Dlg::OnBnClickedOne()
{
insert_char='1';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
have_left=true;
}
// TODO:在此添加控件通知处理程序代码
}
有括号
void C计算器Dlg::OnBnClickedleft()
{
if(have_left)
{
insert_char=')';
screen.GetWindowTextW(str);
str+=insert_char;
screen.SetWindowTextW(str);
result=cal.eval(char_arr,char_arr+lengh);
if(cal.geterror()=="null")
{
str.Format(_T("%g"),result);
screen.SetWindowTextW(str);
}
else
{
MessageBox(cal.geterror());
}
head++;
}
number1=eval(p,--head); //递归调用
}
if(op=='+') //加法存入栈
{
s.push(number1);
}
if(op=='-') //减法存入目标的负数
{
s.push(-number1);
}
if(op=='*') //遇到乘法进行计算,结果进栈
{
number2=s.pop();
{
have_point=false; //这些变量是为了;
have_num=false; //尽量使用户输入的;
have_op=false; //公式合法;
have_right=false; //但是还是有点问题;
have_left=false; //不能用键盘输入。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
相关文档
最新文档