1. 程式人生 > >Java SE 第三章

Java SE 第三章

第三章 選擇語句
3.1 比較運算子
※ 大於 >
※ 大於等於 >=
※ 小於 <
※ 小於等於 <=
※ 等於 ==
※ 不等於 !=
3.2 邏輯運算子
※ 單與 &
有false則false。
※ 雙與 &&
有false則false。&&具有短路效果。左邊是false,右邊不執行。
※ 或 |
有true則true。
※ 雙或 ||
||和|都是表示“或”,區別是||只要滿足第一個條件,後面的條件就不再判斷,而|要對所有的條件進行判斷。
※ 非 !
非false則true,非true則false。
※ 異或 ^


相同為false,不同為true。
3.3 if語句
※ 單if if-else分支
在這裡插入圖片描述
在這裡插入圖片描述

※ 多if-else分支
在這裡插入圖片描述
在這裡插入圖片描述

※ 多if-else巢狀
在這裡插入圖片描述
在這裡插入圖片描述

示例:計算身體質量指數
在這裡插入圖片描述

import java.util.Scanner;


public class Test1 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取身高和體重
		System.out.print("Please enter your weight and hight:");
		double weight=scanner.nextDouble();
		double hight=scanner.nextDouble();
		//2.BMI=體重/身高^2
		double BMI=weight/hight/hight;
		//3.將BMI進行判斷,輸出相應的說明
		if(BMI>=30.0){
			System.out.println("過胖");
		}else if(BMI>=25.0){
			System.out.println("超重");
		}else if(BMI>=18.5){
			System.out.println("正常");
		}else{
			System.out.println("偏瘦");
		}
	}
}


示例:判斷閏年
在這裡插入圖片描述

import java.util.Scanner;


public class Test2 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取使用者輸入的年份
		System.out.print("Enter the year:");
		int year=scanner.nextInt();
		//2.將年份進行判斷 year%4==0&&year%100!=0 || year%400==0
		if( year%4==0&&year%100!=0 || year%400==0){
			System.out.println(year+"是閏年");
		}else{
			System.out.println(year+"是平年");
		}
	}
}

示例:彩票
在這裡插入圖片描述

import java.util.Scanner;


public class Test3 {
	public static void main(String[] args) {
		int randomNumber=(int) (Math.random()*100);
		System.out.println("程式產生:"+randomNumber);
		Scanner scanner=new Scanner(System.in);
		//1.使用者輸入一個數字(要麼一位數,要麼兩位數)
		System.out.print("輸入一個數字n,n∈[0,100):");
		int number=scanner.nextInt();
		//2.程式中隨機產生一個數字(要麼一位數,要麼兩位數)
			//Math.random()生成一個0~1之間的任意小數[0,1)
			//[0,1) [0,10) [0,100)
		//假設17 a=7 b=1  29 a=9 b=2
		int a1=number%10;//7
		number/=10;//1
		int b1=number%10;//1
		int a2=randomNumber%10;//9
		randomNumber/=10;//2
		int b2=randomNumber%10;//2
		//一等獎 a1=a2 && b1==b2 19 19
		if(a1==a2&&b1==b2){
			System.out.println("一等獎!");
		//二等獎 a1==b2 && a2==b1 19 91
		}else if(a1==b2&&a2==b1){
			System.out.println("二等獎!");
		//三等獎 a1==a2||a1==b2||b1==a2||b1==b2 12 24
		}else if(a1==a2||a1==b2||b1==a2||b1==b2){
			System.out.println("三等獎!");
		}else{
			System.out.println("謝謝參與!");
		}
	}
}

3.4 switch語句
※ switch

(1) 能用於switch判斷的型別有:byte、short、int、char(JDK1.6),還有列舉型別,但是在JDK1.7後添加了對String型別的判斷
(2) case語句中少寫了break,編譯不會報錯,但是會一直執行之後所有case條件下的語句而不再判斷,直到default語句
(3) 若果沒有符合條件的case就執行default下的程式碼塊,default並不是必須的,也可以不寫

※ 不帶case的switch

