图灵机,
1、题目分析
①十进制转化为二进制:对十进制数不断除2并取余,如果取余后结果为0,那么将0存入一个字符数组里,如果结果为1,则将1存入数组里,直到将该数除尽结果为0,最后因为是倒取,所以用了strrev函数,将所有字符的顺序颠倒过来。
②扩展:设定一个新字符数组,不断读取传入原字符数组值,若读到1,则给新数组赋值‘1’,‘0’,若读到0,则给新数组赋值‘0’,其中涉及到两个长度问题,在读到1时给[]里的变量j+=2,否则j+=1;最后通过j++再给数组末赋值‘1’,‘1’,‘0’。
③命令:首先设定初始内存为0,再根据读入的数组内值为‘0’,或‘1’,来选择(if)执行的命令(6条指令),再if语句里通过相应的指令更改内存和数组值,通过continue和break来选择继续还是跳出循环。
④收缩:设置一个变量p=0,若读入数组值是1,给p+1,如果p=1,就给新数组赋值1,再把p改为0,若p为0,就给数组赋值0,如果它没有读入1,就不会更改p的值,会给数组赋值0。,
⑤二进制转化为十进制:若读入数组值为1,就通过一个pow(2,len-i-1))函数求出平方后的值,将它赋给一个变量,累加得出最后的十进制。
2、算法构造
在算法设计中,在每个步骤转换的时候有字符数组长度的变化需要设定新的变量新的数组来记录,在函数中根据数值类型的转变会用到一些函数,比如计算幂次方,根据步骤内部变化运用If else,for循环来改变新数组的值,并输出,运用到下一个函数。
3、算法实现
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<math.h>
void EJZ(int a,char s[])//十进制转换到二进制
{
int p;
int i;
for(i=0;a!=0;i++)
{
p=a%2;//对数取余
if(p==0)
{
s[i]='0';}
else {
s[i]='1';}
a=a/2;
}
strrev(s);
}
void KZ(char s[],int len,char s2[])//扩展形式
{
int i=0,j=1,m=0; //m是计算新数组长度的,从0开始算
s2[0]='0';
while(i<len)
{
if(s[i]=='1')//新的数组要s2[0](j)=0,赋值给新数组开始是s2[1],又要保证传入的数组从[0](i)读
{s2[j]='1';//所以设定两个变量
s2[j+1]='0';
j+=2;
m=m+2;
}
else
{s2[j]='0';
j++;
m++;//新的数组长度
}
i++;
}
//for(i=0;i<m+1;i++)
//{cout<<s2[i]<<endl; }
s2[j]='1';
s2[j+1]='1';
s2[j+2]='0';
}
void command(char s3[],int len2)//命令
{
s3[len2]='0';
s3[len2+1]='0';
int h=0;//当前内存状态
for(int i=0;i<len2+2;i++)
{
if(h==0&&s3[i]=='0')//根据内存状态和传入数组值来选择执行哪条指令
{
h=0;
s3[i]='0';
continue;
}
if(h==0&&s3[i]=='1')
{
h=1;//改变内存状态
s3[i]='0';//若不同泽更改该值
continue;
}
if(h==1&&s3[i]=='0')
{
h=0;
s3[i]='1';
continue;
}
if(h==1&&s3[i]=='1')
{
h=10;
s3[i]='0';
continue;
}
if(h==10&&s3[i]=='0')
{
h=11;
s3[i]='1';
}
if(h==11&&s3[i]=='0')
{
h=0;
s3[i]='1';
break;
}
}
}
void SS(char s2[],int len,char s[])//收缩形式
{
int j=0;
for(int i=0;i<len-2;)
{
if((s2[i]=='1'&&s2[i+1]=='0')||(s2[i+1]=='1'&&s2[i]=='0'))
{
s[j]='1';
i+=2;
j++;
}
else
{
s[j]='0';
i+=1;
j++;
}
}
for (int a=0;a<j-2;a++)
cout<<s[a];
}
int SJZ(char s[],int len)//二进制转化到十进制
{
int sum=0;
int j;
for(int i=0;i<len;i++)
{
if(s[i]=='1')
{
j=int(pow(2,len-i-1));//计算幂次方
sum+=j;//累加
}
}
return sum;
}
void main()
{
int n;
char s[]="";
char s2[]="";
char s3[]="";
int result;
cout<<"XN*2实现"<<endl;
cout<<"请输入数"<<endl;
cin>>n;
EJZ(n,s);
int len8=strlen(s);
for(int b=0;b<len8;b++)
cout<<s[b];
cout<<endl;
int len=strlen(s);
KZ(s,len,s2);
int len7=strlen(s2);
for(int a=0;a<len7;a++)
cout<<s2[a];
cout<<endl;
int len2=strlen(s2);
command(s2,len2);
int len6=strlen(s2);
for (int i=0;i<len6;i++)
cout<<s2[i];
cout<<endl;
int len3=strlen(s2);
SS(s2,len3,s3);
cout<<endl;
int len5=strlen(s3);
result=SJZ(s3,len5);
cout<<result<<endl
}
4、经验归纳
在图灵机的编程中,我学到了如何将前一个函数中得出的新数组,再运用给下一个函数,该新数组可以通过再主函数里定义再传入函数中,再函数中改变他的值,还学到了几个操作函数,strrew(),pow(), 还有就是在函数中如果数组与数组间[]变量的值如果发生改变,就定义一个新的变量来记录,以防他们之间互相影响。
运行结果