Hej alle sammen. Jeg har fået til opgave at lave en lommeregner der kan forstå parenteser. Jeg har skrevet koden, men nu skal den bare testes. Koden indeholder: en ccp-fil, og 4 h-filer.
Koderne jeg har lavet er:
lommeregner.main.cpp (er på forhånd givet):
#include "Expr.h"
#include "Num.h"
#include "BinOp.h"
#include "Operator.h"
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using std::cout;using std::endl;
int main()
{
std::vector<Expr *> expressions;
Num num5(5);
Num num4(4);
Num num3(3);
Num num2(2);
Num num1(1);
Num num0(0);
Plus ex_plus2_5( &num2, &num5 );
Minus ex_minus( &ex_plus2_5, &num1 );
Mult ex_mul( &ex_plus2_5, &ex_minus );
expressions.push_back( &ex_mul );
Div ex_div7_5( &ex_plus2_5, &num5 );
expressions.push_back( &ex_div7_5 );
Pow ex_pow( &num5, &num2 );
expressions.push_back( &ex_pow );
Pow ex_pow2( &num1, &ex_mul );
expressions.push_back( &ex_pow2 );
Exp ex_exp( &num2 );
expressions.push_back( &ex_exp );
Sqrt ex_sqrt( &num2 );
expressions.push_back( &ex_sqrt );
Mult ex_( &ex_pow, &ex_sqrt );
expressions.push_back( &ex_ );
for( int i = 0; i < expressions.size(); ++i )
cout << expressions[i]->toString() << " = " << expressions[i]->eval() << endl;
Div ex_dbz( &num2, &num0 );
try{
cout << ex_dbz.toString(); cout.flush();
ex_dbz.eval();
}
catch (std::domain_error ex) {
cout << "Exception: " << ex.what() << endl;
return 0;
}
Expr.h :
#include<iostream>
#include <string>
class Expr {
private:
public:
virtual double eval()=0;
virtual std::string toString() const=0;
};
Num.h :
#include "Expr.h"
#include <string>
#include <sstream>
class Num: public Expr
{
double tal;
Expr *some_val;
public:
Num (double tal1)
{
tal=tal1;
}
double eval()
{
return tal;
}
std::string toString()
{
std::stringstream stream;
stream << some_val; // Like cout
return stream.str(); // Output a string
}
};
BinOp.h :
#include "Expr.h"
#include "Num.h"
#include <string>
class BinOp: public Expr
{
public:
double eval()=0;
std::string toString()=0;
Expr *left;
Expr *right;
};
Operator.h :
#include "Expr.h"
#include "Num.h"
#include "BinOp.h"
#include <cmath>
#include <string>
class Plus: public BinOp
{
public:
std::string toString();
Plus(Expr *l, Expr *r)
{
left=l;
right=r;
}
double eval()
{
return left -> eval() + right -> eval();
}
};
class Minus: public BinOp
{
public:
std::string toString();
Minus(Expr *l, Expr *r)
{
left=l;
right=r;
}
double eval()
{
return left -> eval() - right -> eval();
}
};
class Mult: public BinOp
{
public:
std::string toString();
Mult(Expr *l, Expr *r)
{
left=l;
right=r;
}
double eval()
{
return left -> eval() * right -> eval();
}
};
class Div: public BinOp
{
public:
std::string toString();
Div(Expr *l, Expr *r)
{
left=l;
right=r;
}
double eval()
{
return left -> eval() / right -> eval();
}
};
class Pow: public BinOp
{
public:
std::string toString();
Pow(Expr *l, Expr *r)
{
left=l;
right=r;
}
double eval()
{
return pow(left-> eval(),right-> eval());
}
};
class Sqrt: public BinOp
{
public:
std::string toString();
Sqrt(Expr *r)
{
right=r;
}
double eval()
{
return sqrt(right-> eval());
}
};
class Exp: public BinOp
{
public:
std::string toString();
Exp(Expr *r)
{
right=r;
}
double eval()
{
return exp(right-> eval());
}
};
Måden hvorpå jeg nu skal teste at koden fungerer er på følgende måde:
2.Implementer Expr class. Implementer derefter Num class. Test Num ved at oprette et objekt (en instans) kaldet num5, som indeholder værdien 5. Udskriv så værdien, som returneres ved kaldet af eval funktionen i num5. Værdien skulle gerne være 5.
3. Så testes Expr class ved at tildele objektet num5 til en Expr pointer expr5, og udskriv værdien, som returneres fra expr5->eval().
4. Implementér BinOp og Plus. Opret et objekt Num num2 med værdien 2. Lav en Plus plus2_5 for at teste værdien af 2+5.
5. Implementer resten af operatorerne. Test dit program ved at evaluere udtrykket (expression) 2/(3+4).
hvordan gør jeg- for jeg er ikke helt med. På forhånd tak for hjælpen.