Not understanding how to add factorial

OK. I am using the book "Programming: Principles and Practice Using C++" 2nd Edition. I am trying to do the drills for chapter 6. I have completed # 1 & 2. Here is the code after adding the brackets to the program so it will now calculate both parentheses and brackets. The next line tells me to do factorials, I will have to make them ints and I will have to make 0=1 for the sake of that function.Here is what I came up with
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int factor(int z)
	{
	if (z >= 0)
	{
	if (z = 0)
		z = 1;
	else
		{
		int fact = 1;
		int inc;
		for (inc = 1; inc <= z; inc++)
		fact *= inc;
		return fact;
		}
	}
	else
{
	cerr << "Can not make a factorial of negative numbers!";
	t.kind = 'x';
	t.value = '0';
	}

I believe this should take care of everything, but am not sure. The last few lines of the code above are to try to maake it exit if there is a problem. Someone tell me if there is a better way to do this. Now the bigger question is exactly where to put the code in the following block of codeWhat I can't seem to figure out is where to put it so it has a number to do the math on. From what I understand, primary() returns a number, but if I put this after primary, won't it miss any numbers that are located inside parentheses?The one thing I forgot to say wass that I am suppose to find all this info using tokens which are defined as "char double" but this operation, I am suppose to impliment when they enter something like 7! +3 where 7! means the factorial of 7. the fact that the symbol comes after the number is what is giving me so many problems trying to figure this one out. Here is the program only modified to accept brackets as a operator. Any help would be appreciated.
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
194
195
196
197
198
199
200
201
202

//
// This is example code from Chapter 6.7 "Trying the second version" of
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//

#include "std_lib_facilities.h"

//------------------------------------------------------------------------------

class Token {
public:
	char kind;		// what kind of token
	double value;	 // for numbers: a value 
	Token(char ch)	// make a Token from a char
		:kind(ch), value(0) { }	
	Token(char ch, double val)	 // make a Token from a char and a double
		:kind(ch), value(val) { }
};

//------------------------------------------------------------------------------

class Token_stream {
public: 
	Token_stream();   // make a Token_stream that reads from cin
	Token get();	  // get a Token (get() is defined elsewhere)
	void putback(Token t);	// put a Token back
private:
	bool full;		// is there a Token in the buffer?
	Token buffer;	 // here is where we keep a Token put back using putback()
};

//------------------------------------------------------------------------------

// The constructor just sets full to indicate that the buffer is empty:
Token_stream::Token_stream()
:full(false), buffer(0)	// no Token in buffer
{
}

//------------------------------------------------------------------------------

// The putback() member function puts its argument back into the Token_stream's buffer:
void Token_stream::putback(Token t)
{
	if (full) error("putback() into a full buffer");
	buffer = t;	   // copy t to buffer
	full = true;	  // buffer is now full
}

//------------------------------------------------------------------------------

Token Token_stream::get()
{
	if (full) {	   // do we already have a Token ready?
		// remove token from buffer
		full=false;
		return buffer;
	} 

	char ch;
	cin >> ch;	// note that >> skips whitespace (space, newline, tab, etc.)

	switch (ch) {
	case '=':	// for "print"
	case 'x':	// for "quit"
	case '!': case '{': case '}':	// Added to add brackets to equasions
	case '(': case ')': case '+': case '-': case '*': case '/': 
		return Token(ch);		// let each character represent itself
	case '.':
	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
		{	
			cin.putback(ch);		 // put digit back into the input stream
			double val;
			cin >> val;			  // read a floating-point number
			return Token('8',val);   // let '8' represent "a number"
		}
	default:
		error("Bad token");
	}
}

//------------------------------------------------------------------------------

Token_stream ts;		// provides get() and putback() 

//------------------------------------------------------------------------------

double expression();	// declaration so that primary() can call expression()

//------------------------------------------------------------------------------
// This is where I was thinking of putting the factorial code
//------------------------------------------------------------------------------

// deal with numbers and parentheses
double primary()
{
	Token t = ts.get();
	switch (t.kind) {
	case '(':	// handle '(' expression ')'
		{	
			double d = expression();
			t = ts.get();
			if (t.kind != ')') error("')' expected");
			return d;
		}
	case '8':			// we use '8' to represent a number
		return t.value;  // return the number's value
	case '{':
			{	
			double e = expression();
			t = ts.get();
			if (t.kind != '}') error("'}' expected");
			return e;
		}
	default:
		error("primary expected");
	}
}

//------------------------------------------------------------------------------

// deal with *, /, and %
double term()
{
	double left = primary();
	Token t = ts.get();		// get the next token from token stream

	while(true) {
		switch (t.kind) {
		case '*':
			left *= primary();
			t = ts.get();
			break;
		case '/':
			{	
				double d = primary();
				if (d == 0) error("divide by zero");
				left /= d; 
				t = ts.get();
				break;
			}
		default: 
			ts.putback(t);	 // put t back into the token stream
			return left;
		}
	}
}

//------------------------------------------------------------------------------

// deal with + and -
double expression()
{
	double left = term();	  // read and evaluate a Term
	Token t = ts.get();		// get the next token from token stream

	while(true) {	
		switch(t.kind) {
		case '+':
			left += term();	// evaluate Term and add
			t = ts.get();
			break;
		case '-':
			left -= term();	// evaluate Term and subtract
			t = ts.get();
			break;
		default: 
			ts.putback(t);	 // put t back into the token stream
			return left;	   // finally: no more + or -: return the answer
		}
	}
}

//------------------------------------------------------------------------------

int main()
try
{
	cout << "Welcome to our simple calculator. \n\nPlease enter expressions using floating - point numbers. \nYou can use the operators '+', '-', '*', and '/'. \nEnter '=' for a result and enter 'x' to quit.\n";
	double val = 0;
	while (cin) {
		Token t = ts.get();
		if (t.kind == 'x') break; // 'x' for quit
		if (t.kind == '=')		// '=' for "print now"
			cout << "=" << val << '\n';
		else
			ts.putback(t);
		val = expression();
	}
}
catch (exception& e) {
	cerr << "error: " << e.what() << '\n'; 
	return 1;
}
catch (...) {
	cerr << "Oops: unknown exception!\n"; 
	return 2;
}

//------------------------------------------------------------------------------ 
Last edited on
Topic archived. No new replies allowed.