// // File: executor.cc // Author: cteam33 // // Created on November 13, 2011, 9:08 AM // #include #include #include #include // // // #define myAbs(x) ((x) >= 0 ? (x) : (-x)) enum instrukce { NUM, POP, INV, DUP, SWP, ADD, SUB, MUL, DIV, MOD } ; int main(int argc, char** argv) { long long zasobnik[10100]; char line[1000]; instrukce Inst[110000]; long long param[110000]; for(;;){ int pocet_instr = 0; while(true) { gets(line); if (!strcmp("QUIT", line)) return 0; if (!strcmp("END", line)) break; line[3]='\0'; if (!strcmp(line, "POP")) { Inst[pocet_instr] = POP; pocet_instr++; continue; } else if (!strcmp(line, "INV")) { Inst[pocet_instr] = INV; pocet_instr++; continue; } else if (!strcmp(line, "DUP")) { Inst[pocet_instr] = DUP; pocet_instr++; continue; } else if (!strcmp(line, "SWP")) { Inst[pocet_instr] = SWP; pocet_instr++; continue; } else if (!strcmp(line, "ADD")) { Inst[pocet_instr] = ADD; pocet_instr++; continue; } else if (!strcmp(line, "SUB")) { Inst[pocet_instr] = SUB; pocet_instr++; continue; } else if (!strcmp(line, "MUL")) { Inst[pocet_instr] = MUL; pocet_instr++; continue; } else if (!strcmp(line, "DIV")) { Inst[pocet_instr] = DIV; pocet_instr++; continue; } else if (!strcmp(line, "MOD")) { Inst[pocet_instr] = MOD; pocet_instr++; continue; } else if (!strcmp(line, "NUM")) { Inst[pocet_instr] = NUM; param[pocet_instr] = atoi(line+4); pocet_instr++; continue; } else { throw 1; } } int n; scanf("%i\n", &n); for(int k = 0 ; k< n; k++) { int velZas = 0; int cis = 0; scanf("%i\n", &cis); bool fail =false; zasobnik[velZas] = cis; velZas++; long long co, cim, v, temp; long long vysl; for (int i = 0 ; i < pocet_instr; i++) { switch(Inst[i]) { case NUM: zasobnik[velZas] = param[i]; velZas++; break; case POP: if (velZas<=0) { fail = true; } velZas--; break; case INV: if (velZas<=0) { fail = true; break; } zasobnik[velZas-1] = -zasobnik[velZas-1]; break; case DUP: if (velZas<=0) { fail = true; break; } zasobnik[velZas] = zasobnik[velZas-1]; velZas++; break; case SWP: if (velZas<=1) { fail = true; break; } temp = zasobnik[velZas-1]; zasobnik[velZas-1] = zasobnik[velZas-2]; zasobnik[velZas-2] = temp; break; case ADD: if (velZas<=1) { fail = true; break; } vysl = zasobnik[velZas-1]+zasobnik[velZas-2]; if (myAbs(vysl) > 1000000000 ) { fail = true; break; } zasobnik[velZas-2] =vysl; velZas--; break; case SUB: if (velZas<=1) { fail = true; break; } vysl = -zasobnik[velZas-1]+zasobnik[velZas-2]; if (myAbs(vysl) > 1000000000 ) { fail = true; break; } zasobnik[velZas-2] = vysl; velZas--; break; case MUL: if (velZas<=1) { fail = true; break; } co = zasobnik[velZas-2]; cim = zasobnik[velZas-1]; vysl =co * cim; if (myAbs(vysl) > 1000000000L ) { fail = true; break; } zasobnik[velZas-2] = vysl; velZas--; break; case DIV: if (velZas<=1) { fail = true; break; } co = zasobnik[velZas-2]; cim = zasobnik[velZas-1]; if (cim==0) { fail = true; break; } zasobnik[velZas-2] = co / cim; velZas--; break; case MOD: if (velZas<=1) { fail = true; break; } co = zasobnik[velZas-2]; cim = zasobnik[velZas-1]; if (cim==0) { fail = true; break; } v = myAbs(co) % myAbs(cim); if (co <0 ) v = -v; zasobnik[velZas-2] = v; velZas--; break; } if (fail) { break; } } // konec for if (velZas != 1) fail = true; if (fail) { printf("ERROR\n"); } else { printf("%i\n", (int)zasobnik[velZas-1]); } } printf("\n"); scanf("\n"); } }