3.5 條件表示式
※ 布林表示式
布林表示式(Boolean expression)是一段程式碼宣告,它最終只有true(真)和false(假)兩個取值。最簡單的布林表示式是等式(equality),這種布林表示式用來測試一個值是否與另一個值相同。
3.6 常見錯誤和陷阱
※ 忘記必要的括號
※ 在if行出現錯誤的分號
※ 對布林值的冗餘測試
※ 懸空else出現的歧義
※ 兩個浮點數值的相等測試
※ 簡化布林變數賦值
※ 避免不同情形中的重複程式碼

本章小結

1.boolean 型別變數可以儲存值 true 或 false。

2.關係操作符(<、 <= 、 ==、 ! =、 >、 >=) 產生一個布林值。

3.選擇語句用於可選擇的動作路徑的程式設計。 選擇語句有以下幾種型別: 單分支 if 語句、 雙分支 ifelse 語句、 巢狀 if 語句、 多分支 if-else 語句、 switch 語句和條件表示式。

4.各種 if 語句都是基於布林表示式來控制決定的。 根據表示式的值是 true 或 false, 這些語句選擇兩種 可能路徑中的一種。

5.布林操作符&&、||、!和^對布林值和布林變數進行計算。

6.當對 p1&&p2 求值時, Java 先求 p1 的值, 如果 p1為 true, 再對 p2 求值; 如果 p1 為 false, 就 不再對 P2 求值。 當對 p1ll p2 求值時, Java 先求 p1的值, 如果 p1為 false, 再對 p2 求值; 如果 p1為 true, 就不再對 p2 求值。 因此, && 也稱為條件與操作符或短路與操作符, 而 || 也稱為條件或 操作符或短路或操作符。

7.switch 語句根據 char、 byte,short、 int 或者 String 型別的 switch 表示式來進行控制決定。

8.在 switch 語句中, 關鍵字 break 是可選的, 但它通常用在每個分支的結尾, 以中止執行 switch語 句的剩餘部分。 如果沒有出現 break 語句, 則執行接下來的 case 語句。

9.表示式中的操作符按照括號、 操作符優先順序以及操作符結合規則所確定的次序進行求值。

10.括號用於強制求值的順序以任何順序進行。

11.具有更高階優先權的操作符更早地進行操作。 對於同樣優先順序的操作符, 它們的結合規則確定操作 的順序。

12.除開賦值操作符的所有二元操作符都是左結合的, 陚值操作符是右結合的。

程式設計練習題
在這裡插入圖片描述

import java.util.Scanner;


public class test4 {
	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		System.out.print("請輸入二次函式二次項係數a:");
		double a=scanner.nextDouble();
		System.out.print("請輸入二次函式一次項係數b:");
		double b=scanner.nextDouble();
		System.out.print("請輸入二次函式常數項係數c:");
		double c=scanner.nextDouble();
		double delt=Math.sqrt(b*b-4*a*c);
		if(delt>0){
			System.out.println("二次函式有兩個值。");
			System.out.println("兩個值分別是 "+(-b+delt)/2*a+"和"+(-b-delt)/2*a);
		}else if(delt==0){
			System.out.println("二次函式有一個值。");
			System.out.println("值是 "+(-b+delt)/2*a);
		}else{
			System.out.println("二次函式無實數根");
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_2 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入係數和常數項
		System.out.print("Enter a,b,c,d,e,f:");
		double a=scanner.nextDouble();
		double b=scanner.nextDouble();
		double c=scanner.nextDouble();
		double d=scanner.nextDouble();
		double e=scanner.nextDouble();
		double f=scanner.nextDouble();
		//2.判斷該方程組是否有解
		double delt=a*d-b*c;
		if(delt!=0){
			double x=(e*d-b*f)/delt;
			double y=(a*f-e*c)/delt;
			System.out.println("x is "+x+" , and y is "+y);
		}else{
			System.out.println("has no solution");
		}
	}
}


在這裡插入圖片描述

import java.util.Scanner;



