명품 JAVA 프로그래밍

명품 JAVA 프로그래밍 7장 실습문제 13

anycoding 2021. 12. 12. 23:59
반응형

문제

명령을 실행하는 소프트웨어를 작성하라. 명령은 다음과 같이 mov, add, sub, jn0, prt로 구성되면 move sum 0는 sum 변수에 0을 삽입하고, add sum i는 sum 변수에 i 값을 더하면 sub n 1은 n 변수의 값을 1 감소시키고, jn0 n 3은 변수 n의 값이 0이 아니면 3 번째 명령(실제 4번째 줄)으로 돌아가도록 처리하고, prt sum 0은 sum 변수의 값을 출력하고 프로그램을 종료한다. prt에서 마지막 0은 특별한 의미가 없다. go는 지금까지 입력한 프로그램을 처음부터 실행하도록 하는 지시어이다.
참고로, 실행 예시에서 첫 번재 프로그램은 5에서 15까지 더하는 프로그램이다.

 

예시 답안

수퍼컴이 작동합니다. 프로그램을 입력해주세요. GO를 입력하면 작동합니다.
>> mov sum 0
>> mov i 5
>> mov n 10
>> add sum i
>> add i 1
>> sub n 1
>> jn0 n 3
>> prt sum 0
>> go
[ptr sum 0]
I:15 SUM:95 N:0
출력할 결과는 95. 프로그램 실행 끝
>> mov n 100
>> mov m 20
>> add n m
>> sub n 5
>> prt n 0
>> go
[prt n 0]
M:20 N:115
출력할 결과는 115. 프로그램 실행 끝
>>

 

소스 코드

(한번만 실행되게 만들었습니다.)

import java.util.*;

class ControlProgram{
	ArrayList<String> excution = new ArrayList<String>();
	ArrayList<String> temp = new ArrayList<String>();
	HashMap<String,Integer> var = new HashMap<String,Integer>();
	ArrayList<String> num = new ArrayList<String>();
	
	String [] alpha= {"a","b","c","d","e","f","g",
			"h","i","j","k","l","n","m","o",
			"p","q","r","s","t","u","v","w","x","y","z"};
	
	public ControlProgram() {
		Scanner s = new Scanner(System.in);
		System.out.println("수퍼컴이 작동합니다. 프로그램을 입력해주세요. GO를 입력하면 작동합니다.");
		
		while(true) {
			System.out.print(">> ");
			String temp1 = s.next();
			if(temp1.equals("go"))
				break;
			String temp2 = s.next();
			String temp3 = s.next();
			s.nextLine();
			excution.add(temp1);
			temp.add(temp2);
			num.add(temp3);
		}
		run();
		
		s.close();
	}
	private boolean Compare(String s) {
		for(int i = 0;i<alpha.length;i++)
		{
			if(s.contains(alpha[i]))
				return true;
		}
		return false;
	}
	
	private void run() {
		int count = 0;
		while(true) {
			switch(excution.get(count)) {
			case "mov":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.put(temp.get(count),var.get(num.get(count)));
				else // 알파벳이 아니라 정수형이면
					var.put(temp.get(count), Integer.parseInt(num.get(count)));
				count++;
				break;
			case "add":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.replace(temp.get(count), var.get(temp.get(count))+var.get(num.get(count)));
				else
					var.replace(temp.get(count), var.get(temp.get(count))+Integer.parseInt(num.get(count)));
				count++;
				break;
			case "sub":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.replace(temp.get(count), var.get(temp.get(count))-var.get(num.get(count)));
				else
					var.replace(temp.get(count), var.get(temp.get(count))-Integer.parseInt(num.get(count)));
				count++;
				break;
			case "jn0":
				int k;
				if(Compare(num.get(count)))
					k = var.get(num.get(count));
				else
					k = Integer.parseInt(num.get(count));
				if(var.get(temp.get(count)) != 0)
					count = k;
				else
					count++;
				break;
			case "prt":
				if(Compare(num.get(count)))
					System.out.println("[ptr "+ temp.get(count) +" "+ var.get(num.get(count)) +"]");
				else
					System.out.println("[ptr "+ temp.get(count) + " " + num.get(count) + "]");
				Set<String> keys = var.keySet();
				Iterator<String> it = keys.iterator();
				for(int i =0;i<var.size();i++)
				{
					String t = it.next();
					System.out.print(t.toUpperCase()+":"+var.get(t)+" ");
				}
				System.out.println();
				System.out.println("출력할 결과는 "+ var.get(temp.get(count))+". 프로그램 실행 끝");
				return;
			}
		}
	}
}

public class Main13 {
	public static void main(String[] args){
		new ControlProgram();
	}
}
반응형