PTA作业第三阶段总结
一、第三作阶段作业总结
1、作业目的总结。
到了学期后期了,这三次作业的主要侧重点就是让我们自主设计类图,了解类设计的基本方法,让我们自己掌握类的基本设计,能够自己设计并完成类的设计,并且对于之前的所学的内容融合到自己的类设计中,加深对于类的设计的基本原则的一些理解,能够在自己的类设计中运用这些类设计思想。
2、作业基础概况
这三次作业题目分别为雨刷程序功能扩展设计、统计Java程序中关键词的出现次数 、表达式求值,这三次作业难度系数都不是很难,得分情况分别为100、90、100,类图的设计也不是很难,复杂点就是第一题的类图设计,开始并未想到辅助类的设计,经过老师课堂上的讲解才有了辅助类的设计,其他两次作业的类图设计,就比较简单了,基本上都是一个类调用另外一个类的形式,之所以第二次作业得分低于第一三次作业,是因为第二次作业的时间复杂度太高了,运行时间太长了。
3、作业中遇到问题
在这三次作业遇到的问题:第一次作业遇到的问题就是在辅助类中调用的几个子类,这几个子类无法进行修改,只能继承父类,需要重新编译一个父类,然后在用原来的类继承这个父类,代码见附录,第二次作业的问题就在于如何统计每一行代码字符中自带的关键字,例如munint这种标识符中的关键字,如何将这种关键字排除在外,开始就是自己的字符串分离出现问题了,所以导致统计关键子的数量出问题了,修改后的方法代码如下:
public int keywordtime(String str,int num)
{
int time=0;
String []first=list.get(num).replaceAll("=", "").replaceAll("\\W+", " ").trim().split(" +");
for(int i=0;i<first.length;i++)
{
if(first[i].equals(str))
time++;
}
return time;
}
修改之后的代码能够正常处理关键字,并且统计关键字的数量。第三次作业内容是表达式计算,在排除特殊情况下无法输出正常的数据,起初发现自己的代码没有保留两位小数,排除了这个错误之后,发现自己的算式计算方法在没有括号的算式时,是按照从右往左计算,这就导致出现问题了,在排除这个问题之后,就能够正常通过全部的测试点了,算式计算的方法如下:
public double dealvali()
{
Stack<Double> opon=new Stack<Double>();
Stack<Character> stack=new Stack<Character>();
int i=0;
replace();
while(i<this.dealstr.length())
{
switch(this.dealstr.charAt(i))
{
case '+':if(stack.empty())
stack.push(dealstr.charAt(i));
else
{
if(stack.peek()=='*'||stack.peek()=='/'||stack.peek()=='+'||stack.peek()=='-')
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
if(!stack.isEmpty()) {
while(stack.peek()=='+'||stack.peek()=='-'){
a=(double)opon.pop();
b=(double)opon.pop();
result=calculation(a,b,(char)stack.pop());
opon.push(result);
if(stack.isEmpty())
break;
}
}
stack.push(dealstr.charAt(i));
}
else
{
stack.push(dealstr.charAt(i));
}
}
i++;
break;
case '-':if(stack.empty())
stack.push(dealstr.charAt(i));
else
{
if(stack.peek()=='*'||stack.peek()=='/'||stack.peek()=='+'||stack.peek()=='-')
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
if(!stack.isEmpty()) {
while(stack.peek()=='+'||stack.peek()=='-'){
a=(double)opon.pop();
b=(double)opon.pop();
result=calculation(a,b,(char)stack.pop());
opon.push(result);
if(stack.isEmpty())
break;
}
}
stack.push(dealstr.charAt(i));
}
else
{
stack.push(dealstr.charAt(i));
}
}
i++;
break;
case '*':if(stack.empty())
stack.push(dealstr.charAt(i));
else
{
if(stack.peek()=='*'||stack.peek()=='/')
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
stack.push(dealstr.charAt(i));
}
else
stack.push(dealstr.charAt(i));
}
i++;
break;
case '/':if(stack.empty())
stack.push(dealstr.charAt(i));
else
{
if(stack.peek()=='*'||stack.peek()=='/')
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
stack.push(dealstr.charAt(i));
}
else
stack.push(dealstr.charAt(i));
}
i++;
break;
case '(':stack.push(dealstr.charAt(i));
i++;break;
case ')':while(stack.peek()!='(')
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
if(stack.peek()=='(')
break;
}
stack.pop();
i++;break;
default:String num=new String();
while(this.dealstr.charAt(i)<='9'&&this.dealstr.charAt(i)>='0')
{
char[]a=new char[1];
a[0]=this.dealstr.charAt(i);
String s=new String(a);
num=num+s;
i++;
if(i>=this.dealstr.length())
break;
}
opon.push(Double.parseDouble(num));
}
if(stack.empty()&&i>=this.dealstr.length())
break;
}
while(!stack.empty())
{
double a=(double)opon.pop();
double b=(double)opon.pop();
double result=calculation(a,b,(char)stack.pop());
opon.push(result);
}
return (double)opon.peek();
}
但是这个代码仍然存在一些问题就是这段代码太长了,并没有实现单一原则的设计原则,后面需要继续修改。
4、PTA第三阶段学习总结:
这三次作业总的来说,是对于我们之前学习内容的一个测试吧,让我们在后面的设计类时,能够将我们所学到的东西将其融入到自己设计的类中,尽量的将自己的类进行完善;对于我自己而言,学到最多不是对于学习内容的回顾和总结,而是对于编写代码方面的心得,在我们编写完代码进行测试时,要多考虑一些特殊情况,另外就是不能拘泥于之前已经测试过的测试点,要不断的全方面的考虑,并且在自己设计算法时,要尽量将时间复杂度和空间复杂度考虑进去,在很多程序员编写代码的过程中很容易被忽略,但是这两个复杂度却是极其重要的。
二、界面和窗口的编译总结
在学完了Java基础内容后,我们有接触了一些很有趣的东西,就是界面和窗口的编程,在我们学习界面和窗口编程时,要特别注意的是理解下面这幅图:

