C++中一个类型转换的问题。

//第一个
// Expression.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include"SeqStack.cpp"
using std::cout;
using std::endl;
using std::cerr;

double Operate(double a,char pre_op,double b);
char Precede(char pre_op,char ch);
double Expression_Eval();

int _tmain(int argc, _TCHAR* argv[])
{
double value=Expression_Eval();
cout<<value<<endl;
return 0;
}

double Expression_Eval()
{
SeqStack OPTR;
SeqStack OPND;
OPTR.Push('@');
char ch = getchar();
while(ch!='@' || OPTR.Top()!='@')
{
if(ch>='0' && ch<='9')
{
OPND.Push(ch-'0');
ch=getchar();
}
else
{
char pre_op = OPTR.Top();
switch(Precede(pre_op,ch))
{
case'<':
OPTR.Push(ch);
ch = getchar();
break;
case'=':
OPTR.Pop();
ch = getchar();
break;
case'>':
double b = OPND.Pop();
double a = OPND.Pop();
pre_op = OPTR.Pop();
OPND.Push(Operate(a,pre_op,b));
break;
}
}
}
return OPND.Top();
}

double Operate(double a,char pre_op,double b)
{
switch(pre_op)
{
case'+': return a+b;
case'-': return a-b;
case'*': return a*b;
case'/': return a/b;
default: cout<<"不能进行该运算。"<<endl;
}
return 0;
}

char Precede(char pre_op,char ch)
{
char operates[7][7] =
{
'>' , '>' , '<' , '<' , '<' , '>' , '>' ,
'>' , '>' , '<' , '<' , '<' , '>' , '>' ,
'>' , '>' , '>' , '>' , '<' , '>' , '>' ,
'>' , '>' , '>' , '>' , '<' , '>' , '>' ,
'<' , '<' , '<' , '<' , '<' , '=' , ' ' ,
'>' , '>' , '>' , '>' , ' ' , '>' , '>' ,
'<' , '<' , '<' , '<' , '<' , ' ' , '='
};
int x=0,y=0;
switch(pre_op)
{
case'+' :x=0;break;
case'-' :x=1;break;
case'*' :x=2;break;
case'/' :x=3;break;
case'(' :x=4;break;
case')' :x=5;break;
case'@' :x=6;break;
default:cerr<<"输入错误。"<<endl;
}
switch(ch)
{
case'+' :y=0;break;
case'-' :y=1;break;
case'*' :y=2;break;
case'/' :y=3;break;
case'(' :y=4;break;
case')' :y=5;break;
case'@' :y=6;break;
default :cerr<<"输入错误。"<<endl;
}
return operates[x][y];
}
//第二个
#ifndef SEQSTACK_H
#define SEQSTACK_H

template
class SeqStack
{
T data[MaxSize]; //存放栈元素的数组
int top; //栈顶指针,指定栈顶元素在数组中的下标
public:
SeqStack(); //构造函数
void Push(T x); //入栈
T Pop(); //出栈
T Top(); //取栈顶元素,元素并不出栈
bool Empty(); //判断栈是否为空
bool Full(); //判断栈是否满了
};

#endif
//第三个
#include "stdafx.h"
#include"SeqStack.h"
#include
using namespace std;

//初始化
template
SeqStack::SeqStack()
{
top=-1;
}

//入栈操作
template
void SeqStack::Push(T x)
{
if(top==MaxSize-1)
{
cerr<<"上溢。"<<endl;
exit(1);
}
++top;
data[top]=x;

}

//出栈,类似于删除
template
T SeqStack::Pop()
{
if(top==-1)
{
cerr<<"下溢。"<<endl;
exit(1);
}
int x=data[top];
top--;
return x;
}

//取出栈元素
template
T SeqStack::Top()
{
if(top==-1)
{
cerr<<"下溢。"<<endl;
exit(1);
}
return data[top];
}

//判断栈是否满了
template
bool SeqStack::Full()
{
if(top==MaxSize-1)
{
cerr<<"栈已经满了。"<<endl;
return true;
}
else
cout<<"未满"<<endl;
return false;
}

//判断栈是否为空
template
bool SeqStack::Empty()
{
if(top==-1)
{
cerr<<"栈为空。"<<endl;
return true;
}
return false;
}

5个回答

我已经把代码附全了,还望帮助!谢谢!

SeqStack.cpp 的源代码呢

你的测试用例实在看不出是因为后面被当作整除了,还是表达式没有对后面求值。代码不全也不好调试。

liyuanjinglyj
李元静 回复LightZeg: 问题动画1动画2效果不一样,动态代码无闪烁,XML动画闪烁,是两个动画不一样,不是处理延迟。这两个一样的动画,为什么会有不同的效果。这是问题
大约 5 年之前 回复
lfz_1912
白於青 我已经把代码附全了,还望帮助。
5 年多之前 回复

//第一个文件
#include "stdafx.h"
#include"SeqStack.h"
#include
using namespace std;

//初始化
template
SeqStack::SeqStack()
{
top=-1;
}

//入栈操作
template
void SeqStack::Push(T x)
{
if(top==MaxSize-1)
{
cerr<<"上溢。"<<endl;
exit(1);
}
++top;
data[top]=x;

}

//出栈,类似于删除
template
T SeqStack::Pop()
{
if(top==-1)
{
cerr<<"下溢。"<<endl;
exit(1);
}
int x=data[top];
top--;
return x;
}

//取出栈元素
template
T SeqStack::Top()
{
if(top==-1)
{
cerr<<"下溢。"<<endl;
exit(1);
}
return data[top];
}

//判断栈是否满了
template
bool SeqStack::Full()
{
if(top==MaxSize-1)
{
cerr<<"栈已经满了。"<<endl;
return true;
}
else
cout<<"未满"<<endl;
return false;
}

//判断栈是否为空
template
bool SeqStack::Empty()
{
if(top==-1)
{
cerr<<"栈为空。"<<endl;
return true;
}
return false;
}
//第二个文件
#ifndef SEQSTACK_H
#define SEQSTACK_H

template
class SeqStack
{
T data[MaxSize]; //存放栈元素的数组
int top; //栈顶指针,指定栈顶元素在数组中的下标
public:
SeqStack(); //构造函数
void Push(T x); //入栈
T Pop(); //出栈
T Top(); //取栈顶元素,元素并不出栈
bool Empty(); //判断栈是否为空
bool Full(); //判断栈是否满了
};

#endif

1+3/6 的结果正确的是:1。
如果想得到小数点后的结果,就需要将 3 或 6 强制转成 float 或 double。如:
1+ (float)3/6 或
1+ (double)3/6
因为数值的类型转换,默认是向精度较大的转换。如果都是 int 型,计算出来的结果就只是 int 型,没有小数。

91program
91program 回复lfz_1912: float 是需要写在代码里,不是让你输入的
5 年多之前 回复
lfz_1912
白於青 这根本不可能啊,我的输入都要做判断的,怎么能输入(float)这样的东西。会显示“输入错误”的。
5 年多之前 回复

代码不完整,用编辑框的第6个按钮贴你的代码

caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复lfz_1912: 代码还是不完整,用编辑框的第6个按钮贴你的代码,我说的你看明白么?
5 年多之前 回复
lfz_1912
白於青 我更新过了,上面是全部的代码了。别人是怎么上传源代码的啊?好漂亮。
5 年多之前 回复
立即提问
相关内容推荐