Java SE 第二章
第二章 基本程式設計
2.1 關鍵字和識別符號
※ 關鍵字
Java關鍵字是電腦語言裡事先定義的,有特別意義的識別符號,有時又叫保留字,還有特別意義的變數。Java的關鍵字對Java的編譯器有特殊的意義,他們用來表示一種資料型別,或者表示程式的結構等,關鍵字不能用作變數名、方法名、類名、包名和引數。
※識別符號
Java語言中,對於變數,常量,函式,語句塊也有名字,我們統統稱之為Java識別符號.
識別符號是用來給類、物件、方法、變數、介面和自定義資料型別命名的。
2.2 註釋和常量
※註釋
對於Java註釋我們主要了解三種:
1, // 註釋一行
2, /* … / 註釋若干行
3, /**……
※常量
“常量”的廣義概念是:‘不變化的量’
※進位制
十進位制轉二進位制
方法為:十進位制數除2取餘法,即十進位制數除2,餘數為權位上的數,得到的商值繼續除2,依此步驟繼續向下運算直到商為0為止。
(具體用法如下圖)
二進位制轉十進位制
方法為:把二進位制數按權展開、相加即得十進位制數。
(具體用法如下圖)
二進位制轉八進位制
方法為:3位二進位制數按權展開相加得到1位八進位制數。(注意事項,3位二進位制轉成八進位制是從右到左開始轉換,不足時補0)。
(具體用法如下圖)
八進位制轉成二進位制
方法為:八進位制數通過除2取餘法,得到二進位制數,對每個八進位制為3個二進位制,不足時在最左邊補零。
(具體用法如下圖)
二進位制轉十六進位制
方法為:與二進位制轉八進位制方法近似,八進位制是取三合一,十六進位制是取四合一。(注意事項,4位二進位制轉成十六進位制是從右到左開始轉換,不足時補0)。
(具體用法如下圖)
十六進位制轉二進位制
方法為:十六進位制數通過除2取餘法,得到二進位制數,對每個十六進位制為4個二進位制,不足時在最左邊補零。
(具體用法如下圖)
2.3 變數和資料型別
※變數
變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。
※資料型別
資料型別在資料結構中的定義是一個值的集合以及定義在這個值集上的一組操作。
2.4
※輸入
通過new Scanner(System.in)建立一個Scanner,控制檯會一直等待輸入,直到敲回車鍵結束,把所輸入的內容傳給Scanner,作為掃描物件。
※輸出
System.out.println() 輸出結果進行換行
System.out.print() 輸出結果進行不換行
2.5 資料型別轉換
※資料型別轉化
從上表可以看出java中各種資料型別所佔空間的大小. 在java中整數的預設資料型別是int, 例如數字4, 小數的預設數字型別是double, 例如3.12. 當float a = 3.12時會報錯, 因為3.12的預設資料型別是double, 我們需要使用如下的賦值方法:
2.5.1 第一種方法在3.12後面加了一個F, 告訴編譯器這是一個float的數. 第二種方法對3.12進行了強制的型別轉換. 接下來我們仔細分析一下java中的型別轉換問題.
***2.5.2***基本資料型別中,布林型別boolean佔有一個位元組,由於其本身所程式碼的特殊含義,boolean型別與其他基本型別不能進行型別的轉換(既不能進行自動型別的提升,也不能強制型別轉換), 否則,將編譯出錯。
⚪賦值和方法呼叫 轉換規則:從低位型別到高位型別自動轉換;從高位型別到低位型別需要強制型別轉換:
(1)布林型和其它基本資料型別之間不能相互轉換;
(2)byte型可以轉換為short、int、、long、float和double;
(3)short可轉換為int、long、float和double;
(4)char可轉換為int、long、float和double;
(5)int可轉換為long、float和double;
(6)long可轉換為float和double;
(7)float可轉換為double;
b、算術運算 中的型別轉換:1 基本就是先轉換為高位資料型別,再參加運算,結果也是最高位的資料型別;2 byte short char運算會轉換為Int;
(1)如運算元之一為double,則另一個運算元先被轉化為double,再參與算術運算。
(2)如兩運算元均不為double,當運算元之一為float,則另一運算元先被轉換為float,再參與運算。
(3)如兩運算元均不為double或float,當運算元之一為long,、則另一運算元先被轉換為long,再參與算術運算。
(4)如兩運算元均不為double、float或long,則兩運算元先被轉換為int,再參與運算。
特殊:
(1)如採用+=、*=等縮略形式的運算子,系統會自動強制將運算結果轉換為目標變數的型別。
(2) 當運算子為自動遞增運算子(++)或自動遞減運算子(–)時,如果運算元為byte,short或char型別不發生改變;
2.6算術運算子
※算數運算子
加 +
減 -
乘 *
除 /
取餘 %
自加 ++
自減 –
練習題:
public class Text1 {
public static void main(String[] args){
System.out.println("totalMilliseconds is:"+System.currentTimeMillis());
System.out.println("totalseconds is:"+System.currentTimeMillis()/1000);
System.out.println("Nowseconds is:"+(System.currentTimeMillis()/1000)%6);
System.out.println("totalminutes is:"+System.currentTimeMillis()/1000/60);
System.out.println("Nowminutes is:"+(System.currentTimeMillis()/1000/60)%60);
System.out.println("totalhours is:"+System.currentTimeMillis()/1000/60/60);
System.out.println("Nowhours is:"+(System.currentTimeMillis()/1000/60/60)%24);
System.out.println("現在的時間是:"+(System.currentTimeMillis()/1000/60/60)%24+"時"+""+(System.currentTimeMillis()/1000/60)%60+"分"+""+(System.currentTimeMillis()/1000)%60+"秒");
}
}
執行結果:
2.7 賦值運算子
※ 加等 +=
例如n+=2,意思為n=n+2
※ 減等 -=
例如n-=2,意思為n=n-2
※ 乘等 =
例如n=2,意思為n=n*2
※ 除等 /=
例如n/=2,意思為n=n/2
※ 模等 %=
例如n%=2,意思為n=n%2
2.8 位運算子
※ 位與&
參加運算的兩個資料,按二進位制位進行“與”運算。
運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩位同時為“1”,結果才為“1”,否則為0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
※ 位與|
參加運算的兩個物件,按二進位制位進行“或”運算。
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運算的兩個物件只要有一個為1,其值為1。
例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。
※ 位異或^
參加運算的兩個資料,按二進位制位進行“異或”運算。
運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:參加運算的兩個物件,如果兩個相應位為“異”(值不同),則該位結果為1,否則為0。
※ 位左移<<
將一個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。
例:a = a << 2 將a的二進位制位左移2位,右補0,
左移1位後a = a * 2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
※ 位右移>>
將一個數的各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
運算元每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進位制位右移2位,
左補0 or 補1 得看被移數是正還是負。
2.9 常見的錯誤和陷阱
※未宣告、未初始化的變數和未使用的變數
※整數溢位
※取整錯誤
※超出預期的整數除法
※冗餘的輸入物件
本章小結:
1.識別符號是程式中用於命名諸如變數 、 常量、 方法 、 類、 包之類元素的名稱。
2.識別符號是由字母、 數字、 下劃線( _ )和美元符號( $ ) 構成的字元序列。 識別符號必須以字母或下 劃線( _ ) 開頭, 不能以數字開頭.識別符號不能是保留字。 識別符號可以為任意長度。
3.變數用於儲存程式中的資料。 宣告變數就是告訴編譯器變數可以儲存何種資料型別。
4.有兩種型別的 import 語句: 明確匯入和萬用字元匯入。 明確導人是在 import 語句中指定匯入單個 類;萬用字元匯入將包中所有的類匯入。
5.在 Java 中, 等號( = ) 被用作賦值操作符。
6.方法中宣告的變數必須在使用前被賦值 。
7.命名常量(或簡稱為常量) 表示從不改變的永久資料。
8.用關鍵字 final 宣告命名常量。
9.Java 提供四種整數型別( byte、 short、 int、 long) 表示四種不同長度範圍的整數。
10.Java 提供兩種浮點類哲(float、 double) 表示兩種不同精度的浮點數。
11.Java 提供操作符完成數值運算: 加號(+)、 減號(- )、 乘號( * )、 除號(/) 和求餘符號(%)。
12.整數運算(/) 得到的結果是一個整數。
13.Java 表示式中的數值操作符和算術表示式中的使用方法是完全一致的。
14.Java 提供擴充套件陚值操作符 :+= (加法陚值 )、 -=(減法陚值)、 *=(乘法陚值)、 /=(除法陚值) 以 及 %=(求餘陚值)。
15.自增操作符( ++) 和自減操作符(–) 分別對變數加1或減1。
16.當計算的表示式中有不同型別的值, Java 會自動地將運算元轉換為恰當的型別。
17.可以使用(type)value 這樣的表示法顯式地將數值從一個型別轉換到另一個型別。
18.將一個較小範圍型別的變數轉換為較大範圍型別的變數稱為拓寬型別。
19.將一個較大範圍型別的變貴轉換為較小範圍型別的變數稱為縮窄型別。
20.拓寬型別不需要顯式轉換, 可以自動完成。 縮窄型別必須顯式完成。
21.在電腦科學中1970年1月1日午夜零點稱為 UNIX 時間戮。
程式設計練習題
import java.util.Scanner;
public class Demo2_1 {//IPO Input Process Output
public static void main(String[] args) {
//1.獲取使用者輸入的攝氏溫度
Scanner scanner=new Scanner(System.in);
//提示資訊
System.out.print("Enter a degree in Celsius:");
double celsius=scanner.nextDouble();
//2.將攝氏溫度轉換為華氏溫度
double fahrenheit=(9.0/5)*celsius+32;
//3.將華氏溫度輸出
System.out.println(celsius+" Celsius is "+fahrenheit+" Fahrenheit");
}
}
import java.util.Scanner;
public class Demo2_2 {
//全域性常量
public static final double PI=3.1415926;
public static void main(String[] args) {
//1.獲取使用者輸入的半徑和高
Scanner scanner=new Scanner(System.in);
//提示
System.out.print("Enter the radius and length of a cylinder:");
double radius=scanner.nextDouble();
double length=scanner.nextDouble();
//2.先計算底面積 後計算體積
double area=radius*radius*PI;
double volume=area*length;
//3.將體積輸出
System.out.println("The area is "+area);
System.out.println("The volume is "+volume);
}
}
import java.util.Scanner;
public class Demo2_3 {
public static void main(String[] args) {
//1.獲取使用者輸入的數字
Scanner scanner=new Scanner(System.in);
System.out.print("Enter a number betweem 0 and 1000:");
int number=scanner.nextInt();
//2.將數字進行分解
/*
987%10=7->a
987/10=98
98%10=8->b
98/10=9
9%10=9->c
a+b+c
98%10=8->a
98/10=9
9%10=9->b
9/10=0
0%10=0->c
*/
int a=number%10;
number/=10;
int b=number%10;
number/=10;
int c=number%10;
//3.將三個數字相加並輸出
System.out.println("The sum of the digit is "+(a+b+c));
}
}
import java.util.Scanner;
public class Demo2_4 {
public static void main(String[] args) {
//1.獲取使用者輸入的分鐘數
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the number of minutes:");
int mintues=scanner.nextInt();
//2.將從分鐘數中轉化處天數->年數
int days=mintues/60/24;
int years=days/365;
days=days%365;
//3.輸出
System.out.println(mintues+" mintues is approximately "+years+" years and "+days+" days");
}
}
import java.util.Scanner;
public class Demo2_5 {
public static void main(String[] args) {
//獲取從1970 1-1 00:00:00 到至今的毫秒數
Scanner scanner=new Scanner(System.in);
//獲取偏移量
System.out.print("Enter the time zone offset to GMT:");
int offset=scanner.nextInt();
long millis=System.currentTimeMillis();
long seconds=millis/1000;
long minutes=seconds/60;
long hours=minutes/60;
//如何從經過的毫秒值裡獲取當前小時 總小時%24
System.out.print(hours%24+offset+":");//東八區+8
//...當前分鐘
System.out.print(minutes%60+":");
//...當前秒
System.out.println(seconds%60);
}
}
import java.util.Scanner;
public class Demo2_6 {
public static void main(String[] args) {
//1.輸入水的重量 初始溫度 最終溫度
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the amount of water in kilograms:");
double weight=scanner.nextDouble();
System.out.print("Enter the inital temperature:");
double initalTemp=scanner.nextDouble();
System.out.print("Enter the final temperature:");
double finalTemp=scanner.nextDouble();
//2.根據公式 計算能量
double energy=weight*(finalTemp-initalTemp)*4184;
//3.輸出能量值
System.out.println("The energy needed is "+energy);
}
}
public class Demo2_7 {
public static void main(String[] args) {
double money=100;//本金
double rate=5.0/100/12;//月利率
//第一個月
money=money*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
System.out.println(money);
}
}
import java.util.Scanner;
public class Demo2_8 {
public static void main(String[] args) {
//1.輸入兩個座標
Scanner scanner=new Scanner(System.in);
System.out.print("Enter x1 and y1:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
System.out.print("Enter x2 and y2:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
//2.計算兩個座標之間的距離
double deltX=x2-x1;
double deltY=y2-y1;
//Math.pow(2,3) 2^3
//Math.pow(4,0.5) Math.sqrt()
double distance=Math.sqrt(Math.pow(deltX, 2)+Math.pow(deltY, 2));
//3.輸出距離
System.out.println(distance);
}
}
import java.util.Scanner;
public class Demo2_9 {
public static void main(String[] args) {
//1.輸入邊長
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the side:");
double side=scanner.nextDouble();
//2.計算面積
double area=3*Math.sqrt(3)/2*Math.pow(side, 2);
//3.輸出面積
System.out.println(area);
}
}
import java.util.Scanner;
public class Demo2_10 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1.輸入華氏溫度、風速
System.out.print("Enter the temperature in Fahrenheit between -58°F and 41°F:");
double fahrenheit=scanner.nextDouble();
System.out.print("Enter the wind speed(>=2) in miles per hour:");
double speed=scanner.nextDouble();
//2.根據公式計算室外風寒溫度
double windChill=35.74+0.6217*fahrenheit-35.75*Math.pow(speed, 0.16)+0.4275*fahrenheit*Math.pow(speed, 0.16);
System.out.println(windChill);
}
}
import java.util.Scanner;
public class Demo2_11 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1.輸入三個座標
System.out.print("Enter three points for a triangle:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
double x3=scanner.nextDouble();
double y3=scanner.nextDouble();
//2.根據座標求三邊
double sideA=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
double sideB=Math.sqrt(Math.pow(x1-x3, 2)+Math.pow(y1-y3, 2));
double sideC=Math.sqrt(Math.pow(x2-x3, 2)+Math.pow(y2-y3, 2));
//3.根據三邊求面積
double s=(sideA+sideB+sideC)/2;
double area=Math.sqrt(s*(s-sideA)*(s-sideB)*(s-sideC));
System.out.println(area);
}
}