图灵机试题

上机作业——图灵机

一、题目分析

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

二、算法构造

  • 对于un+1

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

  • 对于xn*2

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

三、流程图

  • Un+1流程图

图灵机试题_第1张图片

  • un*2流程图
    图灵机试题_第2张图片

四、测试

un+1代码测试

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

图灵机试题_第3张图片

  • 将字符串转化为数组测试
    图灵机试题_第4张图片

xn*2代码测试

  • 十进制转二进制测试

图灵机试题_第5张图片

  • 扩展过程测试

图灵机试题_第6张图片

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

图灵机试题_第7张图片

  • 收缩过程测试

图灵机试题_第8张图片

  • 收缩结果转为十进制并输出
    图灵机试题_第9张图片

五、测试

  • 对un+1指令调试
    图灵机试题_第10张图片
    图灵机试题_第11张图片
    图灵机试题_第12张图片
    图灵机试题_第13张图片
    图灵机试题_第14张图片
    图灵机试题_第15张图片
    图灵机试题_第16张图片

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

图灵机试题_第17张图片

  • xn*2中字符串转数组调试
    图灵机试题_第18张图片
    图灵机试题_第19张图片

  • 收缩过程调试
    图灵机试题_第20张图片

六、运行结果

  • un+1的运行结果
    图灵机试题_第21张图片

  • xn*2的运行结果

图灵机试题_第22张图片

七、经验归纳

这次的上机练习,学会了好多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;i00R
				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
  • 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;i00R
				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

你可能感兴趣的:(图灵机试题)