扩展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
注意:程序设计了自动判别功能,即根据输入数据的类型进行判别并转换为另一类型数据;
为了验证转换结果是否可靠,可运行程序实施相互转换:
- 输入某一序号的转换的代码;然后输入该代码,即时验证输出的序号与上次输入的序号是否相同;