用JAVA实现图灵机XN*2

一、内容

1、算法分析

运用JAVA程序设计的方法设计图灵机XN*2,输入一个十进制数n并判断输入数的正确性,对输入的数通过Inter.toBinaryString(n)的方法将十进制数转化为二进制数,并在其前后加上0和逗号,在通过0->0;1->10;,->110;的要求,将二进制编码转换成扩展的二进制编码,再通过toCharArray()函数将扩展的二进制编码字符转化为字符数组。通过定义两个数组a1,a2表示输入内态、输入和输出内态、输出,再通过Find()函数找到输入数组(a1)的索引值,再在turing()函数中通过索引值来更新内态,并以此通过for循环完成转化,之后将转化的字符数组转化为字符串,再将其转化为二进制数后再通过Integer.parseInt(str,2)函数将其转化为十进制数。

2、概要设计

在这里插入图片描述

3、测试

1、输入0的输出结果

在这里插入图片描述

2、输入一个十进制数的输出结果

在这里插入图片描述

4、调试

1、十进制数转化为二进制数的调试

2、二进制数转化为扩展二进制数的调试

在这里插入图片描述

3、扩展二进制数的转化过程的调试

在这里插入图片描述

4、转化完成的扩展二进制数转化为二进制数,再转化为十进制数的调试

在这里插入图片描述

4、实现代码

import java.util.Scanner;


public class Turing {
	//先将输入的十进制数转换为二进制数
	public static String Transform(int n) {
		String str = Integer.toBinaryString(n);			//将十进制数转化为二进制数
		str = "0"+ str+",";								//在二进制数头部加0尾部加逗号
		System.out.println("将此数转化成二进制:"+str);
		return str;
	}
	
	
	//将二进制数转化为二进制扩展数
	/*     1->10      */
	/*	   ,->110	  */
	/*	   0->0	      */
	public static char[] Transform1(String str) {
		str = str.replace("1", "10");			
		str = str.replace(",", "110");
		str = str.replace("0", "0");
		
		String str1 = str+"00";
		System.out.println("将此数转为二进制扩展数:"+ str1);
		System.out.println();
		char[] ch = str1.toCharArray();					//将字符串转化为字符数组
		return ch;
	}
	
	//找到在数组a1中内态和输入的索引值
	public static int Find(int nt,int sr,int[][] a1) {
		for(int i = 0;i < 6;i++) {
			if(nt == a1[i][0]&&sr == a1[i][1]) {
				return i;
			}
		}
		return -1;
	}
	
	/*该数字的字符 - '0'得到该数字,例如0的ASCII码为48,1的ASCII码为49,所以'1'-'0'=49-48=1*/
	/*该数字 + '0'得到该数字的字符,例如1+'0'=1+48=49='1'*/
	public static char[] turing(char[] ch){
		int[][] a1 = {{0,0},{0,1},{1,0},{1,1},{10,0},{11,0}};	//规定输入的内态和输入
		int[][] a2 = {{0,0},{1,0},{0,1},{10,0},{11,1},{0,1}};	//规定输出的内态和输出
		int nt = 0;
		System.out.println("转化过程为:");
		for(int i = 0;i<ch.length;i++) {	
			int index = Find(nt,ch[i]-'0',a1);					//找到a1中内态和输入对应的索引值
			nt = a2[index][0];									//更新输入的内态
			ch[i] = (char)(a2[index][1]+'0');					//把输出的数字加上0的ASCII码值得到该数的字符并存到ch[]中
			System.out.println(ch);
			if(nt ==11&&ch[i] == 0)
				break;
		}
		return ch;
	}	
	
	
	//完成运算后将二进制扩展数转化为十进制数
	public static void Transform2(char[] ch) {
		String str = new String(ch); 					//将字符数组转化为字符串
		System.out.println();	
		System.out.println("得到最后的二进制扩展数:"+str);
		
		str = str.replace("110", ",");					//把二进制扩展数为110的转化为逗号
		str = str.replace("10", "1");					//把二进制扩展数为10的转化为1
		System.out.println("转为二进制:"+str);
		int index1 = str.indexOf("1");					//找到二进制扩展数的第一个1
		str = str.substring(index1,str.length()-1);		//去掉二进制扩展数头部的零和尾部的逗号
		System.out.println("去掉头部的0和尾部的逗号:"+str);
		System.out.print("再转成十进制:");
		System.out.println(Integer.parseInt(str,2));	//将得到的二进制数转化为十进制数并输出
		System.out.println();
		
	}
	


	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println("请输入一个十进制数:");
		int n = new Scanner(System.in).nextInt();
		//判断n输入的正确性
		while(n < 0) {
			System.out.println("输入错误,请重新输入一个十进制数:");
			int n1 = new Scanner(System.in).nextInt();
			n = n1;
		}
		if(n == 0) {
			System.out.println("结果为0");
			return;
		}
		//将输入的十进制数转化为二进制数
		//再将二进制数转化为二进制扩展数,并将其转化为数组中字符的形式
		//将输入的二进制扩展数进行XN*2的转化
		//再将转化后的二进制扩展数转化为二进制数
		String str = Transform(n);
		char[] ch = Transform1(str);
		ch = turing(ch);
		Transform2(ch);
	}
}

5、心得体会

通过用JAVA程序设计的方法对图灵机XN*2进行程序设计,让我学到了十进制转二进制的函数Interger.toBinaryString(),二进制转十进制的函数Interger.parseInt(),将字符串转化为字符型数组的函数str.toCharArray()和去掉字符串首尾的函数str.substring(),这次作业在刚开始做的时候虽然知道原理,但是写代码的时候逻辑算法逻辑总是出问题,通过查询资料才把问题解决,让我认识到我的算法逻辑以及我个人的逻辑还需要提升。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值