Java程序设计(2021春)——第二章课后题(选择题+编程题)答案与详解


第二章选择题

Tip:选择题部分我只针对部分我出错的或我认为有价值的题目在此整理。

2.1 面向对象方法的特性

T1

题面

面向对象的程序设计方法采用了什么样的抽象方法构建程序的类与对象:

A 过程抽象

B 数据抽象

C 过程抽象与数据抽象

D 没有采用任何的抽象方法

答案

B

详解

​ 面向对象程序设计方法的基本思想是使用类、对象、继承、封装和消息等概念进行程序设计。它从现实世界客观存在的事物(对象)出发来构造软件系统。强调尽可能用人类自然的思维方式思考问题,认识问题,从而将现实世界中的事物抽象成系统中的类,作为系统的基本构成单元。这样构建的系统能直接映射客观世界,更符合现实世界的本来面貌。

​ 面向对象的基本哲学是世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通信构成了完整的现实世界。

从程序设计的角度看,面向对象的程序设计语言必须有描述对象及其相互之间的关系的语言成分。归纳起来即:系统中一切都是对象;对象是属性及其操作的封装体;对象可以按性质划分为类,对象是类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。

​ 在面向对象的编程过程中,开发者要从自己的使用角度和认识角度出发来定义类,从而模拟客观世界的事物,并让自己明白这种事物是用来做什么的,对我们有什么意义。用抽象的方法忽略一个事物中与目标类无关的那些方面,充分地注意与当前目标有关的方面。

T5

题面

Java的封装性是通过什么实现的:

A 访问控制权限

B 设计内部类

C 静态域与静态方法

D 包

答案

A

详解

笔者查了一下,还没查到为什么,先mark一下。


2.2-1 类声明与对象创建


2.2-2 数据成员


2.2-3 方法成员


2.2-4 包


2.2-5类的访问控制权限

T3

题面

下列代码在编译时会发生错误,下面哪种修改可以更正错误:

class Test{
private int m;
public static void fun(){
System.out.println(m);
}
}

A 将private int m改成protected int m

B 将private int m改成public int m

C 将private int m改成static int m

D 将private int m改成int m

答案

C

详解

fun经过了static修饰,是类方法(静态方法),不可以调用实例变量。


2.3-1 对象初始化


2.3-2 内存回收


2.4枚举类

T2

题面

下面关于枚举类型,说法错误的是:

A 枚举值是类的对象

B 枚举中可以定义数据和方法

C 枚举类的values()方法用于获得枚举类型的枚举值的数组

D 枚举类型可以有public的构造函数

答案

D

详解

构造函数构造方法,而枚举类型中构造方法必须是包内私有或者私有的。


第二章编程题

T1 矩阵螺旋

题面

给定m × n个元素(m行,n列)的矩阵,以螺旋顺序返回矩阵的所有元素。输入为m n以及m*n的矩阵,输出螺旋顺序的所有元素

样例输入:

3 3
1 2 3
4 5 6
7 8 9

样例输出:

123698745

样例解释:

思考和详解

本题笔者思考的时候说实话其实没太用到Java面向对象的特性,基本上还是按照C语言的思考方式来写的。只需要举几个例子,判断一下条件即可模拟解决本题。

具体代码

import java.util.Scanner;

public class matrix {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = 0;
int n = 0;
int flag = 1;
int ct = 0;
int cnt = 1;
m = in.nextInt();
n = in.nextInt();
int sum = m * n;
int[][] matrix = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
matrix[i][j] = in.nextInt();
}
}
in.close();
int i = 1;
int j = 1;
while ((++ct) <= sum) {
if (flag == 1) {
System.out.print(matrix[i][j++]);
if (j == n) {
flag = 2;
}
continue;
} else if (flag == 2) {
System.out.print(matrix[i++][j]);
if (i == m) {
flag = 3;
n--;
}
continue;
} else if (flag == 3) {
System.out.print(matrix[i][j--]);
if (j == cnt) {
flag = 4;
cnt++;
}
continue;
} else if (flag == 4) {
System.out.print(matrix[i--][j]);
if (i == cnt) {
flag = 1;
m--;
}
continue;
}
}
}
}

T2 组合数

题面

给定N个无重复的正整数,和目标数M,找出N中所有子集,使得每个子集的和是M,对于每个数而言,可以选多次,所有结果子集不能够重复。输入为2行,第一行为N和M,第二行为N个数,输出为总共的子集数。

样例输入:

4 7

2 3 6 7

样例输出:

2

样例解释:

7=7

2+2+3=7

思考和详解

本题使用简单递归即可,由于没有要求不重复,所以我们额外注意一下枚举的时候从当前元素开始。本题没有说明给的无重复正整数一定是按顺序给出的,但是笔者比较懒,没写sort,但是还是过了,测试数据应该都是升序给的,不过标准来说还是应该排序一下的。

具体代码

import java.util.Scanner;

