天天看點

序号與代碼

擴充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
           

注意:程式設計了自動判别功能,即根據輸入資料的類型進行判别并轉換為另一類型資料;

為了驗證轉換結果是否可靠,可運作程式實施互相轉換:

  • 輸入某一序号的轉換的代碼;然後輸入該代碼,即時驗證輸出的序号與上次輸入的序号是否相同;

繼續閱讀