// // File: executor.cc // Author: cteam33 // // Created on November 13, 2011, 9:08 AM // #include #include #include #include // // // enum instrukce { NUM, POP, INV, DUP, SWP, ADD, SUB, MUL, DIV, MOD } ; int main(int argc, char** argv) { int zasobnik[1010]; char line[100]; instrukce Inst[110000]; int 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++; int 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: zasobnik[velZas-1] = -zasobnik[velZas-1]; break; case DUP: zasobnik[velZas] = zasobnik[velZas-1]; velZas++; break; case SWP: temp = zasobnik[velZas-1]; zasobnik[velZas-1] = zasobnik[velZas]; zasobnik[velZas] = temp; break; case ADD: if (velZas<=0) { fail = true; break; } vysl = zasobnik[velZas-1]+zasobnik[velZas-2]; if (abs(vysl) > 1000000000 ) { fail = true; break; } zasobnik[velZas-2] =(int) vysl; velZas--; break; case SUB: if (velZas<=0) { fail = true; break; } vysl = -zasobnik[velZas-1]+zasobnik[velZas-2]; if (abs(vysl) > 1000000000 ) { fail = true; break; } zasobnik[velZas-2] =(int) vysl; velZas--; break; case MUL: if (velZas<=0) { fail = true; break; } co = zasobnik[velZas-2]; cim = zasobnik[velZas-1]; vysl = (long long)co * (long long)cim; if (abs(vysl) > 1000000000 ) { fail = true; break; } zasobnik[velZas-2] = (int)vysl; velZas--; break; case DIV: if (velZas<=0) { 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<=0) { fail = true; break; } co = zasobnik[velZas-2]; cim = zasobnik[velZas-1]; if (cim==0) { fail = true; break; } v = abs(co) % abs(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", zasobnik[velZas-1]); } } printf("\n"); scanf("\n"); } }