一.要求:
提示使用者輸入棱形的行數,比如輸入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;
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);
int x=0;
if(j == 1 || j == num-2*x) System.out.printf("*");//每行列印* 号
else System.out.printf(" ");
System.out.println();//每行行尾才列印換行符
}
}
}
本文轉自 碧雲天 51CTO部落格,原文連結:http://blog.51cto.com/333234/1775991,如需轉載請自行聯系原作者