-
Notifications
You must be signed in to change notification settings - Fork 0
/
ssc.cpp
193 lines (179 loc) · 6.11 KB
/
ssc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/* Simple Stack Calculator by Mark Ridings
This program implements a stack based, Revese Polish Notation, calculator.
To ensure accuracy, ssc stores all inputed values as a Rational Number
having a numerator and a denominator. The calculator supports 4 mathematical
operations: addition(+), subtraction(-), multiplication(*) and
division(/). The list of complete operations supported is as follows:
Operation Description
p Prints the current top entry on the stack
P Pops the top entry from the stack
f Prints the entire stack starting with top
c Pops all items off the stack (clears stack)
d Duplicates the top entry on the stack
r Reverses the top two entries on the stack
s Show RationalNumber in decimal form
+ Replaces top 2 entries with their sum
- Replaces top 2 entries with their difference
* Replaces top 2 entries with their product
/ Top entry is divided into item below it. Answer
replaces the top two entries
Rational numbers are inputed, via standard input, in the following forms:
integer -> 6 or -5
decimal -> 7.63 or -2.0 or 0.38
fraction -> 8/9 or -6/7 or 11/2
*/
#include <iostream>
#include <stdlib.h>
#include <string>
#include "rational.h"
#include "stack.h"
using namespace std;
int main()
{
Stack<RationalNumber> s;
char c, ch; // chars for input
RationalNumber first, second; // for input
RationalNumber answer; // for arithmetic operations
RationalNumber identity(-1); // for sign conversion
bool cont = true;
cout << "ssc: enter h for options\n";
// input loop
while (cont)
{
c = (cin >> ws).peek(); // observe first char of input
// if at end of file exit
if (cin.eof())
return 0;
// take appropriate action based on stack
switch (c)
{
case 'p': // print top of stack
cin >> ch;
cout << s.top() << endl;
break;
case 'P': // Pop the stack
cin >> ch;
s.pop();
break;
case 'r': // reverse top two entries on stack
cin >> ch;
first = s.top();
s.pop();
second = s.top();
s.pop();
s.push(first);
s.push(second);
break;
case 'd': // duplicate top entry on stack
cin >> ch;
s.push(s.top());
break;
case 's': // output top number in decimal form
cin >> ch;
first = s.top();
cout << first.showDecimal() << endl;
break;
case 'c': // clear stack
cin >> ch;
while (!s.isEmpty())
s.pop();
break;
case 'f': // print entire stack starting at top
cin >> ch;
cout << s << endl;
break;
case 'h': // list options
cin >> ch;
cout << "----------------------------------------------------\n";
cout << "p - Print current top entry on stack\n";
cout << "P - Pop the stack\n";
cout << "f - print entire stack starting with top\n";
cout << "c - Pops all items clearing the stack\n";
cout << "d - Duplicates the top entry on the stack\n";
cout << "r - Reverses the top two entries on the stack\n";
cout << "s - Displays number as a decimal\n";
cout << "q - Exit program\n";
cout << "----------------------------------------------------\n";
break;
case 'q': // quit program
cin >> ch;
cont = false;
break;
case '+': // replace top two items of stack with sum
cin >> ch;
first = s.top();
s.pop();
second = s.top();
s.pop();
answer = second + first;
s.push(answer);
break;
case '-': // replace top two items of stack with difference
cin >> ch;
// determine if '-' is subtraction or negative sign
c = (cin >> ws).peek();
if (isdigit(c)) // if c isdigit then '-' is negative sign
{
cin >> first; // input a RationalNumber
first = first * identity; // format negative number
s.push(first);
}
else // '-' is subtraction
{
first = s.top();
s.pop();
second = s.top();
s.pop();
answer = second - first;
s.push(answer);
}
break;
case '*': // replace top two items of stack with product
cin >> ch;
first = s.top();
s.pop();
second = s.top();
s.pop();
answer = second * first;
s.push(answer);
break;
case '/': // replace top two items of stack with quotient
cin >> ch;
first = s.top();
s.pop();
second = s.top();
s.pop();
// check for division by zero
if (first.isZero())
{
cerr << "ssc: undefined division by zero\n";
s.push(second);
s.push(first);
}
else
{
answer = second / first;
s.push(answer);
}
break;
default: // either a number or unimplemented option
if (isdigit(c))
{
cin >> first; // input RationalNumber
if (first.isLegal())
if (s.isFull())
cerr << "ssc: stack is full\n";
else
s.push(first);
else
cerr << "ssc: undefined number\n";
}
else // unimplemented option
{
cin >> ch;
cerr << "ssc: " << ch << " not implemented\n";
}
} // end of switch
} // end of while
return 0;
}