念整数之初级分析过程(《程序设计入门—Java语言.翁恺》第四周编程作业(2))

这个题目很多大神都写了好多了,也看了很多,不过都没有详细点的解说,我这个小白也是不断的琢磨才搞明白,现在决定细细的分析,给自己做个记录,也给像我这样的小白一点思路吧。
首先题目如下:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:fu er san si yi

刚看到的时候我第一时间想到的是翁恺老师在while循环时介绍的一个例子,即整数的分解反转代码如下:

Scanner in = new Scanner(System.in);
		int number;		
		number = in.nextInt();
		do{
			int digit = number%10;			
			System.out.println(digit);
			number = number/10;
		}while(number>0);

这个代码可以把一个整数翻过来逐个输出,例如输入:352
输出:253。
所以回到我们的题目,这个不就刚好契合嘛。我们就先反转着这样输出,根据题目要求,现在暂时只需要把253用拼音的形式输出,那么想一下我们学到这节课之前的知识,那就if语句就可以实现嘛,我们就让digit是某个数的时候就输出对应的拼音,那么代码如下:

if(digit01 == 0)
{
	System.out.print("ling"+" ");
}
else if(digit01 == 1)
{
	System.out.print("yi"+" ");
}
else if(digit01 == 2)
{
	System.out.print("er"+" ");
}
	else if(digit01 == 3)
{
	System.out.print("san"+" ");
}
	else if(digit01 == 4)
{
	System.out.print("si"+" ");
}
	else if(digit01 == 5)
{
	System.out.print("wu"+" ");
}
else if(digit01 == 6)
{
	System.out.print("liu"+" ");
}
	else if(digit01 == 7)
{
	System.out.print("qi"+" ");
}
else if(digit01 == 8)
{
	System.out.print("ba"+" ");
}
	else if(digit01 == 9)
{
	System.out.print("jiu"+" ");
}		

那么到现在我们是可以输出这个整数的输出了,不过是反转的,所以到现在还剩下三个问题:
1.输出排序。
2.取值范围以及负数时的处理
3.最后一个输出的空格问题。
我们一个个解决,先解决输出的排序问题,我们既然用while循环反转了,那么再用一遍while反转过来不可以吗?答案是,位数不为0时可以,所以这个存在缺陷,程序存在缺陷当然不可以了,这个方法是不可行的。
那我们去了解一下如何反转输出,再看看老师的下一节课内容,那很显然数组是个很好的方法,我们把digit放入一个数组,然后倒叙输出就成为整数的正序输出了。那么首先我们建立个空的数组,这个数字的取值范围在六位数内,包括六位数:

int[] numbers = new int[6];

然后我们把digit一个一个填加到数组中,如何加呢?需要通过位置赋予,即从0位置开始到整数的位数-1相等的位置,那么如何实现确定位置呢,通过计数即可,所以我们添加count=0,然后每次循环+1即可实现位置,所以我们需要在while循环内添加如下代码:

int count = 0;//初始值在代码开始时给
numbers[count] = digit;	
count ++;

这样我们就得到这个整数的每个数组成的数组,下面我们通过循环实现数组倒叙输出,即从最后一个位置先输出:

for (int i = count-1; i >= 0;i--)
{
	int digit01 = numbers[i];
}	

现在我们解决第二个问题,取值范围和负数,这个其实是个条件,所以我们把整个代码加到取值范围这个条件内,然后负数时把他转正并输出一个“fu”拼音即可:

if(number<=100000&&number>=(-100000))
{	
	if (number<0)
	{
	number = -number;
	System.out.print("fu"+" ");
				
	}
			.......
}

现在最后一个输出格式问题,即最后一个不存在空格,毫无疑问我们以上的代码无法实现,那该如何改进呢?其实很简单,最后一个不带空格即前面所有的都应该有空格,所以我们在前面每个数后输出个空格就可以,首先我们把现有的每个拼音输出去掉空格,然后在最后一个数前即i>0时,输出一个数字就要输出一个空格,所以代码如下:

if(digit01 == 0)
{
	System.out.print("ling");
}
else if(digit01 == 1)
{
	System.out.print("yi");
}
				......
else if(digit01 == 9)
{
	System.out.print("jiu");
}	
if(i>0) 
{
	System.out.print(" ");
}

现在我们这个作业就完成了,完整代码如下:

