Java流程式控制制 1.用戶交互Scanner java.util.Scanner是Java5的新特征,我們可以通過Scannner類來獲取用戶的輸入。 基本語法: Scanner s = new Scanner(System.in); 通過Scanner類的next()與nextLine()方法獲取 ...
1.用戶交互Scanner
java.util.Scanner是Java5的新特征,我們可以通過Scannner類來獲取用戶的輸入。
Scanner s = new Scanner(System.in);
-
通過Scanner類的next()與nextLine()方法獲取輸入的字元串,在讀取前一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的數據。
1.1Scanner對象
-
next()
-
一定要讀取到有效字元後才可以結束輸入
-
對輸入有效字元之前遇到的空白,next()方法會自動將其去掉
-
只有輸入有效字元後才能將其後面輸入的空白作為分隔符或者結束符
-
next()不能得到帶有空格的字元串
-
nextLine()
-
nextLine()是以Enter(回車)作為結束符,也就是說nextLine()方法返回的是輸入回車之前的所有字元
-
可以獲取空白
例子1
package li.bolog.scanner;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
//創建一個掃描器對象,用於接收鍵盤數據
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判斷用戶有沒有輸入字元串
if(scanner.hasNext()){
String str = scanner.next();//程式會等待用戶輸入完畢
System.out.println("輸入的內容為:"+str);
}
//凡是屬於IO流的類如果不關閉會一直占用資源,要養成好習慣用完就關掉。
scanner.close();
}
}
例子2
package li.bolog.scanner;
import java.sql.SQLOutput;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判斷是否還有輸入
if (scanner.hasNextLine()){
//使用nextLine方式接收
String str=scanner.nextLine();
System.out.println("輸入的內容為:"+str);
}
scanner.close();
}
}
例子3
package li.bolog.scanner;
import java.util.Scanner;
public class Demo03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入數據:");
String str = scanner.nextLine();
System.out.println("輸出的內容為:"+str);
scanner.close();
}
}
1.2Scanner進階使用
例子4
package li.bolog.scanner;
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;
System.out.println("請輸入數據:");
//通過迴圈判斷是否還有數字輸入,併在裡面對每一次進行求和和統計
while(scanner.hasNextDouble()){
double x = scanner.nextDouble();
m=m+1;
sum=sum+x;
System.out.println("你輸入了第"+m+"個數據,當前結果sum="+sum);
}
System.out.println(m+"個數的和為:"+sum);
System.out.println(m+"個數的平均數為:"+(sum/m));
scanner.close();
}
}
2.順序結構
-
Java的基本結構就是順序結構,除非特別指明。否則就按照順序一句一句執行
-
順序結構是最簡單的演算法結構
-
語句與語句之間,框與框之間是按照從上到下的順序進行的,它是由若幹個一次執行的處理步驟組成的,它是任何一個演算法都離不開的一種基本的演算法結構。
3.選擇結構
3.1if單選擇結構
-
我們很多時候需要去判斷一個東西是否可行再去執行,這樣一個過程在程式中用if語句來表示。
語法:
if(布爾表達式){
//這裡是如果布爾表達式為true,則將執行的語句
}
例子
package li.bolog.struct;
import java.util.Scanner;
public class IfDemo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入內容:");
String s= scanner.nextLine();
//equals:判斷字元串是否相等
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("End");
scanner.close();
}
}
3.2if雙選擇結構
語法:
if(布爾表達式){
//這裡是如果布爾表達式為true則將執行的語句
}else{
//這裡是布爾表達式為false則將執行的語句
}
例子
package li.bolog.struct;
import java.util.Scanner;
public class IfDemo02 {
public static void main(String[] args) {
//考試成績大於60分則及格,否則不及格
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入成績:");
int score = scanner.nextInt();
if(score>=60){
System.out.println("成績及格!");
}else{
System.out.println("成績不及格!");
}
scanner.close();
}
}
3.3if多選擇結構
語法:
if(布爾表達式1){
//這裡是如果布爾表達式1為true則將執行的語句
}else if(布爾表達式2){
//這裡是如果布爾表達式2為true則將執行的語句
}else if(布爾表達式3){
//這裡是如果布爾表達式3為true則將執行的語句
}...else{
//如果以上布爾表達都不為true則執行這裡的代碼
}
if語句至多有一個else語句,else語句在所有的else if語句之後
if語句可以有若幹個else if 語句,它們必須在else語句之前
一旦其中一個else if語句檢測為true,其他的else if以及else語句都將跳過
例子
package li.bolog.struct;
import java.util.Scanner;
public class IfDemo03 {
public static void main(String[] args) {
//考試成績大於60分則及格,否則不及格
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入成績:");
int score = scanner.nextInt();
if(score==100){
System.out.println("成績滿分!");
}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<60&&score>=0){
System.out.println("成績不合格!");
}else{
System.out.println("成績非法!");
}
scanner.close();
}
}
3.4嵌套的if結構
使用嵌套的if…else語句是合法的。也就是說你可以在另一個if或者else if語句中使用if或者else if語句。你可以像if語句一樣嵌套else if…else
語法:
if(布爾表達式1){
//如果布爾表達式1為true則執行的語句
if(布爾表達式2){
//這裡是如果布爾表達式2為true則將執行的語句
}
}
3.5switch多選擇結構
-
多選擇結構還有一個實現方式就是switch case語句
-
switch case語句判斷一個變數與一系列值中的某個值是否相等,每一個值稱為一個分支
-
switch語句中的變數類型可以是:
-
byte、short、int或者char
-
從Java SE 7開始 switch支持字元串類型
,同時case標簽必須為字元串常量或字面量
-
語法:
switch(expression){
case value:
//語句
break;//可選
case value:
//語句
break;//可選
//你可以有任意數量的case語句
default://可選
//語句
}
例子:case穿透現象
在switch語句中,如果case的後面不寫break,將出現穿透現象,也就是不會在判斷下一個case的值,直接向後運
行,直到遇到break,或者整體switch結束。
package li.bolog.struct;
public class SwitchDemo01 {
public static void main(String[] args) {
//
char grade='A';
switch(grade){
case 'A':
System.out.println("優秀");
case 'B':
System.out.println("良好");
case 'C':
System.out.println("及格");break;
default:
System.out.println("未知等級");
}
}
}
例子:switch支持字元串類型
package li.bolog.struct;
public class SwitchDemo02 {
public static void main(String[] args) {
String name = "中國";
//JDK7的新特性標,表達式結果可以是字元串!!
//字元串的本質還是數字
//反編譯 java--class(位元組碼文件)----反編譯(這裡用IDEA實現)
switch(name){
case "英國":
System.out.println("英國");break;
case "美國":
System.out.println("美國");break;
case "中國":
System.out.println("中國");break;
default:
System.out.println("弄啥嘞?");
}
}
}
字元串的本質還是數字
這裡使用IDEA反編譯該java文件對應的class文件,得到如下:
可以看到, switch(name)變成了switch(name.hashCode()),case後面對應的字元串變成了數字。每一個中文都會有對應的哈希值,根據哈希值判斷中文是否相同。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package li.bolog.struct;
public class SwitchDemo02 {
public SwitchDemo02() {
}
public static void main(String[] args) {
String name = "中國";
byte var3 = -1;
switch(name.hashCode()) {
case 642672:
if (name.equals("中國")) {
var3 = 2;
}
break;
case 1034543:
if (name.equals("美國")) {
var3 = 1;
}
break;
case 1061420:
if (name.equals("英國")) {
var3 = 0;
}
}
switch(var3) {
case 0:
System.out.println("英國");
break;
case 1:
System.out.println("美國");
break;
case 2:
System.out.println("中國");
break;
default:
System.out.println("弄啥嘞?");
}
}
}
4.迴圈結構
-
while迴圈
-
do...while迴圈
-
for迴圈
在java5中引入了一種主要用於數組的增強型for迴圈
4.1while迴圈
while是最基本的迴圈,它的結構為:
while(布爾表達式){
//迴圈內容
}
-
只要布爾表達式為true,迴圈就會一直執行下去
-
如果想要迴圈停下來,就需要一個表達式失效的方式來結束迴圈
-
迴圈條件一直true就會造成無限迴圈[死迴圈]
例子:輸出1-100
package li.bolog.struct;
public class WhileDemo01 {
public static void main(String[] args) {
//輸出1到100
int i = 0;
while(i<100){
i++;
System.out.print(i);
}
}
}
例子:計算1+2+...+100
package li.bolog.struct;
public class WhileDemo02 {
public static void main(String[] args) {
//計算1+2+...+100
int i=0;
int sum=0;
while(i<=100){
sum=sum+i;
i++;
}
System.out.println(sum);
}
}
4.2do...while迴圈
對於while語句而言,若果不滿足條件,則不能進入迴圈。但有時候我們需要即使不滿足條件,也至少執行一次。
do...while迴圈和while迴圈相似,不同的是,do...while迴圈至少會執行一次
語法:
do{
//代碼語句
}
while(布爾表達式);
-
while和do...while的區別:
-
while先判斷後執行,do-while是先執行後判斷
-
do-while總是保證迴圈體至少會被執行一次!這是他們的主要區別
-
例子:計算1+2+...+100
package li.bolog.struct;
public class DoWhlieDemo01 {
public static void main(String[] args) {
int i=0;
int sum=0;
do{
sum=sum+i;
i++;
}while(i<=100);
System.out.println(sum);
}
}
例子:while和do-while
package li.bolog.struct;
public class DoWhileDemo02 {
public static void main(String[] args) {
int a=0;
while (a<0){
System.out.println(a);
a++;
}
System.out.println("===========");
do{
System.out.println(a);
a++;
}while(a<0);
}
}
4.3For迴圈
for迴圈語句是支持迭代的一種通用結構,是最有效,最靈活的迴圈結構
for迴圈執行的次數是在執行前就確定的。
語法:
for(初始化;布爾表達式;更新){
//代碼語句
}
例子:while和for迴圈對比
package li.bolog.struct;
public class ForDemo01 {
public static void main(String[] args) {
int a = 1;//初始化條件
while(a<=100){//條件判斷
System.out.print(a+" ");//迴圈體
a+=8;//迭代
}
System.out.println("while迴圈結束!");
//初始化 //條件判斷 //迭代
for(int i=1;i<=100;i=i+8){
System.out.print(i+" ");
}
System.out.println("for迴圈結束!");
}
}
關於for迴圈有以下幾點說明:
最先執行的初始化步驟可以聲明一種變數,也可初始化一個或者多個迴圈控制變數,也可以是空語句
然後執行檢測布爾表達式的值,如果為true,迴圈體執行;如果為false,迴圈終止,開始執行迴圈體後面的語句
執行一次迴圈後,更新迴圈控制變數(迭代因數控制迴圈變數的增減)
再次檢測布爾表達式。迴圈執行上面的過程
練習1:分別計算0到100之間奇數和、偶數和
package li.bolog.struct;
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=oddSum+i;
}
else {
evenSum=evenSum+i;
}
}
System.out.println("奇數的和:"+oddSum);
System.out.println("偶數的和:"+evenSum);
}
}
練習2:用while或for迴圈輸出1-1000之間能被5整除的數,並且每行輸出3個
package li.bolog.struct;
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){
System.out.print(i+"\t");
}
if(i%(5*3)==0){//每行輸出的第三個值都是15的倍數,因此除以15
System.out.println();//或者System.out.println("\n");
}
}
}
}
練習3:列印九九乘法表
package li.bolog.struct;
public class ForDemo04 {
public static void main(String[] args) {
//我們先列印第一列
//我們先把固定的j用一個迴圈包起來
//去掉重覆項,j<=i
//調整樣式
for(int i=1;i<=9;i++){
for (int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+(i*j)+"\t");
}
System.out.println();
}
}
}
增強for迴圈:
Java5引入了一種主要用於數組或者集合的增強型for迴圈
Java增強for迴圈語法格式如下:
for(聲明語句:表達式){
//代碼句子
}
聲明語句:聲明新的局部變數,該變數的類型必須和數組元素的類型匹配。其作用域限定在迴圈語句塊,其值與此時數組元素的值相等
表達式:表達式是要訪問的數組名,或者是返回值為數組的方法
package li.bolog.struct;
public class ForDemo05 {
public static void main(String[] args) {
int[] number={10,20,30,40};//定義了一個數組
for(int i=0;i<4;i++){
System.out.println(number[i]);
}
System.out.println("=========");
//遍曆數組元素
for(int x:number){
System.out.println(x);
}
}
}