網頁

2018/2/24

Java 畫三角形,金字塔,階梯

Java筆試的常見題型,在console試著依據傳入的數使用星號(*)畫出三角形,階梯或金字塔。

例如傳入的數為5,則畫階梯的結果印出如下

*
**
***
****
*****

因為傳入的數為5,所以要印出5階。這是最簡單的題型,因為只要印出星號即可,且每一階的星號數以公差為1遞增

public static void main(String[] args) {
    printStairs(5);
}

public static void printStairs(int n) {
    if (n < 1) {
        System.out.println("n要大於0");
    }

    for (int i = 0; i < n; i++) {    // 第一層迴圈負責印斷行(\n)
        for (int j = 0; j <= i; j++) {  // 第二層迴圈負責印星號(*)
            System.out.print("*");
        }
        System.out.print("\n");
    }

}

重點在第二層迴圈。

當第一層迴圈i=0時,第二層的迴圈次數上限為i,也就是0,所以第二層迴圈的j從0開始會跑1次,也就是印出1個星號。
當第一層迴圈i=1時,第二層的迴圈次數上限為i,也就是1,所以第二層迴圈的j從0開始會跑2次,也就是印出2個星號。
當第一層迴圈i=2時,第二層的迴圈次數上限為i,也就是2,所以第二層迴圈的j從0開始會跑3次,也就是印出3個星號。

了解以上規則以後就可以依照傳入的數印出對應的階梯了。



下面是印出一個箭頭,例如傳入的數為5印出的箭頭如下

*
**
***
****
*****
****
***
**
*

其實只是多印了下半邊的部分。

public static void main(String[] args) throws InterruptedException {
    printArrowHead(5);
}

public static void printArrowHead(int n) {
    if (n < 1) {
        System.out.println("n要大於0");
    }

    for (int i = 0; i < n; i++) {    // 第一層迴圈負責印斷行(\n)
        for (int j = 0; j <= i; j++) {  // 第二層迴圈負責印星號(*)
            System.out.print("*");
        }
        System.out.print("\n");
    }

    for (int i = 1; i < n; i++) {    // 第一層迴圈負責印斷行(\n)
        for (int j = (n - i); j > 0; j--) {  // 第二層迴圈負責印星號(*)
            System.out.print("*");
        }
        System.out.print("\n");
    }

}



下面也是印出一個箭頭,但可以決定每階星號的公差,如傳入的數為2, 5印出的箭頭如下

*
***
*****
*******
*********
*******
*****
***
*
public static void main(String[] args) {
    printArrow(2, 5);
}

public static void printArrow(int d, int n) {
    if (n < 1) {
        System.out.println("要大於0");
    }

    for (int i = 0; i < n; i++) { // 第一層迴圈負責印斷行(\n)
        for (int j = 0; j <= i; j++) { // 第二層迴圈負責印星號(*)
            if (j == 0) {
                System.out.print("*");
            } else if (j > 0) {
                for (int k = 0; k < d; k++) {
                    System.out.print("*");
                }
            }
        }
        System.out.print("\n");
    }

    for (int i = 1; i < n; i++) { // 第一層迴圈負責印斷行(\n)
        for (int j = (n - i); j > 0; j--) { // 第二層迴圈負責印星號(*)
            if (j > 1) {
                for (int k = 0; k < d; k++) {
                    System.out.print("*");
                }
            } else if (j == 1) {
                System.out.print("*");
            }
        }
        System.out.print("\n");
    }
}


下面是難一點的題型,也就是印出反向的階梯,例如傳入的數為5印出的階梯如下

    *
   **
  ***
 ****
*****

仔細觀察可知,星號前面要填入空白,所以多了印出空白的程序。而空白的數量剛好是傳入數值-1並以公差為1遞減。

public static void main(String[] args) {
    printStairs(5);
}

public static void printStairs(int n){
    if(n < 1){
        System.out.println("n要大於0");
    }

    for(int i = 0; i < n ; i++) {      // 第一層迴圈負責印斷行(\n)
        for(int k = (n-1); k > i; k--) { // 第二層迴圈負責印空白( )
            System.out.print(" ");
        }
        for(int j = 0; j <= i; j++) {    // 第二層迴圈負責印星號(*)
            System.out.print("*");
        }
        System.out.print("\n");
    }

}

上面範例只在第一個範例中加了印出空白這個迴圈程序。

