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思考和详解