天天看点

序号与代码

扩展Excel表列序号为1,2,……的列代码依次为A,B,C,……,Y,Z;AA,AB,……,AZ;BA,BB,……,AZ;BA,BB,……,BZ;……;ZA,ZB,……,ZZ;AAA,……;

试进行列序号与列代码的相互转换;

输入列序号(不超过15位整数)或列代码(不超过10个大写字母),输出对应的列代码或对应的列序号;

例如,输入列序号28,输出对应的列代码AB;输入列代码BA,输出对应的列序号53;

1.说明:

设置3个数组:字符串数组b存储输入的列序号与列代码,整型数组a存储把b串中的每一个字符转换为整数,整型数组p存储把序号s通过“除26取余”的各位余数;

(1)、以字符串方式输入代码或序号,并把各字符转换为数字存储在a数组中,检测若输入的字符不是数字或大写字母时退出;

(2)、一个数字(如a[1])若非数字,则实施代码转换为代码;否则,实施序号转换为代码;

(3)、代码转换为序号: 应用a[k]-16把一个代码转换为数字(如A~1,B~2,……),然后在k循环中通过s=(s+a[k])*26转换,整数s即代码的序号;

(4)、序号转换为代码:首先把各数字a[k]应用s=(s+s[k])*10转换为十进制整数s;然后通过“除26取余”把s转换为26进制数,从低位开始为p[1],p[2],……(若p[m]=0,则p[m]=26;,相应的被除数x=x-1;),最后从高位到低位以字符方式输出p[k],即为所求的列代码;

2.程序设计:

#include<stdio.h>
#include<math.h>
int main()
{
   int k,m,a[20],p[20];
   double s,x;
   char b[20];
   printf("请输入列序号或列代码:");
   scanf("%s",b);         /*以字符串方式输入代码或序号*/
   for(m=0,k=0;b[k]!='\0';k++)
   {
      m++;
      if(b[k]>90 || b[k]<48 || b[k]>57 && b[k]<65)
      return;
      a[m]=b[m-1]-48;
   }
   if(a[1]>9)             /*代码转换为序号*/
   {
      for(s=0,k=1;k<m;k++)
         s=(s+a[k]-16)*26;  /*大写字母转换为数字计算*/
      s=s+a[m]-16;
      printf("对应的序号为:%.0f\n",s);
   }
   else                    /*序号转换为代码*/
   {
      for(s=0,k=1;k<m;k++)
         s=(s+a[k])*10;
      s=s+a[m];            /*输入的整数由字符串转换为整数*/
      x=s;
      m=0;
      while(x>0)
      {
         m++;              /*转换为26进制*/
         p[m]=(int)fmod(x,26);
         x=floor(x/26);
         if(p[m]==0)
         {
            p[m]=26;
            x=x-1;
         }
      }
      printf("对应的代码为:");
      for(k=m;k>=1;k++)
         printf("%c",p[k]+64);
      printf("\n");
   }
}
           

3.程序运行示例及其注意事项:

请输入列序号或列代码:123456789098765
对应的代码为:VSDYLBQNTE
请输入列序号或列代码:ABCDEFGHIJ
对应的序号为:5872551179180
           

注意:程序设计了自动判别功能,即根据输入数据的类型进行判别并转换为另一类型数据;

为了验证转换结果是否可靠,可运行程序实施相互转换:

  • 输入某一序号的转换的代码;然后输入该代码,即时验证输出的序号与上次输入的序号是否相同;

继续阅读