!" # $ ? @ % &'( ) * ( + , - . / 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