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;
    }
}

 

posted @ 2020-06-07 17:22  狩魔军团  阅读(248)  评论(0)    收藏  举报