public class combination {
public static int cnt = 0;
public static int[] arr = new int[10005 + 1]; public static void func(int nowSum, int n, int ct, int target) {
if (nowSum == target) {
cnt++;
return;
} else if (nowSum > target)
return;
for (int i = ct; i <= n; i++) {
func(nowSum + arr[i], n, i, target);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m;
int n;
n = in.nextInt();
m = in.nextInt();
for (int i = 1; i <= n; i++) {
combination.arr[i] = in.nextInt();
}
combination.func(0, n, 1, m);
System.out.println(combination.cnt);
}
}

T3 组合数2

题面

给定N个的正整数【可能有重复】,和目标数M,找出N中所有子集,使得每个子集的和是M,对于每个数,只能选一次,所有结果子集不能够重复。输入为2行,第一行为N和M,第二行为N个数,输出为总共的子集数。

样例输入:

7 8

10 1 2 7 6 1 5

样例输出:

4

样例解释:

【1,7】

【1,2,5】

【2,6】

【1,1,6】

思考和详解

本题在本章T2的基础上略有改变,主要体现在以下两点:

  1. 所给数字可能有重复。
  2. 每个数字只能用一次,对于重复数字则是至多用所给次数次,但方案彼此不可以重复。

需要改变的地方有如下:

  1. 需要对数组排序,调用java.import.Arrays中的Arrays.sort()方法,值得注意的是,调用该方法似乎默认对整个数组进行排序,因此建议按照正好的大小进行初始化申请空间,并从角标0存入数据。
  2. 需要特殊处理数组中连续的重复数字,以避免如1,1,1,1,2,2中选出了若干1,1,2这种情况。
  3. 需要注意不重复数字只能使用一次。

具体代码

import java.util.Arrays;
import java.util.Scanner; class Main {
public static int cnt = 0;
public static int[] arr; public static void func(int nowSum, int n, int ctt, int target) {
int flag;
int j = 0;
if (nowSum == target) {
Main.cnt++;
return;
} else if (nowSum > target)
return;
for (int i = ctt; i < n; i++) {
flag = 0;
if ((i + 1) < n && Main.arr[i] == Main.arr[i + 1]) {
flag = 1;
j = i;
while ((j + 1) < n && Main.arr[j] == Main.arr[j + 1]) {
j++;
}
}
if (flag == 0)
func(nowSum + arr[i], n, i + 1, target);
else {
for (int k = 1; k <= (j - i + 1); k++) {
func(nowSum + k * arr[i], n, j + 1, target);
}
i = j;
}
}
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m;
int n;
n = in.nextInt();
m = in.nextInt();
Main.arr = new int[n];
for (int i = 0; i < n; i++) {
Main.arr[i] = in.nextInt();
}
in.close();
Arrays.sort(arr);
Main.func(0, n, 0, m);
System.out.println(Main.cnt);
}
}

Java程序设计(2021春)——第二章课后题(选择题+编程题)答案与详解的更多相关文章

  1. “全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. 《80x86汇编语言程序设计教程》第二章课后题答案

    2.5 习题 2.1 数据寄存器 1. 八个通用寄存器除了各自规定的专门用途外,它们均可以用于传送和暂存数据,可以保存算术逻辑运算中的各种操作数和运算结果. 2.1 AX和Al寄存器又称为累加器(ac ...

  3. Java程序设计(2021春)——第一章课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 第一章选择题 1.1 Java与面向对象程 ...

  4. Java程序设计(2021春)——第四章接口与多态课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第四章接口与多态课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第四章接口与多态课后题(选择题+编程题)答案与详解 第四章选择题 4.0 ...

  5. 《Java程序设计》第四章-认识对象

    20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...

  6. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  7. 《Java 程序设计》课堂实践项目 课后学习总结

    <Java 程序设计>课堂实践项目 课后学习总结 String类的使用(sort) 目录 Linux命令(sort) 课堂实践 课后思考 学习老师的代码之后的思考:int与Integer ...

  8. 《Java程序设计》第三章-基础语法

    20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...

  9. 关于《Java读书笔记》第六章课后习题选择题总结与疑问

    课后习题 选择题 3 题 代码: class Some{ String ToString(){ return "Some instance"; } } public class M ...

随机推荐

  1. Redux 原理和简单实现

    前端开发中React + Redux 是大部分项目的标配,Redux也是我喜欢的库之一,他的源码也拜读过几遍,每次都有很多收获,尤其他的中间件设计模式,对自己封装一些库提供了思想上的指导. Redux ...

  2. HUAWEI防火墙通过L2TP隧道让外出员工访问公司内网的各种资源

    组网图形 组网需求 企业网络如图所示,企业希望公司外的移动办公用户能够通过L2TP VPN隧道访问公司内网的各种资源. 操作步骤 配置LNS. 1.配置接口IP地址,并将接口加入安全区域. <L ...

  3. 在pycharm进行单元测试(unittest python)

    在Edit Configuration中添加Python test 选中相应的脚本或者文件夹 # coding:utf-8 import unittest import requests from c ...

  4. noip模拟4[随·单·题·大佬]

    woc    woc   woc难斩了人都傻了 害上来先看T1,发现这不就是一个小期望嘛(有啥的)真是!!打算半个小时秒掉 可是吧,读着读着题面,发现这题面有大问题,后来去找老师,还是我nb给题挑错, ...

  5. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.12 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  6. TensorFlow单层感知机实现

    TensorFlow单层感知机实现 简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,只能解决线性可分的问题.虽然限制了单层感知机只能应用于线性可分 ...

  7. 国内操作系统OS分析(下)

    国内操作系统OS分析(下) 3.2 Android/iOS移动互联网时代 Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google公司和 ...

  8. matrix_multiply代码解析

    matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...

  9. oracle单机开机自启动

    ====================== 单机数据库开机自启动  ============================= 环境: oracle数据库单机 版本:11.2.0.4 1.修改配置文 ...

  10. 【NX二次开发】Block UI 图层

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...