#include #include #define stk struct strStack #define programa struct strPrograma #define ADD 1 #define SUB 2 #define MUL 3 #define DIV 4 #define DUP 5 programa { int inst[20]; int length; }progAct; stk { int vals[100]; int sp; }; FILE* fp; int numCaso; int n; int x[30]; int y[30]; int errFlag; int le() { int i; numCaso++; fscanf(fp,"%d\n", &n); if (n==0) return 0; printf("Program %d\n", numCaso); for (i=0;ivals[++s->sp]=a; } int pop(stk* s) { if (s->sp < 0) { errFlag=1; return 0; } return s->vals[s->sp--]; } void add(stk* s) { int a,b; a=pop(s); b=pop(s); push(s,a+b); } void sub(stk* s) { int a,b; a=pop(s); b=pop(s); push(s,b-a); } void mul(stk* s) { int a,b; a=pop(s); b=pop(s); push(s,a*b); } void div2(stk* s) { int a,b; a=pop(s); b=pop(s); if (a==0) { errFlag=1; return;} push(s,(int) b/a); } void dup(stk* s) { int a; a=pop(s); push(s,a); push(s,a); } void instr(stk* s, int inst) { switch (inst) { case MUL: mul(s); break; case ADD: add(s); break; case SUB: sub(s); break; case DIV: div2(s); break; case DUP: dup(s); break; } } void insInst(i) { progAct.inst[progAct.length++]=i; } int correcto(stk* vals) { int v; for (v=0;vmaxd) return 0; for (i=1;i<6;i++) { memcpy(nvals, vals, 30*sizeof(stk)); errFlag=0; for (v=0;v=0;i--){ switch (progAct.inst[i]) { case ADD: printf("ADD "); break; case SUB: printf("SUB "); break; case MUL: printf("MUL "); break; case DIV: printf("DIV "); break; case DUP: printf("DUP "); break; } } printf("\n\n"); } void resolve() { int prof; stk base[30]; stk vals[30]; int v; for (v=0;v