public class Javaforin_online02 {
	public static void main(String[] args) {
Scanner in = new Scanner(System.in);
		
		int number = in.nextInt();
		int[] numbers = new int[6];
		int count = 0;
		if(number<=100000&&number>=(-100000))
		{	
			if (number<0)
			{
				number = -number;
				System.out.print("fu"+" ");	
			}
			do{
				int digit = number%10;
				number = number/10;
				numbers[count] = digit;
				count ++;					
				}while(number>0);
			for (int i = count-1; i >= 0;i--)
			{
				int digit01 = numbers[i];
				if(digit01 == 0)
				{
					System.out.print("ling");
				}
				else if(digit01 == 1)
				{
					System.out.print("yi");
				}
				else if(digit01 == 2)
				{
					System.out.print("er");
				}
				else if(digit01 == 3)
				{
					System.out.print("san");
				}
				else if(digit01 == 4)
				{
					System.out.print("si");
				}
				else if(digit01 == 5)
				{
					System.out.print("wu");
				}
				else if(digit01 == 6)
				{
					System.out.print("liu");
				}
				else if(digit01 == 7)
				{
					System.out.print("qi");
				}
				else if(digit01 == 8)
				{
					System.out.print("ba");
				}
				else if(digit01 == 9)
				{
					System.out.print("jiu");
				}	
				if(i>0) 
				{
					System.out.print(" ");
				}
			}		
		}
		else
		{
			System.out.print("请输入[-100000-100000]之间的整数");
		}
	}
}

作为初学者现在先不要急着说要用多高级或者多简单的代码,可以先尝试着通过自己掌握的内容能不能解决,这样可以巩固自己学过的知识,然后在尝试着去简化代码,比如我们的if语句代码可以通过通过switch case 语句进行简化,(switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支),改进如下:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int number = in.nextInt();
		int[] numbers = new int[6];
		int count = 0;
		if(number<=100000&&number>=(-100000))
		{	
			if (number<0)
			{
				number = -number;
				System.out.print("fu"+" ");				
			}
			do{
				int digit = number%10;
				number = number/10;
				numbers[count] = digit;
				count ++;					
				}while(number>0);
				
			for (int i = count-1; i >= 0;i--)
			{
				int digit01 = numbers[i];
					
				switch (digit01)
	            {
	            case 0:System.out.print("ling");break;
				case 1:System.out.print("yi");break;
				case 2:System.out.print("er");break;
				case 3:System.out.print("san");break;
				case 4:System.out.print("si");break;
				case 5:System.out.print("wu");break;
				case 6:System.out.print("liu");break;
				case 7:System.out.print("qi");break;
				case 8:System.out.print("ba");break;
				case 9:System.out.print("jiu");break;
	            }
			if(i>0) 
			{
				System.out.print(" ");
			}
			}				
		}
		else
		{
			System.out.print("请输入[-100000-100000]之间的整数");
		}
	}

当然这节课的重点是for循环语句,所以我们也可以通过for循环来实现,这个也是当前比较普遍的答案,代码如下(做了注释,如不明白可以通过debug或者在不明白地方增加输出行看看输出的是什么):

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int number;
		int count=0;
		int num = 1;
		number=in.nextInt();
		if(number>=-100000&&number<=100000)
		{
			if(number<0)//将负数转为整数,并在输出前加上“fu”
			{
				System.out.print("fu ");
				number=-number;
			}
			for(int onumber=number;num!=0;)//通过count判断其有几位数
			{
				count=count+1;
				num=onumber/10;
				onumber=num;
//				System.out.println(num);
//				System.out.println(count);
			}
			for(int i=count;i>0;i--)//逐步分解整数
			{
				int divisor=1;
				int digit;
				for(int j=1;j<i;j++)//给出等位数的除数
				{
					divisor=divisor*10;
//					System.out.println(divisor);
				}
//				System.out.println();
				digit=number/divisor;//通过除以除数依次得出每位数
				number=number%divisor;//得到剩余的整数
//				System.out.print(digit);
				//通过if语句将数字转化为拼音
				if(digit == 0)
				{
					System.out.print("ling");					
				}
				else if(digit == 1)
				{
					System.out.print("yi");				
				}
				else if(digit == 2)
				{
					System.out.print("er");					
				}
				else if(digit == 3)
				{
					System.out.print("san");				
				}
				else if(digit == 4)
				{
					System.out.print("si");					
				}
				else if(digit == 5)
				{
					System.out.print("wu");				
				}
				else if(digit == 6)
				{
					System.out.print("liu");	
				}
				else if(digit == 7)
				{
					System.out.print("qi");
				}
				else if(digit== 8)
				{
					System.out.print("ba");	
				}
				else if(digit == 9)
				{
					System.out.print("jiu");	
				}				
				
				if(i>1)//末位数后面不带空格
				{
					System.out.print(" ");
				}
			}
			}		
		else
		{
			System.out.println("请输入[-100000,100000]范围内的整数");
		}	
	}

我这里还是用的if语句,也可以改为switch case 语句来替代。
希望所有初学者开到一个题目时不要慌,先过一遍题目要求,分析出解决的步骤,然后过一下自己所学内容,一个个解决,切记不要直接搜答案,重要的是你解题的过程,这也是培养自己写代码的思维方式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值