6번 문제 {{{ #pragma once #define _CRT_SECURE_NO_WARNINGS #include const int TRUE = 1; const int FALSE = 0; int equ = 0; int reg00 = 0, reg01 = 0, reg10 = 0, reg11 = 0; int mem00 = 0, mem01 = 0, mem10 = 0, mem11 = 0; void initialize(); // 레지스터와 메모리 값 초기화 void fetch_command(); // 명령어 읽기 int execute_command(int, int, int, int, int, int, int, int); // 명령어 실행 int get_reg(int, int); // 해당되는 레지스터 값 얻기 int get_mem(int, int); // 해당되는 메모리 값 얻기 int get_bin4(int, int, int, int); // 해당되는 4자리 이진수 얻기 void set_reg(int, int, int); // 해당되는 레지스터에 값 넣기 void set_mem(int, int, int); // 해당되는 메모리에 값 넣기 void load(int, int, int, int); // 메모리에서 레지스터로 값 불러오기 void add(int, int, int, int); // 두 레지스터의 값 더하기 void mul(int, int, int, int); // 두 레지스터의 값 곱하기 void save(int, int, int, int); // 레지스터에서 메모리로 값 저장하기 void equal(int, int, int, int); // 두 레지스터 값이 같은지 비교 void beq(int, int, int, int); // 명령어 분기 int main() { printf("2016 새싹교실 CodeRace\n"); initialize(); fetch_command(); printf("%d %d %d %d %d %d %d %d\n", reg00, reg01, reg10, reg11, mem00, mem01, mem10, mem11); return 0; } void initialize() { // 처음 레지스터와 메모리 값 초기화 scanf("%d %d %d %d %d %d %d %d", ®00, ®01, ®10, ®11, &mem00, &mem01, &mem10, &mem11); } void fetch_command() { // 명령어 입력 int bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7; do { scanf("%d %d %d %d %d %d %d %d", &bit0, &bit1, &bit2, &bit3, &bit4, &bit5, &bit6, &bit7); // 명령어 실행 } while (!execute_command(bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7)); } int execute_command(int bit0, int bit1, int bit2, int bit3, int bit4, int bit5, int bit6, int bit7) { if (bit0 == TRUE) { if (bit1 == TRUE) { if (bit2 == TRUE) { if (bit3 == TRUE) // 1111 { return 1; // exit } else { // 1110 } } else { if (bit3 == TRUE) // 1101 { } else { // 1100 } } } else { if (bit2 == TRUE) { if (bit3 == TRUE) // 1011 { } else { // 1010 } } else { if (bit3 == TRUE) // 1001 { } else { // 1000 beq(bit4, bit5, bit6, bit7); } } } } else { if (bit1 == TRUE) { if (bit2 == TRUE) { if (bit3 == TRUE) // 0111 { } else { // 0110 } } else { if (bit3 == TRUE) // 0101 { } else { // 0100 equal(bit4, bit5, bit6, bit7); } } } else { if (bit2 == TRUE) { if (bit3 == TRUE) // 0011 { mul(bit4, bit5, bit6, bit7); } else { // 0010 add(bit4, bit5, bit6, bit7); } } else { if (bit3 == TRUE) // 0001 { save(bit4, bit5, bit6, bit7); } else { // 0000 load(bit4, bit5, bit6, bit7); } } } } return 0; } int get_reg(int bit0, int bit1) { if (bit0 == TRUE) { if (bit1 == TRUE) { return reg11; } else { return reg10; } } else { if (bit1 == TRUE) { return reg01; } else { return reg00; } } } int get_mem(int bit0, int bit1) { if (bit0 == TRUE) { if (bit1 == TRUE) { return mem11; } else { return mem10; } } else { if (bit1 == TRUE) { return mem01; } else { return mem00; } } } int get_bin4(int bit0, int bit1, int bit2, int bit3) { return 8 * bit0 + 4 * bit1 + 2 * bit2 + bit3; } void set_reg(int bit0, int bit1, int val) { if (bit0 == TRUE) { if (bit1 == TRUE) { reg11 = val; } else { reg10 = val; } } else { if (bit1 == TRUE) { reg01 = val; } else { reg00 = val; } } } void set_mem(int bit0, int bit1, int val) { if (bit0 == TRUE) { if (bit1 == TRUE) { mem11 = val; } else { mem10 = val; } } else { if (bit1 == TRUE) { mem01 = val; } else { mem00 = val; } } } void load(int mem_bit0, int mem_bit1, int reg_bit0, int reg_bit1) { set_reg(reg_bit0, reg_bit1, get_mem(mem_bit0, mem_bit1)); } void add(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1) { set_reg(reg1_bit0, reg1_bit1, get_reg(reg0_bit0, reg0_bit1) + get_reg(reg1_bit0, reg1_bit1)); } void mul(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1) { set_reg(reg1_bit0, reg1_bit1, get_reg(reg0_bit0, reg0_bit1) * get_reg(reg1_bit0, reg1_bit1)); } void save(int reg_bit0, int reg_bit1, int mem_bit0, int mem_bit1) { set_mem(mem_bit0, mem_bit1, get_reg(reg_bit0, reg_bit1)); } void equal(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1) { if (get_reg(reg0_bit0, reg0_bit1) == get_reg(reg1_bit0, reg1_bit1)) { printf("1\n"); equ = TRUE; } else { printf("0\n"); equ = FALSE; } } void beq(int bit0, int bit1, int bit2, int bit3) { int num_skipped_command = get_bin4(bit0, bit1, bit2, bit3); int count; for (count = 0; count < num_skipped_command; count++) { scanf("%*d %*d %*d %*d %*d %*d %*d %*d"); } } }}}