这个题目很多大神都写了好多了,也看了很多,不过都没有详细点的解说,我这个小白也是不断的琢磨才搞明白,现在决定细细的分析,给自己做个记录,也给像我这样的小白一点思路吧。
首先题目如下:
你的程序要读入一个整数,范围是[-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 语句来替代。
希望所有初学者开到一个题目时不要慌,先过一遍题目要求,分析出解决的步骤,然后过一下自己所学内容,一个个解决,切记不要直接搜答案,重要的是你解题的过程,这也是培养自己写代码的思维方式。