public class Demo3_3 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取今天的周幾
		System.out.print("Enter today's day:");
		int today=scanner.nextInt();
		//2.獲取幾天後
		System.out.print("Enter the number of days elasped since today:");
		int since=scanner.nextInt();
		switch (today%7) {
			case 1:
				System.out.print("Today is Monday ");
				break;
			case 2:
				System.out.print("Today is Tuesday ");
				break;
			case 3:
				System.out.print("Today is Wednesday ");
				break;
			case 4:
				System.out.print("Today is Thursday ");
				break;
			case 5:
				System.out.print("Today is Friday ");
				break;
			case 6:
				System.out.print("Today is Saturday ");
				break;
			case 0:
				System.out.print("Today is Sunday ");
				break;
		}
		//3.輸出今天周幾 幾天後周幾
		switch((today+since)%7){
			case 1:
				System.out.print("the future day is Monday ");
				break;
			case 2:
				System.out.print("the future day is Tuesday ");
				break;
			case 3:
				System.out.print("the future day is Wednesday ");
				break;
			case 4:
				System.out.print("the future day is Thursday ");
				break;
			case 5:
				System.out.print("the future day is Friday ");
				break;
			case 6:
				System.out.print("the future day is Saturday ");
				break;
			case 0:
				System.out.print("the future day is Sunday ");
				break;
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;
public class Demo3_4 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取使用者輸入的前九位編號
		System.out.print("Enter the first 9 digits of an ISBN as integer:");
		int digit=scanner.nextInt();
		int digitOri=digit;
		//2.將九位編號分別取出
		System.out.println(digit);
		int d9=digit%10;
		digit/=10;
		int d8=digit%10;
		digit/=10;
		int d7=digit%10;
		digit/=10;
		int d6=digit%10;
		digit/=10;
		int d5=digit%10;
		digit/=10;
		int d4=digit%10;
		digit/=10;
		int d3=digit%10;
		digit/=10;
		int d2=digit%10;
		digit/=10;
		int d1=digit%10;
		//3.根據取出的前九位數字 計算第十位
		int d10=(d1*1+d2*2+d3*3+d4*4+d5*5+d6*6+d7*7+d8*8+d9*9)%11;
		System.out.println(d10);
		//4.拼接ISBN 輸出
		String res="";
		if(d1==0){
			res+=0;//"0"
		}
		if(d10==10){
			res=res+digitOri+"X";
//			System.out.println(digitOri+"X");//+ 字串連線符
		}else{
			res=res+digitOri+d10;
		}
		System.out.println(res);
	}
}

在這裡插入圖片描述

import java.util.Scanner;
public class Demo3_5 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入一個三位數字
		System.out.print("Enter a number:");
		int number=scanner.nextInt();
		//2.將三位數進行拆分
		int a=number%10;//123
		int b=number/100;//
		//3.對比個位與百位
		if(a==b){
			System.out.println("是迴文數字");
		}else{
			System.out.println("不是!");
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;
public class Demo3_6 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入玩家的選擇
		System.out.print("Enter :");
		int p=scanner.nextInt();
		//2.隨機生成選擇
		int c=(int) (Math.random()*3);//[0,1)*3 [0,3)
		System.out.println(c);
		int result=-1;
		String cStr="";//出拳資訊
		String pStr="";//出拳資訊
		if(p==0){
			result=(p+c+3)%3;
		}
		if(p==1){
			result=(p+c+1)%3;
		}
		if(p==2){
			result=(p+c+2)%3;
		}
		if(p==0){
			pStr="scissor";
		}else if(p==1){
			pStr="rock";
		}else{
			pStr="paper";
		}
		if(c==0){
			cStr="scissor";
		}else if(c==1){
			cStr="rock";
		}else{
			cStr="paper";
		}
		System.out.print("The computer is "+cStr+". You are "+pStr+".");
		switch (result) {
			case 0:
				System.out.println(" too! It is draw.");
				break;
			case 1:
				System.out.println("You lose.");
				break;
			case 2:
				System.out.println("You won.");
				break;
		}
	}
}
/*
 * 0 1 2
 * 0 1 2
 * 
 * P C
 * 0 0 平0 0+3%3
 * 0 1 輸1 1+3%3
 * 0 2 贏2 2+3%3
 * 
 * 1 0 贏2 1+1%3
 * 1 1 平0 2+1%3
 * 1 2 輸1 3+1%3
 * 
 * 2 0 輸1 2+2%3
 * 2 1 贏2 3+2%3
 * 2 2 平0 4+2%3
 * */

