1. 程式人生 > 實用技巧 >維修數列[NOI2005]

維修數列[NOI2005]

1.何為方法

  • System.out.println(),那麼他是什麼呢

  • java方法是語句的集合,它們在一起執行一個功能。

  • 設計方法的原則:方法的本意是功能塊,就是實現某個功能的語句塊的集合。我們設計方法的時候,最好保持方法的原子性,就是一個方法只完成一個功能,這樣利於我們後期的擴充套件。

  • 方法的命名規則?

     package com.langlang.method;
     ​
     public class Demo01 {
     ​
         //main方法
         public static void main(String[] args) {
     ​
             //1,2是實際引數:
    int sum = add(1,2); System.out.println(sum); ​ } //加法 //a,b是形式引數 public static int add(int a,int b){ return a+b; } ​ } ​

2.方法的定義和呼叫

方法的定義

  • java的方法類似於其他語言的函式,是一段用來完成功能的程式碼片段,一般情況下,定義一個方法包含以下語法:

  • 方法包含一個方法頭和一個方法體。下面是一個方法的所有部分:

    • 修飾符:修飾符,可選的告訴編譯器如何呼叫該方法,定義了該方法的訪問型別。

    • 返回值型別:方法可能會有返回值,returnValueType是方法返回值的資料型別。有些方法執行所需的操作,但是沒有返回值,這種情況下,returnValueType是關鍵字void。

    • 方法名:是方法的實際名稱。方法名和引數表共同構成方法簽名。

    • 引數型別:引數像是一個佔位符。當方法被呼叫時,傳遞值給引數。這個值被稱為實參或變數。引數列表是指方法的引數型別、順序和引數的個數。引數是可選的,方法可以不包含任何引數。

      • 形式引數:在方法呼叫時用於接收外界輸入的資料。

      • 實參:呼叫方法時實際傳遞給方法的資料。

    • 方法體:方法體包括具體的語句,定義該方法的功能。

方法的呼叫

  • 呼叫方法:物件名.方法名(實參列表)

  • java支援兩種呼叫方法的方式,根據方法是否返回值來選擇。

  • 當方法返回一個值的時候,方法呼叫通常被當做一個值。例如:

  • 如果方法返回是void,方法呼叫一定是一條語句。

  • 值傳遞(java) 和 引用傳遞

3.方法過載

  • 過載就是在一個類中,有相同的函式名稱,但形參不同的函式。

  • 方法的過載的規則:

    • 方法名稱必須相同

    • 引數列表必須不同(個數不同、或型別不同、引數排列順序不同等)

    • 方法的返回型別可以相同也可以不同

    • 僅僅返回型別不同不足以成為方法的過載

  • 實現理論:

    • 方法名稱相同時,編譯器會根據呼叫方法的引數個數、引數型別等去逐個匹配,以選擇對應的方法,如果匹配失敗,則編譯器報錯。

      
      
      
      package com.langlang.method;
       ​
       public class Demo03 {
           public static void main(String[] args) {
                System.out.println(view(2,3,true));
                System.out.println(view(2,3.15,false));
           }
          //方法過載
      //演示1
           public static int view(int a , double b ,boolean c){
                   if (c){
                       return a;
                   }else{
                       return (int)b;
                   }
           }
           //演示2  與1中引數不同可以構成過載
           public static int view(int a , int b ,boolean c){
               if (c){
                   return a;
               }else{
                   return b;
               }
           }
           //演示3   與演示2中返回型別不同 不能構成過載
           //方法的返回型別不是構成過載的必要因素
           public static String view(int a , int b ,boolean c){
               if (c){
                   return "a";
               }else{
                   return "b";
               }
           }
       }
       ​

4.命令列傳參

  • 有時候你希望執行一個程式時再傳遞給它訊息。這要靠傳遞命令列引數給main()函式實現。

  •  package com.langlang.method;
     ​
     public class Demo04 {
         public static void main(String[] args) {
             //args.length 陣列長度
             for (int i = 0;i < args.length; i++){
                 System.out.println("args["+i+"]:"+args[i]);
             }
         }
     }
     ​

5.可變引數

  • JDK 1.5開始,java支援傳遞同類型的可變引數給一個方法。

  • 在方法宣告中,在指定引數型別後加一個省略號(...)。

  • 一個方法中只能指定一個可變引數,它必須是方法的最後一個引數。任何普通的引數必須在它之前宣告。

    
    
    
    package com.langlang.method;
     ​
     public class Demo05 {
         public static void main(String[] args) {
     ​
             Demo05 demo05 = new Demo05();
             demo05.test(1,5,6);
     ​
         }
     ​
         public void test(int...i){
             for (int a=0;a<i.length;a++){
                 System.out.println(i[a]);
             }
         }
     ​
     }
     ​

6.遞迴

  • A方法呼叫B方法,我們很容易理解:

  • 遞迴就是:A方法呼叫A方法!就是自己調自己

  • 利用遞迴可以用簡單的程式來解決一些複雜的問題。它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。

  • 遞迴結構包括兩部分:

    • 遞迴頭:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈。

    • 遞迴體:什麼時候需要呼叫自身方法。

 package com.langlang.method;
 ​
 public class Demo06 {
     
     
     public static void main(String[] args) {
         Demo06 demo06 = new Demo06();
         demo06.test();
     }
     //錯誤的使用方法,使程式陷入死迴圈
     public void test(){
         test();
     }
 }
 ​

 package com.langlang.method;
 //遞迴練習
 public class Demo07 {
     public static void main(String[] args) {
         System.out.println(f(5));
     }
 ​
     public static int f(int n){
         if(n==1){
             return 1;
         }else{
             return n*f(n-1);
         }
     }
 ​
 }
 ​

方法簡單練習(簡易計算器)



package com.langlang.method;
 ​
 import java.util.Scanner;
 ​
 public class Demo08 {
 ​
     public static Scanner sc = new Scanner(System.in);
 ​
     public static void main(String[] args) {
         while(true){
             System.out.println("***********************歡迎使用簡易計算器***********************");
             System.out.println("1.加法運算 2.減法運算 3.除法運算 4.乘法運算 5.遞迴運算 6.退出程式");
             System.out.println("****************************************************************");
             System.out.println("選擇序號:");
             int a = sc.nextInt();
             switch (a){
                 case 1:
                     add();
                     break;
                 case 2:
                     J();
                     break;
                 case 3:
                     Ch();
                     break;
                 case 4:
                     C();
                     break;
                 case 5:
                     System.out.println("請輸入要計算的數(整數且大於等於1,否則無效):");
                     int x = sc.nextInt();
                     System.out.println("階乘運算處理結果是:"+T(x));
                     break;
                 case 6:
                     System.exit(0);
                     break;
                 default:
                     System.out.println("輸入無效請重新輸入!");
             }
         }
     }
     //加法運算
     public static void add(){
         System.out.println("輸入第一個數:");
         int a = sc.nextInt();
         System.out.println("輸入第二個數:");
         int b =sc.nextInt();
         System.out.println("加法運算處理結果是:"+(a+b));
     }
     //減法運算
     public static void J(){
         System.out.println("輸入第一個數:");
         int a = sc.nextInt();
         System.out.println("輸入第二個數:");
         int b =sc.nextInt();
         System.out.println("減法運算處理結果是:"+(a-b));
     }
     //乘法運算
     public static void C(){
         System.out.println("輸入第一個數:");
         int a = sc.nextInt();
         System.out.println("輸入第二個數:");
         int b =sc.nextInt();
         System.out.println("乘法運算處理結果是:"+(a*b));
     }
     //除法運算
     public static void Ch(){
         System.out.println("輸入第一個數:");
         int a = sc.nextInt();
         System.out.println("輸入第二個數:");
         int b =sc.nextInt();
         System.out.println("除法運算處理結果是:"+(a/b));
     }
     //階乘運算
     public static int T(int a){
         if(a==1){
             return 1;
         }else{
             return a*T(a-1);
         }
     }
 ​
 }
 ​