阅读目录
前言
第七次PTA
第八次PTA
总结
前言
一:对于java的最后认识
Java是一种功能强大且广泛使用的编程语言,它以其独特的优势在软件开发领域占据了重要地位。以下是关于Java更详细的认知:
跨平台性:Java的“一次编写,到处运行”的能力是其最显著的特点。通过Java虚拟机(JVM),Java程序可以在任何安装了JVM的操作系统上运行,这使得Java成为了跨平台开发的首选语言。
面向对象:Java是完全面向对象的语言,支持类和对象的概念,这使得代码更加模块化、易于维护和扩展。通过继承、封装和多态等特性,Java能够实现代码的高内聚、低耦合,提高软件的可重用性。
自动内存管理:Java具有垃圾回收机制,能够自动管理内存,减少了内存泄漏和内存溢出的风险。程序员无需手动分配和释放内存,从而降低了出错的可能性。
丰富的API:Java标准库(JDK)提供了大量的API,这些API覆盖了从基本的数据结构到复杂的网络编程、图形用户界面(GUI)开发等各个方面。这些API使得Java程序员能够高效地开发出各种类型的应用程序。
安全性:Java是一种安全性很高的编程语言,具有很多安全特性。它支持访问控制、异常处理、字节码验证等机制,可以确保程序的稳定性和安全性。这使得Java成为开发安全敏感应用(如银行系统、电子商务网站等)的理想选择。
多线程支持:Java内置了对多线程的支持,这使得开发并发应用变得更加容易。Java提供了多种同步机制,如synchronized关键字、Lock接口等,以确保线程安全。多线程编程在现代软件开发中越来越重要,Java的多线程支持使得程序员能够充分利用多核处理器的性能。
广泛的应用领域:Java在各个领域都有广泛的应用,包括企业应用、Web开发、移动开发、大数据、云计算等。许多知名的企业和项目都选择Java作为主要的开发语言,如Google的Android操作系统、Amazon的AWS云计算平台等。
庞大的开发社区和丰富的资源:Java拥有庞大的开发者社区和丰富的资源支持,如开源项目、教程、书籍、论坛等。这些资源为Java的学习和使用提供了极大的便利,使得Java成为易于学习和掌握的语言。
持续更新与演进:Java语言本身也在不断地更新和演进,以适应不断变化的市场需求。新的Java版本会引入新的特性和改进,以提高语言的表达能力和开发效率。例如,Java 8引入了Lambda表达式和函数式接口等特性,极大地提高了代码的简洁性和可读性。
总的来说,Java以其独特的优势在软件开发领域具有举足轻重的地位。无论是初学者还是经验丰富的开发者,Java都是一个值得学习和掌握的重要编程语言。
二:对于这两次PTA的理解
这两次的pta的难度都很大,导致了许多人所得的分十分不理想,特别是最后一次的pta作业,那更是难上加难,许多之前分一直很高的同学也在这里绊倒了,就比如我的一个室友,在之前的陪pta一直都是满的,但是也栽在最后一次上了,但是我们老师说过,坚持到这里就已经很不错了,就已经成功了
第七次PTA
设计与分析
以下是类的分析
Device类:(抽象类)
ElectricalAppliance类:(抽象类)
Control类:(抽象类)
Switch类:
Fan类:
IncandescentLamp类:
FluorescentLamp类:
BinningGovernor类:
ContinuousGovernor类:
Mian类。
分析:
其中ElectricalAppliance类和Control类是Device类的子类;
Switch类、BinningGovernor类和ContinuousGovernor类是Control类的子类;
最后FluorescentLamp类、IncandescentLamp类和Fan类是ElectricalAppliance类的子类。
PowerDesigner输出例如:
接下来的是SourceMonitor的测试结果:
思路分析:
定义设备类:
电路设备类:包含所有电路设备的公共特征,如电阻、电流、电压等属性。
受控设备类:包含受控设备的特性和行为,如灯、风扇等。
控制设备类:包含控制设备的特性和行为,如开关、调速器等。
实现设备类的方法:
为每个设备实现计算电压、电流、电阻等的方法。
为受控设备实现根据电压计算亮度或转速的方法。
为控制设备实现切换状态或调节档位的方法。
设计电路结构:
串联电路类:表示电路中元件的串联关系,包括计算整个电路的电压、电流等。
并联电路类:表示电路中元件的并联关系,包括计算各个分支的电压、电流等。
实现电路结构:
使用类的方法来计算并返回电路的各个参数。
确保电路的输入输出符合题目的要求。
输入输出设计:
设计输入信息的格式,如设备标识符、编号、引脚编号等。
设计输出信息的格式,如设备标识、编号、状态或参数值等。
异常处理:
确保系统能够处理非法输入,如错误的设备标识符、不合理的连接信息等。
避免系统因短路等异常情况而损坏。
测试:
开发测试用例,确保系统能够正确地处理各种输入,并输出正确的结果。
进行边界测试、异常测试等,确保系统的鲁棒性。
踩坑心得
1.电路模拟过程中可能会出现小数,如果处理不当,可能会导致模拟精度问题。
2.用户输入的电路连接信息可能存在错误,如引脚接错、设备型号错误等。
3.并联电路中包含串联电路,或者多个并联电路相互包含,会增加电路分析的复杂性。
4.电路模拟系统的正确性需要通过广泛的测试来验证,测试用例的设计和执行非常重要。
改进建议
1.使用合适的数据类型(如double)进行计算,并在输出时按照规定的截尾规则处理小数部分,确保模拟的准确性。
2.设计输入验证机制,确保输入的信息符合格式要求和物理规律,如检查电源和地线的连接是否正确。
3.在进行智能家居强电电路模拟系统的设计和开发时,持续的学习和实践是非常重要的。面对挑战,要保持耐心和毅力,不断探索和尝试新的解决方案。同时,团队成员之间的沟通和合作也是成功的关键。
第八次PTA
设计与分析
所建类分析:
Device类:(抽象类)
ElectricalAppliance类:(抽象类)
Control类:(抽象类)
Switch类:
Fan类:
IncandescentLamp类:
FluorescentLamp类:
BinningGovernor类:
ContinuousGovernor类:
FloorFan类:
Concatenation类:
点击查看代码
class Concatenation {//串联
private ArrayList<ParallelConnection> parallelConnection ;
private ArrayList<String> device = new ArrayList<>();
public Concatenation() {
}
public Concatenation(ArrayList<ParallelConnection> parallelConnection, ArrayList<String> device) {
this.parallelConnection = parallelConnection;
this.device = device;
}
public ArrayList<String> getDevice() {
return device;
}
public void setDevice(ArrayList<String> device) {
this.device = device;
}
public void setParallelConnection(ArrayList<ParallelConnection> parallelConnection) {
this.parallelConnection = parallelConnection;
}
public ArrayList<ParallelConnection> getParallelConnection() {
return parallelConnection;
}
public double totalResistance(ArrayList<String> aSwitches,int[] num) {
double resistance = 0;
for (int i = 0; i < device.size(); i++) {
switch (device.get(i).charAt(0)){
case 'K':resistance = resistance + 0;
break;
case 'B':resistance = resistance + 10;
break;
case 'R':resistance = resistance + 5;
break;
case 'D':resistance = resistance + 20;
break;
case 'A':resistance = resistance + 20;
break;
case 'M':resistance = resistance + ShuntResistance(aSwitches,num);
break;
default:
break;
}
}
return resistance;
}
public double ShuntResistance(ArrayList<String> aSwitches,int[] num){
double resistance = 0, resistance1 = 0;
for (int i = 0; i < parallelConnection.size(); i++) {
resistance += 1/parallelConnection.get(i).totalResistance(aSwitches,num);
}
resistance1 = 1/resistance;
return resistance1;
}
public double TributaryVoltage(ArrayList<String> aSwitches,int[] num){
double voltage = 0;
voltage = 220*(ShuntResistance(aSwitches,num)/totalResistance(aSwitches,num));
return voltage;
}
public double MainVoltage(ArrayList<String> aSwitches,int[] num){
double voltage = 0;
voltage = 220 - TributaryVoltage(aSwitches,num);
return voltage;
}
public void ToPrintln(ArrayList<String> aSwitches,int[] num){
ArrayList<String> device1 = new ArrayList<>();
int i,j,k;
for (i = 0; i < device.size(); i++) {
if(device.get(i).charAt(0) == 'M')
continue;
device1.add(device.get(i));
}
for (j = 0; j < parallelConnection.size(); j++) {
for (k = 0; k < parallelConnection.get(j).getDevice().size(); k++) {
device1.add(parallelConnection.get(j).getDevice().get(k));
}
}
char[] type = {'K','F','L','B','R','D','A'};
for (int l = 0; l < type.length; l++) {
for (int m = 0; m < device1.size(); m++) {
if(device1.get(m).charAt(0) == type[l]){
}
}
}
}
}
ParallelConnection类:
点击查看代码
class ParallelConnection{//并联类
private ArrayList<String> device = new ArrayList<>();
public ParallelConnection() {
}
public ParallelConnection(ArrayList<String> device) {
this.device = device;
}
public ArrayList<String> getDevice() {
return device;
}
public void setDevice(ArrayList<String> device) {
this.device = device;
}
public double totalResistance(ArrayList<String> aSwitches,int[] num) {
ArrayList<Device> devices = new ArrayList<>();
double resistance = 0;
int n = 0;
for (int i = 0; i < device.size(); i++) {
switch (device.get(i).charAt(0)){
case 'K':
n = 0;
Switch aSwitch = new Switch();
for (int j = 0; j < aSwitches.size(); j++) {
if(device.get(i).equals(aSwitches.get(j))){
aSwitch = new Switch(device.get(i),1,2,num[j]);
resistance = resistance + 0;
n = 1;
}
}
if(n == 1){
aSwitch = new Switch(device.get(i),1,2,0);
resistance = resistance + 0;
}
devices.add(aSwitch);
if (aSwitch.changeState() == 0){
n = 2;
}
break;
case 'B': resistance = resistance + 10;
break;
case 'R':resistance = resistance + 5;
break;
case 'D':resistance = resistance + 20;
break;
case 'A':resistance = resistance + 20;
break;
default:
break;
}
if (n == 2) {
resistance = 0;
break;
}
}
return resistance;
}
}
Mian类。
其中ElectricalAppliance类和Control类是Device类的子类;
Switch类、BinningGovernor类和ContinuousGovernor类是Control类的子类;
最后FluorescentLamp类、IncandescentLamp类、Fan类和FloorFan类是ElectricalAppliance类的子类。
Concatenation类和ParallelConnection类是独立出来的单独类,与其他类关联,其电路作用。
PowerDesigner输出例如:
因为一部分的原因,类图看着反而更加简单了,实际上一个会更加复杂才对。
接下来的是SourceMonitor的测试结果:
输入是全部放在Main类中了,代码如下:
点击查看代码
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
ArrayList<String> aSwitches = new ArrayList<>();
ArrayList<String> aSwitch = new ArrayList<>();
ArrayList<String> circuit2 = new ArrayList<>();
ArrayList<ParallelConnection> parallelConnections = new ArrayList<>();
Concatenation concatenation = new Concatenation();
int num1 = 0,num2 = 0;
int n = 0,m = 0;
double gears = 0;
String all = "";
while (true){
all = sc.nextLine();
if(all.equals("end")){
break;
}
if(all.charAt(1) == 'T'){
String circuit1 = "";
String regex = "\\[([^\\]]+)\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(all);
int i = 1;
while (matcher.find()) {
circuit1 += matcher.group(1) + " ";
}
String[] circuit = circuit1.split("IN |-| OUT| ");
circuit[0] = String.valueOf(all.charAt(2));
ArrayList<String> device = new ArrayList<>();
for(int j = 0; j+3< circuit.length; j=j+4){
device.add(circuit[j+3]);
}
if(circuit1.charAt(0) == 'I' ){
ParallelConnection temp = new ParallelConnection();
temp.setDevice(device);
parallelConnections.add(temp);
}
if(circuit1.charAt(0) == 'V'){
concatenation.setDevice(device);
concatenation.setParallelConnection(parallelConnections);
}
}
if(all.charAt(1) == 'M'){
Pattern pattern1 = Pattern.compile("#M1:\\[([\\S]+)\\s+([\\S]+)\\]");
Matcher matcher1 = pattern1.matcher(all);
if (matcher1.find()) {
circuit2.add(matcher1.group(1));
circuit2.add(matcher1.group(2));
}
}
if(all.charAt(1) == 'K'){
String[] switch1 = all.split("#");
aSwitches.add(switch1[1]);
}
if(all.charAt(1) == 'F'){
if(all.charAt(3) == '+'){
num2++;
}
else
num2--;
}
if(all.charAt(1) == 'L'){
String[] lian = all.split("#L|:");
gears = Double.parseDouble(lian[2]);
}
}
int[] numK = new int[aSwitches.size()];
aSwitch.add(aSwitches.get(0));
numK[0] = 1;
for (int i = 0; i < aSwitches.size(); ) {
n = 1;
for (int j = i + 1; j < aSwitches.size(); j++) {
if(aSwitches.get(i).equals(aSwitches.get(j))){
for (int k = 0; k < aSwitch.size(); k++) {
if(aSwitch.get(k).equals(aSwitches.get(j))){
numK[k]++;
n++;
}
}
}
else{
for (int k = 0; k < aSwitch.size(); k++) {
if(!aSwitch.get(k).equals(aSwitches.get(j))){
aSwitch.add(aSwitches.get(j));
numK[k+1] = 1;
break;
}
}
break;
}
}
if(n != 0){
i = i + n;
}
else {
i++;
}
}
concatenation.ToPrintln(aSwitches,numK);
}
思路分析
设备定义和连接:
确保所有设备都被正确地定义,包括它们的属性和连接方式。
注意设备之间的连接顺序和方式,确保串联和并联的关系被正确表示。
对于互斥开关,确保分支引脚的连接关系被正确处理。
输入信息的解析:
准确解析输入的设备信息、连接信息和控制调节信息。
确保输入的信息符合格式要求,如设备标识符、编号的正确性,引脚编号的合理性等。
电路模拟逻辑:
设计正确的电路模拟逻辑,确保电路的电压和电流计算准确无误。
对于调速器,实现正确的档位切换逻辑。
对于灯和风扇等受控设备,根据输入的电压差计算亮度或转速。
电流和电压的限制:
检查电路中的实时电流是否超过设备的最大电流限制。
对于电压,确保不超过220V的限制。
短路检测:
实现短路检测机制,当检测到短路时,输出错误信息并停止电路模拟。
二极管的特性和连接:
确保二极管的正向导通和反向截止特性被正确模拟。
注意二极管的连接方式,确保其两端电压的计算正确。
输出信息的格式:
确保输出信息格式符合要求,如设备状态和参数的显示,以及引脚电压的输出。
测试和验证:
设计全面的测试用例,包括正常情况、边界情况和异常情况。
验证电路模拟结果的正确性,确保输出信息与预期一致。
错误处理和提示:
当发生错误时,如短路、电流超过限制等,应给出明确的错误提示。
踩坑心得
1.短路可能导致电路模拟程序崩溃或设备损坏,设备的输入输出可能连接错误,导致电路模拟不准确,二极管的正向导通和反向截止特性需要正确模拟。
2.电器在工作时,过大的电流会引起电器过热,从而烧坏电路,
3.电路模拟的正确性需要通过测试来验证。
改进建议
1.短路检测是保障电路安全的重要措施,不可忽视,在模拟电路时,输入输出的连接是非常关键的,必须仔细核对,处理复杂电路结构时,清晰的逻辑和适当的抽象是非常重要的,电流限制不仅是为了安全,也是为了保护设备的正常工作。
2.在进行智能家居强电电路模拟时,需要有扎实的电子电路基础,对各种电子元件的工作原理和特性有深入的了解。同时,良好的编程习惯和清晰的逻辑思维也是必不可少的。在设计过程中,要不断地调试和优化,以确保电路模拟的准确性和稳定性。
总结
1.设计一个智能家居强电电路模拟系统是一个复杂的工程,涉及到的知识点包括但不限于电子电路原理、编程语言、数据结构、算法等
2.pta题集的难度是有目共睹的,不能像第一次一样按照自己的想法随便编写,需要严格按照要求来,有自己的想法固然是好事,但一定是要在要求下才可以,用得好是锦上添花,否则就变成了不按照规则办事,适得其反,一定要循规蹈矩的一步一步的往前走。
3.如果以后有机会遇见迭代的题时,一定要一步一步走踏实了,建好基础才可以在后面的题目中走的更远,爬的更高。
4.理论上来说一道题类建的越多就应该越简单,但是还是要根据题目来建立,不管任何盲目的建立只会使代码更加混乱。
5.类一定要履行单一职责原则这样会使代码更加清晰明了,不至于将自己写昏。