Question #29591

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

bool die(const string &msg);

//stack class

class Stack{

public:

Stack();

void push(const double &val);

void push(const string &oper);

double popnum();

string popop();

double getopele();

double getnumele();

private:

static const unsigned MAX=30;

string opstack[MAX];

double numstack[MAX];

unsigned opele;

unsigned numele;

};

//operator type

struct OP{

string name;

void * func;

unsigned arity;

unsigned prec;

bool lass;

string descrip;

};

//operator table

OP op[]={{"+", add, 2, 4, true, "2+3 is 5"},

{"-", subtract, 2, 4, true, "2-3 is -1"},

{"*", multiply, 2, 6, true, "2*3 is 6"},

{"/", divide, 2, 6, true, "2/3 is 0.666666..., div by 0 illegal"}};

unsigned OPELE =sizeof(op)/sizeof(op[0]);

//operators

bool add(double &r, double &x, double &y);

bool subtract(double &r, double &x, double &y);

bool multiply(double &r, double &x, double &y);

bool divide(double &r, double &x, double &y);

//Manip

unsigned findindex(string token, OP op[], unsigned OPELE);

bool parse(double &t, const string &token);

bool evaluate(double &result, string line);

bool weird(double x);

int main(){

for(string line; getline(cin, line);){

if(line=="QUIT") break;

if(line.empty()) continue;

if(line=="DOC")

for(unsigned i=0; i<OPELE; i++)

cout<<op[i].name<<" | "<<op[i].descrip<<'\n';

double result;

if(evaluate(result, line)){

cout<<result<<'\n';

}else{

cout<<"Could not understand input\n\n";

}

}

}

Stack::Stack(){

opele=0;

numele=0;

}

void Stack::push(const double &val){

if(MAX) die("Stack Overflow");

numstack[numele++]=val;

}

void Stack::push(const string &oper){

if(MAX) die("Stack Overflow");

opstack[opele++]=oper;

}

double Stack::popnum(){

if(!numele) die("Stack Underflow");

return numstack[--numele];

}

string Stack::popop(){

if(!opele) die("Stack Underflow");

return opstack[--opele];

}

double Stack::getopele(){

return opele;

}

double Stack::getnumele(){

return numele;

}

bool add(double &r, double &x, double &y){

double t = x + y;

if( weird(t) ) return false;

r = t;

return true;

}

bool subtract(double &r, double &x, double &y){

double t = x - y;

if( weird(t) ) return false;

result = t;

return true;

}

bool multiply( double & r, double& x, double &y ){

double t = x * y;

if( weird(t) ) return false;

result = t;

return true;

}

bool divide( double & result, double &x, double &y ){

double t = x / y;

if( weird(t) ) return false;

result = t;

return true;

}

unsigned findindex(string token, OP op[], unsigned OPELE){

for(unsigned i=0l i<OPELE; i++)

if(op[i].name==token)

return i;

return UINT_MAX;

}

bool parse(double &t, const string &token){

istringstream sin( token );

double t;

if( !(sin >>t) ) return false;

char junk;

if( sin >>junk ) return false;

value = t;

return true;

}

bool evaluate(double &result, string line){

istringstream sin(line);

Stack s;

for(string token; sin>>token;){

double t;

if(parse(t, token)){

s.push(t);

}else if(

}

}

bool weird( double x ){

return x != x || x != 0 && x == 2*x;

}

#include <string>

#include <sstream>

using namespace std;

bool die(const string &msg);

//stack class

class Stack{

public:

Stack();

void push(const double &val);

void push(const string &oper);

double popnum();

string popop();

double getopele();

double getnumele();

private:

static const unsigned MAX=30;

string opstack[MAX];

double numstack[MAX];

unsigned opele;

unsigned numele;

};

//operator type

struct OP{

string name;

void * func;

unsigned arity;

unsigned prec;

bool lass;

string descrip;

};

//operator table

OP op[]={{"+", add, 2, 4, true, "2+3 is 5"},

{"-", subtract, 2, 4, true, "2-3 is -1"},

{"*", multiply, 2, 6, true, "2*3 is 6"},

{"/", divide, 2, 6, true, "2/3 is 0.666666..., div by 0 illegal"}};

unsigned OPELE =sizeof(op)/sizeof(op[0]);

//operators

bool add(double &r, double &x, double &y);

bool subtract(double &r, double &x, double &y);

bool multiply(double &r, double &x, double &y);

bool divide(double &r, double &x, double &y);

//Manip

unsigned findindex(string token, OP op[], unsigned OPELE);

bool parse(double &t, const string &token);

bool evaluate(double &result, string line);

bool weird(double x);

int main(){

for(string line; getline(cin, line);){

if(line=="QUIT") break;

if(line.empty()) continue;

if(line=="DOC")

for(unsigned i=0; i<OPELE; i++)

cout<<op[i].name<<" | "<<op[i].descrip<<'\n';

double result;

if(evaluate(result, line)){

cout<<result<<'\n';

}else{

cout<<"Could not understand input\n\n";

}

}

}

Stack::Stack(){

opele=0;

numele=0;

}

void Stack::push(const double &val){

if(MAX) die("Stack Overflow");

numstack[numele++]=val;

}

void Stack::push(const string &oper){

if(MAX) die("Stack Overflow");

opstack[opele++]=oper;

}

double Stack::popnum(){

if(!numele) die("Stack Underflow");

return numstack[--numele];

}

string Stack::popop(){

if(!opele) die("Stack Underflow");

return opstack[--opele];

}

double Stack::getopele(){

return opele;

}

double Stack::getnumele(){

return numele;

}

bool add(double &r, double &x, double &y){

double t = x + y;

if( weird(t) ) return false;

r = t;

return true;

}

bool subtract(double &r, double &x, double &y){

double t = x - y;

if( weird(t) ) return false;

result = t;

return true;

}

bool multiply( double & r, double& x, double &y ){

double t = x * y;

if( weird(t) ) return false;

result = t;

return true;

}

bool divide( double & result, double &x, double &y ){

double t = x / y;

if( weird(t) ) return false;

result = t;

return true;

}

unsigned findindex(string token, OP op[], unsigned OPELE){

for(unsigned i=0l i<OPELE; i++)

if(op[i].name==token)

return i;

return UINT_MAX;

}

bool parse(double &t, const string &token){

istringstream sin( token );

double t;

if( !(sin >>t) ) return false;

char junk;

if( sin >>junk ) return false;

value = t;

return true;

}

bool evaluate(double &result, string line){

istringstream sin(line);

Stack s;

for(string token; sin>>token;){

double t;

if(parse(t, token)){

s.push(t);

}else if(

}

}

bool weird( double x ){

return x != x || x != 0 && x == 2*x;

}

Expert's answer

Dear visitor

What do you need to be done? Please, give us the details so we could help you

What do you need to be done? Please, give us the details so we could help you

Learn more about our help with Assignments: C++

## Comments

Bilal01.05.13, 15:26Sir its a simple program (printf and scanf )statement but I didnot understand please help me Q:A computer Company produce 3291 computers in 2010. Its priduction increases by 12%.In how many years will production exceed 8000 computers per years?

## Leave a comment