北京理工大学2013学年Java考试试卷试题及答案

jinxuliang2 发表于   2014/11/20 10:27:48,阅读次数: 12555

北京理工大学2013学年Java考试试卷试题,包括简单的分析和解答。

说明:

这是去年的考题,请同学们参考。

今年的变化是:

(1)去掉了Android部分的内容,添加Java8中新特性的内容。我今年会录制一些Android的入门视频,同学们可以到网易云课堂《面向对象软件开发实践》这门MOOC课上看到这些视频。

(2)不再要求写出全部源码,而采用“关键代码”+“文字说明/绘示意图表达”的方式,讲清楚你的技术实现思路就行了。

(3)减少题量,但同时提升题目的灵活性,少考核具体知识点,重点考核学生对于面向对象的理解及基本编程技能高低。

================================================================================================


北京理工大学计算机科学技术学院 20132014学年第一学期

Java语言程序设计考试试题(A)

班级          学号           姓名           成绩         

 

说明:

    1)本次考试为开卷考试,允许学生携带笔记本电脑及其他资料,允许上网,但不允许以各种手段相互抄袭。

2)考试时间为2小时。

    3)判断题答案直接写在试卷上。简答题和编程题写在试卷后所附的答题纸上,标明题号。

       4)要求代码书写规范,并添加相应的注释。

       5)部分题目没有标准答案,只要言之成理,均可给分,这类题目如发现有抄袭嫌疑的,该题判为0分。

*******************************************************************************

 

一、   判断题(正确的描述打勾,错误的打叉,每题1分,共10分)

 

1.   Java的跨平台特性是指它的源代码可以在多个平台运行。(X

 

2.   Web客户端的编程语言JavaScript源自Java,其功能是Java SE的子集。(X

 

3.   枚举(enum)属于原始数据类型(primitive type)。(X

 

4.   在程序代码中写的注释太多,会使编译后的程序尺寸变大。 X

 

5.   在开发中使用泛型取代非泛型的数据类型(比如用ArrayList<String>取代ArrayList),程序的运行时性能会变得更好。(X

 

6.   Android应用中各Activity之间主要通过Intent相互传送信息。(对)

 

7.   我们在程序中经常使用“System.out.println()”来输出信息,语句中的System是包名,out是类名,println是方法名。(X

 

8.   JDK中提供的javajavacjar等开发工具也是用Java编写的。(对)

 

9.   可以把任何一种数据类型的变量赋给Object类型的变量。         T

 

10. 高优先级的线程比低优先级的线程运行得更快。(错)

 

 

二、   简答题(请将答案写到答题纸上,注明题号。共20分)

 

11. (本题3分)我们都知道计算机只能在一定的精度范围内处理浮点数运算,然而,以下两句Java代码输出的结果大相径庭:

 

System.out.println(100.1*2);//输出:200.2

System.out.println(100.1*3);//输出:300.29999999999995

 

如此奇怪的现象是怎样产生的?请尝试解释之。


计算机无法精确地表示浮点数,但乘以2的整数次幂时,计算机只需进行简单的移位操作即可(乘以2只需左移一位),所以结果是正确的,而乘以3就不能仅用简单的移位操作实现了,必须完成浮点数的乘法运算,这个过程得到的只能是近似数。

 

12. (本题3分)以下代码编译失败,为什么?

 

class MyGenericClass<T,V>{

    T obj1=null;

    V obj2=null;

    void setValue(T obj){

    }

    void setValue(V obj){

    }

}

 

       Java编译器的“擦除”原理

 

13. (本题3分)某同学开发一个Android应用,他想在界面上用一个TextView控件显示当前的时间( 1):

1

 

以下是他所编写的代码:

 

public class MainActivity extends Activity {

private TextView timerTextView=null;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        timerTextView = (TextView)findViewById(R.id.tvTimer);

        Timer timer=new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {

            public void run() {

                //TextView控件上显示当前时间

                Date nowDate = new Date();

                timerTextView.setText(nowDate.toLocaleString());

            }

        }, 0, 1000);//每隔一秒种更新显示文本

    }

}

 

可是程序运行时,Android报告以下错误( 2):

2

 

请解释原因,并修改代码消除此BUG

 

原因:跨线程更新UI控件。应该将更新UI控件的代码封装起来,POST到UI线程的消息队列中。

参考示意代码如下

public class MainActivity extends Activity {

 

    private TextView timerTextView=null;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        timerTextView=(TextView)findViewById(R.id.tvTimer);

        final Runnable runnable=new Runnable() {

           public void run() {

              Date nowDate=new Date();

              timerTextView.setText(nowDate.toLocaleString());

           }

       };

        Timer timer=new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {

           public void run() {

              runOnUiThread(runnable);

           }

       }, 0, 1000);

    }

 

}

14.   (本题3分)下图是Android手机中的QQ界面载图( 3):

3

 

如何组合现有的Android控件设计出以上界面?简要叙述一下你的技术实现方案。

 使用LinearLayout嵌套RelativeLayout。

15. (本题4分)以下有两段功能相似的代码,一个使用int,另一个使用Integer:

 

代码段一

代码段二

public   static int sumViaInteger(

Integer from , Integer   to) {

Integer result=0;

       for(int   i=from;i<=to;i++){

            result+=i;

        }

        return   result;

    }

public   static int sumViaInt(int from , int to) {

        int result=0;

        for(int i=from;i<=to;i++){

            result+=i;

        }

        return result;

    }

 

以下代码测试这两个方法的执行时间:

public static void main(String[] args) {

    for (int i = 0; i < 3; i++) {

        long start = System.nanoTime();

        sumViaInteger(1, 100);

        long end = System.nanoTime();

        System.out.println(i + "  sumViaInteger(1,100)所花时间:"

                    + (end - start));

        start = System.nanoTime();

        sumViaInt(1, 100);

        end = System.nanoTime();

        System.out.println(i + "  sumViaInt(1,100)所花时间:" + (end - start));

        }

    }

 

以下是程序某次运行的输出结果

 

0  sumViaInteger(1,100)所花时间:457051

0  sumViaInt(1,100)所花时间:3499

-------------------

1  sumViaInteger(1,100)所花时间:19948

1  sumViaInt(1,100)所花时间:1400

-------------------

2  sumViaInteger(1,100)所花时间:19598

2  sumViaInt(1,100)所花时间:1400

-------------------

 

仔细观察以上输出结果,你发现了什么?得出了什么结论?请对出现此运行结果的可能原因进行分析。

 

1sumViaInteger()花时间是sumViaInt()10倍以上。原因:装箱和拆箱。

2)两个方法第一次执行时间都长,第二次都大规模减少。原因:JVM缓存了JIT编译的结果。

 

