1. 程式人生 > >Java基礎篇之順序、選擇、迴圈結構

Java基礎篇之順序、選擇、迴圈結構

程式流程

 java程式語句執行的順序包括4種基本控制結構:順序結構、選擇結構、迴圈結構、異常處理邏輯結構

順序結構

 Java程式中,語句執行的基本順序按各語句出現的位置先後順序執行,即為順序結構。

  • 例1:順序結構:已知三角形三邊,求三角形面積:
public class Inorder {
    public static void main(String[] args) {
     double a, b, c, p,area;
        Scanner scan = new Scanner(System.in);//Scanner可用於掃描控制檯輸入
        System.out.print("請輸入三角形的邊A:  ");
        String s = scan.nextLine();
        a = Double.parseDouble(s); //將數字字串轉換成等效的雙精度浮點數
        System.out.print("請輸入三角形的邊B:  ");
        s = scan.nextLine();
        b = Double.parseDouble(s); //將數字字串轉換成等效的雙精度浮點數
        System.out.print("請輸入三角形的邊C:  ");
        s = scan.nextLine();
        c = Double.parseDouble(s); //將數字字串轉換成等效的雙精度浮點數
        System.out.printf("三角形的三邊分別為:a =%6.1f,b=%6.1f,c=%6.1f\n",a,b,c);
        p = (a+b+c)/2;
        area = Math.sqrt(p*(p-a)*(p-b)*(p-c));
        System.out.printf("三角形的面積是= %8.1f\n",area);
    }
 }
  • 執行結果:
請輸入三角形的邊A:  3
請輸入三角形的邊B:  4
請輸入三角形的邊C:  5
三角形的三邊分別為:a =   3.0,b=   4.0,c=   5.0
三角形的面積是=      6.0
  • 這裡用到了Scanner類,Java 5添加了java.util.Scanner類,這是一個用於掃描輸入文字的新的實用程式。例子中用到到了Scanner類的一個常用方法nextline(),同時下面將nextline()和next()兩個方法做簡單對比:
package kkee;
import java.util.Scanner; //匯入包
/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/13 15:44
 */
public class Text {
    public static void main(String []args) {
        Scanner scanner = new Scanner(System.in);
      //  System.out.println("請輸入一個字串(中間能加空格或符號)");
        // String a = scanner.nextLine();
        System.out.println("請輸入一個字串(中間不能加空格或符號)");
        String b = scanner.next();
       /* System.out.println("請輸入一個整數");
        int c;
        c = scanner.nextInt();
        System.out.println("請輸入一個double型別的小數");
        double d = scanner.nextDouble();
        System.out.println("請輸入一個float型別的小數");
        float f = scanner.nextFloat();
        System.out.println("按順序輸出abcdf的值:");
        System.out.println(a);*/
        System.out.println(b);
       // System.out.println(c);
       // System.out.println(d);
       // System.out.println(f);
    }
}

  • 執行結果:
請輸入一個字串(中間能加空格或符號)
solo
請輸入一個字串(中間不能加空格或符號)
solo
請輸入一個整數
123
請輸入一個double型別的小數
12.1234
請輸入一個float型別的小數
2.34567
按順序輸出abcdf的值:
solo
solo
123
12.1234
2.34567
  • 當在next()方法下,輸入帶符號或空格的值,所得結果:
請輸入一個字串(中間不能加空格或符號)
so lo
so

總結:
(1) next():只讀取輸入直到空格,無法識別空格鍵,遇到即退出。它不能讀兩個由空格或符號隔開的單詞。此外,next()在讀取輸入後將游標放在同一行中。(next()只讀空格之前的資料,並且游標指向本行)
(2)nextLine():讀取輸入,包括單詞之間的空格和除回車以外的所有符號。讀取輸入後,nextLine()將游標定位在下一行。
(3)nextlnt():只讀取int值,就是隻能讀取整數型別的資料,如果輸入了非整型的資料(浮點型字串等)就會報錯。 nextFloat()、nextDouble()這些也是以此類推,只能讀取符合該型別的資料。

