# | Problem | Pass Rate (passed user / total user) |
---|---|---|
13797 | EE2310_Assignment_3 |
|
Description
Assignment #3 - Evaluating Mathematical Epressions : due 1/10 Tue (at 11:59pm)
A Mathematical epression is something like the following2 + (5 *(3.1^{3.3}+ sin(6.1)))/ log_{3}(15)*2
, in which there is a mixture of arithmetic expression, trigonometric, and logarithmic functions. Here is a list of those 12 functions.
- Basic arithmetic operators:
+
,-
,*
,/
along with the unary negation operator-
, i.e.-5
- Unary scientific functions:
sin()
,cos()
,tan()
,log()
,sqrt()
- Binary scientific functions:
log_{b}(a)
and2^{3}
. You should use the corresponding math functions in<cmath>
to implement them.
Remarks
- Unary negation
-
: note that-5^{2}
must be interpreted as-(5^{2})
instead of(-5)^{2}
. The unary operator-
acts on anydouble
and turns its value negative. log()
stands for natural logarithm, i.e. with basee = 2.718....
log_{b}(a)
is ordanry logarithm with baseb
. Use thelog()
function in<cmath>
to implementlog_{b}(a)
aslog(a)/log(b)
.sqrt()
is square root.2^{3}
stands for2
raising to the third power, which is equal to8
- Note that, according to our syntax, the curly braces
{}
are only used in logarithm's subscriptlog_{b}(a)
and power's superscript5.1^{2}
. - The operators' priorities are listed as follows.
- You do not need to check for invalid expressions (like
2.5+=3
) or invalid operations (such assqrt(-5)
).
priority | operators/functions |
---|---|
lowest | + , - |
medium | unary - |
high | * , / |
highest | sin() , cos() , tan() , log_{}() , log() , sqrt() ,^{} |
If two operators have the same priority, they should be evaluated from left to right.
Write a class Expression
that holds the value of a Mathematical epression and it has two member functions input()
and eval()
, in which the latter evaluates the expression. We strongly suggest you use the getline()
function to read the whole expression as a string
object (remember to include <string>
). Do not use cin >> str;
as it will stop on whitespaces. Use getline(cin, str);
instead to read the whole line (in which str
is a string
object). The main function is given as follows. Do not change main()
otherwise you may lose penalty points.
int main () { // DO NOT CHANGE MAIN!!
Expression exp1;
exp1.input();
exp1.eval();
return 0;
}
Try to explore the power of C++ and make your program as flexible as possible, i.e. if new functions like sinh
or tanh
are added in the future, you do not need to modify too much of your work to support them.
Hint
You may need to use two stacks to do this assignment. One for storing the operands, and the other for storing the operators. You can use the standard library templates to do that. Include <stack>
to use their templates. You also need to include <string>
and <cmath>
libraries.
Grading & Submission
Same as Assignment #2. 70% correctness and 30% style. Submit your sourcecode (with detailed comments) both on OJ and eLearn. No need to prepare a README file.
Input 1
2 + (5 *(3.1^{3.3}+ sin(6.1)))/ log_{3}(15)*2
Output 1
170.961
Input 2
-87.38 + sqrt(.23^{1.4} + 91.13)*3.456+tan(98.23)
Output 2
-53.2482
Input
2 + (5 *(3.1^{3.3}+ sin(6.1)))/ log_{3}(15)*2
Output
170.961