1. 程式人生 > >編碼輸出圖形的思想:最重要的不是怎麼敲,而是怎麼想!(楊輝三角和輸出金字塔!)

編碼輸出圖形的思想:最重要的不是怎麼敲,而是怎麼想!(楊輝三角和輸出金字塔!)

我們在程式設計練習初始階段總會碰到這樣的演算法題,輸出一個怎樣怎樣的圖形,達到什麼樣的效果,其實這樣的題都會有一個固定的思想。

首先要發現其中隱藏的規律,既然是輸出圖形,怎麼擺放一定是有規律的,要不然各種亂,一點規律沒有,這樣的題就一點意義都沒有了。所以拿到這種演算法題,不是拿過來就敲程式碼,要根據觀察得來的規律,腦中大致要有一個思路,第一步實現什麼,第二步實現什麼,這是很重要的,同時這也是很多初學者程式設計時候最容易犯的錯誤!             

下面我們用楊輝三角形和金字塔來進行舉例:

  •    楊輝三角形

    • 1  1 1  1 2 1  1 3 3 1  1 4 6 4 1  1 5 10 10 5 1 
    • 大家可以自己畫一下觀察一下規律(有人問為啥不是等腰三角形形狀?那個輸出的時候控制一下就好了!)
    • 首先,最明顯的是最外層全是1;
    • 之後呢,從第三行開始每一個數是上一行本列和前一列的的數之和,不過此時要注意就是第一列和最後一列除外。
    • 此時,大家再觀察一下,還有沒有其它的規律呢?
    • 沒有的話,此時還不是直接敲程式碼哦,別心急,想一下如何是實現?這對初學者尤為重要,思路清晰事半功倍!
    • 程式設計開始的第一步,你一定是要把最外層的1放進去的,因為這是最明顯的。那麼放在哪裡?觀察這個楊輝三角,每個數其實就像在一個棋盤上面,每個都對齊著,有行有列,那我們就可以用一個二維陣列來儲存每個資料。
    • 第二步:此時最外層1放進去了,便可以實現第二哥規律了:從第三行開始每一個數是上一行本列和前一列的的數之和,此時陣列正好可以用下標來表示行和列。
    • 第二步完成時,規律實現完,也就是把所有數按照規律放在了裡面。
    • 最後一步,列印輸出。
import  java.util.Scanner;
public class c {
   public static void main(String[] args)  {
      System.out.println("請輸入所要顯示楊輝三角的行數:");
      Scanner  in = new Scanner(System.in);
      int  Line = Integer.parseInt(in.nextLine());
      int[][] arr = new  int[Line][Line];
      for(int i = 0; i < arr.length; i++){
          arr[i][0] = 1;
          arr[i][i] = 1;
      }
      for(int i = 2; i < arr.length; i++){
          for(int j = 1; j <= i-1 ; j++){
             arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
          }
      }
      for(int i = 0; i < arr.length ; i++){
          for(int j = 0; j <= i ; j++){
             System.out.print(arr[i][j]+" ");
          }
          System.out.println();        
      }



   }

}

  • 金字塔

    • (我是直接擷取的圖片,大家可以畫一下,這樣有助於大家瞭解這道題。 )
    • 大家先畫一下這個三角形金子塔,根據上面的楊輝三角,來做一下道圖形輸出題。
    • 同樣,首先第一步不是直接敲程式碼,而是找出隱藏規律!!!
    • 第一步,觀察出最明顯的,也就是星號了吧。繼續觀察每一行的星號,此時相信你已經不難發現星號與行數的關係!恭喜你,第一個規律就找到了。
    • 第二步,整個金字塔除了這些還有啥?沒啥了啊,是不是?不是的,那不還有空格嘛?要不然你怎麼將星號放在中間的位置啊?繼續觀察每一行的空格,此時你就不難發現空格和行數的關係!
    • 此時整個金字塔分析完畢,整理可得:
      • 空格:等於  行數減一  
      • 星號:等於  2倍  行數減一
    • 此時還不是直接敲程式碼哦,別心急,想一下如何是實現?
    • 很明顯,輸出的時候一定是先輸出空格,之後再輸出星號,對吧,要不然怎麼可能讓星號直接放到中間。
    • 輸出空格、星號之後第一行就結束了,第二行同樣,第三行也同樣...不知道你有沒有感覺但,如此有規律我們是不是就可以想到用for迴圈啦。一定是先限制行數,再限制空格,最後再限制星號!
    • 想到這,就可以行動啦!
  • import  java.util.Scanner;
    
    public class ptOne {
       public static void main(String[] args) {
          System.out.println("請輸入要列印的金字塔行號:");
          Scanner  in = new  Scanner(System.in);
          int Line = in.nextInt();
          for(int i = 1;i <= Line; i++){   // 控制行數
              //先輸出空格
              for(int j = 0; j < Line-i;j++){ //控制空格
                 System.out.print(" ");
              }
              //在輸出星號
              for(int t = 0; t < 2*i-1; t++){ //控制星號 
                 System.out.print("*");
              }
              System.out.    }
                System.out.println();
            }
    
        }
    }
    
    

    到這,你是不是已經明白了呢?不妨自己編一下倒三角和菱形來檢測一下自己吧!! 要記住:一定要多敲程式碼,而不是看懂了就ok了哦!

    //倒三角
    
    import  java.util.Scanner;
    public class b {
        public static void main(String[] args) {
            System.out.println("請輸入要列印的金字塔行號:");
            Scanner  in = new  Scanner(System.in);
            int Line = in.nextInt();
            //行數
            for(int i = Line; i > 0; i--){
                for(int j = 0; j < Line - i ;j++){
                    System.out.print(" ");
                }
                for(int t = 0;t <2*i-1;t++){
                    System.out.print("*");
                }
                System.out.println();
            }
    
        }
    }
    
    //菱形
    import  java.util.Scanner;
    public class b {
        public static void main(String[] args) {
            System.out.println("請輸入要列印的金字塔行號:");
            Scanner  in = new  Scanner(System.in);
            int Line = in.nextInt();
            for(int i = 1;i <= Line; i++){
                for(int j = 0; j < Line-i;j++){
                    System.out.print(" ");
                }
                for(int t = 0; t < 2*i-1; t++){
                    System.out.print("*");
                }
                System.out.println(" ");
            }
            //行數
            for(int i = Line; i > 0; i--){
                for(int j = 0; j < Line - i ;j++){
                    System.out.print(" ");
                }
                for(int t = 0;t <2*i-1;t++){
                    System.out.print("*");
    
    
    }
                System.out.println();
            }
    
        }
    }