Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。任务要求:编写程序,实现从RC地址格式到常规地址格式的转换。
题目分析:
要深入理解RC地址格式到常规地址格式的转换规律,再写算法。
转换规律:
例1:R12C4—>D12,(常规格式)D12中:前面字母D在表中表示列,后面12表示行;
例2:R5C255—>IU5,难点:将255转化为IU。(可以理解成26进制)
设计算法:
1.已知输入的数据String str是一个包含数字和字母的字符串。
2.首先是获取行和列的数字:需要的数字是行和列的整型int数字(不是字符串型String),我们可以使用substring 进行切割以得到行和列的子串(此时行和列仍是字符串型String),RC地址的行子串从输入字符串的第二位开始;列子串是以最后一位结束的,显然,那么我们还需要先找到str中的'C',即:c=str.indexOf('C'),后面就是:Row=str.substring(1, c);//获取行号(从第二位开始到'C'结束);Line=str.substring(c+1);//获取列号(从'C'后以位开始到最后一位结束)。
3.由于行号可以原样输出,不需要转化为整型Integer,但是列号必须转化为整型Integer,如下:line=Integer.parseInt(Line);
4.接下来进行拼接,分成line<=26和line>26两种情况:
如果line<=26,即Row=(char)(line+'A'-1)+Row,程序结束,输出结果;
如果line>26, 还需要分两种情况:
- 如果列是26整数倍,则需要 Row='Z'+Row,直接拼接;然后将line=line/26以得到更高位并且line--(更高位减一),但是flag不为0,还需要进行循环;
- 如果列不是26整数倍,则需要分类:(1)line>26:Row=(char)(line%26+'A'-1)+Row,line=line/26,(2)否则 Row=(char)(line+'A'-1)+Row,flag=0,程序结束。
- 代码清单
//Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。 //事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 //第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。 //任务要求:编写程序,实现从RC地址格式到常规地址格式的转换。 package 实验1; import java.util.*; public class exchange { public static void main(String[] args) { try (Scanner reader = new Scanner(System.in)) { String str,Row,Line; int c,line,flag,n; System.out.println("请输入需要转换的个数:"); n=reader.nextInt();//n表示需要转换的个数 for(int i=0;i<n;i++) { flag=1;//初始化flag为1 System.out.println("请输入需要转换的RC地址格式:"); str=reader.next();//str表示需要转换的RC地址格式 //以下是对str进行切分 c=str.indexOf('C');//先找到str中的'C' Row=str.substring(1, c);//获取行号(从第二位开始到'C'结束) Line=str.substring(c+1);//获取列号(从'C'后以位开始到最后一位结束) line=Integer.parseInt(Line);//将String转成Integer,line表示列号 if(line<=26)//如果line小于等于26,直接拼接 { Row=(char)(line+'A'-1)+Row;//-1不能漏掉 } else { while(flag==1) {//如果列大于26则分情况讨论 if(line%26==0) {//列是26整数倍 Row='Z'+Row;//直接拼接 line=line/26;//得到更高位(在输出结果前面加位) line--;//更高位减一 } else {//列不是26整数倍 if(line>26) { //有高于26 Row=(char)(line%26+'A'-1)+Row;//求余,拼接 line=line/26;//得到更高位(在输出结果前面加位) } else {//没有高于26 Row=(char)(line+'A'-1)+Row;//直接拼接 flag=0;//循环结束 } } } } System.out.println("转换结果为:"+ Row); } }catch(NumberFormatException e) { e.printStackTrace(); } } }
2.运行结果:
-