挑战编程 程序设计竞赛训练手册-1.6.6 解释器(Interpreter)

挑战编程 程序设计竞赛训练手册-1.6.6 解释器(Interpreter)

public class problem_Interpreter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*int testYu = 9%1000;
		System.out.println(testYu);*/
		String[] s = {	"299",
						//"211",//测试9
						"492",
						"495",
						"399",
						"492",
						//"981",//测试9
						"495",
						"399",
						"283",
						"279",
						"689",
						"078",
						"100"/*,
						"000",
						"000",
						"000"*/
						};

		int step = 1;//步骤起始数位1
		int[] registerD = new int[10];//声明寄存器
		int[] memoryVal = new int[1000];//声明内存单元值
		int RegisterDx=0;//声明寄存器下标,初始化为0
		int testRegisterDx;//声明临时寄存器下标
		int tempRegisterD;//声明暂存寄存器
		int tempMemoryVal;//声明暂存内存单元值
		
		for(int i=0;i<s.length;i++){	//开始读取数据i即为内存单元
			int interpreter =Integer.parseInt(s[i].substring(0, 1));//截取指令
			switch(interpreter){
			case 1://表示停机
				if(s[i].equals("100")){
					System.out.println("step"+step);
				}else{
					System.out.println("无效代码");
				}
				break;
			
			case 2://2dn将寄存器d的值设为n(0-9)
				testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取第二位数,为临时寄存器下标赋值
				if(errorRegisterDx(testRegisterDx)){//判断有效性
					System.out.println("无效代码");
				}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =nToD(Integer.parseInt(s[i].substring(2, s[i].length())));//把n赋值给指定寄存器
				}
				
				break;
			
			case 3://3dn将寄存器d的值增加n
				testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取第二位数,为临时寄存器下标赋值
				if(errorRegisterDx(testRegisterDx)){//判断有效性
					System.out.println("无效代码");
				}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =dPlusN(registerD[RegisterDx],Integer.parseInt(s[i].substring(2, s[i].length())));//把n赋值给指定寄存器
				}
				
				break;
			
			case 4://4dn将寄存器的的值乘以n
				testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取第二位数,为临时寄存器下标赋值
				if(errorRegisterDx(testRegisterDx)){//判断有效性
					System.out.println("无效代码");
				}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =dTimesN(registerD[RegisterDx],Integer.parseInt(s[i].substring(2, s[i].length())));//把n赋值给指定寄存器
				}
				
				break;
				
			case 5://5ds将寄存器s的值拷贝到寄存器d
				testRegisterDx = Integer.parseInt(s[i].substring(2,3));//截取赋值寄存器的下标
				if(errorRegisterDx(testRegisterDx)){//判断被赋值寄存器下标有效性
					System.out.println("无效代码");
				}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给正式寄存器的下标
					tempRegisterD = registerD[RegisterDx];//--被赋值寄存器的值--存储在临时数据中
					
					testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取赋值寄存器下标
					if(errorRegisterDx(testRegisterDx)){//判断赋值寄存器下标有效性
						System.out.println("无效代码");
					}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =RsToRd(registerD[RegisterDx],tempRegisterD);//等待被赋值寄存器,等待赋值寄存器
					}
				}
				
				break;
			
			case 6://6ds将寄存器s的值加到寄存器d
				testRegisterDx = Integer.parseInt(s[i].substring(2,3));//截取赋值寄存器的下标
				if(errorRegisterDx(testRegisterDx)){//判断被赋值寄存器下标有效性
					System.out.println("无效代码");
				}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给正式寄存器的下标
					tempRegisterD = registerD[RegisterDx];//--被赋值寄存器的值--存储在临时数据中
					
					testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取赋值寄存器下标
					if(errorRegisterDx(testRegisterDx)){//判断赋值寄存器下标有效性
						System.out.println("无效代码");
					}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =RsPlusRd(registerD[RegisterDx],tempRegisterD);//等待被赋值寄存器,等待赋值寄存器
					}
				}
				
				break;
			
			case 7://7ds将寄存器s的值乘到寄存器d
				testRegisterDx = Integer.parseInt(s[i].substring(2,3));//截取赋值寄存器的下标
				if(errorRegisterDx(testRegisterDx)){//判断被赋值寄存器下标有效性
					System.out.println("无效代码");
				}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给正式寄存器的下标
					tempRegisterD = registerD[RegisterDx];//--被赋值寄存器的值--存储在临时数据中
					
					testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取赋值寄存器下标
					if(errorRegisterDx(testRegisterDx)){//判断赋值寄存器下标有效性
						System.out.println("无效代码");
					}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx] =RsTimesRd(registerD[RegisterDx],tempRegisterD);//等待被赋值寄存器,等待赋值寄存器
					}
				}
				
				break;
			
			case 8://8da将地址为”寄存器a的值“的内存单元的值拷贝到寄存器d
				testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取赋值寄存器的下标
				if(errorRegisterDx(testRegisterDx)){//判断被赋值寄存器下标有效性
					System.out.println("无效代码");
				}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给正式寄存器的下标
					tempRegisterD = registerD[RegisterDx];//--赋值寄存器的值--存储在临时数据中
					tempMemoryVal = memoryVal[registerD[RegisterDx]];
					
					testRegisterDx = Integer.parseInt(s[i].substring(2,s[i].length()));//截取被赋值寄存器下标
					if(errorRegisterDx(testRegisterDx)){//判断赋值寄存器下标有效性
						System.out.println("无效代码");
					}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					registerD[RegisterDx]=MaToRd(registerD[RegisterDx],tempMemoryVal);//把内存单元值赋给寄存器
					}
				}
				
				break;
			
			case 9://9sa将寄存器s的值拷贝到地址为"寄存器a的值"的内存单元
				testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取赋值寄存器的下标
				if(errorRegisterDx(testRegisterDx)){//判断被赋值寄存器下标有效性
					System.out.println("无效代码");
				}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给正式寄存器的下标
					tempRegisterD = registerD[RegisterDx];//--赋值寄存器的值--存储在临时数据中
					
					testRegisterDx = Integer.parseInt(s[i].substring(2,s[i].length()));//截取被赋值寄存器下标
					if(errorRegisterDx(testRegisterDx)){//判断赋值寄存器下标有效性
						System.out.println("无效代码");
					}else{
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					memoryVal[registerD[RegisterDx]]=RsToMa(memoryVal[registerD[RegisterDx]],tempRegisterD);//为内存单元赋值
					System.out.println(memoryVal[registerD[RegisterDx]]);
					}
				}
				break;
			
			case 0://0ds若寄存器s的值不为0,则跳转到地址为"寄存器d的值"的内存单元处继续执行
				testRegisterDx = Integer.parseInt(s[i].substring(2,3));//截取第二位数,为临时寄存器下标赋值
				if(errorRegisterDx(testRegisterDx)){//判断有效性
					System.out.println("无效代码");
				}else{
					//System.out.println(registerD);
					//System.out.println(s[i].substring(2, s[i].length()));
					RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
					if(registerD[RegisterDx]!=0){
						testRegisterDx = Integer.parseInt(s[i].substring(1,2));//截取第二位数,为临时寄存器下标赋值
						if(errorRegisterDx(testRegisterDx)){//判断有效性
							System.out.println("无效代码");
						}else{
							RegisterDx = testRegisterDx;//临时下标有效,赋值给下标
							i=registerD[RegisterDx]-1;//获取下标寄存器的值。减1为了抵消循环时的+1操作。
							//System.out.println(i+1);
						}
					}else{
						//System.out.println("ture");
					}
				}
				
				break;
				default:
					break;
			}
			memoryVal[i]=registerD[RegisterDx];
			//System.out.println("内存单元"+i+"  值为"+registerD[RegisterDx]);
			step++;//步骤+1
		}
	}

	
	private static int MaToRd(int i, int tempMemoryVal) {
		// TODO Auto-generated method stub
		return (i=tempMemoryVal);
	}


	private static int RsToMa(int i, int tempRegisterD) {
		// TODO Auto-generated method stub
		return (i=tempRegisterD);
	}


	private static int RsTimesRd(int i, int tempRegisterD) {
		// TODO Auto-generated method stub
		return (i*tempRegisterD)%1000;
	}


	private static int RsPlusRd(int i, int tempRegisterD) {
		// TODO Auto-generated method stub
		return (i+tempRegisterD)%1000;
	}


	private static int RsToRd(int i, int tempRegisterD) {
		// TODO Auto-generated method stub
		i=tempRegisterD;
		return i%1000;
	}


	private static int dTimesN(int i, int parseInt) {
		// TODO Auto-generated method stub
		return (i*parseInt)%1000;
	}


	private static int dPlusN(int i, int parseInt) {
		// TODO Auto-generated method stub
		return (i+parseInt)%1000;
	}

	private static int nToD(int parseInt) {
		// TODO Auto-generated method stub
		return parseInt%1000;
	}
	
	private static boolean errorRegisterDx(int testRegisterDx) {
		// TODO Auto-generated method stub
		boolean flagDx ;
		if(testRegisterDx<0||testRegisterDx>9){
			flagDx = true;
		}else{
			flagDx = false;
		}
		return flagDx;
	}

	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值