一.要求:
提示用户输入棱形的行数,比如输入5时,打印如下实心棱形和空心棱形(由于排版问题,可能显示会有变形):
*
***
*****
***
*
*
* *
* *
* *
*
二.分析:
A.图形是上下对称的
B.每行先打印空格,再打印星号,后面的空格不用打印
C.中间行不打印空格,其余行根据与中间的行距,依次增加打印空格的数量
D.每行打印的星号数量为最大列宽减去此行打印空格数量的两倍
三.实现:
import java.util.Scanner;
public class loopDemo{
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
System.out.print("请输入需要打印的棱形行数:");//提示输入
int num = sc.nextInt(); //读取输入
int mid = num/2+1; //计算中间行
System.out.printf("%d行实心棱形如下:\n",num);
for(int i=1;i<=num;i++){
int x = 0; //用于记录每行开始打印的空格数,每行都需要先将打印的空格数x置零,所以不能放到循环外面
/*
if(i <= mid){
for(int j=1;j<=mid-i;j++) {
System.out.printf(" ");
x=j;//记录行首打印的空格数,最后一次赋值不会执行,所以x=j,而不是x=j-1
}
for(int j=1;j<=num-2*x;j++) {
System.out.printf("*");
}
}
if(i > mid) {
for(int j=1;j<=i-mid;j++){
System.out.printf(" ")
;x=j;
}
for(int j=1;j<=num-2*x;j++) {
System.out.printf("*");
}
}
//上面的逻辑其实相同,可以采用下面的绝对值来进行简化
*/
for(int j=1;j<=Math.abs(mid-i);j++) {
System.out.printf(" ");//每行先打印空格
x=j;//并记录每行行首打印的空格数
}
for(int j=1;j<=num-2*x;j++) {//每行*号数量为总的数量减去两端的空格数量
System.out.printf("*");//每行打印* 号
}
System.out.println();//每行行尾才打印换行符
}
System.out.printf("%d行空心棱形如下:\n",num);
for(int i=1;i<=num;i++){
int x=0;
for(int j=1;j<=Math.abs(mid-i);j++) {
System.out.printf(" ");//每行先打印空格
x=j;//并记录每行行首打印的空格数
}
for(int j=1;j<=num-2*x;j++) {//每行*号数量为总的数量减去两端的空格数量
if(j == 1 || j == num-2*x) System.out.printf("*");//每行打印* 号
else System.out.printf(" ");
}
System.out.println();//每行行尾才打印换行符
}
}
}