在這裡插入圖片描述

import java.util.Scanner;


public class Test3_7 {
	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		System.out.print("請輸入三角形第一條邊的長度:");
		int side1=scanner.nextInt();
		System.out.print("請輸入三角形第二條邊的長度:");
		int side2=scanner.nextInt();
		System.out.print("請輸入三角形第三條邊的長度:");
		int side3=scanner.nextInt();
		if(side1+side2>side3&&side1+side3>side2&&side2+side3>side1){
			System.out.print("三角形的周長為:"+(side1+side2+side3));
		}else{
			System.out.print("這三條邊不能構成一個三角形!");
		}
	}
}


在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_8 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取 年份 月 日
		System.out.print("Enter year:");
		int year=scanner.nextInt();
		System.out.print("Enter month:");
		int month=scanner.nextInt();
		System.out.print("Enter the day of the month:");
		int day=scanner.nextInt();
		//隱含計算 j 世紀數 k該世紀的第幾年
		if(month==1||month==2){
			month+=12;
			year--;
		}
		int j=year/100;
		int k=year%100;
		int h=(day+26*(month+1)/10+k+k/4+j/4+5*j)%7;
		System.out.println(h);
	}
}

在這裡插入圖片描述

public class Demo3_9 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.獲取座標點 x y
		System.out.print("Enter a point with two coordinates:");
		double x=scanner.nextDouble();
		double y=scanner.nextDouble();
		//2.求座標點到圓心的距離
		double deltX=x-0;
		double deltY=y-0;
		double distance=Math.sqrt(deltX*deltX+deltY*deltY);
		//3.將距離和半徑進行個比較
		if(distance>10){
			System.out.println("Point("+x+","+y+") is not in the circle.");
		}else{
			System.out.println("Point("+x+","+y+") is in the circle.");
		}
	}
}



在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_10 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入座標點
		System.out.print("Enter a point:");
		double x=Math.abs(scanner.nextDouble());
		double y=Math.abs(scanner.nextDouble());
		//2.判斷該座標點x的量和y的量
		if(x>5||y>2.5){
			System.out.println("矩形外");
		}else{
			System.out.println("矩形內");
		}
	}
}

在這裡插入圖片描述

public class Demo3_11 {
	public static void main(String[] args) {
		//1.從[1,13]之間隨機數點數
		int rank=(int) (1+Math.random()*13);
		//2.從[1,4]之間隨機數花色
		int suit=(int) (1+Math.random()*4);
		switch(rank){
			case 1:
				System.out.println("你所選的牌是 A");
				break;
			case 2:
				System.out.println("你所選的牌是 2");
				break;
			case 3:
				System.out.println("你所選的牌是 3");
				break;
			case 4:
				System.out.println("你所選的牌是 4");
				break;
			case 5:
				System.out.println("你所選的牌是 5");
				break;
			case 6:
				System.out.println("你所選的牌是 6");
				break;
			case 7:
				System.out.println("你所選的牌是 7");
				break;
			case 8:
				System.out.println("你所選的牌是 8");
				break;
			case 9:
				System.out.println("你所選的牌是 9");
				break;
			case 10:
				System.out.println("你所選的牌是 10");
				break;
			case 11:
				System.out.println("你所選的牌是 J");
				break;
			case 12:
				System.out.println("你所選的牌是 Q");
				break;
			case 13:
				System.out.println("你所選的牌是 K");
				break;
		
		}
		switch(suit){
		case 1:
			System.out.println("牌色是 黒梅花");
			break;
		case 2:
			System.out.println("牌色是 紅方片");
			break;
		case 3:
			System.out.println("牌色是 紅心");
			break;
		case 4:
			System.out.println("牌色是 黑桃");
			break;
		
	}
}
}

