常州工学院Java实验一

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,程序结束。
  1. 代码清单
    //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.运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值