Java程序設計(2021春)——第一章課后題(選擇題+編程題)答案與詳解
第一章選擇題
Tip:選擇題部分我只針對部分我出錯的或我認為有價值的題目在此整理。
1.1 Java與面向對象程序設計簡介
T4
題面
面向對象技術給軟件發展帶來的益處有:
(1) 一個設計好的類,可以在后續開發中被部分或者全部的重復使用
(2) 每個類可以作為一個獨立單元進行測試維護,大量代碼來源於成熟可靠的類庫,因此開發新程序時的新增代碼明顯減少,使程序更加可靠
(3) 有利於提高用戶對類的修改和數據的控制,使得開發更加便捷。
A(1) (2) (3)
B(1) (2)
C(1) (3)
D(2) (3)
答案
B
詳解
筆者不知道這個題目(3)為什么不對,先放在這以后學的過程中再體會(逃
T9
題面
Java的主要優點是()(多選)
A直接操作內存,功能強大
B一次編譯,到處運行
C純面向對象的語言
D可以通過拖拽的方式快速開發用戶界面
答案
BC
詳解
RT
T10
題面
下面有關JAVA代碼安全性的敘述錯誤的是()
A字節碼校驗器加載查詢執行所需的所有類
B運行時由解釋器執行代碼
C運行時,字節碼被加載,驗證,然后在解釋器中執行
D類加載器通過分離本機文件系統的類和從網絡導入的類增加安全性
答案
A
詳解
思考.jpg(筆者查了一下也不是很清楚,mark一下以后學到的時候回來看)
T11
題面
下面說法正確的是()
A JAVA程序的源文件名稱與主類的名稱相同,后綴可為.java或者.txt
B JDK的編譯命令為java
C一個JAVA源程序編譯后,可能產生幾個字節碼文件
D在DOS命令行下編譯好字節碼文件后,只需輸入程序名即可運行該程序
答案
C
詳解
A選項后綴應為.java
B選項編譯命令應為javac
C選項正確
D選項顯然不正確
T15
題面
設HelloWord的代碼為:
class HelloWord{
public void main(String a[]){
System.out.println("hello world");
}
}
下面說法正確的是:
A HelloWord.java無法通過編譯,因為main方法的聲明方式不對
B HelloWord.java可以通過編譯,但是運行該程序會出現異常,不會打印HelloWorld
C HelloWord.java可以通過編譯,但是無法運行,因為該文件沒有public類
D HelloWord.java可以通過編譯並正常運行,結果輸出hello world
答案
B
詳解
筆者查了一下資料,不是很清楚,先mark住(逃
1.2 基本數據類型與表達式
T12
題面
在某個main()方法中有以下代碼:
String s1,s2;
int[] numbers;
int num;
num=15;
boolean b=false;
下面哪個說法是正確的()
A 聲明了1個基本類型變量和2個引用變量
B 聲明了2個基本類型變量和2個引用變量
C 聲明了2個基本類型變量和3個引用變量
D 聲明了3個基本類型變量和3個引用變量
答案
C
詳解
以筆者目前掌握知識來看,String
聲明了s1,s2
兩個引用變量;int[]
聲明了一個引用變量;int
和boolean
分別聲明了一個基本類型變量。
Tip: Java中的基本類型變量有boolean,byte,char,double,float,int long short
T14
題面
關於數據類型的聲明,以下聲明正確的是:
(1) byte a = 129;
(2) long b = 129F;
(3) float c = 1.234F;
(4) short d = 1.2;
(5) boolean e = true;
(6) float f = 1.234D;
A(1)(3)(4)(5)
B(3)(5)
C(2)(3)(6)
D(1)(5)(6)
答案
B
詳解
聲明數值型變量有如下規則
數據類型 | 文字量 |
---|---|
byte,short,int |
十進制數,開頭不為0 ;0X 跟十六進制數,如0XF1C4 ;0 跟八進制數,如0726 |
long |
同上,但后面再跟一個l 或L ,如84l ,0X1F39L |
float |
數字后跟f或F,如1.2456F ,1.893E2F |
double |
后面可選d或D做后綴,如:1.23D |
boolean |
true 或false |
數值型變量范圍如下
類型 | 說明 | 長度 | 最小值 | 最大值 |
---|---|---|---|---|
byte | 帶符號微整數 | 8位 | -128 | 127 |
short | 帶符號短整數 | 16位 | -215 | 215-1 |
int | 帶符號整數 | 32位 | -231 | 231-1 |
long | 帶符號長整數 | 64位 | -263 | 263-1 |
float | 單精度浮點數 | 32位 | -2-149 | (2-2-23)·2127 |
double | 雙精度浮點數 | 64位 | -2-1074 | (2-2-52)·21023 |
(1):超出byte
范圍,錯。
(2):long
型變量末尾跟l
或L
,不是F
。
(3):正確。
(4):short
聲明為整型,1.2
不是整型,錯。
(5):正確。
(6):float
型變量末尾跟f'
或F
,不跟D
。
1.3數組
T1
題面
(1) 數組可以動態初始化
(2) 數組可以賦值給Object類型的對象
(3) 數組創建以后,其長度可以修改
(4) 數組可以調用Object類的所有方法
A (1)(2)(3)(4)
B (1)(2)(4)
C (2)(3)(4)
D (2)(4)
答案
B
詳解
java中數組的長度不可以改變。java中的數組的定義就是相同類型,固定長度的一組數據,一旦被初始化,長度不可更改。
Tip:底層原理筆者還不是很清楚,但是考慮到C和Java的相似性,數組應該也是申請一塊連續的空間,所以這樣的話數組的長度如果再更改就不合適了。
T4
題面
關於二維數組的創建,以下做法正確的是:
(1)int a[][] =new int[4][5]
(2)int a[][] =new int[4][]; a[0]=new int[10]; a[1]=new int[20];
(3)int a[][]; a=new int[3][]; a[0]=new int[3]; a[1]={1,2};a[2]={1,2,3};
A (1)(2)(3)
B (1)(2)
C (1)(3)
D (1)
答案
B
詳解
(1):聲明數組的引用的同時指明元素的個數並且分配內存空間。
(2):二維數組的本質是一維數組再多一維,我們允許這樣操作。
(3):語法int[] a = {1,2}
僅允許出現在定義數組變量時使用,如果數組變量已經創建了,之后再修改它,就不能使用這種語法了。
1.4算法的流程控制
T7
題面
下面關於switch語句錯誤的是:
A 在同一個switch語句中,case后的值可以相同
B 沒有break語句,也能編譯運行
C default語句可有可無
D switch語句中表達式的值可以是String類型
答案
A
詳解
case后跟的值不可以相同,否則會報錯,有邏輯問題。
第一章編程練習題(1.5)
T1 Pow函數
題面
實現x的n次方,x為類型為double,n的類型為int. 給定輸入為x n, 輸出x的n次方結果。
樣例輸入:
0.2
5
樣例輸出:
0.00032
思考和詳解
本題作為這門課程第一個編程題,在提交代碼方式上就卡住了我,我在這里分享一下我踩過的坑供大家參考。
-
提交代碼到oj上時要將
package hello;
之類的包刪去,本條對所有評測Java語言的oj均有效[1]。 -
在一般oj上,我們提交Java代碼的要求往往是形如以下[1:1]
public class Main {//此處須為Main,否則編譯無法通過 public static void main(String[] args){ /*TO DO*/ } }
-
值得注意的是,在學堂在線oj中,提交的代碼應當以如下兩種形式之一呈現[1:2]
當沒有輸入時
class Main {//此處須為Main,否則編譯無法通過 public static void main(String[] args){ /*TO DO*/ } }
當有輸入時
import java.util.Scanner; class Main {//此處須為Main,否則編譯無法通過 public static void main(String[] args){ Scanner in = new Scanner(System.in); /*TO DO*/ } }
即,學堂在線oj特別地要求刪去public[1:3]。
具體代碼
/*這份代碼在學堂在線oj獲得了40分,我不知道問題出在,思路和代碼本身應該是正確的,猜測可能是格式化輸出有差別,但是題目又沒有說清楚,所以我沒有繼續嘗試。有興趣的朋友如果知道這個題怎么寫可以滿分可以評論告訴我或者私信聯系我*/
import java.util.Scanner;
public class pow {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double x,ans;
int n;
x = in.nextDouble();
n = in.nextInt();
ans = x;
for(int i = 1;i < n;i++) {
ans *= x;
}
if(n == 0)ans = 1.0;
System.out.print(ans);
}
}
T2 哈密頓距離
題面
兩個整數的哈密頓距離定義為兩個數二進制位的個數。給定兩個32位整數,M,N,輸出M和N的哈密頓距離。輸入以空格切分。
樣例輸入:
3 4
樣例輸出:
3
樣例解釋:
3的二進制為011, 4的二進制為100,不同位的個數為3。
思考和詳解
本題按照題意模擬即可,可能需要補碼相關知識,建議沒學習前置課程《C語言程序設計》的同學自學相關內容。(Tip:位運算基礎題目中可能會反復利用到本題循環中的工具變量,沒接觸過相關知識的同學可以留意一下)
具體代碼
/*提交代碼時應當按照“T1思考和詳解”中相關要求進行格式修正*/import java.util.Scanner;public class hamilton { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a,b,c,d = 1,ct = 0; a = in.nextInt(); b = in.nextInt(); c = a ^ b; for(int i = 1;i <= 32;i++) {//在Java中,可以在for中定義變量,這是區別於C的一個小特點 if((c & d) == 1) ct++; c >>>= 1; } System.out.println(ct); }}
附:T1思考和詳解
T3 組三角形
題面
給定一個長度為N的非負整數數組,現在以數組中的三個數為邊長,組成一個三角形,計算能組成三角形的個數。輸入為2行,第一行為N,第二行為N個整數,輸出為三角形個數
樣例輸入:
4
2 2 3 4
輸出:
3
樣例解釋:
2,3,4(第一個2),2,3,4(第二個2),(2,2,3)
思考和詳解
本題可直接采用最朴素的思路:三重循環遍歷每組數據,若某組數據均滿足兩邊之和大於第三邊則為所需。
具體代碼
/*提交代碼時應當按照“T1思考和詳解”中相關要求進行格式修正*/import java.util.Scanner;public class triangle { public static void main(String[] args){ int n,ct = 0; Scanner in = new Scanner(System.in); n = in.nextInt(); int num[] = new int[n]; for(int i = 0;i < n;i++) { num[i] = in.nextInt(); } for(int i = 0;i < n;i++) { for(int j = i + 1;j < n;j++) { for(int k = j + 1;k < n;k++) { int a,b,c; a = num[i]; b = num[j]; c = num[k]; if(a + b > c&&a + c > b&&b + c > a) ct++; } } } System.out.println(ct); }}
附:T1思考和詳解