1. 程式人生 > 實用技巧 >.新手Java基本語法(2)

.新手Java基本語法(2)

三,流程控制
1,接收使用者輸入

首先,建立Scanner工具類對應的實體物件input,用於操作輸入,需要注意以下兩點:

在這裡插入圖片描述

更具體的輸入,需要使用上一步建立的實體input帶有的函式,比如:

input.nextInt(); // 返回值為int
input.nextFloat(); // 返回值為float
input.nextByte(); // 返回值為byte
…

然而上述函式要求輸入必須與預定型別一致。為了方便接受各種不同型別的輸入,可以使用函式:

input.next(); // 返回值為String
input.nextLine(); // 返回值為String

注意:

next與nextLine儘量不要同時使用,以下面的例子為例:

package com.kaikeba.demo;
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("請輸入next接受的內容:");
String s1 = input.next();
System.out.println(s1);
System.out.println("請輸入nextLine接受的內容:");
String s2 = input.nextLine();
System.out.println(s2);
System.out.println("------我是分界線------");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

原先設想的是可以在控制檯輸入兩次資料,一次給next函式,另一次給nextLine函式。然而執行時會發現,next接收資料後,敲下回車,可以正常顯示,等到nextLine函式接受資料時,卻不能繼續在控制檯進行輸入。

原因是:敲下回車後,next函式接受了資料,nextLine函式接收了後面的換行字元;所以s2中存放的是換行字元;
2,程式的執行結構

1996 年,電腦科學家 Bohm 和 Jacopini 證明了:任何簡單或複雜的演算法都可以由順序結構、分支結構和迴圈結構這三種基本 結構組合而成。

它們的共同點是都包含一個入口和一個出口,它們的每個程式碼都有機會被執行,不會出現死迴圈。

順序結構 :順序結構是一種基本的控制結構,它按照語句出現的順序執行操作 ;
分支結構 :分支結構又被稱為選擇結構,根據條件成立與否來執行操作;
迴圈結構 :迴圈結構是一種重複結構,如果條件成立,它會重複執行某一迴圈體,直到出現不滿足的條件為止;

3,分支執行結構
3.1 if條件語句

if 條件結構是根據條件判斷之後再做處理

if(條件語句){…}
if (條件語句){…}else{…}
if (條件語句){…}else if(條件語句){…}
if (條件語句){…}else if(條件語句){…}else{…}
例子:使用者輸入學生成績,判斷成績是否及格,判斷條件為 優良: > 90、良好:81-90、中:60-80、不及格:<60