在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_12 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入四個座標點
		System.out.print("Enter 4 points:");
		double x1=scanner.nextDouble();
		double y1=scanner.nextDouble();
		double x2=scanner.nextDouble();
		double y2=scanner.nextDouble();
		double x3=scanner.nextDouble();
		double y3=scanner.nextDouble();
		double x4=scanner.nextDouble();
		double y4=scanner.nextDouble();
		//2.結合方程組 計算方程組中的係數和常數項
		double a=y1-y2;
		double b=-(x1-x2);
		double c=y3-y4;
		double d=-(x3-x4);
		double e=(y1-y2)*x1-(x1-x2)*y1;
		double f=(y3-y4)*x3-(x3-x4)*y3;
		//3.判斷方程組是否有解
		double delt=a*d-b*c;
	
		if(delt==0){
			System.out.println("The two line are parallel");
		}else{
			double x=(e*d-b*f)/delt;
			double y=(a*f-e*c)/delt;
			System.out.println("x="+x+",y="+y);
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;
public class Demo3_13 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.print("Enter x,y:");
		double x=scanner.nextDouble();
		double y=scanner.nextDouble();
		if(x>=0&&x<=200){
			if((200-x)/y>=2){
				System.out.println("int");
				return;//直接結束函式 謹慎使用
			}
		}
		System.out.println("out");
	}
}

在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_14 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入兩個矩形的寬高和中心座標
		System.out.print("Enter r1:");
		double xo=scanner.nextDouble();
		double yo=scanner.nextDouble();
		double W=scanner.nextDouble();
		double H=scanner.nextDouble();
		System.out.print("Enter r2:");
		double x=scanner.nextDouble();
		double y=scanner.nextDouble();
		double w=scanner.nextDouble();
		double h=scanner.nextDouble();
		//2.計算是否r2在r1內
		if(x<=(W/2-w/2+xo)&&x>=(xo-W/2+w/2)&&y<=(H/2-h/2+yo)&&y>=(yo-H/2+h/2)){
			System.out.println("r2 in r1");
			//計算是否r2在r1外
		}else if(x>=(W/2+w/2+xo)||x<=(xo-W/2-w/2)||y>=(H/2+h/2+yo)||y<=(yo-H/2-h/2)){
			System.out.println("r2 out r1");
		}else{
			System.out.println("r2 overlaps r1");
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;


public class Demo3_15 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//1.輸入兩個圓的資訊 圓心座標 半徑
		System.out.print("Enter circle1:");
		double x1=scanner.nextDouble();
		double y1=scanner.nextDouble();
		double r1=scanner.nextDouble();
		System.out.print("Enter circle2:");
		double x2=scanner.nextDouble();
		double y2=scanner.nextDouble();
		double r2=scanner.nextDouble();
		//2.計算兩圓心之間的距離
		double distance=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
		//3.判斷距離所表示的兩圓之間的關係
		if(distance<=Math.abs(r1-r2)){
			System.out.println("c2 in c1");
		}else if(distance>=r1+r2){
			System.out.println("c2 out c1");
		}else{
			System.out.println("c2 overlaps c1");
		}
	}
}

在這裡插入圖片描述

import java.util.Scanner;
public class Demo3_16 {
	public static void main(String[] args) {
		//1.輸入三個點的座標 p0 p1 p2
		Scanner scanner=new Scanner(System.in);
		System.out.print("Enter p0,p1,p2:");
		double x0=scanner.nextDouble();
		double y0=scanner.nextDouble();
		double x1=scanner.nextDouble();
		double y1=scanner.nextDouble();
		double x2=scanner.nextDouble();
		double y2=scanner.nextDouble();
		//計算結果
		double res=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
		if(res>0){
			System.out.println("p2 left to line");
		}else if(res==0){
			System.out.println("p2 on the line");
		}else{
			System.out.println("p2 right to line");
		}
	}
}