選擇結構

 選擇結構根據條件來控制程式碼的執行分支,也成分支結構。Java包括兩種控制分支的條件語句,if語句、switch語句

  • if語句包含多種形式:單分支、雙分支、多分支。
  • (1)單分支:語法形式:
     if(條件表示式)
      語句/語句塊;
     該語句的作用是當條件表示式的值為真(true)時,執行if後的語句(塊),否則不做任何操作,控制轉到if語句的結束點。
  • 典例:判斷當前年,是否為閏年?
  • 1.年份能被4整除並且不能被100整除;
    2.能被400整除;

public class Year {
        public static boolean loopYear ( int year){
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                return true;
            }
            return false;
        }
    public static void main(String[] args) {
       boolean k = loopYear(2018);
       System.out.println(k);
    }
}
false
  • (2)雙分支:語法形式:
     if(條件表示式)
      語句/語句塊1;
    else
     語句/語句塊2;
     該語句的作用是當條件表示式的值為真時,執行if後的語句/語句塊1,否則執行語句/語句塊2。
  • 典例:輸入兩個數,判斷兩個數的大小。
public class Copab {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("請輸入2個整數:");
        int a = s.nextInt();
        int b = s.nextInt();
        if(a < b){
            System.out.println("a < b");
        }else{
            System.out.println("a>b");
        }
    }

請輸入2個整數:
2
3
a < b

  • (3)多分支:
     if(條件表示式1)
      語句/語句塊1;
    else if(條件表示式2)
     語句/語句塊2;
    else if(條件表示式2)
     語句/語句塊2;
    ……
  • 典例:已知課程的成績,根據成績80-100、70-80、60-70、60以下,將其分等級為A、B、C、D。輸入成績時,輸出評價。
public class Grade {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入成績:");
        int mark = scanner.nextInt();
        if(mark >= 80) {
            System.out.println('A');
        } else  if(mark >=70   && mark <=80 ){
            System.out.println('B');
        }else if(mark >=60 && mark <=70 ){
            System.out.println('C');
        }else if(mark <60 ){
            System.out.println('D');
        }
    }
}
請輸入成績:
68
C

  • (4)if語句的巢狀:
     if(條件表示式1){
      if(條件表示式2){
      語句/語句塊1;
     }else{
     語句/語句塊2;}
    }
  • switch語句是一個控制語句,它通過將控制傳遞給其體內的case語句來處理多個選擇和列舉。
    -語法形式:
    switch(表示式){
    case 常量表達式1: 語句1;
    break;
    case 常量表達式2: 語句2;
    break;

    case 常量表達式n: 語句n;
    break;
    default: 語句n+1;
    break;
    }
  • 典例:已知課程的成績,根據成績80-100、70-80、60-70、60以下,將其分等級為A、B、C、D。輸入等級時,輸出成績範圍。
package kkee;

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/13 22:26
 */
public class School {
    public static char fun(char ch) {
        switch (ch) {
            case 'A':
                System.out.println("80-100");
                break;
            case 'B':
                System.out.println("70-80");
                break;
            case 'C':
                System.out.println("60-70");
                break;
            case 'D':
                System.out.println("60以下");
                break;
            default:
                System.out.println("沒救了!");
                break;
        }
        return ch;
    }
    public static void main(String[] args) {
        char k = fun('A');
        System.out.println(k);

    }
}

80-100
A
  • 注意
     (1)switch控制表示式所允許的資料型別:整型型別(byte、short、int)、字元型別(char)和列舉型別;不能允許的資料型別有:double、long、float。
     (2)case標籤後的常量表達式只能是常數或者常量,不能為變數。

迴圈結構

 Java提供了4種不同的迴圈機制:for、while、do…while、for each,在滿足某個條件之前,可以重複執行程式碼塊。

  • for迴圈是計數型迴圈語句,一般用於已知迴圈次數的情況,所以也稱定次迴圈。
  • for(初始化設定表示式;迴圈執行條件;迴圈變數的增減量)
    { 迴圈語句序列 }
  • 典例:求輸入的數字是否為素數?
 public static boolean isPrime(int n){
        for (int a = 2; a > 2; a++){
           if( n % a == 0) {
               return false;
           }
        }
        return true;
    }
  • 典例:求5的階乘。
package kkee;



/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/13 23:05
 */
public class fun {
     public static int Pulse(int n) {
        int j = 1;
        for (int i = 1; i <= n; i++) {
            j = j * i;
        }
         return  j;
    }
    public static void main(String[] args) {
        int k = Pulse(5);
        System.out.println(k);
    }
}

  • 典例:求1-100之內的和,1-100之內奇數的和。
