信息解码 uva213

题目

对于下面这个字符串:
0,00,01,10,000,001,010,011…….
首先是长度为1的串,然后是长度为2的串,以此类推。不存在全为1的串。
你的任务是编写一个程序。首先输入一个代码头(例如AB#TANCnrtXc),则上述序列的每个串依次对应编码头的每个字符。例如,0对应A,00对应B,01对应#…,0000对应c。接下来是编码文本(可能由多行组成,你应当把他们拼成一个长长的01串)。编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度,用二进制表示,然后是个字符的编码,以全1结束。编码文本以000结束。

分析

读取

读取代码头
读取编码文本

转换

二进制转换

存储

数组存储 code[len编码长度][所对应的十进制]

设计函数

设计一个读取代码头的函数
设计一个将二进制转化为十进制的函数
设计一个能读取编码文本(被分割成多行)的函数

收获

1.如何将二进制数转化为十进制数
2.1< 3.如何终止2层for循环 --将该部分功能变成函数 移除主函数 然后用return终止

代码

#include 
#include 
int code[8][1<<8];
char readchar(//读取被分隔成了多行的编码文本
{
   char ch;
   while((ch=getchar())=='\n'||ch=='\r');
   return ch;
}
int trans (int len) //将二进制转化为十进制
{
   int ch=0;
   while(len--) ch=2*ch+readchar(-0’;
   return ch;
}
int readcode()  //读取代码头
{
   char word;
   memset(code,0,sizeof(code)); //清空数组
   for(int i=1;i<8;i++)
   {
      for(int j=0;j<(1<<i)-1;j++)
      {
         word=getchar();       //用word暂且存储读取值(银针试毒),若判断无误,则再赋予要赋的地方
         if(word==EOF) return 0;
         if(word=='\r'||word=='\n') return 1;
         code[i][j]=word;
      }
   }
   return 1;
}
int main(void)
{
   int len=0;
   int value=0;
   while(readcode())
   {
      for(;;)
      {
         len=trans(3);
         if(len==0) break;
         for(;;)
         {
            value=trans(len);
            if(value==(1<<len)-1) break;
            putchar(code[len][value]);
         }
      }
      putchar('\n');
   }
   return 0;
}
  
         
         


你可能感兴趣的:(紫薯)