挑战编程 程序设计竞赛训练手册-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;
}
}