!" #
$
? @
% &'( ) * ( + , - . /
ABC D E F
GCBH E FI
Q E T FSFAM U M L @
E
B M FL GA C U E
W
E
J BE H BC@ C
Q SQ GE
E T U M I M @
M F Q B SA E
T C
FS@ J GM F@ M T AM Q E GE Q C U E
U C F
E J MBC D a M F
U M FQ BSD V E
M FABL AL B C Z N E
X MBM @ E F
U M
C
T E
L @
[ M
FAC Q R ` FM
MT AV E
SFFE
U M
N O P
FAC QR
J CBC
C
FA B ST H
Q E T ASX M B
C
FABST H
Q E T A SX M B L @
B M A SB C U E F
E F
L @
) , * 1 < = , 9 5 >'8 1
S@ J GM @ M T AC B
C
Q C GQ L GC U E B C
FAB ST H I C FAB ST H
W C X C GSC U C M
T \ @ MBE
]E J M BC T U E ^
M FAM
FMB_
Q C BC QAM B Q E BBM FJ E T U M T AM C L @ C
E J MBCT U E F
U E
FA C Q R I
C
E J MBC D VE
W
FA C Q R Z
U E
J BE H BC@ C
M FAC B M @ E F
M h M @ J GE
C
E
FMBVE
cL T Q SE T C @ M T AE
J BMJ CBCB
L FC
Q C U C SA M B C D V E I W GS U C L @ C
W Q E GE Q C U E T E
cCb MB@ E F
@ C SF
M FAC B M @ E F
K L M
K L M
FC YU C Z
FL J E BAC U C FI
B M C GSb C U C M E B M FL GA C U E
? FAC
0 *1 2 3 4 2 1 &2 5 &1 + , 6 1 7 1 6 1 ( 8 7 6 ( 9 9: ( 9 ( ;
C
L ASGSb C D V E
E B H C T Sb C D V E
U E
J E U M
AB C d C Ge C B
U M FAM
T E FFE
FMB
J CBC
A SJ E
U M F Q B SA C
U E SF
U M
Q i U SH E
J E B
L @
U SC H B C @ C
E d f M Q A SX E F Z g E B
U SC H B C @ C F Z
@ M F@ E
C T AM F
g E B
U M
U M
L @
GC U E I
E L ABE
GC U E I
Q E @ M D CB@ E F
C
J BE H BC@ CB Z
j @
U SC H B C @ C U M M FABL AL B C ST SQ SC GI J C B C M FAM J BE H B C@ C J E U M B _ FM B k
calc
str
str
le
res
res
avalia
escreve
res
no
op
procNo
l E
U SC H B C @ C
C Q S@ C I
C
B M J M ASU C @ M T AM C F cL T D a M F
FMAC
I
M @
CBQ E
M
procNo procOp
? h SFAM @
@ M F@ E
ST U SQ C
le avalia escreve
Q E T U SQ SE T C G@ M T A M ]nop oI U M J M T U M T U E
M
procOp
Z m
K L M
C
GE F C T H E
U C X M B Sc SQ C D V E
E L
cL T D V E
J BST Q SJ C G
ST U SQ C K L M C cL T D V E
T V E
U M L @ C
Qe C @ C
calc Q e C @
avalia
C
Q E T U SD V E ^ C F cL T D a M F
Z
@ L SA E F J B E H B C @ C F K L M M h Sd M @
M FA M A SJ E
U M M FABL AL B C I E L
E B H C T Sb C D V E
U M
Q i U SH E Z
!"
!1' # &
! , - ) "$ - '
# $ % &
' '
( $ ) (
printf
$ - " .- ) / 0 $ * !
2 3
1! !$ .$ 5 "1&
9
$
( $ + $
# $ + - < 1+ $
# $ !- :
($ '
.- ) / 0 $
< $
) : 1
: &$ +
!1' # &1. 1( / 0 $ # $ +
2 6
1 !
' $ !
!!
3
) $ "
$
printf
"$ ) + $
# 1) ( &- = ! !
' $ !
!1' # &1.1( 1 , -
# $ +
printf
!!
$
8
: &$ , -
* 8 procOp
$ # ) ".
i 2
* $ , res
.$ *
7 ' $ ! !
+ 1 4 ' * $
) # $ # 4 $
"$ * # $ +
! !1'
( !$
+
#
.- ) / 0 $
.
1" '
) "
!
1) "
!
"0 $
4 + $ ) - ' 2
:
!(
:
.- ) / 0 $
8
$
: &$ * , -
avalia
$
'
* 7 >
printf + procOp
1) " . (
! .- ) / ? !
" + - < 1+ ) $ + 1 4 ' !
# $ +
escreve
4 - 1) "
$
!"
2 ;
"$ ) : &$ 8
res
) 0 $
!
1+ ! " > !
.
1 )
c
&(
(
, -
*
! !> 1$
2 ;
!"
2
calc
str
str
le
avalia
no
op
procNo
@ $ '
% !
)
!"
+
!
) : $ &:
( $ '
$
+ 1 4 ' * C DE D * - ' ) , - ) "$
;
( A + 14 $
&8 '
G '
+ $ ! , -
#
, -
) $
# $ 4 ' # $ ! ! =:
+ 1 4 ' # $ +
' $ !
"=) B ' $ ! # procOp
# $ +
>
B :
+ + : 1!"$ 1) 1( 1 &'
' $ ! 4 $ ( $ '
)
(
!!1+ +
.- ) / 0 $
) "
)
+
(
/ !(
:
$ ) $ !!$
( $ ' # " 1% 1&1< ! ! 1" +
' 1!
- '
# $ ) "- &'
# F '
( A + 14 $
) "
$
"$ * # 2
& 8 H
#include "type.h"
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXLEN 20
#define MAX_STACK_SIZE 10
#define ENDCHAR 'q'
void le(char *, int);
void avalia(char *);
void procNo(type);
void procOp(char );
2
main() {
char str[MAXLEN];
printf("Calculadora para expressões aritméticas em notação sufixa.\n");
printf("Características: \n");
printf("
- Operandos: inteiros \n");
printf("
- Operadores: +, - *, / \n\n");
/*
printf("jvo - Mar. 2001 \n");
printf("Estrutura modificada em Abr. 2003 \n");
*/
STACKinit(MAX_STACK_SIZE);
for (;;) {
le(str, MAXLEN);
if(str[0] == ENDCHAR) break;
avalia(str);
}
return 0;
}
void le(char *str, int n) {
printf(": ");
fgets(str, n, stdin);
printf("%s \n", str);
/* Verificar aqui se str esta' num formato valido */
}
void avalia(char *s) {
if(isdigit(s[0])) {
type t = (type) atof(s);
procNo(t);
}
else procOp(s[0]);
}
void procNo(type no) {
if (STACKfull()) {
fprintf(stderr, "Error: STACK overflow. \n");
exit(1);
}
else
STACKpush(no);
}
void procOp(char op) {
type res, o1, o2;
if(STACKempty()) {
fprintf(stderr, "Error: STACK empty. \n");
exit(1);
}
else o2 =STACKpop();
if(STACKempty()) {
fprintf(stderr, "Error: STACK empty. \n");
exit(1);
}
else o1 =STACKpop();
switch (op) {
case '+': res = o1 + o2; break;
case '-': res = o1 - o2; break;
case '*': res = o1 * o2; break;
case '/': if(o2) res = o1/o2;
else {
fprintf(stderr, "Error: divide by zero; finished. \n");
exit(1);
}
break;
default: { fprintf(stderr, "Error: unknown command. \n"); exit(1); }
}
/* Aqui existem pelo menos dois lugares vazios no stack */
STACKpush(res);
printf(printfstring, res);
printf("\n");
}
$ "
!
( $ ' $
$
, -
8 printfstring
+ $ " 1# $
!1) A ) 1' $
# $ ( !$ # !
) "
$
E
type
($ ) "
+
( $ ) " $ &$
!"0 $
5 + $
+
$
- .$ ' " / 0 $
.1) 1+ $ ! ) $
+ $ .1( B
1 $ # $ +
.1(B
1 $
1 !
H
+ $
type.h 2
printf
2
- ' !"
;
# 1'
E
* !!1'
1 :
!0 $
typedef int type;
#define printfstring "%d"
$
) ") "$ *
# $ 4 ' 1) ( &- ! ?
( &1
!
) $ !
) "
*
! ' 5 &" 1# & !
&
, -
2
' % ' $ !
) $
, -
( A + 14 $
type.h
+
G ' . $ ' " =# 1 ( +
"
1' # &
>
'
, -
!
) " / 0 $
: 1" ! +
1) ( &- =+ $
+ $
( & / ?
, -
) $
+
:
' $ !
*
! ' 5 &" 1# & ! 8 !
( A + 14 $
# 4 - 1) "
+ $
:
) 1
H
#ifndef _TYPE_
#define _TYPE_
typedef int type;
#define printfstring "%d"
#endif
) +
#ifndef
#define
#endif
!0 $
!
1) +
#
) +
(B ' + !
+ 1
( " 1: !
) "
) "
!
'
) "
"$ + ! ! &1) B ! ( - 7 $ # 1'
1 $
) 0 $
$
3
( A + 14 $ !
<identificador>
4 - 1 " 8 , -
. (
+ $
2
#
.1) 1+ $ *
!! + $ # 8 # $ (
+ 1
, -
!"
9 - ) "
$
+
!
+
1) "
#
) ! ) ( $ ) !"- / 0 $ + ) $ ! ! ' > , - 1) ( &( - & + $ ( $ ) B
(
*
2
$ !
+
" &B
# 8
#
1) "
# $ (
!! + $ "
&1) B &1) B *
($ ) !1+
#ifndef <identificador>*
( "1: ! ! 4 - 1) " ! H
*
#else #elif #endif 2
) : $ &: 1'
1' # &
$ #
2
( "1: # $ 4 ' .$ 1 +
!
2
!! + $ ( "1: !
! + 1
1) "
'
!" (
+
! 7 # $ (
) ( $ ) " + - ' + ! + 1
' $ ! + 1<
# 8
) ! ! + $ !
9
7 + $
( $ ' # 1& + $ ( ("
!"1:
!
@ $ ' $ ( $ ) ( &- ! 0 $ # $ +
+ $
'
!
) : $ &: 1+ $ % !
) "$ * ) 0 $
) " / 0 $
) + $
- ! ' $ !* )
+ $
!" (
'
( $ ) (
!
#
$
) !
!" 1:
' $ !
) " ' $
)
$ !
#
) +
2
1 )
+ 1" 1$ )
2
3
) 14 B ' *
2 ) "1( $ &&*
+ 4
'
1(
&&1!
$
$ $
'
1" < *
5 " " C 2
9
%& & %
( )E *
5 " " C 3 5 E ,
;
) ) 1!
1" ( B 1
*
C
E E ! E " E
C *
2
5 C E
*+ ,
*
" 7
B ) 1*
- ! )
3
3
3
* @ $ ' # - " (1 ) (
3
C
, - . / 0 1 2 " , + + 1!$ )
) +
!!*
!&
6
*
%& & &
!$ )
7
' 9
$ *
%& & :
+ *
C
) 3 4 2
2 ",
C
) 8
4 2
Download

calculadora em notação sufixa.