栈在计算部分的使用
在最开始写四则运算器的时候,想的就是随机生成不同的部分,然后每一部分分别计算,最后算出结果,但是生成不同的类型也要判断所以实现的过程会相当麻烦要不断的判断,所以就在想有没有其他的思路。通过百度和对学长的请教,得到了利用栈来计算表达式的思路。但是对于栈有没有接触过,所以也就是照猫画虎写出了一个能实现功能的代码。后来通过学习,有对原代码进行改进,最后就得到了这个(详解见注释)
double CalculateResult(char express[])
{
double a,b; //两个操作数
char opera; //运算符
char c; //字符变量
char x; //x用来获取运算符栈栈顶的运算符
stack<char> oper;
stack<double> data; //运算符栈栈顶的运算符,操作数栈
int j=0;
int i=0;
oper.push('='); //先将定界符(=)推入操作符栈
c = express[i++];
double num=0;
while(c!='=' || x!='=') //循环处理表达式中的每个字符
{
if(IsOperator(c)) //若是运算符
{
num = 0; //入栈之后清空某一个操作数的暂存值
switch(Priority(x,c))
{
case -1: //当前运算符c大于前一运算符x
//cout << "o----" << c << endl;
oper.push(c); //当前运算符进栈
c=express[i++]; //取表达式下一字符
break;
case 0: //括号(等号)配对
oper.pop(); //运算符左半部分出栈(抛弃)
c=express[i++]; //取表达式下一字符
break;
case 1: //当前运算符c小于等于前一运算符x
opera = oper.top(); //出栈之前取得栈顶元素
oper.pop(); //运算符出栈
b = data.top();
data.pop();
a = data.top();
data.pop(); //两个操作数出栈
double t = calculate(a,opera,b); //计算结果
if(t!=(int)t) //解决除0再乘零的情况
return 0.1;
else
data.push(t); //将结算结果入栈
break;
}
}
else if(c>='0' && c<='9') //若输入的是数字字符 入栈
{
num=c-'0';
data.push(num);
c=express[i++];
}
x = oper.top(); //获取运算符栈顶的元素
}
num = data.top();
StackClear(oper);
StackClear(data); //清空两个栈
return num; //返回数字栈栈顶元素,即为计算结果
}
界面编程探索
刚开始看到这个要求也是蛮好奇的,开启了新世界的大门。我们之前写的程序在运行时出现的黑框DOS窗口是界面的一种。作为最基础的一种运行窗口,黑黑的界面不是很美观。后来通过对界面编程的研究之后,其实这就是通过编程设计出自己想要的操作界面。参考教程有一些,其中比较全面的请看
看了之后有了大致的概念之后,想着要是直接改四则运算器可能不太现实,那就先写一个最简单的两个数的运算吧……虽然只是照猫画虎,但是还是出现了一些问题。
我是用的是VS的MFC程序,按照步骤来应该没有什么问题,但是其中出现了不少问题,问了很多同学之后慢慢找到了解决方法,现在正在摸索,我会继续更新这次的关于界面编程的内容的。