import java.util.Scanner;
public class Demo4{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("請輸入成績:");
int score s= input.nextInt(); // 91 優 81-90 良 60-80 中 60 差
if(score >= 91){
System.out.println("您的成績是優秀!繼續加油哦!");
}else if(score >= 81 & score < 91){
System.out.println("您的成績是良好!還要努力哦!");
}else if(score >= 60 & score <= 80){
System.out.println("您的成績是中等!還要加倍努力哦!");
}else{
System.out.println("您的成績是差!準備補考費吧!");
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

3.2 switch語句

switch(表示式){

case 取值 1: 語句塊 1;break;

case 取值 n: 語句塊 n;break;

default: 語句塊 n+1;break;

}

switch 語句有關規則

表示式的返回值必須是下述幾種型別之一:int, byte, char, short,String;
case 子句中的取值必須是常量,且所有 case 子句中的取值應是不同的;
default 子句是可選的;
break 語句用來在執行完一個 case 分支後使程式跳出 switch 語句塊;
如果 case 後面沒有寫 break 則直接往下面執行!
Case 後面的執行體可寫{ }也可以不寫{ }

例題:多分支月份輸出天數(充分利用語句特性)

import java.util.Scanner;
public class Demo6{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("請輸入月份:");
int month = input.nextInt();
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month + "月共有 31 天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(month + "月共有 30 天");
break;
case 2:
System.out.println(month + "月共有 28 天");
break;
default :
System.out.println("友情提示,您輸入有誤!");
break;
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

4,迴圈執行結構

迴圈語句功能

在迴圈條件滿足的情況下,反覆執行特定程式碼 迴圈語句分類
for 迴圈
while 迴圈
do/while 迴圈

4.1 while迴圈

符合條件,迴圈繼續執行;否則,迴圈退出

特點:先判斷,再執行

while(條件表示式){
//語句塊;
}

int sum = 0;
int score = 0;
int avg = 0;
int studentNum = 20;
while(i<=studentNum){
System.out.print("請輸入第" + i + "位同學的成績:");
score = input.nextInt();
sum = sum + score;
i++;
}
avg = sum / stuNum ;

1
2
3
4
5
6
7
8
9
10
11

4.2 do-while 迴圈

先執行一遍迴圈操作,符合條件,迴圈繼續執行;否則,迴圈退出 (保證函式體內的程式碼至少執行一次)

特點:先執行,再判斷

do {
迴圈操作
}while ( 條件表示式 );

在這裡插入圖片描述
4.3 for迴圈

for(初始化引數;判斷條件 ;更新迴圈變數){
迴圈體;
}

public class ForLoop {
public static void main(String [] args){
int result = 0;
for(int i=1; i<=100; i++) {
result += i;
}
System.out.println("result=" + result);
}

}

1
2
3
4
5
6
7
8
9
10
11

4.4 break、continue與多重迴圈的跳出

break:跳出包含break的最近的一個迴圈體;

continue:跳過此次迴圈體中continue語句後的程式碼,並執行下一次迴圈;

多重迴圈的跳出使用別名的方法,舉例如下:
在這裡插入圖片描述
4.5 判斷使用者輸入型別

在這裡插入圖片描述
四,陣列
1,陣列
1.1 陣列概念

陣列是相同資料型別的多個數據的容器。

這些元素按線性順序排列。所謂線性順序是指除第一個元素外,每一個元素都有唯一的前驅元素;除最後一個元素外,每一個元素都有唯一的後繼元素。(“簡單理解就是:一個跟一個順序排列”)。
1.2 陣列建立格式

格式 1. 資料型別[] 陣列名稱 = new 資料型別[陣列長度];

格式 2. 資料型別[] 陣列名稱 = {陣列內容 1,陣列內容 2,陣列內容 3…陣列內容 n};

格式 3. 資料型別[] 陣列名;

格式 3 屬於只建立了陣列引用名, 並未在記憶體建立陣列空間。

格式 4. 資料型別[] 陣列名稱 = new 資料型別[]{內容 1,內容 2,內容 3…內容 n};

package com.kaikeba.demo;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
/*
* 建立陣列的格式
*/
// 常用格式1:建立陣列同時指定陣列內容
// 資料型別[] 陣列名 = {資料1,資料2,資料3,......};
int[] tem1 = {1, 2, 3, 4};

	// 常用格式2:建立陣列,指定長度,不指定內容
	// 資料型別[] 陣列名 = new 資料型別[陣列長度(int)型別]
	int[] tem2 = new int[10];
	
	// 不常用格式1:建立陣列 不初始化
	// 資料型別[] 陣列名
	int[] tem3;
	
	// 不常用格式2:建立陣列並指定內容
	// 資料型別[] 陣列名 = new 資料型別[]{資料1,資料2,資料3,......}
	int[] tem4 = new int[] {1, 2, 3, 4};
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

1.3 陣列相關操作

1,通過下標操作資料的方式

給陣列某個下標賦值:

tem1[2] = 66;

1

從下標取值:

System.out.println(tem1[2]);

1

2,獲得陣列長度

陣列名.length

System.out.println(tem2.length);

1

2,陣列常見問題
2.1 下標越界

在這裡插入圖片描述
2.2 空指標問題

名稱與值未繫結;
在這裡插入圖片描述
3,陣列應用
3.1 尋找陣列最大最小值

建立變數,儲存最大值,遍歷陣列更新最大值;

建議:將變數初始化為陣列的第一個元素;
在這裡插入圖片描述
3.2 常用演算法

氣泡排序:

原理:

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後一個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
名字來由:

是因為最小(或最大)的元素會經由交換慢慢“浮”到數列的頂端(降序或升序),就如同水中的氣泡最終會上浮到 頂端一樣,故名“氣泡排序”。

package com.kaikeba.demo1;

public class Demo4 {

/**
 * 氣泡排序
 * @param args
 */
public static void main(String[] args) {
	int[] nums = {20,15,18,13,30,60};
	int temp;
	//外層迴圈控制的是, 比較的輪數。
	//外層迴圈次數: length-1
	for(int i=0;i<nums.length-1;i++) {
		//內層迴圈控制的是,每輪比較的次數
		//第i輪(i從0開始計算), 比較次數為:length-i-1
		for(int j=0;j<nums.length-i-1;j++) {
			if(nums[j]>nums[j+1]) {
				//兩兩相比, 滿足移動條件
				temp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = temp;
			}
		}
	}
//排序已經完成。 下面是遍歷列印檢視的過程
	for(int i=0;i<nums.length;i++) {
		System.out.println(nums[i]);
	}
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

二分查詢

概述

二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,二分查詢要求陣列資料必須採用順序儲存結構有序排列。

原理

首先,假設陣列中元素是按升序排列,將陣列中間位置的資料與查詢資料比較,如果兩者相等,則查詢成功;否則利用
中間位置記錄將陣列分成前、後兩個子陣列,如果中間位置資料大於查詢資料,則進一步查詢前子陣列,否則進一步查 找後子陣列。
重複以上過程,直到找到滿足條件的資料,則表示查詢成功, 直到子陣列不存在為止,表示查詢不成功。