擴充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
注意:程式設計了自動判别功能,即根據輸入資料的類型進行判别并轉換為另一類型資料;
為了驗證轉換結果是否可靠,可運作程式實施互相轉換:
- 輸入某一序号的轉換的代碼;然後輸入該代碼,即時驗證輸出的序号與上次輸入的序号是否相同;