1 鱼币
一个计算器,只能顺序计算之后的值,不支持括号。。。
话说加括号就要全部推翻重改程序了吧。。。
代码中有多处重复和不合理的地方。。。
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/
#define PLEASE 1
#define ADD '+'
#define SUB '-'
#define MUL '*'
#define DIV '/'
#define TRUE 1
#include <iostream>
#include <string>
#include <math.h>
#include <stdlib.h>
class caclu
{
private:
float result;
std::string buffer;
public:
void pleaseinput(void);
void sayhello(void);
void error(void);
void outputresult(void);
void thank(void);
bool getbuffer(void); //此处接受从键盘输入的命令
bool judege_process(void); //数据处理(核心)
bool process(bool flag);
caclu():result(0.0){}
};
void caclu::thank(void)
{
std::cout<<"thank you !see you!"<<std::endl;
}
void caclu::sayhello(void)
{
std::cout<<"the result is>> "<<result;
}
void caclu::pleaseinput(void)
{
std::cout<<"please input command:";
}
void caclu::error(void)
{
std::cout<<"symtax error!!"<<std::endl;
result=0;
//错误处理!
}
bool caclu::getbuffer(void) //每次进行输入的时候只需要使用这个函数不需要使用pleaseinput函数。
{
sayhello();
std::cout<<std::endl;
pleaseinput();
std::getline(std::cin,buffer);
return 1;
}
bool caclu::process(bool flag) /*函数的目的是处理缓冲区的数据*/
{
char temp='?';bool late=0;flag=0; /*buffer存放现在指针所指的数的
前一个运算符,num存放加数,late指示
如果当前为字符的话late为那个字符*/
for(std::string::iterator i=buffer.begin();i!=buffer.end();i++)
{
if(!((*i=='+'||*i=='-'||*i=='*'||*i=='/')||((*i>='0'&&*i<='9')||(*i=='.')))){error();return 0;}
std::string::iterator front,end;
if(*i=='+'||*i=='-'||*i=='*'||*i=='/'){late=1;temp=*i;} //如果为字符则判断上一个是不是也是字符
else late=0;
if((late==flag)&&flag==1){error();return 0;}
if((*i>='0'&&*i<='9')||(*i=='.')) //如果为数则进行复杂的处理
{
{
float sum(0);
front=i;
for(;(*i>='0')&&(*i<='9')||(*i=='.');i++)
{
end=i;
}
std::string cacluate(front,end+1);
int times=0;bool sign=0;int time=0 ; //启用一个新的string变量存放数
for(std::string::iterator k=cacluate.begin();k!=cacluate.end();k++)
{
if(*k=='.'){sign=1;times++;continue;}
if(!sign)sum=sum*10+(*k-48);
else
{
time++;
sum=sum+(*k-48)/pow(10,time);
}
if(times>=2){error();return 0;}
}
switch (temp)
{
case '+':result+=sum;break;
case '-':result-=sum;break;
case '*':result*=sum;break;
case '/':result/=sum;break;
case '?':result=sum;break;
default:std::cout<<"wrong!!!!!!!!!!!!!!!!!!!!!!!!";
}
}
i--;
}
flag=late;
}
}
bool caclu::judege_process(void) /*这个函数的作用是处理缓冲区里面的string并且处理其中数据*/
{
short flag=0;
if(buffer[0]=='+'||buffer[0]=='-'||buffer[0]=='*'||buffer[0]=='/')flag=1; //若为运算符将标志致1
else if((buffer[0]>='0' && buffer[0]<='9')||buffer[0]=='.')flag=0;
else if (buffer[0]=='q'){thank();exit(0);}
else{error();return 0;}
if(process(flag)==0)return 0;
return 1;
}
int main(void)
{
caclu a;
while(TRUE){
if(!a.getbuffer()){std::cout<<"buffer unavaliable"<<std::endl;return 1;}
if(!a.judege_process())continue;
a.sayhello();
}
return 0;
}
我来回答