在这里需要说明一下的是,我们学习的是JAVAFX进行界面编程,主要原因就是因为这对于初学者来说比较容易理解,并且更容易使用,而且JavaFX能够更好地展示,能够很好用于桌面计算机、手持设备上开发跨平台的GUI应用;不过在使用JavaFX进行窗口编程时需要先进行JavaFX的一些相关设置,这些设置都可以在百度上找到,并进行一步一步的操作,所以在此我就不多说了;接下来我就简单地说一下上面那幅图的内容,上面这幅图包含了以下几个内容:Stage、Scene、Node、Control、以及Pane的关系,学过了类图的同学可以轻松地看懂,所以在这里我就不多说了,我要说的几个注意地方就是:一、Scene可以包含Node、Control、Pane,但是不能包含Shpae或者ImageView,Pane和Group可以包含Node的任何子类型,二可以使用构造方法Scene(Parent、width、height)或者Scene(Parent)来创建Scene,在第二个构造方法中,场景的尺寸将自动确定。
下面附上一段代码(初学者可以去尝试一下)
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.scene.input.MouseEvent; import javafx.stage.Stage; public class shiyan5 extends Application{ public static void main(String[] args) { // TODO Auto-generated method stub Application.launch(args); } @Override public void start(Stage s) throws Exception { // TODO Auto-generated method stub Pane pane=new Pane(); pane.setOnMouseClicked( e->{ double x=e.getX(); double y=e.getY(); int i=(int)(1+Math.random()*(3-1+1)); switch(i) { case 1: int j=(int)(1+Math.random()*(3-1+1)); Line line = new Line(); line.setStartX(x); line.setStartY(y); line.setEndX(x+10); line.setEndY(y); if(j==1) line.setStroke(Color.RED); if(j==2) line.setStroke(Color.GREEN); if(j==3) line.setStroke(Color.BLUE); line.setFill(Color.WHITE); pane.getChildren().add(line); break; case 2: int k=(int)(1+Math.random()*(3-1+1)); Rectangle r=new Rectangle(x+5,y+5,10,10); if(k==1) r.setStroke(Color.RED); if(k==2) r.setStroke(Color.GREEN); if(k==3) r.setStroke(Color.BLUE); r.setFill(Color.WHITE); pane.getChildren().add(r); break; case 3: int l=(int)(1+Math.random()*(3-1+1)); Circle c=new Circle(x,y,10); if(l==1) c.setStroke(Color.RED); if(l==2) c.setStroke(Color.GREEN); if(l==3) c.setStroke(Color.BLUE); c.setFill(Color.WHITE); pane.getChildren().add(c); break; } }); Scene scene=new Scene(pane,300,300); s.setTitle("MouseEvent"); s.setScene(scene); s.show(); } }
这是一个绘图窗口。
三、本学期学习Java总结:
本学期我接触到了一个全新的编译环境,接触到了类,了解了类的一些基本特性,比如说封装、继承、多态、接口与抽象类的区别;也了解了类设计的原则:
1.开闭原则(Open Close Principle)
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
2.里氏代换原则(Liskov Substitution Principle)
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义2:子类型必须能够替换掉它们的父类型。
3、依赖倒转原则
4、接口隔离原则
5、组合/聚合复用原则
6、迪米特法则
7.单一职责原则
我自己也能进行一些基础的类设计,进行简单的窗口编写,而且我也能清楚的感觉到Java与C语言的不同,面向过程与面向对象的不同:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为;总的来说这学期学习到的内容,给了我们一个崭新的世界,提供给我们一个新的方向,但是我们对于这个的Java这个世界的探索还是不够,它一直在变化,我们也需要一直去探索,最后我要感谢老师的教导。
四、附录:
import java.math.BigDecimal;//表达式计算 import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.Scanner; class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); String str =input.nextLine(); String s=str; CheckString check=new CheckString(str);//!check.checkIllegal_Character() if(str==""||str.trim().length()==0||!check.checkIllegal_Character()||!check.checkString()||!check.checkIllegalOperator()||!check.checkIllegal()||!check.checkOpertor()||!check.checkContinuous_Operator()) { System.out.println("Wrong Format"); } else { if(!check.checkOpertors()) System.out.println(str+" = NaN"); else { DealOpretor deal=new DealOpretor(str); System.out.println(s+" = "+String.format("%.2f", deal.dealvali())); } } } } class CheckString { private String str; CheckString(String str) { this.str=str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } public boolean checkString() { boolean x=true; int index=str.length()-1; if(str.charAt(0)=='+'||str.charAt(0)=='*'||str.charAt(0)=='/'||str.charAt(0)==')') x=false; if(str.charAt(index)=='+'||str.charAt(index)=='-'||str.charAt(index)=='/'||str.charAt(index)=='*') x=false; return x; } public boolean checkIllegalOperator() { String regex="\\W+"; String []first=str.split(regex); String regex1="[a-zA-Z]"; boolean x=true; for(String a:first) { if(a.trim().matches(regex1)) { x=false; break; } } return x; } public boolean checkIllegal() { boolean x=true; int i=0; int j=0; String m=str; String n=str; int size=m.indexOf("("); int size1=n.indexOf(")"); while(m!=""||n!="") { if(size!=-1) i++; if(size1!=-1) j++; m=m.substring(size+1); n=n.substring(size1+1); size=m.indexOf("("); size1=n.indexOf(")"); if(size==-1) m=""; if(size1==-1) n=""; } if(i!=j) x=false; return x; } public boolean checkOpertor() { boolean x=true; if(str.indexOf("()")!=-1) x=false; return x; } public boolean checkContinuous_Operator() { boolean x=true; if(str.indexOf("++")!=-1||str.indexOf("--")!=-1||str.indexOf("**")!=-1||str.indexOf("//")!=-1) x=false; return x; } public boolean checkIllegal_Character() { boolean x=true; String []first=str.trim().split(" "); StringBuilder s=new StringBuilder(); for(String a:first) s.append(a); String regex="[0-9[\\+\\-\\*\\/\\(\\)]]"; int j=0; for(int i=0;i<s.toString().length();i++) { if((s.toString().charAt(i)<=57&&s.toString().charAt(i)>=48)||(s.toString().charAt(i)<=43&&s.toString().charAt(i)>=40)||s.toString().charAt(i)==45||s.toString().charAt(i)==47) j++; } if(j!=s.toString().length()) x=false; return x; } public boolean checkOpertors() { boolean x=true; String []first=str.trim().split(" "); StringBuilder s=new StringBuilder(); for(String a:first) s.append(a); String str1=s.toString(); String regex="/0"; if(str1.indexOf(regex)!=-1) x=false; return x; } } class DealOpretor { private String str; private String dealstr; DealOpretor(String str) { this.str=str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } public String getDealstr() { return dealstr; } public void setDealstr(String dealstr) { this.dealstr = dealstr; } public void removeSpace() { String []first=str.trim().split(" "); StringBuilder s=new StringBuilder(); for(String a:first) s.append(a); this.dealstr=s.toString(); } public void replace() { removeSpace(); if(this.dealstr.charAt(0)=='-') { this.dealstr="0"+this.dealstr; } String regex="(-"; this.dealstr=this.dealstr.replace("(-", "(0-"); } public double dealvali() { Stack<Double> opon=new Stack<Double>(); Stack<Character> stack=new Stack<Character>(); int i=0; replace(); while(i<this.dealstr.length()) { switch(this.dealstr.charAt(i)) { case '+':if(stack.empty()) stack.push(dealstr.charAt(i)); else { if(stack.peek()=='*'||stack.peek()=='/'||stack.peek()=='+'||stack.peek()=='-') { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); if(!stack.isEmpty()) { while(stack.peek()=='+'||stack.peek()=='-'){ a=(double)opon.pop(); b=(double)opon.pop(); result=calculation(a,b,(char)stack.pop()); opon.push(result); if(stack.isEmpty()) break; } } stack.push(dealstr.charAt(i)); } else { stack.push(dealstr.charAt(i)); } } i++; break; case '-':if(stack.empty()) stack.push(dealstr.charAt(i)); else { if(stack.peek()=='*'||stack.peek()=='/'||stack.peek()=='+'||stack.peek()=='-') { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); if(!stack.isEmpty()) { while(stack.peek()=='+'||stack.peek()=='-'){ a=(double)opon.pop(); b=(double)opon.pop(); result=calculation(a,b,(char)stack.pop()); opon.push(result); if(stack.isEmpty()) break; } } stack.push(dealstr.charAt(i)); } else { stack.push(dealstr.charAt(i)); } } i++; break; case '*':if(stack.empty()) stack.push(dealstr.charAt(i)); else { if(stack.peek()=='*'||stack.peek()=='/') { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); stack.push(dealstr.charAt(i)); } else stack.push(dealstr.charAt(i)); } i++; break; case '/':if(stack.empty()) stack.push(dealstr.charAt(i)); else { if(stack.peek()=='*'||stack.peek()=='/') { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); stack.push(dealstr.charAt(i)); } else stack.push(dealstr.charAt(i)); } i++; break; case '(':stack.push(dealstr.charAt(i)); i++;break; case ')':while(stack.peek()!='(') { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); if(stack.peek()=='(') break; } stack.pop(); i++;break; default:String num=new String(); while(this.dealstr.charAt(i)<='9'&&this.dealstr.charAt(i)>='0') { char[]a=new char[1]; a[0]=this.dealstr.charAt(i); String s=new String(a); num=num+s; i++; if(i>=this.dealstr.length()) break; } opon.push(Double.parseDouble(num)); } if(stack.empty()&&i>=this.dealstr.length()) break; } while(!stack.empty()) { double a=(double)opon.pop(); double b=(double)opon.pop(); double result=calculation(a,b,(char)stack.pop()); opon.push(result); } return (double)opon.peek(); } public double calculation(double a,double b,char opretor) { double x=b; double y=a; double result=0; if(opretor=='+') result=x+y; if(opretor=='-') result=x-y; if(opretor=='*') result=x*y; if(opretor=='/') result=x/y; return result; } }

浙公网安备 33010602011771号