6번 문제
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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");
}
}