第二次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大作业除开难题以外,都是一些比较基础的题目,但是对于难题,很考验学生的心态和专注度,这一次的难题都有一个特点,就是题目很长,其次包容的其他知识很多,比如电路的串联并联,都是对学生综合能力的考验,其次题目文字量大,题目长,也是对学生心态的考验,学生是否有耐心将题目逐字逐句地分析,将题目的信息化成类图方便写程序......这些说到底都不单单是对学生程序设计能力的考察,也是对学生综合素质能力的测验。

posted @ 2024-06-08 17:04  YGKING22  阅读(13)  评论(0编辑  收藏  举报