C++尺寸大小計算
Java流程控制
目錄使用者互動Scanner
我們之前學習的基本語法中我們並沒有實現程式和人的互動,但是Java給我們提供了這樣一個工具類,我們可以獲取使用者的輸入。java.util.Scanner 是 Java5 的新特性,我們可以通過 Scanner 類來獲取使用者的輸入
基礎語法:
Scanner scanner = new Scanner(System.in);
通過Scanner 類的 next() 與 nextLine() 方法獲取輸入的字串,在讀取前我們一般需要 使用 hasNext() 與 hasNextLine() 判斷是否還有輸入的資料。
接收字元
-
next()方法:
-
一定要讀取到有效字元後才可以結束輸入
-
對輸入有效字串之前遇到的空白,next() 方法會自動將其去掉
-
只有輸入有效字元之後才將其後面輸入的空白作為分隔符或結束符
-
next() 不能得到帶有空格的字串
import java.util.Scanner; public class Demo01 { public static void main(String[] args) { // 建立一個掃描物件,用於接收鍵盤資料 Scanner scanner = new Scanner(System.in); System.out.print("使用next()方法接收:"); // 判斷使用者有沒有輸入字串 if (scanner.hasNext()) { // 接收使用者的輸入 String str = scanner.next(); // 程式會等待使用者輸入完畢再執行 System.out.println("輸入的內容為:" + str); // 輸入:Hello World 輸出:Hello } // 凡是屬於 IO 流的類如果不關閉會一直佔用資源,要養成良好的習慣,用完就關閉 scanner.close(); } }
-
-
nextLine()方法:
-
以Enter作為結束符,也就是說 nextLine() 方法返回的是輸入回車之前的所有字元‘
-
可以獲得空白
import java.util.Scanner; public class Demo02 { public static void main(String[] args) { // 從鍵盤接收資料 Scanner scanner = new Scanner(System.in); System.out.print("使用nextLine()方法接收:"); //判定是否還有輸入 if (scanner.hasNextLine()) { String str = scanner.nextLine(); System.out.println("輸入的內容為:" + str); // Hello World } scanner.close(); } }
-
常用格式:
import java.util.Scanner;
public class Demo03 {
public static void main(String[] args) {
// 從鍵盤接收資料
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入資料:");
String str = scanner.nextLine(); // 接收一行資料
System.out.println("輸入的內容為:" + str);
scanner.close(); // 關閉 IO 流
}
}
接收其他資料型別
除了 hasNext() 方法之外,還有 hasNextInt()、hasNextDouble()、……
當然 next() 方法之外 ,還有 nextInt()、nextDouble()、……
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 從鍵盤接收資料
int i = 0;
float f = 0.0f;
// 接收整數:
System.out.print("請輸入整數:");
if (scanner.hasNextInt()) {
i = scanner.nextInt();
System.out.println("整數資料:" + i);
} else {
System.out.println("您輸入的資料不是整數!");
}
// 接收小數:
System.out.print("請輸入小數:");
if (scanner.hasNextFloat()) {
f = scanner.nextFloat();
System.out.println("小數資料:" + f);
} else {
System.out.println("您輸入的資料不是小數!");
}
scanner.close();
}
}
練習
我們可以輸入多個數字,並求出其總和與平均數,每輸入一個數字用回車確認。
通過輸入非數字來結束輸入並輸出執行結果
import java.util.Scanner;
public class Demo05 {
public static void main(String[] args) {
// 接收鍵盤錄入
Scanner scanner = new Scanner(System.in);
// 記錄總和
double sum = 0;
// 記錄輸入的次數
int m = 0;
//迴圈輸入
while (scanner.hasNextDouble()) {
// 輸入一次,sum就加上輸入的數
sum += scanner.nextDouble();
// 記錄數自增1
m++;
System.out.println("第" + m + "次輸入,當前和為:" + sum);
}
System.out.println("一共輸入了:" + m + "次");
System.out.println("和為:" + sum);
System.out.println("平均數是:" + (sum / m));
// 關閉 IO 流
scanner.close();
}
}
順序結構
Java的基本結構就是順序結構,除非特別指明,否則就按照一句一句從上往下依次執行。
順序結構是最簡單的演算法結構
語句與語句之間,框與框之間是按從上到下的順序進行,它是由若干個依次執行的處理步驟組成的
它是一個任何演算法都離不開的一種基本演算法結構
public class OrderDemo {
public static void main(String[] args) {
System.out.println("Hello1");
System.out.println("Hello2");
System.out.println("Hello3");
System.out.println("Hello4");
System.out.println("Hello5");
// 從Hello1 依次執行到 Hello5
}
}
選擇結構
if單選擇結構
我們很多時候需要去判斷一個東西是否可行,然後我們才去執行,這樣一個過程在持續中用if語句來表示
語法:
if (布林表示式) {
// 如果布林表示式為true將執行的語句
}
程式碼:
public class IfDemo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入一個內容:");
String s = scanner.nextLine();
// equals: 判斷字串是否一致
if ("hello".equals(s)){
// 如果輸入的字串是hello,就執行下面的語句
System.out.println(s);
}
System.out.println("End");
scanner.close();
}
}
if雙選擇結構
那現在有個需求,考試分數大於60分及格,小於60分就不及格。這樣的需求用一個if就搞不定了,我們需要有兩個判斷,需要一個雙選擇結構,所以就有了if-else結構。
語法:
if (布林表示式) {
// 如果布林表示式的值為true
} else {
// 如果布林表示式的值為false
}
程式碼:
public class IfDemo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入成績:");
double score = scanner.nextDouble();
if (score >= 60) {
System.out.println("成績及格");
} else {
System.out.println("成績不及格");
}
scanner.close();
}
}
if多選擇結構
我們發現剛才的程式碼不符合實際情況,真實的情況還可能存在ABCD,存在區間多級判斷。比如90-100就是A,80-90 就是B……等等,在生活中我們很多時候的選擇也不僅僅只有兩個,所以我們需要一個多選擇結構來處理這類問題!
if 語句至少有 1 個 else 語句,else 語句必須在所有的 else if 語句之後
if 語句可以有若干個 else if 語句,它們在 else 語句之前
一旦其中一個 else if 語句檢測為 true,其他的 else if 以及 else 語句都將跳過執行
語法:
if (布林表示式1) {
// 如果布林表示式1的值為true執行程式碼
} else if (布林表示式2) {
// 如果布林表示式2的值為true執行程式碼
} else if (布林表示式3) {
// 如果布林表示式3的值為true執行程式碼
} else {
// 如果以上布林表示式的值都不為true執行程式碼
}
程式碼:
public class IfDemo03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入成績:");
double score = scanner.nextDouble();
if (score == 100) {
System.out.println("S");
} else if (score < 100 && score >= 90) {
System.out.println("A級");
} else if (score < 90 && score >= 80) {
System.out.println("B級");
} else if (score < 80 && score >= 70) {
System.out.println("C級");
} else if (score < 70 && score >= 60) {
System.out.println("D級");
} else if (score >= 0 && score < 60) {
System.out.println("不及格");
} else {
System.out.println("成績不合法");
}
scanner.close();
}
}
巢狀的if結構
使用巢狀的if...else語句是合法的。也就是說你可以在另一個if或者else if語句中使用if或者else if 語句。你可以像if語句一樣巢狀else if...else。
語法:
if (布林表示式1) {
// 如果布林表示式1的值為true執行程式碼
if (布林表示式2) {
// 如果布林表示式2的值為true執行程式碼
}
}
switch多選擇結構
多選擇結構還有一個實現方式就是switch case語句。
switch case語句判斷一個變數與一系列值中某個值是否相等,每個值稱為一個分支。
語法:
switch(expression){
case value:
// 語句
break; // 可選
case value:
// 語句
break; // 可選
// 你可以有任意數量的case語句
default : // 可選
// 語句
break;
}
switch 語句中的變數型別可以是:
- byte、short、int 或者 char
- 從Java SE 7 開始
- switch 支援字串 String 型別了
- 同時 case 標籤必須為字串常量或字面量
程式碼:
public class SwitchDemo01 {
public static void main(String[] args) {
char grade = 'C';
// switch 匹配一個具體的值
switch (grade) {
case 'A':
System.out.println("優秀");
break; // 可選
// case 穿透 執行完一個case,如果沒有break,就會繼續執行下一條 case 或 break
case 'B':
System.out.println("良好");
case 'C':
System.out.println("及格");
case 'D':
System.out.println("再接再厲");
break;
case 'E':
System.out.println("掛科");
default:
System.out.println("未知等級");
break;
}
}
}
反編譯
Java檔案:
package com.jh.struct;
public class SwitchDemo02 {
public static void main(String[] args) {
String name = "study";
// JDK7的新特性,表示式的結果可以是字串!!!
// 字元的本質還是數字
/*
反編譯 java -- class(位元組碼檔案) --- 反編譯(IDEA)
*/
switch(name){
case "hello":
System.out.println("你好");
break;
case "study":
System.out.println("study");
break;
default :
System.out.println("無法匹配");
break;
}
}
}
class檔案反編譯後:
package com.jh.struct;
public class SwitchDemo02 {
public SwitchDemo02() {
}
public static void main(String[] args) {
String name = "study";
byte var3 = -1;
switch(name.hashCode()) {
case 99162322:
if (name.equals("hello")) {
var3 = 0;
}
break;
case 109776329:
if (name.equals("study")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("你好");
break;
case 1:
System.out.println("study");
break;
default:
System.out.println("無法匹配");
}
}
}
迴圈結構
為了執行程式碼中的重複步驟,減少程式碼的冗餘,使程式碼簡潔明瞭
while 迴圈
while 是最基本的迴圈
結構:
while (布林表示式) {
// 迴圈內容
}
只要布林表示式為 true,迴圈就會一直執行下去
我們大多數情況是會讓迴圈停止下來的,我們需要一個讓表示式失效的方法來結束迴圈
少部分情況需要迴圈一直執行,比如伺服器的請求響應監聽等
迴圈條件一直為true就會造成無限迴圈【死迴圈】我們正常的業務程式設計中應該儘量避免死迴圈。會影響程式效能或者造成程式卡死崩潰!
程式碼:
public class WhileDemo01 {
public static void main(String[] args) {
// 輸出1~100
int i = 0;
while (i < 100) { // 迴圈結束條件
i++;
System.out.println(i);
}
}
}
死迴圈程式碼:
public class WhileDemo02 {
public static void main(String[] args) {
// 死迴圈
while (true){
// 等到客戶端連線
// 定時檢查任務
// ……
}
}
}
練習:計算 1 + 2 + 3 + …… + 100 = ?
高斯的故事:首項加末項乘以項數除以2
public class WhileDemo03 {
public static void main(String[] args) {
int i = 0; // 初始值
int sum = 0; //總和
while (i <= 100) { // 迴圈條件
sum += i; // 執行一次 sum 就加上 i
i++; // i自增
}
System.out.println(sum); // 5050
}
}
do...while 迴圈
對於 while 語句而言,如果不滿足條件,則不能進入迴圈。但有時候我們需要即使不滿足條件,也至少執行一次
do...while 迴圈和 while 迴圈相似,不同的是,do...while 迴圈至少會執行一次
語法:
do {
// 程式碼語句
} while (布林值表示式);
while 和 do-while 的區別:
- while先判斷後執行。do-while是先執行後判斷!
- do ... while 總是保證迴圈體會被至少執行一次!
程式碼:
public class DoWhileDemo01 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
sum += i;
i++;
} while (i <= 100);
System.out.println(sum);
}
}
while 和 do...while 對比:
public class DoWhileDemo02 {
public static void main(String[] args) {
int i = 0;
while (i < 0) {
System.out.println(i);
}
System.out.println("==========");
do {
System.out.println(i);
} while (i < 0);
}
}
// 輸出
==========
0
for 迴圈
雖然所有迴圈結構都可以用 while 或者 do...while表示,但 Java 提供了另一種語句 ----- for 迴圈,使一些迴圈結構變得更加簡單
for 迴圈語句是支援迭代的一種通用結構,是最有效、最靈活的迴圈結構
for 迴圈執行的次數是在執行前就確定的
語法:
for (初始值; 布林表示式; 更新) {
// 程式碼語句
}
for 迴圈特點:
- 最先執行初始化步驟。可以宣告一種型別,但可初始化一個或多個迴圈控制變數,也可以是空語句
- 然後,檢測布林表示式的值。如果為true,迴圈體被執行。如果alse,迴圈終止,開始執行迴圈體後面的語句
- 執行一次迴圈後,更新迴圈控制變數(迭代因子控制迴圈變數的地減)
- 再次檢測布林表示式。箭環執行上面的過程
程式碼:
public class ForDemo01 {
public static void main(String[] args) {
int a = 1; // 初始化條件
while (a <= 100) { // 條件判斷
System.out.println(a); //迴圈體內容
a++; // 迭代
}
System.out.println("while迴圈結束!");
// 初始化條件;條件判斷;迭代
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
System.out.println("for迴圈結束!");
}
}
for 迴圈的死迴圈寫法:
for (; ; ) {
}
for迴圈練習
計算0到100之間的偶數和奇數的和
public class ForDemo02 {
public static void main(String[] args) {
// 計算0到100之間的偶數和奇數的和
int oddSum = 0;
int evenSum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) { // 奇數
oddSum += i;
} else { // 偶數
evenSum += i;
}
}
System.out.println("奇數和:" + oddSum); // 2500
System.out.println("偶數和:" + evenSum); // 2550
}
}
用 while 或 for 迴圈輸出 1~1000 之間能被5整除的數,並且每行輸出3個
public class ForDemo03 {
public static void main(String[] args) {
// 用 while 或 for 迴圈輸出 1~1000 之間能被5整除的數,並且每行輸出3個
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) { // 被5整除
System.out.print(i + "\t");
}
if (i % (5 * 3) == 0) { // 每行三個 換行
System.out.println();
}
}
}
}
列印九九乘法表
public class ForDemo04 {
public static void main(String[] args) {
// 外圍for迴圈 控制列
// 內層for迴圈 控制每列列印幾行
// 每列列印的行數就是對應的第幾列 (1列1行、2列2行、3列3行、……)
for (int i = 1; i <= 9; i++) { // 控制列
for (int j = 1; j <= i; j++) { // 控制行
System.out.print(j + "*" + i + "=" + (i * j) + "\t"); // 輸出
}
System.out.println(); // 換行
}
}
}
增強for迴圈
在Java5中引入了一種主要用於陣列或集合的增強型for迴圈
語法:
for (宣告語句 : 表示式) {
// 程式碼語句
}
宣告語句:宣告新的區域性變數,該變數的型別必須和資料元素的型別匹配。其作用域限定在迴圈語句塊,其值於此時陣列元素的值相等。
表示式:表示式是要訪問的陣列名,或者是返回值為陣列的方法。
程式碼:
public class ForDemo05 {
public static void main(String[] args) {
// 定義一個數組
int[] numbers = new int[]{10, 20, 30, 40, 50};
// for迴圈 遍歷陣列的元素
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
// foreach 遍歷陣列的元素
for (int number : numbers) {
System.out.println(number);
}
}
}
break和continue
break在任何迴圈語句的主體部分,均可用break控制迴圈的流程。break用於強行退出迴圈,不執行迴圈中剩餘的語句。(break語句也在switch語句中使用)。
break:
public class BreakDemo {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
i++;
System.out.println(i);
if (i == 30) {
break; // 終止迴圈
}
}
// 終止迴圈後,不影響後面語句的執行
System.out.println("123");
}
}
continue語句用在迴圈語句體中,用於終止某次迴圈過程,即跳過迴圈體中尚未執行的語句,接著進行下一次是否執行迴圈的判定。
continue:
public class ContinueDemo {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
i++;
if (i % 10 == 0) {
System.out.println();
continue; // 終止本次迴圈,開始下一次迴圈
}
System.out.println(i);
}
}
}
關於goto關鍵字
goto關鍵字很早就在程式設計語言中出現。儘管goto仍是Java的一個保留字,但並未在語言中得到正式使用;Java沒有goto。然而,在break和continue這兩個關鍵字的身上,我們仍然能看出一些goto的影子---帶標籤的break和continue。
“標籤”是指後面跟一個冒號的識別符號,例如 :label:
對Java來說唯一用到標籤的地方是在迴圈語句之前。而在迴圈之前設定標籤的唯一理由是:我們希望在其中巢狀另-個迴圈,由於break和continue關鍵字通常只中斷當前迴圈,但若隨同標籤使用,它們就會中斷到存在標籤的地方。
程式碼:
public class LabelDemo {
public static void main(String[] args) {
// 列印101~150之間的所有質數
// 質數,大於1的自然數中,除了1和它本身以外不再有其他因數的自然數
int count = 0;
// 不建議使用
outer:for (int i = 101; i < 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0){
continue outer;
}
}
System.out.println(i);
}
System.out.println(count);
}
}
流程控制練習
列印三角形
public class TestDemo {
/*
*
***
*****
*******
*********
*/
public static void main(String[] args) {
// 列印三角形 5行
int row = 5;
for (int i = 1; i <= row; i++) { // 控制行
for (int j = row; j >= i ; j--) { // 列印最左邊空白三角形
System.out.print(" ");
}
for (int j = 1; j <= i ; j++) { // 列印右直角三角形
System.out.print("*");
}
for (int j = 1; j < i ; j++) { // 列印左直角三角形
System.out.print("*");
}
System.out.println(); // 換行
}
}
}