//我是一个电脑小白,学习Java的萌新,在编程的路上,和大家分享自己的解题心得,希望大家共同进步!文章有不正之处还望大佬指正!抱拳了,老铁!
//本题目出自Java语言程序设计第十版(机械工业出版社)第五章第十七题
一、原题目以及参考代码:
编写程序,提示用户输入一个在1到15之间的整数,然后显示一个金字塔形状的图案,如下面的运行示例所示:
二、编程解析:
这一道题是我们在学习循环时遇到的经典题目——输出“*”形金字塔的变形,其思路也是一样,只不过本题是需要输出数字而已,需要多设计一个循环。
本题需要每一行每一行来找规律,也就是空格(输出中左边空白其实都是空格),每行数字以及与行数的关系,如此来看这个表格应该是:
我们不如设用户输入的一个数字为num,每行空格数为space,每行行数为line,每行数字“1”左边数字数(包括“1”)为starL,每行数字“1”右边数字数(不包括“1”)为starR。(为什么需要分左右下文将讲解)则每行有此规律:
starL = line ;
starR = line – 1 ;(从第二行起)
space = num – line ;
那么要解此道题,我们应该想到,每行的组成应该是【空格+行数递减+行数递增(第一行除外)】。例如第一行的空格,我们需要创建一个输出一个空格的语句,而让它重复输出(num – line = )3次就行,而第二行我们就减掉1就行;递减数字我们直接输出行数递减到1就行,递增数字我们直接赋初始值为2,最大值设定为行数就行。所以此题用for循环最好不过。
三、编程语句解析:
★为什么设置左右变量?
因为一个循环它只能按照规律进行递减或者递增,所以我们需要设置两个变量。
★如何来设置循环?
需要用到三次for循环,两个并列for循环嵌套一个for循环
for(line = 1 ;line < num; line++){
//设置初始行数为1,并且设置为递增
for(space = num - line; space >= 0 ; space--){
System.out.printf(" ");
//初始化每行的空格数,并且设置循环让其输出三次
}
for (starL = line; starL >= 1; starL--) {
System.out.printf( "%d",starL);
//初始化左边数字递减循环,最小值为1;
}
for (starR = 2;starR <= line ;starR++) {
System.out.printf("%d",starR);
//初始化右边数字为2,设置它小于行数,所以输出第1行的时候此循环无效
}
System.out.printf("\n");
//此语句隶属于第一个for循环,其作用就是输出完每行数据之后换行
}
至此,主要程序思路完毕。
【后记:请体会为什么循环内输出语句是“…….printf()”,而不是“…….println()”,因为此语句输出后光标停留在本行利于其他循环继续输出。】