第二次pta大作业的总结和反思
第二次pta大作业的总结和反思
目录
一.前言
二.题目分析
三.总结
一.前言
第二次作业说实话有点一言难尽啊,因为比较难的缘故吧,有的题甚至做了一个星期也没做完,所以blog有点无从下手,因为有很多题目是现想的,没有经过调试,不知道思路究竟对不对,可能会有一些理解上会些偏差,构造方法会有点偏简单复杂,还请理解。
二.题目分析
第四次pta作业
第二题
设计一个学生类(Student)和它的一个子类——本科生类(Undergraduate)。要求如下:
(1)Student类有姓名(name)和年龄(age)属性,两者的访问权限为protected;一个包含两个参数的构造方法,用于给姓名和年龄属性赋值;一个show( )方法用于输出Student的属性信息,输出格式为Student[name=XXX,age=XX]。
(2)Undergraduate类增加一个专业(major)属性,该属性的访问权限为private;有一个包含三个参数的构造方法,前两个参数用于给继承的年龄和姓名属性赋值,第三个参数给专业属性赋值;一个show( )方######法用于输出Undergraduate的属性信息,输出格式为Undergraduate[name=XXX,age=XXX,major=XXX]。
在测试类Main的main( )方法中,调用Student类的带参数的构造方法创建对象object1,调用Undergraduate类的带参数的构造方法创建对象object2,然后分别调用它们的show( )方法。
解析思路
这道题主要考察的是继承,父类和子类,学生类作为父类,本科生类作为子类,子类是要继承父类属性,首先创造学生类,访问权限为protected,并加入姓名和年龄的属性,并用一个show()方法将姓名和年龄输出,再创造一个子类Undergraduate类,访问权限就是private,继承父类的属性,并用show()方法输出。
代码展示
点击查看代码
import java.util.Scanner;
class Student {
protected String name;
protected int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println("Student[name=" + this.name + ",age=" + this.age + "]");
}
}
class Undergraduate extends Student {
private String major;
public Undergraduate(String name, int age, String major) {
super(name, age);
this.major = major;
}
public void show() {
System.out.println("Undergraduate[name=" + this.name +
",age=" + this.age + ",major=" + this.major + "]");
}
}
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String name = cin.next();
int age = cin.nextInt();
Student student = new Student(name, age);
name = cin.next();
age = cin.nextInt();
String major = cin.next();
Undergraduate undergraduate = new Undergraduate(name, age, major);
student.show();
undergraduate.show();
}
}
第三题
学校需要构建综合系统,使用者包含多种角色。角色Role分两类:学生Student和雇员Employee;雇员又分为教员Faculty和职员Staff。
每个角色都有姓名、性别。学生有学号、班级。一个雇员有工号、入职日期。教员有职称。职员有职位称号。
请以如下Main类为基础,构建各个角色类,将代码补充完整。
点击查看代码
public class Main {
public static void main(String[] args) {
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.show();
sta.show();
stu.show();
}
}
解析思路
该题已经给出了Main类,利用逆向思维,通过Main类给出的基础对学生类Student和雇员类Employee类进行构造,其中Employee类分为Faculty和Staff类,可以先创造一个role类,将姓名和年龄的属性,将此作为输出,再构造Student类,Faculty类和Staff类并将三个类的属性通过role类输出
代码展示
点击查看代码
import java.util.Arrays;
import java.util.Scanner;
class Role{
String name;
int age;
Role(String name, int age){
this.name = name;
this.age = age;
}
}
class Faculty extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
Faculty(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + super.age + "岁。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。是一名教师," + this.f_name + "职称。");
}
}
class Student extends Role{
private String id;
private String cl;
Student(String name, int age, String id, String cl){
super(name, age);
this.cl = cl;
this.id = id;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + age + "岁。学号是" + id + ",来自" + cl + "班。");
}
}
class Staff extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
Staff(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + super.age + "岁。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。是一名" + this.f_name + "。");
}
}
public class Main {
public static void main(String[] args) {
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.show();
sta.show();
stu.show();
}
}
第五次pta作业
功能:
使用集合存储多个学生的信息(有序);
获取学生总数,并按照存储顺序;
按照存储顺序获取各个学生的信息并逐条输出
备注:请学生复制以下代码到编程区进行改错。
//1考查集合导包
点击查看代码
class Student{
private String no;
private String name;
public Student(String no, String name) {
super();
this.no = no;
this.name = name;
}
public Student() {
super();
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + "]";
}
}
public class Main {
public static void main(String[] args) {
// 创建学生对象
Student stu1 = new Student("1001","zs");
Student stu2 = new Student("1002","ls");
//2考查集合接口的实例化
//创建有序集合List,并向集合中添加学生,
List students=new List();
students.add(stu1);
students.add(stu2);
//计算学生人数,显示学生信息
for(int i=0;i<students.size();i++) {
//3考查遍历方法和向下转型
Student stu=students.get(i);
System.out.println("no:"+stu.getNo()+"\t name:"+stu.getName());
}
}
}
解析思路
该题是对给出的代码进行改错,其实操作很简单只用将题目中的代码复制粘贴到eclipse,根据eclipse上的提示进行修改,如果你要是够懒的话,也可以用点击eclipse代码旁的小灯提示,直接改,还不用自己打字,你说够不够懒。
代码展示
点击查看代码
import java.util.ArrayList;
class Student{
private String no;
private String name;
public Student(String no, String name) {
super();
this.no = no;
this.name = name;
}
public Student() {
super();
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + "]";
}
}
public class Main {
public static void main(String[] args) {
// 创建学生对象
Student stu1 = new Student("1001","zs");
Student stu2 = new Student("1002","ls");
//2考查集合接口的实例化
//创建有序集合List,并向集合中添加学生,
ArrayList<Student> students=new ArrayList();
students.add(stu1);
students.add(stu2);
//计算学生人数,显示学生信息
for(int i=0;i<students.size();i++) {
//3考查遍历方法和向下转型
Student stu=students.get(i);
System.out.println("no:"+stu.getNo()+"\t name:"+stu.getName());
}
}
}
第三题
功能需求:
使用集合存储3个员工的信息(有序);
通过迭代器依次找出所有的员工。
提示:学生复制以下代码到编程区,并按需求进行调试修改。
// 1、导入相关包
//定义员工类
class Employee {
private String name;
private int age;
public Employee() {
super();
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//主函数
public class Main {
public static void main(String[] args) {
// 1、创建有序集合对象
Collection c ;
// 创建3个员工元素对象
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);
String employeeName = sc.nextLine();
int employeeAge = sc.nextInt();
Employee employee = new Employee(employeeName, employeeAge);
c.add(employee);
}
// 2、创建迭代器遍历集合
Iterator it;
//3、遍历
while (it.hasnext) {
//4、集合中对象未知,向下转型
Employee e = it.next();
System.out.println(e.getName() + "---" + e.getAge());
}
}
}
解析思路
这和上一个题目没什么区别吧牢底,包变脸的,就是把题目中的代码复制粘贴到eclipse上,根据eclipse的提示,对代码进行修改,但是要注意一个点就是非零返回,以为前几次修改,我都忘记了要用return返回属性的值,这是很低级的错误了吧。
代码展示
点击查看代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Scanner;
import java.util.HashMap;
//定义员工类
class Employee {
private String name;
private String age;
public Employee(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
//主函数
public class Main {
public static void main(String[] args) {
// 1、创建有序集合对象
ArrayList<Employee> users =new ArrayList<>();
String employeeAge;
String employeeName;
Scanner sc = new Scanner(System.in);
// 创建3个员工元素对象
for (int i = 0; i < 3; i++) {
employeeName = sc.nextLine();
employeeAge = sc.nextLine();
users.add(new Employee(employeeName, employeeAge));
}
for(int j=0;j<3;j++) {
System.out.println(users.get(j).getName() + "---" + users.get(j).getAge());
}
}
}
第四题
智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能。请根据如下要去设计一个智能家居强电电路模拟系统。
1、控制设备模拟
本题模拟的控制设备包括:开关、分档调速器、连续调速器。
开关:包括0和1两种状态。
开关有两个引脚,任意一个引脚都可以是输入引脚,而另一个则是输出引脚。开关状态为0时,无论输入电位是多少,输出引脚电位为0。当开关状态为1时,输出引脚电位等于输入电位。
分档调速器
按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器
没有固定档位,按位置比例得到档位参数,数值范围在[0.00-1.00]之间,含两位小数。输出电位为档位参数乘以输入电压。
所有调速器都有两个引脚,一个固定的输入(引脚编号为1)、一个输出引脚(引脚编号为2)。当输入电位为0时,输出引脚输出的电位固定为0,不受各类开关调节的影响。
所有控制设备的初始状态/档位为0。
控制设备的输入引脚编号为1,输出引脚编号为2。
2、受控设备模拟
本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。
灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚的电位差的不同而有区别。
本次迭代模拟两种灯具。
白炽灯:
亮度在0~200lux(流明)之间。
电位差为0-9V时亮度为0,其他电位差按比例,电位差10V对应50ux,220V对应200lux,其他电位差与对应亮度值成正比。白炽灯超过220V。
日光灯:
亮度为180lux。
只有两种状态,电位差为0时,亮度为0,电位差不为0,亮度为180。
本次迭代模拟一种吊扇。
工作电压区间为80V-150V,对应转速区间为80-360转/分钟。80V对应转速为80转/分钟,150V对应转速为360转/分钟,超过150V转速为360转/分钟(本次迭代暂不考虑电压超标的异常情况)。其他电压值与转速成正比,输入输出电位差小于80V时转速为0。
输入信息:
1、设备信息
分别用设备标识符K、F、L、B、R、D分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇。
设备标识用标识符+编号表示,如K1、F3、L2等。
引脚格式:设备标识-引脚编号,例如:K1-1标识编号为1的开关的输入引脚。
三种控制开关的输入引脚编号为1,输出引脚编号为2。
受控设备的两个引脚编号分别为1、2。
约束条件:
不同设备的编号可以相同。
同种设备的编号可以不连续。
设备信息不单独输入,包含在连接信息中。
2、连接信息
一条连接信息占一行,用[]表示一组连接在一起的设备引脚,引脚与引脚之间用英文空格" "分隔。
格式:"["+引脚号+" "+...+" "+引脚号+"]"
例如:[K1-1 K3-2 D5-1]表示K1的输入引脚,K3的输出引脚,D5的1号引脚连接在一起。
约束条件:
本次迭代不考虑两个输出引脚短接的情况
考虑调速器输出串联到其他控制设备(开关)的情况
不考虑调速器串联到其他调速器的情况。
不考虑各类控制设备的并联接入或反馈接入。例如,K1的输出接到L2的输入,L2的输出再接其他设备属于串联接线。K1的输出接到L2的输出,同时K1的输入接到L2的输入,这种情况属于并联。K1的输出接到L2的输入,K1的输入接到L2的输出,属于反馈接线。
3、控制设备调节信息
开关调节信息格式:
+设备标识K+设备编号,例如:#K2,代表切换K2开关的状态。
分档调速器的调节信息格式:
+设备标识F+设备编号+"+" 代表加一档,例如:#F3+,代表F3输出加一档。
+设备标识F+设备编号+"-" 代表减一档,例如:#F1-,代表F1输出减一档。
连续调速器的调节信息格式:
+设备标识L+设备编号+":" +数值 代表将连续调速器的档位设置到对应数值,例如:#L3:0.6,代表L3输出档位参数0.6。
4、电源接地标识:VCC,电压220V,GND,电压0V。没有接线的引脚默认接地,电压为0V。
输入信息以end为结束标志,忽略end之后的输入信息。
输出信息:
按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
输出格式:@设备标识+设备编号+":" +设备参数值(控制开关的档位或状态、灯的亮度、风扇的转速,只输出值,不输出单位)
连续调速器的档位信息保留两位小数,即使小数为0,依然显示两位小数.00。
开关状态为0(打开)时显示turned on,状态为1(合上)时显示closed
如:
@K1:turned on
@B1:190
@L1:0.60
本题不考虑输入电压或电压差超过220V的情况。
本题只考虑串联的形式,所以所有测试用例的所有连接信息都只包含两个引脚
本题电路中除了开关可能出现多个,其他电路设备均只出现一次。
电源VCC一定是第一个连接的第一项,接地GND一定是最后一个连接的后一项。
家居电路模拟系列所有题目的默认规则:
1、当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。
2、所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。
3、连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。
4、对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。
家居电路模拟系列1-4题目后续迭代设计:
1、电路结构变化:
迭代1:只有一条线路,所有元件串联
迭代2:线路中包含一个并联电路
迭代3:线路中包含多个串联起来的并联电路
迭代4:并联电路之间可能出现包含关系
电路结构变化示意图见图1。
2、输入信息的变化
串联线路信息:用于记录一段串联电路的元件与连接信息。
例如: #T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T1:[IN K1-1] [K1-2 M1-IN][M1-OUT D2-1] [D2-2 GND]
并联线路信息:用于记录一段并联电路所包含的所有串联电路信息。
例如:#M1:[T1 T2 T3]
以上格式仅做参考,格式细节可能会调整,以具体发布的为准。
3、计算方式的变化
迭代1只包含1个受控元件,不用计算电流,之后的电路计算要包含电流、电阻等电路参数。
4、电路元件的变化
每次迭代会增加1-2个新的电路元件。
图1:电路结构示意图
设计建议:
1、电路设备类:描述所有电路设备的公共特征。
2、受控设备类、控制设备类:对应受控、控制设备
3、串联电路类:一条由多个电路设备构成的串联电路,也看成是一个独立的电路设备
其他类以及类的属性、方法自行设计。
思路解析
如何呢,这题目长的我看都看不懂这就是为啥我做了几天一分都没有的原因,那么根据题目,首先取电路连接信息完成处理和存储
,然后再完成线路连接(将元件添加至串并联线路中),对所有开关进行判断,判断串并联连通性,计算串并联对象的总电阻,逐层分压,计算工作状态,最后排序并输出,思路就是这样简单,但前提是要看得懂题目才行
三.总结
其实这一次的pta大作业除开难题以外,都是一些比较基础的题目,但是对于难题,很考验学生的心态和专注度,这一次的难题都有一个特点,就是题目很长,其次包容的其他知识很多,比如电路的串联并联,都是对学生综合能力的考验,其次题目文字量大,题目长,也是对学生心态的考验,学生是否有耐心将题目逐字逐句地分析,将题目的信息化成类图方便写程序......这些说到底都不单单是对学生程序设计能力的考察,也是对学生综合素质能力的测验。