2
2
* Exercise 5-10. Write the program expr, which evaluates a reverse Polish
3
3
* expression from the command line, where each operator or operand is a
4
4
* separate argument. For example,
5
+ *
5
6
* expr 2 3 4 + *
7
+ *
6
8
* evaluates 2 * (3 + 4).
9
+ *
7
10
* By Faisal Saadatmand
8
11
*/
9
12
13
+ /* NOTE: * and % must be included in equation marks at the command prompt,
14
+ * otherwise they will be interpreted by the shell as wildcard characters */
15
+
10
16
#include <stdio.h>
11
17
#include <stdlib.h>
12
18
#include <ctype.h>
15
21
#define MAXVAL 100
16
22
17
23
/* functions */
18
- void push (double );
24
+ void push (double );
19
25
double pop (void );
20
26
21
27
/* globals */
22
- int sp = 0 ; /* next free stack position */
23
- double val [MAXVAL ]; /* value stack */
28
+ int sp = 0 ; /* next free stack position */
29
+ double val [MAXVAL ]; /* value stack */
24
30
25
31
/* push: push f onto value stack */
26
32
void push (double f )
@@ -44,27 +50,23 @@ double pop(void)
44
50
45
51
int main (int argc , char * argv [])
46
52
{
47
- int type , error = 0 ;
48
- double op2 ;
53
+ int type ;
54
+ double num , op2 ;
49
55
50
56
if (argc < 4 ) {
51
- printf ("Usage: expr operand1 operand2 operator operand3 operator ...\n" );
57
+ printf ("Usage: %s <expr> ...\n" , * argv );
52
58
return -1 ;
53
59
}
54
60
55
61
while (-- argc > 0 ) {
56
- ++ argv ; /* skip program name */
57
- if (* (argv )[0 ] == '-' && isdigit (* (* argv + 1 )))
58
- type = NUMBER ;
59
- if (isdigit (* (argv )[0 ]))
60
- type = NUMBER ;
61
- if (* (argv )[0 ] == '.' && isdigit (* (* argv + 1 )))
62
+ ++ argv ; /* skip program name */
63
+ if ((num = atof (* argv )))
62
64
type = NUMBER ;
63
- if (! isdigit ( * ( argv )[ 0 ]) && * ( argv )[ 0 ] != '-' && * ( argv )[ 0 ] != '.' )
64
- type = * ( argv )[ 0 ];
65
+ else
66
+ type = * * argv ; /* first character in *argv string */
65
67
switch (type ) {
66
68
case NUMBER :
67
- push (atof ( * argv ) );
69
+ push (num );
68
70
break ;
69
71
case '*' :
70
72
push (pop () * pop ());
@@ -81,26 +83,25 @@ int main(int argc, char *argv[])
81
83
if (op2 != 0.0 )
82
84
push (pop () / op2 );
83
85
else {
84
- printf ("error: division by zero\n" );
85
- error = 1 ;
86
+ printf ("error: zero divisor \n" );
87
+ argc = 1 ;
86
88
}
87
89
break ;
88
90
case '%' :
89
91
op2 = pop ();
90
92
if (op2 != 0.0 )
91
93
push ((long ) pop () % (long ) op2 );
92
94
else {
93
- printf ("error: division by zero\n" );
94
- error = 1 ;
95
+ printf ("error: zero divisor \n" );
96
+ argc = 1 ;
95
97
}
96
98
break ;
97
99
default :
98
- printf ("error: unknown parameter \n" );
99
- error = 1 ;
100
+ printf ("error: unknown command %s \n" , * argv );
101
+ argc = 1 ;
100
102
break ;
101
103
}
102
104
}
103
- if (!error )
104
- printf ("%g\n" , pop ());
105
+ printf (" %.8g\n" , pop ()); /* print result */
105
106
return 0 ;
106
107
}
0 commit comments