C语言求解Excel地址转换问题

蓝桥杯的一道题目:

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。        

事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。

任务:编写程序,实现从RC地址格式到常规地址格式的转换。

【输入、输出格式要求】

    用户先输入一个整数n(n<100),表示接下来有n行输入数据。

    接着输入的n行数据是RC格式的Excel单元格地址表示法。

    程序则输出n行数据,每行是转换后的常规地址表示法。

    例如:用户输入:

2

R12C4

R5C255

    则程序应该输出:

D12

IU5

  这道题目不难,首先将用户输入的整数n和地址字符串接收,将地址里的行和列提取出来,然后将列数转换为第二种格式,将列和行输出即可。下面给出一种解法:

 1 #include<stdio.h>
 2 void Trans()
 3 {
 4     int col=0,row=0;    //行,列 
 5     char col_1,col_2;
 6     char s[20];
 7     scanf("%s",s);
 8     int i,j;
 9     for(i=1;s[i]!='C';i++)
10     {
11         row=row*10+s[i]-48;        //不要忘记减48 
12     }
13     i++;                         //将C跳过 
14     while(s[i]!=0)
15     {
16         col=col*10+s[i]-48;
17         i++;
18     }
19     col_1=col/26+65-1;
20     col_2=col%26;
21     col_2=col_2?(col_2+65-1):'Z';
22     if(col_1!=64)
23         printf("%C",col_1);
24     printf("%c",col_2);
25     printf("%d",row);
26 } 
27 int main()
28 {
29     int n;
30     scanf("%d",&n);
31     int i;
32     for(i=0;i<n;i++)
33     {
34         Trans();    
35     }
36     
37     return 0;
38 } 

其中Trans()函数完成地址转换和输出的功能。但上面的程序有些问题:输入输出格式不能满足要求。即当n>1时,用户每输入一个地址,程序就立刻返回结果,而不是按要求当用户输入完毕后再将结果一起输出。其运行结果是这样的:

  这种结果不太符合要求,接下来给一段改进的:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 char *Trans()
 4 {
 5     int col=0,row=0;            //行,列 
 6     char col_1,col_2;
 7     char s[20];
 8     scanf("%s",s);
 9     int i;
10     for(i=1;s[i]!='C';i++)
11     {
12         ;                        //找到C 
13     }
14     i++;                         //将C跳过 
15     while(s[i]!=0)
16     {
17         col=col*10+s[i]-48;
18         i++;
19     }
20     col_1=col/26+65-1;
21     col_2=col%26;
22     col_2=col_2?(col_2+65-1):'Z';
23     char j=0; 
24     char *ans;     
25     ans=(char *)malloc(20*sizeof(char));     //动态内存分布 
26     if(col_1!=64)
27     {
28         ans[j++]=col_1;
29         ans[j++]=col_2;
30     }
31     else
32     {
33         ans[j++]=col_2;
34     }
35     for(i=1;s[i]!='C';i++)
36     {
37         ans[j++]=s[i];        //找到C 
38     }
39     ans[j]=0;                //不要忘记结束标志,否则会输出乱字符 
40     //free(ans);            //不能释放,否则无法执行下一步的返回地址 
41     
42     return ans;
43 }
44 int main()
45 {
46     int n;
47     scanf("%d",&n);
48     int i;
49     char *str[100]={""};    //此处定义一个指针数组
50     for(i=0;i<n;i++)
51     {
52         str[i]=Trans();        
53     }
54     for(i=0;i<n;i++)
55     {
56         printf("%s
",str[i]);
57     }
58         
59     return 0;
60 } 

下面是运行的结果:

当所有地址输入完毕后再输出结果。

  程序第24行定义了一个指针ans,用于存放转换后的结果,并且作为Trans函数的返回值;在main函数中的49行定义了一个指针数组,用于接收每次转换后的结果并存储起来,当所有地址都转换完成后再一起输出。

  但是注意,在Trans函数中ans不能被定义为数组类型,因为局部变量的地址空间在函数运行完后会被收回。因此若在Trans函数中将ans定义为数组,那么在Trans调用结束后ans空间将被收回,将其作为返回值没有意义。可以将ans定义为全局变量的数组或者是静态变量的数组,这样可以完成地址传递的功能,但是也要注意多次调用此函数时全局变量被多次赋值时的相互覆盖问题。

原文地址:https://www.cnblogs.com/Atsea/p/3575538.html