當第一層迴圈i=0時,第二層印空白的迴圈次數下限為i,也就是0,所以第二層迴圈的k從(n-1)開始遞減到0會跑n-1次,也就是印出n-1個空白。
當第一層迴圈i=1時,第二層印空白的迴圈次數上限為i,也就是1,所以第二層迴圈的k從(n-1)開始遞減到1會跑n-2次,也就是印出n-2個空白。
當第一層迴圈i=2時,第二層印空白的迴圈次數上限為i,也就是2,所以第二層迴圈的k從(n-1)開始遞減到2會跑n-3次,也就是印出n-3個空白。

以此類推,印出空白後接著印出星號。




下面是再進階一點的題型,印出金字塔,例如傳入的數為5印出如下

    *
   ***
  *****
 *******
*********

其實基本上與第二個範例一樣,差別在於星號印出的數量是以公差2為來遞增,例如第一層1個星號,第二層3個星號,第三層5個星號。至於空白的遞減方式仍然不變。

public static void main(String[] args) {
    printPyramid(5);
}

public static void printPyramid(int n){
    if(n < 1) {
        System.out.println("n要大於0");
    }

    int x = 0;
    for(int i = 0; i < n ; i++) {       // 第一層迴圈負責印斷行(\n)
        for(int k = (n-1); k > i; k--) {  // 第二層迴圈負責印空白( )
            System.out.print(" ");
        }
        for(int j = 0; j <= x; j++) {     // 第二層迴圈負責印星號(*)
            System.out.print("*");
        }
        System.out.print("\n");
        x+=2;
    }

}

在印星號的迴圈上限不是每次以1遞增,而是要以2遞增,所以要改以遞增2的x來達成。




留言有人問怎麼用for迴圈在jsp畫出九宮格,其實jsp是Java後端渲染出來的畫面,能直接在jsp裡寫Java程式,又稱為Scriptlet。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<!-- JSP Scriptlet -->
<%
    for(int i = 0; i < 3; i++) {
        out.println("<div style=\"height:52px;\">");
        for (int j = 0; j < 3; j++) {
%>
<div style="border:solid 1px; width:50px; height:50px; float:left"></div>
<%
        }
        out.println("</div>");
    }
%>
</body>
</html>

顯示結果如下。


如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。

8 則留言:

  1. 你好 我想請問一下
    我想用scanner print出箭頭
    例如我打:
    1
    5
    5
    1

    會print出
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *
    這樣要如何打

    回覆刪除
  2. @Justin
    不太懂您的問題,您的意思是說你的輸入參數是1,5,5,1,而印出一個箭頭是嗎? 如果是的話我不太清楚1,5,5,1與箭頭間有什麼關係,這邊要請您說明清楚一點。

    回覆刪除
  3. @Justin 是這樣嗎?
    public static void pringArrow(int d, int n) {
     if (n < 1) {
      System.out.println("要大於0");
     }

     for (int i = 0; i < n; i++) { // 第一層迴圈負責印斷行(\n)
      for (int j = 0; j <= i; j++) { // 第二層迴圈負責印星號(*)
       if (j == 0) {
        System.out.print("*");
       } else if (j > 0) {
        for (int k = 0; k < d; k++) {
         System.out.print("*");
        }
       }
      }
      System.out.print("\n");
     }

     for (int i = 1; i < n; i++) { // 第一層迴圈負責印斷行(\n)
      for (int j = (n - i); j > 0; j--) { // 第二層迴圈負責印星號(*)
       if (j > 0) {
        for (int k = 0; k < d; k++) {
         System.out.print("*");
        }
       } else if (j == 1) {
        System.out.print("*");
       }
      }
      System.out.print("\n");
     }
    }

    回覆刪除
  4. 你好 我先處理上半部
    public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int d;
    int n;
    d=scanner.nextInt();
    n=scanner.nextInt();

    printArrow(d,n);

    }

    public static void printArrow(int d, int n) {
    if (n < 1) {
    System.out.println("要大於0");
    }

    for (int i = 0; i < n; i++) { // 第一層迴圈負責印斷行(\n)
    for (int j = 0; j <= i; j++) { // 第二層迴圈負責印星號(*)
    if (j == 0) {
    System.out.print("*");
    System.out.print("*");
    } else if (j > 0) {
    for (int k = 0; k < d; k++) {
    }
    }
    }
    System.out.print("\n");
    }
    }
    }

    回覆刪除
  5. 會 print出
    2
    9

    **
    **
    **
    **
    **
    **
    **
    **
    **

    回覆刪除
  6. 怎麼撰寫一個 JSP 程式,使用 for 迴圈,顯示一個九宮格

    回覆刪除
  7. 您好
    如要要印出一個反向箭頭要怎麼用呢

    回覆刪除