Java程式設計綜合練習題(期末考試)
一:判斷題
1:如果使用import語句引入了整個包中的類,那麼可能會增加編譯時間。但絕對不會影響程式執行的效能,因為當程式執行時,只是將真正使用的類的位元組碼檔案載入到記憶體。 (T)
2:一個數組可以存放許多不同型別的數值。 (F)
3:設String物件s="Hello ",執行語句System.out.println(s.concat("World!"));後String物件s的內容為"Hello world!",所以語句輸出為Hello world!。 (F)
// String永遠不會發生改變,任何對String的操作都是另外返回一個新的String,而不是在原有的String上進行修改:
4:類及其屬性、方法可以同時有一個以上的修飾符來修飾。 (F)
5:可以使用protected修飾符來防止方法和資料被不同包的非子類訪問。 (T)
6:例項變數只能通過物件名訪問,類變數既可以通過某個物件名也可以通過類名來訪問。 (T)
7:StringBuffer類是執行緒安全的,StringBuilder類是執行緒不安全的。 (T)
8:構造方法可以呼叫本類中過載的構造方法和它的父類的構造方法。 (T)
9:可以使用throws語句來指明方法有異常丟擲。 (T)
10:在例項方法或構造器中,this用來引用當前物件,通過使用this可引用當前物件的任何成員。 (F
二:單選題
2-1
類中某方法定義如下: double fun(int a,int b){ return a*1.0/b; } 同一類內其它方法呼叫該方法的正確方式是( 3 )。(2分)
- double a = fun(1.0,2.0)
- int x = fun(1.0,2.0)
- double a = fun(1,2)
- int x = fun(1,2)
2-2
Which of the following statements correctly rotates the button 45 degrees counterclockwise? ( )
- button.setRotate(Math.toRadians(45));
- button.setRotate(45);
- button.setRotate(-45);
- button.setRotate(360 - 45);
2-3
What kind of reader do you use to handle Character code? ( ) (2分)
- Writer
- PrintWriter
- Reader
- InputStreamReader
2-4
To handle the mouse click event on a pane p, register the handler with p using __. (2分)
- p.setOnMouseReleased(handler);
- p.setOnMouseDragged(handler);
- p.setOnMouseClicked(handler);
- p.setOnMousePressed(handler);
2-5
The method __ gets the contents of the text field tf. (2分)
- tf.getString()
- tf.getText()
- tf.getText(s)
- tf.findString()
2-6
Which statement about the garbage collection mechanism are true? ( ) (2分)
- The garbage collection mechanism can free the memory used by Java Object at explection time.
- Garbage collection require additional programe code in cases where multiple threads are running.
- The programmer can indicate that a reference through a local variable is no longer of interest.
- The programmer has a mechanism that explicity and immediately frees the memory used by Java objects.
2-7
為AB類的一個無形式引數無返回值的方法method書寫方法頭,使得使用類名AB作為字首就可以呼叫它,該方法頭的形式為( )。(2分)
- final void method( )
- abstract void method( )
- static void method( )
- public void method( )
作者: 強彥
單位: 太原理工大學
2-8
A派生出子類B,B派生出子類C,對於如下Java原始碼正確的說法是()。(2分)
1. A a0 =new A();
2. A a1 =new B();
3. A a2 =new C();
- 第1、2、3行能通過編譯,但第2、3行執行時出錯
- 只有第1行能通過編譯
- 第1、2行能通過編譯,但第3行編譯出錯
- 第1行、第2行和第3行的宣告都是正確的
2-9
The statement for registering a listener for processing list view item change is _. (2分)
- lv.getSelectionModel().selectedItemProperty().addListener(e -> {processStatements});
- lv.getSelectionModel().addListener(e -> {processStatements});
- lv.getItems().addListener(e -> {processStatements});
- lv.addListener(e -> {processStatements});
2-10
以下程式碼段將建立幾個物件?(2)
String s1="bc";
String s2="bc";
- 3
- 1
- 2
- 0 // 這行程式碼被執行的時候,JAVA虛擬機器首先在字串池中查詢是否已經存在了值為"bc"的這麼一個物件,它的判斷依據是String類equals(Object obj)方法的返回值。如果有,則不再建立新的物件,直接返回已存在物件的引用;如果沒有,則先建立這個物件,然後把它加入到字串池中,再將它的引用返回
2-11
下面哪個Set是根據內容排序的? ()
- HashSet
- TreeSet
- AbstractSet
- LinkedHashSet //如果我們需要保留儲存順序, 又要過濾重複元素, 那麼使用LinkedHashSet
2-12
To add a node to the the first row and second column in a GridPane pane, use __. (2分)
- pane.add(node, 1, 2);
- pane.getChildren().add(node, 0, 1);
- pane.add(node, 1, 0);
- pane.add(node, 0, 1);
- pane.getChildren().add(node, 1, 2);
2-13
在使用interface宣告一個介面時,只可以使用(B )修飾符修飾該介面。 (2分)
- private protected
- public // 介面就是為了讓其他類繼承的,肯定是公共的
- private
- protected
2-14
下列語句會造成陣列new int[10]越界是(D)。 (2分)
- a[0] += 9;
- a[9]=10;
- a[9]
- for(int i=0;i<=10;i++) a[i]++;
2-15
To register a source for an action event with a handler, use __. (2)
- source.setActionHandler(handler)
- source.setOnAction(handler)
- source.addOnAction(handler)
- source.addAction(handler)
三:程式填空題
四:函式題
6-1 定義一個股票類Stock (10 分)
定義一個名為Stock的股票類,這個類包括:一個名為symbol的字串資料域表示股票程式碼。一個名為name的字串資料域表示股票名稱。一個名為previousClosingPrice的double資料域,它儲存前一日的股票交易價格。一個名為currentPrice資料域,它儲存當前的股票交易價格。建立一個有特定程式碼和名稱的股票的構造方法。一個名為changePercent()方法返回從previousClosingPrice變化到currentPrice的百分比。
類名為:
Stock
裁判測試程式樣例:
import java.util.Scanner;
/* 你提交的程式碼將被嵌入到這裡 */
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String symbol1=input.next();
String name1=input.next();
Stock stock = new Stock(symbol1, name1);
stock.previousClosingPrice = input.nextDouble();
// Input current price
stock.currentPrice = input.nextDouble();
// Display stock info
System.out.println(stock.name+"price changed: " + stock.changePercent() * 100 + "%");
input.close();
}
}
輸入樣例:
002594
比亞迪
56.98
55.40
輸出樣例:
比亞迪股價漲跌: -2.77290277290277%
Code:
class Stock{
String symbol,name;
double previousClosingPrice,currentPrice;
Stock(String symbol,String name){
this.symbol=symbol;
this.name=name;
}
public double changePercent(){
return (currentPrice-previousClosingPrice)/previousClosingPrice;
}
}
6-2 從抽象類shape類擴展出一個圓形類Circle (10 分)
請從下列的抽象類shape類擴展出一個圓形類Circle,這個類圓形的半徑radius作為私有成員,類中應包含初始化半徑的構造方法。
public abstract class shape {// 抽象類
public abstract double getArea();// 求面積
public abstract double getPerimeter(); // 求周長
}
主類從鍵盤輸入圓形的半徑值,建立一個圓形物件,然後輸出圓形的面積和周長。保留4位小數。
圓形類名Circle
裁判測試程式樣例:
import java.util.Scanner;
import java.text.DecimalFormat;
abstract class shape {// 抽象類
/* 抽象方法 求面積 */
public abstract double getArea( );
/* 抽象方法 求周長 */
public abstract double getPerimeter( );
}
/* 你提交的程式碼將被嵌入到這裡 */
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
DecimalFormat d = new DecimalFormat("#.####");// 保留4位小數
double r = input.nextDouble( );
shape c = new Circle(r);
System.out.println(d.format(c.getArea()));
System.out.println(d.format(c.getPerimeter()));
input.close();
}
}
輸入樣例:
3.1415926
輸出樣例:
31.0063
19.7392
Code:
class Circle extends shape{
private double radius;
Circle(double radius){
this.radius=radius;
}
public double getArea(){
return Math.PI*radius*radius;
}
public double getPerimeter( ){
return 2*Math.PI*radius;
}
}
五:程式設計題
大整數類:
1 找素數 (10 分)
請編寫程式,從鍵盤輸入兩個整數m,n,找出等於或大於m的前n個素數。
輸入格式:
第一個整數為m,第二個整數為n;中間使用空格隔開。例如:
103 3
輸出格式:
從小到大輸出找到的等於或大於m的n個素數,每個一行。例如:
103
107
109
輸入樣例:
9223372036854775839 2
輸出樣例:
9223372036854775907
9223372036854775931
Code:
import java.util.*;
import java.math.BigInteger;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
BigInteger m = input.nextBigInteger();
int n = input.nextInt();
int cnt=0;
while(cnt<n){
if (isPrime(m)) {
cnt++;
System.out.println(m);
}
m=m.add(BigInteger.ONE);
}
}
public static boolean isPrime(BigInteger a) {
return a.isProbablePrime(50);
}
}
2. 大數整除 (10 分)
請編寫程式,從鍵盤輸入一個整數n,找出大於long.MAX_VALUE且能被n整除的前3個數字。
輸入格式:
輸入一個作為除數的整數n,例如: 17
輸出大於long.MAX_VALUE且能被n整除的前3個數字,例如下列三個數能被17整除且大於long.MAX_VALUE: 9223372036854775816
9223372036854775833
9223372036854775850
輸入樣例:
103
輸入樣例:
9223372036854775832
9223372036854775935
9223372036854776038
Code:
import java.util.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
BigInteger big = new BigInteger(String.valueOf(Long.MAX_VALUE));
int count = 0;
while (count<3) {
if (big.mod(BigInteger.valueOf(n)).intValue() == 0) {
count++;
System.out.println(big);
}
big = big.add(BigInteger.ONE); // +1
}
}
}
3 兩個巨大素數(質數)的乘積 (10 分)
得到兩個巨大素數(質數)的乘積是簡單的事,但想從該乘積分解出這兩個巨大素數卻是國際數學界公認的質因數分解難題。這種單向的數學關係,是不對稱加密RSA演算法的基本原理。 本題給出兩個大素數(128bit位)的乘積和其中一個素數,請你程式設計求出另一個素數。
輸入格式:
44022510695404470886511586569647292146578314354528108825807522926455663589709 (大素數的乘積)
189193782774204832019945226750213439577 (其中一個大素數)
輸出格式:
232684764001698545563067004009755869717 (另一個素數)
輸入樣例:
60883665878129858935918958333091530420746054622405737630613777684610994823161
271963475875372143777333694041058521413
輸出樣例:
223867067745633357281812540202957589797
Code:
import java.util.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
BigInteger a = input.nextBigInteger();
BigInteger b = input.nextBigInteger();
System.out.println(a.divide(b));
}
}
4:求階乘(大整數)
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static BigDecimal factorial(int n){
BigDecimal result = new BigDecimal(1);
BigDecimal temp;
for(int i = 2; i <= n; i++){
temp = new BigDecimal(i);
result = result.multiply(temp);
}
return result;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(factorial(n));
}
}
7-2 求解給定字串的字首 (10 分)
求解給定字串的字首。
輸入格式:
輸入數目不定的多對字串,每行兩個,以空格分開。 例如:
filename filepath
Tom Jack
輸出格式:
返回兩個字串的最大字首,例如:
The common prefix is file
No common prefix
輸入樣例:
filename filepath
Tom Jack
輸出樣例:
The common prefix is file
No common prefix
Code:
import java.util.*;
public class Main{
public static void prefix(String s1, String s2){
StringBuffer s = new StringBuffer();
int shortlen = s1.length() < s2.length() ? s1.length() : s2.length();
boolean flag=false;
for(int i = 0; i < shortlen; i++) {
if(s1.charAt(i) == s2.charAt(i)){
s.append(s1.charAt(i));
flag=true;
}
else break;
}
}
if (!flag) System.out.println("No common prefix");
else System.out.println("The common prefix is " + s);
}
public static void main(String[] args){
String s1,s2;
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
s1 = in.next();
s2 = in.next();
prefix(s1, s2);
}
in.close();
}
}
7-3 電話號碼同步(Java) (10 分)
檔案phonebook1.txt和phonebook2.txt中有若干聯絡人的姓名和電話號碼。請你設計一個程式,將這兩個檔案中的電話號碼同步。(所謂同步,就是將兩個檔案中的電話號碼合併後剔除相同的人名和電話號碼。請將同步後的電話號碼按照姓名拼音順序排序後儲存到檔案phonebook3.txt中。)
由於目前的OJ系統暫時不能支援使用者讀入檔案和寫檔案,我們編寫程式從鍵盤輸入檔案中的姓名和電話號碼,當輸入的單詞為end時,表示檔案結束。將同步後的電話號碼按照姓名拼音順序排序後輸出。
輸入格式:
張三 13012345678
李四 13112340000
王五 13212341111
馬六 13312342222
陳七 13412343333
孫悟空 13512345555
end (表示檔案phonebook1.txt結束)
張三 13012345678
孫悟空 13512345555
王五 13212341111
陳七 13412343333
唐三藏 13612346666
豬悟能 13712347777
沙悟淨 13812348888
end (表示檔案phonebook2.txt結束)
輸出格式:
陳七 13412343333
李四 13112340000
馬六 13312342222
沙悟淨 13812348888
孫悟空 13512345555
唐三藏 13612346666
王五 13212341111
張三 13012345678
豬悟能 13712347777
輸入樣例:
Zhang3 13012345678
Li4 13112340000
Wang5 13212341111
Ma6 13312342222
Chen7 13412343333
SunWuKong 13512345555
end
Zhang3 13012345678
SunWuKong 13512345555
Wang5 13212341111
Chen7 13412343333
TangSanZang 13612346666
ZhuWuneng 13712347777
ShaWuJing 13812348888
end
輸出樣例:
Chen7 13412343333
Li4 13112340000
Ma6 13312342222
ShaWuJing 13812348888
SunWuKong 13512345555
TangSanZang 13612346666
Wang5 13212341111
Zhang3 13012345678
ZhuWuneng 13712347777
Code:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
TreeMap<String,Long> map = new TreeMap<>(( String s1,String s2) -> {
return s1.compareTo(s2);
});
String name;
String[] data = new String[2];
while(true){
name = sc.nextLine();
if(name.substring(0,3).equals("end")){
break;
}
data = name.split(" "); //空格處拆分為字串陣列
map.put(data[0],Long.parseLong(data[1]));
//// Long.parseLong() 此方法返回的十進位制引數表示的long
}
while(true){
name = sc.nextLine();
if(name.substring(0,3).equals("end")){
break;
}
data = name.split(" ");
map.put(data[0],Long.parseLong(data[1]));
}
Set<String> keys = map.keySet();
for(String key:keys){
System.out.println(key+" "+map.get(key));
}
}
}
7-4 查詢成績並折算後輸出 (10 分)
檔案:期中考試成績.txt中有若干學生的姓名和數學期中考試成績。 Smith 67 Anderson 75 Lewis 83 Cook 58 David 96 請你編寫一個簡單的查詢成績程式,當從鍵盤輸入一個姓名時查詢到他的數學期中考試分數並按照21%折算後輸出。如果沒找到則顯示Not found. 由於目前的OJ系統暫時不能支援使用者讀入檔案,我們編寫程式從鍵盤輸入檔案中的姓名和成績,當輸入的名字為noname時,表示結束。noname後面有一個名字,需要查詢其成績。
輸入格式:
Smith 67
Anderson 75
Lewis 83
Cook 58
David 96
noname (表示結束)
Bill
輸出格式:
Not found.
輸入樣例:
Smith 67
Anderson 75
Lewis 83
Cook 58
David 96
noname
Lewis
輸出樣例:
17.43
Code:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner in=new Scanner(System.in);
HashMap<String,Double> m=new HashMap<String,Double>();
String name;
double score;
name=in.next();
while(!name.subtring("noname")!=0){
score=in.nextDouble();
m.put(name, score);
name=in.next();
}
name=in.next();
if(m.get(name)!=null)
System.out.println(m.get(name).intValue()*0.21);
else
System.out.println("Not found.");
}
}
7-5 查詢電話號碼 (10 分)
檔案phonebook1.txt中有若干聯絡人的姓名和電話號碼。
高富帥 13312342222
白富美 13412343333
孫悟空 13512345555
唐三藏 13612346666
豬悟能 13712347777
沙悟淨 13812348888
請你編寫一個簡單的通訊錄程式,當從鍵盤輸入一個姓名時查詢到對應的電話號碼並輸出。如果沒找到則顯示Not found. 由於目前的自動裁判系統暫時不能支援使用者讀入檔案,我們編寫程式從鍵盤輸入檔案中的姓名和電話號碼,當輸入的名字為noname時,表示結束。noname後面有一個名字,需要查詢其對應的電話號碼。
輸入格式:
高富帥 13312342222
白富美 13412343333
孫悟空 13512345555
唐三藏 13612346666
豬悟能 13712347777
沙悟淨 13812348888
noname (表示結束)
唐三藏 (需要查詢此人的電話號碼)
輸出格式:
13612346666 (輸出對應的電話號碼)
輸入樣例:
白富美 13412343333
孫悟空 13512345555
唐三藏 13612346666
豬悟能 13712347777
沙悟淨 13812348888
noname
白骨精
輸出樣例:
Not found.
Code:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Map<String,String> map = new HashMap<String, String>();
String name;
String telphone;
name = input.next();
while (!name.equals("noname")) {
telphone = input.next();
map.put(name, telphone);
name = input.next();
}
String target = input.next();
if (map.get(target) != null)
System.out.println(map.get(target));
else
System.out.println("Not found.");
}
}