package kkee;

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/13 23:17
 */
public class SumAll {
    public static void main(String[] args) {
        int sum = 0;
        int sumOdd = 0;//奇數和
        int sumEven = 0;//偶數和
        for(int i = 1;i <= 100;i += 1){
            sum += i;
        }
        for(int i = 1;i <= 100;i += 2){
            sumOdd += i;
        }
        for(int i = 2;i <= 100;i += 2){
            sumEven += i;
        }
        System.out.printf("1-100中所有數的和為%d、奇數和為%d、偶數和為%d\n",sum,sumEven,sumOdd);
    }
}

1-100中所有數的和為5050、奇數和為2550、偶數和為2500


  • 注意
     (1)for 迴圈中,第二個引數若沒有,則預設為真;
     (2)for 迴圈結構中的3個表示式都可省略。例如,下列程式片創造了一個無限迴圈,for(;;){ //This will run forever }
  • Tips:
  • (1)求斐波那契數列的前40項的和?
     斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……特別指出:第0項是0,第1項是第一個1。這個數列從第3項開始,每一項都等於前兩項之和。
package kkee;

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/14 14:04
 */
public class Main {
    public int Fob(int n){
        if (n < 0)
            return -1;//終止遞迴
        if ( n == 1 || n == 2)
            return 1;
        return Fob(n-1)+Fob(n-2);//遞迴呼叫
    }
    public static void main(String[] args) {
        Main main = new Main();//例項化物件
        int sum = 0;
        for (int i = 1; i <= 40 ; i++) { //迴圈次數40,即前40項
            sum += main.Fob(i);//求和
        }
        System.out.println(sum);//列印並輸出
    }
}

267914295

  • (2)用for迴圈產生20個隨機數(10-20)。
     應用Math類的Random()方法,Math.random() – 返回0和1之間的偽隨機數 可能為0,但總是小於1,[0,1); a-b: Math.random() *(b-a)+a 。
package kkee;

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/14 10:47
 */
// 用for迴圈產生20個隨機數(10-20)
//  a-b;  Math.random() *(b-a)+a      Math.random():[0,1)  double
public class RandomNumber {
    public static void main(String[] args) {
        for(int i = 0; i < 20; i++){      //控制迴圈次數,即產生隨機數個數
            double a = (double) (Math.random()*10+10);
                                       //a-b;  Math.random() *(b-a)+a
                                      //設定隨機數產生範圍10-20
            System.out.print(a+"\n");//換行輸出
        }
    }
}
12.981837264734592
13.006022254093143
12.487037794538924
13.145405893027164
12.458942902107488
15.43507744667718
14.259679971672586
15.509221626909214
19.940084712858457
19.772918004113755
13.68682288744929
14.386686400881068
17.878611177117385
10.93307850365068
17.73783786843079
17.264961318332702
11.128319978032376
16.24171939063554
10.588602457917593
10.624208022042762
  • (3)輸入一個數字,求他是幾位數,並且順序輸出,逆序輸出。
     charAt(int index)方法是一個能夠用來檢索特定索引下的字元的String例項的方法,charAt()方法返回指定索引位置的char值。
package kkee;
import java.util.Scanner;//匯入Scanner

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/14 11:43
 */
public class Order {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//獲得從控制檯輸入的引數
        String str = scanner.nextLine();//nextline()方法
        System.out.println("這個數是:" + str.length() + "位");
        System.out.println("順序輸出為:" + str);
        System.out.print("逆序輸出為:");
        for(int i = str.length() - 1; i >= 0; i--) {
            System.out.print(str.charAt(i));//str.charAt()檢索str中的字元,並列印
        }
    }
}

1234
這個數是:4位
順序輸出為:1234
逆序輸出為:4321

  • (4)求一個數字的二進位制數有幾個1?
package kkee;

/**
 * @Package: kkee
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/14 15:03
 */
public class funn {
    public static int getBinary(int value){  
        int count = 0;
        int remainder = 0;
        while (value != 0){
            remainder = value % 2;  //儲存餘數
            if (remainder == 1)
                count++;
                value = value / 2;
        }
        return count;  //返回count的值
    }
    public static void main(String[] args) {
        int k = getBinary(8);
        System.out.println(k);
    }
}

1

Over…