16.(本题4分)用户在使用软件系统时,可能会因为各种原因输入错误的数据。比如教师使用某教务管理系统在线录入学生考试成绩,由于疏忽,本应输入“90”,实际输入了“190”,很明显这是一个非法的分数,不应该被保存到数据库中;还有另外的可能,比如用户输入的是不能转换为int数值的字符串,比如“z90”,这将导致JVM在尝试转换“z90”字符串为int数值时抛出NumberFormatException异常。

如果由你来设计这个教务管理系统,你打算如何解决上面提出的这些与异常处理策略密切相关的实际问题?简述你的系统设计与技术实现思路。

 

封装并转换JDK通用异常为“业务逻辑异常”,在表示层进行捕获,提示用户并允许用户重试。

 

三、  编程题(共30分)

 

17.  (本题5分)设计一个方法,它接收一个整数数组,外界只需调用一次此方法,就能得到此数组中元素的最大值、最小值和平均值。

 

很多方法:

比如将结果封装为一个对象返回,或者把结果放到一个数组中返回,或者是直接修改放置此方法的类中的字段值……

18.(本题5分)给定一个数组,将其转换为一个环型链表。比如某数组中包容[01234],则转换为的环型链表如4所示:


4

 

使用自引用类很容易实现。

 

1.   (本题6分)现在需要计算1+2+3+....+30000的和。请采用多线程完成此计算工作,要求如下:

主线程启动三个线程,分别给它们分派以下任务:

 

线程1:计算1+2+3+...+10000

线程2:计算10001+10002+...+20000

线程3:计算20001+20002+...+30000

 

等三个线程都完成工作之后,主线程汇总三个工作线程的计算结果,得到最终答案:

1 + 2 + 3 + .... + 30000 = 450015000

 

   线程同步问题,多种实现方式,比如可以使用JDK中提供的CountDownLatch实现。

 

2.   (本题14)文件系统及对象集合编程题: 

 

(1)编写一个方法找出指定文件夹(包括其子文件夹)中所有大于指定容量的文件(比如可以找出c:windows下所有大于10M的文件):

 

public static ArrayList<File> getFiles(String directory,int fileSize)

 

(2)编写一个方法对上述方法找到的文件集合进行升序或降序排列:

 

public static void sortFile(List<File> files, boolean desc);

 

升序还是降序由参数desc决定。

 

(3) 编写一个方法(名字、参数、返回值类型自定),对前面getFiles()方法找到的文件集合按照文件扩展名进行分组,比如

 

txt文件组:

    1.txtreadme.txt

exe文件组:

    notepad.execalc.exe

无扩展名的文件组:

    2test

 

 

(4)main()方法中启动一个工作线程执行getFiles()方法,等其工作结束得到文件集合后,如果集合不为空,则再启动两个线程完成后继处理工作,第一个线程执行sortFile()方法进行排序,第二个线程执行分组,这两个线程完成工作后,主线程汇总处理结果并输出在屏幕上。

 

技术关键点:

第(1)小问:考查JDK中的文件操作及递归的编程技巧。

第(2)小问:让对象实现Comparable接口,或者是提供一个外部对象比较器。

第(3)小问:选择合适的集合,通过“对象组合”的编程技巧,保存分组数据

第(4)小问:典型线程同步问题。多种实现方法。



附件清单



评论于: