图灵机试题

上机作业——图灵机

一、题目分析

对于任意给定的一台Turing机和任意的给定字符串,编程模拟次Turing机的运行过程,要求输出从运行开始的每一步骤的结果。

二、算法构造

  • 对于un+1

① 输入要进行计算的字符串
② 转化为数组
③ 将数值输出
④ 根据图灵机un+1的命令,每一步进行输出,最终 得到结果

  • 对于xn*2

① 输入一个数值
② 转为二进制且以逗号结尾的字符串
③ 根据扩展过程,得到目标字符串
④ 将字符串转为int型的数组array[]
⑤ 数组输出
⑥ 根据图灵机xn*2的命令,每一步进行输出
⑦ 对数组元素收缩,将计算的数保存在数组a[]中
⑧ 数组a[]转为字符串
⑨ 将二进制数转为十进制,即得到所运算结果

三、流程图

  • Un+1流程图

在这里插入图片描述

  • un*2流程图
    在这里插入图片描述

四、测试

un+1代码测试

  • 执行图灵机un+2指令测试

在这里插入图片描述

  • 将字符串转化为数组测试
    在这里插入图片描述

xn*2代码测试

  • 十进制转二进制测试

在这里插入图片描述

  • 扩展过程测试

在这里插入图片描述

  • 执行图灵机xn*2指令测试

在这里插入图片描述

  • 收缩过程测试

在这里插入图片描述

  • 收缩结果转为十进制并输出
    在这里插入图片描述

五、测试

  • 对un+1指令调试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • xn*2中二进制转十进制调试

在这里插入图片描述

  • xn*2中字符串转数组调试
    在这里插入图片描述
    在这里插入图片描述

  • 收缩过程调试
    在这里插入图片描述

六、运行结果

  • un+1的运行结果
    在这里插入图片描述

  • xn*2的运行结果

在这里插入图片描述

七、经验归纳

这次的上机练习,学会了好多java中Arrays类的方法,比如,Arrays.toString()在测试数组数据输出时,十分方便。还有String类中char[] toCharArray()将此字符串转化为一个字符数组,StringBuffer类中的replace()替换函数,同时也练习了二进制与十进制之间的相互转化。

八、源代码

  • un+1
package hello;
import java.util.Scanner;

public class Turing {
	public static void main(String[] args) {
		int in=0;
		int flag=0;
		Scanner sc=new Scanner(System.in);
		int[] array=new int[10];
		System.out.println("input your string: ");
		String str=sc.next();
		for(int i = 0; i < str.length(); i++){
			array[i] = Integer.parseInt( String.valueOf(str.charAt(i)));		//字符串转为int数组
		}
		for(int i=0;i<array.length;i++) {
			if(in==0&&array[i]==0) {		//00->00R
				in=0;array[i]=0;
			}
			else if(in==0&&array[i]==1) {		//01->11R
				in=1;array[i]=1;
			}
			else if(in==1&&array[i]==0) {		//10->01    对flag进行标记
				in=0;array[i]=1;
				flag=1;
			}
			else if(in==1&&array[i]==1) {		//11->11R
				in=1;array[i]=1;
			}
			
			for(int j=0;j<array.length;j++) {		//执行一次指令后遍历输出
				System.out.print(array[j]+" ");
			}
			System.out.println();		
			
			if(flag==1) break;		//flag==1时,stop
		}
		
	}
}

  • xn*2
xn*2源代码:

package hello;
import java.util.Scanner;

public class Turing1 {
	public static String binaryToDecimal(int n){		//将输入的十进制数转为二进制
		int b;
		b=n;
		String str = "";
		while(n!=0){
			str = n%2+str;
			n = n/2;
		}
		System.out.println(b+"->"+str+",");
		str=str+",";
		return str;
	}
	
	
	public static void main(String[] args) {
		int in=0;
		int flag=0;
		String st,ss,string;		//st--二进制字符串   ss--字符串中所有1变为01  string--目标字符串(1变为01,逗号变为0110)
		Scanner sc=new Scanner(System.in);
		int[] array=new int[10];
		System.out.println("input your number: ");
			int number=sc.nextInt();
		st=binaryToDecimal(number);		//得到一串字符串
		ss=st.replace("1","01");		//将字符串中所有1变为01
		string=ss.replace(",","0110");		//得到目标字符串
		System.out.println(string);
		int[] a = new int[5];
		for(int i = 0; i < string.length(); i++){
		array[i] = Integer.parseInt( String.valueOf(string.charAt(i)));
		}
		
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
		System.out.println();
		System.out.println();
		
		for(int i=0;i<array.length;i++) {
			if(in==0&&array[i]==0) {		//00->00R
				in=0;array[i]=0;
			}
			else if(in==0&&array[i]==1) {		//01->10R
				in=1;array[i]=0;
			}
			else if(in==1&&array[i]==0) {		//10->01R    
				in=0;array[i]=1;
			}
			else if(in==1&&array[i]==1) {		//11->100R
				in=10;array[i]=0;
			}
			else if(in==10&&array[i]==0) {		//100->111R
				in=11;array[i]=1;
			}
			else if(in==11&&array[i]==0) {		//110->01R  对flag进行标记
				in=0;array[i]=1;
				flag=1;
			}
			for(int j=0;j<array.length;j++) {		//执行一次指令后遍历输出
			System.out.print(array[j]+" ");
			}
			System.out.println();		
			if(flag==1) break;		//flag==1时,stop
		}
		int index=0;
		int q=0;
		for(int j=0;j<array.length;j++) {
			int num=0;
			while(array[index+1]!=0) {
				num++;
				index++;
				if(num==2) break;
			}
			System.out.print(num+" ");	
			a[q++]=num;
			index++;
			if(num==2) break;
		}
		System.out.println();
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < a.length; i++){
		 sb. append(a[i]);
		}
		String newstr = sb.toString();
		String s1;
		s1=newstr.replace("2", "");
	    System.out.println(number+"*2="+Integer.parseInt(s1,2));
	}
}

猜你喜欢

转载自blog.csdn.net/Adore_/article/details/88689533