文章目录
一、内容
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(),这次作业在刚开始做的时候虽然知道原理,但是写代码的时候逻辑算法逻辑总是出问题,通过查询资料才把问题解决,让我认识到我的算法逻辑以及我个人的逻辑还需要提升。