一:判断题
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.");
}
}