+ -
当前位置:首页 → 问答吧 → 自己做的计算器,不过还没有界面化,大家有什么建议尽管提啊,希望共同进步

自己做的计算器,不过还没有界面化,大家有什么建议尽管提啊,希望共同进步

时间:2011-12-20

来源:互联网

[code=C/C++][/code]#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;


template <class T> // 链表节点 类
class Node
{
public:

Node() // default constructor
{
this->next = NULL;
}
Node(T data,Node<T> *next=NULL)
{
this->data = data;
this->next = next;
}
  // 声明为public类型是便于top的访问
T data;
Node<T> *next; //next指向的对象是Node<T>,而不是T类型的
};

template <class T>
class LinkedStack
{
public:
LinkedStack(); //default constructor
~LinkedStack();
bool isEmpty();
void push(T x);
T pop();
T getTop();
private:
Node<T> *top;
};

template <class T>
LinkedStack<T>::LinkedStack()
{
top = NULL;
}

template <class T>
LinkedStack<T>::~LinkedStack()
{
Node<T> *p = top;
Node<T> *q;
while(p!=top) //将编表所分配的空间一个一个给释放掉
{
q = p;
p = p->next;
delete p;
}
top = NULL;
}

template <class T>
bool LinkedStack<T>::isEmpty()
{
return top == NULL;
}

template <class T>
void LinkedStack<T>::push(T x)
{
top = new Node<T>(x,top); // 将链表给链接起来,并且更新top指向的位置
}

template <class T>
T LinkedStack<T>::pop()
{
if(!isEmpty())
{
T x = top->data;
Node<T> *p = top;
top = top->next;
delete p;
return x;
}
throw "空栈,不能执行出栈操作";
}

template <class T>
T LinkedStack<T>::getTop()
{
if(!isEmpty())
{
return top->data;
}
throw "空栈,不能获得栈顶元素";
}


string tochange(string expression) //非递归后序遍历,将输入的计算表达式按后续遍历的顺序放到postfix中去 逆波兰式
{
LinkedStack<char> stack; // 模板用char实例化了 
char postfix[100];
int i=0,j=0; char out;
while(expression[i]!='\0') //逆波兰式算法,将中序的算术表达式转化成为后续的式子
{
switch(expression[i])
{
case'+':
case'-':
while(!stack.isEmpty()&&stack.getTop()!='(')
{
postfix[j++] = stack.pop();
}
stack.push(expression[i++]);
break;
case'*':
case'/':
while(!stack.isEmpty()&&(stack.getTop()=='*'||stack.getTop()=='/'))
{
postfix[j++] = stack.pop();
}
stack.push(expression[i++]);
break;
case'(':stack.push(expression[i++]);
break;
case')':out = stack.pop();
while(!stack.isEmpty()&&out!='(')
{
postfix[j++] = out;
out = stack.pop();
}
i++;
break;
default:
while(expression[i]>='0'&&expression[i]<='9')
{
postfix[j++] =expression[i++];
}
}
}

while(!stack.isEmpty())
{
postfix[j++]=stack.pop();
}
postfix[j]='\0'; //将postfix数组最后补上\0,表示结尾
return postfix;
}


int value(string postfix) //计算
{
LinkedStack<int> stack; //模板用int实例化了,用于存放int型数据
int i=0;
int result = 0;
while(postfix[i]!='\0')
{
if(postfix[i]>='0'&&postfix[i]<='9')
{
result = 0;
result = result*10+postfix[i++]-'0';
stack.push(result);
}
else
{
int y = stack.pop();
int x = stack.pop();
switch(postfix[i])
{
case'+':result = x + y;
break;
case'-':result = x - y;
break;
case'*':result = x * y;
break;
case'/':result = x / y;
break;
}
stack.push(result);
i++;
}
}
return stack.pop();
}


int main()
{
cout<<"******************计算器******************"<<endl;
cout<<" (By Lby)"<<endl;
cout<<endl<<endl;
cout<<"请选择您想要执行的操作: 1. 从键盘输入 2. 从文件读取"<<endl;
int t;
cin>>t;
switch(t)
{
case 1:
string a;
getline(cin,a);
getchar();
string postfix = tochange(a);
cout<<a<<"=";
cout<<value(postfix)<<endl;
break;
case 2:
ifstream in;
ofstream out;
in.open("math.in");
out.open("result.out");
if(!in)
{
cerr<<"Fail to open the file,please check!!!"<<endl;
exit(0);
}
int i=0; int m=0;
string expression[100];
while(getline(in,expression[i++]));
m=i-1;
for(i=0;i<m;i++)
{
string postfix = tochange(expression[i]);
out<<expression[i]<<"=" ;
out<<value(postfix)<<endl;
}

in.close();
out.close();
}
return 0;




大家对程序有什么好的改进的地方,尽管提啊,自己第一次做的东西,是计算器,不过还没有界面化,各位大侠,有什么好的建议尽管提啊 ,不要吝啬,希望大家共同进步。。。

作者: liboyang66666   发布时间: 2011-12-20

用MFC做界面

作者: cbzjzsb123   发布时间: 2011-12-20

这么长的程序,顶一下楼主。

重新排一下版吧,看的够累的。

作者: mosaic   发布时间: 2011-12-20

规范一下代码

作者: gaochizhen33   发布时间: 2011-12-20

代码没有规范。。看的很累的

作者: bobye1230   发布时间: 2011-12-20

code=C/C++ 代码要粘贴到这个中间 /code

作者: yisikaipu   发布时间: 2011-12-20

控制台界面编程,这有本书非常适合你。。。
http://download.csdn.net/detail/wadeyz/3405252

作者: wadeyz   发布时间: 2011-12-20

MFC没学啊。。。
引用 1 楼 cbzjzsb123 的回复:

用MFC做界面

作者: liboyang66666   发布时间: 2011-12-21

多谢提醒啊,下次会注意的。。。
引用 5 楼 yisikaipu 的回复:

code=C/C++ 代码要粘贴到这个中间 /code

作者: liboyang66666   发布时间: 2011-12-21

好的,我会抽时间看的。。多谢
引用 6 楼 wadeyz 的回复:

控制台界面编程,这有本书非常适合你。。。
http://download.csdn.net/detail/wadeyz/3405252

作者: liboyang66666   发布时间: 2011-12-21