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
|
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#define MAXLEN 1000
#define MAXOP 100
#define NUMBER_SIG '0'
unsigned sneed_getline(char str[], unsigned len);
double pop(void);
void push(double input);
char getop(char str[], char op[], unsigned *spos);
int
main(void)
{
char str[MAXLEN];
unsigned len, spos;
char op[MAXOP];
double op2;
while ((len = sneed_getline(str, MAXLEN)) > 1) {
spos = 0;
while (spos < len) {
switch (getop(str, op, &spos)) {
case '0' :
push(atof(op));
break;
case '+' :
push(pop() + pop());
break;
case '*' :
push(pop() * pop());
break;
case '-' :
op2 = pop();
printf("hey: %g\n", op2);
push(pop() - op2);
break;
case '/' :
if ((op2 = pop()) == 0.0)
printf("Err: deviser cant be zero\n");
else
push(pop() / op2);
break;
case '%' :
op2 = pop();
if (op2 != 0)
push(fmod(pop(), op2));
else
printf("Err: deviser cant be zero\n");
break;
default :
printf("Err: unknow command\n");
}
}
printf("%.8g\n", pop());
}
return 0;
}
unsigned
sneed_getline(char str[], unsigned len)
{
char input;
unsigned i;
for(i = 0; i < len+1 && (input = getchar()) != EOF && input != '\n'; i++)
str[i] = input;
str[i] = '\0';
return i;
}
#define MAXVAL 100
double val[MAXVAL];
int sp = 0;
double
pop(void)
{
if (sp > 0)
return val[--sp];
else
printf("Err: stack empty\n");
return 0.0;
}
void
push(double input)
{
if (sp < MAXVAL)
val[sp++] = input;
else
printf("Err: stack full\n");
}
char
getop(char str[], char op[], unsigned *spos)
{
int j;
/* skip blanks */
for (; isblank(str[*spos]); (*spos)++)
;
/* return operator */
if (!isdigit(str[*spos]) && str[*spos] != '.') {
return str[(*spos)++];
}
/* collect digit s*/
for (j = 0; j < MAXOP+1 && (isdigit(str[*spos]) || str[*spos] == '.'); j++, (*spos)++)
op[j] = str[*spos];
op[*spos] = '\0';
return NUMBER_SIG;
}
|