PTA实验1~3分析及总结

Posted LiuLile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA实验1~3分析及总结相关的知识,希望对你有一定的参考价值。

1.前言

         这是第一次作业总结,经过一段时间对Java的学习,我们已经完成了三次pta作业。题目也是由易到难,由浅入深。第一次OOP作业主要考察的是我们的基本语法和对Java基本的理解。第二次作业难度上升,主要考察我们对题目的理解和基础知识的掌握。第三次作业难度大幅提升,考察我们对类的掌握与理解,更加训练我们在更为复杂的情况下多个语法的嵌套与综合运用,所以三次作业之间的关系可以说是基础与提升,是循序渐进的关系。第三次作业的第四题才开始真正考考验我们的编程能力。

2.设计与分析

第一次oop训练:


7-8 从一个字符串中移除包含在另一个字符串中的字符

     设计
将两行输入存入字符数组,将第一行的字符数组一个个与第二行的比较,如果都不相同,则追加到新的字符序列上。
    分析
那么就要用到StringBuffer类中的append()方法,在用toSring()转换成字符串输出。

该题目具体代码如下

import java.util.Scanner;
public class Main 
    public static void main(String[] args) 
        Scanner input=new Scanner(System.in);
        String zf1=input.nextLine();
        String zf2=input.nextLine();
        String[] array=zf1.split("");
        StringBuffer a=new StringBuffer();
        for (int i=0;i<array.length;i++)
            if (!zf2.contains(array[i]))
                a.append(array[i]);
            
        
        System.out.println(a.toString());
    

以下是生成的报表

 

 

 

 

第二次oop训练:

7-3房产税费计算

 

这题需要用到if语句来判断契税的具体情况

其中我们有四个数据需要处理

        double n=input.nextDouble();//第几次购房
        double hm=input.nextDouble();//房款
        double assess=input.nextDouble();//评估价
        double s=input.nextDouble();//房屋面积

通过if语句的使用加上题目大意的理解很容易能够解决

以下便是具体代码的实现

import java.util.Scanner;
public class Main
    public static void main(String[] args)
        Scanner input = new Scanner(System.in);
        float a=0;
        float b;
        float c;
        float d;
  int number=input.nextInt();
  int money=input.nextInt();
  int meature=input.nextInt();
  float size=input.nextFloat();
  if(size>144||number>1) 
      a=meature*300; 
  
  else if(size<=144&&size>90) 
          a=meature*150;
      
  else if((size<=90)&&number<=1) 
      a=meature*100;
  
  b=money*5;
  c=size*3;
  d=size*136/100;
  System.out.println(a+" "+b+" "+c+" "+d);
    

 

7-8判断三角形的类型

 

 这一题比较考验我们新手的理解和分析能力,不过要注意判断三角形是否是直角三角形时要注意

将输入的三条边先进行合法判断,再进行各种三角型的逻辑判断

分析三角形类型判断就要运用好勾股定理,并且有的三角形有着包含关系,就像等腰直角三角型包含在等腰三角型中,要合理的减少代码量,做到简洁,可读。

if((a*a+b*b-c*c<0.00001)||(a*a+c*c-b*b<0.00001)||(b*b+c*c-a*a<0.00001)我们要通过判断两边平方约等于第三边平方,而不是直接判断他们两个相等因为两个doudle经行计算会有很多误差

代码如下

import java.util.Scanner;
public class Main 
    public static void main(String[] args) 
        Scanner input=new Scanner(System.in);
        double a=input.nextDouble();
        double b=input.nextDouble();
        double c=input.nextDouble();
        if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200)
        
           if(a+b>c&&a+c>b&&b+c>a)
            
                if(a==b&&b==c&&b==c)
                    System.out.println("Equilateral triangle");
                else
                
                    if((a==b)||(b==c)||(a==c))
                    
                        if((a*a+b*b-c*c<0.00001)||(a*a+c*c-b*b<0.00001)||(b*b+c*c-a*a<0.00001))
                            System.out.println("Isosceles right-angled triangle");
                        else
                            System.out.println("Isosceles triangle");
                    
                    else
                    
                        if((a*a+b*b-c*c<=0.00001)||(a*a+c*c-b*b<=0.00001)||(b*b+c*c-a*a<=0.00001))
                            System.out.println("Right-angled triangle");
                        else
                            System.out.println("General triangle");
                    
                
            
            else
                System.out.println("Not a triangle");
        
        else
            System.out.println("Wrong Format");
    

生成的报表如下

 

 

 

 

第三次oop训练:题目到这一次就开始难起来了

7-3定义日期类

 

 

首先我们要学会看图,并且知道如何创建一个类

class Date
private int year,month,day;
int [] mon_maxnum=0,31,28,31,30,31,30,31,31,30,31,30,31;
public void Date(int year,int month,int day)
this.year=year;//定义年
this.day=day;//定义月
this.month=month;//定义日

这一题首先我们要输入年月日,主要的就是判断是否是闰年并且运用数组来表示月份会更加简单

具体实现的代码如下

import java.util.*;
class Date
    private int year = 0;
    private int month = 0;
    private int day = 0;
    int[] mon_maxnum=new int[] 0,31,29,31,30,31,30,31,31,30,31,30,31;
 public Date(int year,int month,int day) 
     this.year=year;
     this.month=month;
     this.day =day;

 
 public int getYear() 
     return year;
 
 public void setYear(int year) 
     this.year = year;
 
 public int getMonth() 
     return month;
 
public void setMonth(int month) 
    this.month = month;

public int getDay() 
    return day;

public void setDay(int day) 
    this.day = day;

public boolean isLeapYear(int year) 
    boolean isLeapYear;
    isLeapYear=((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0);
    return isLeapYear;

public boolean checkInputValidity(int year,int month,int day) 
     boolean checkInputValidity;
     int[] a=new int[]0,31,29,31,30,31,30,31,31,30,31,30,31;
     if(!isLeapYear(year))
         a[2] = 28;
     checkInputValidity = (year>=1900&&year<=2000&&month>0&&month<=12&&day<=a[month]&&day>=1);
     return checkInputValidity;

public void getNextDate(int year,int month,int day) 
    int[] a=new int[]0,31,29,31,30,31,30,31,31,30,31,30,31;
    int d=0,m=0;
    if(!isLeapYear(year))
        a[2] = 28;
    if(checkInputValidity( year, month, day)) 
        if(month==12) 
            if(day==a[month]) 
                year = year+1;
                m = 1;
                d=1;
            
            else
                m=month;
                d =day +1;
            
        
        else 
            if(day==a[month]) 
                m = month + 1;
                d = 1;
            
            else
                m=month;
                d = day+1;
            
        
        System.out.println("Next day is:"+year+"-"+m+"-"+d);
    
         else 
        System.out.println("Date Format is Wrong");
    


    public class Main
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        int year= input.nextInt();
        int month= input.nextInt();
        int day= input.nextInt();
        Date date = new Date(year, month, day);
        date.getNextDate(year, month, day);
    

这题主要考察我们根据类图来编写类,以为第一次接触类,所以题目不难,但是要注意的是代码的可读性和可持续性,为我们写下一题打基础的

 

 

7-4日期类设计

接下来便是我们这三次作业的重头戏

 

 下面是本题目的类图

 

 这题其实是对上一题的代码进行扩写,同样的类进行扩写,解决不同的问题,这题有三种情况:
第一种:输出输入日期的下n天
第二种:输出输入日期的前n天
第三种:输出两个日期之间相差的天数
这三种题目的解题思路都差不多,唯一需要注意的就是闰年的二月是29天,具体思路就是将n天与365天比较,再与各个月的天数比较,这样可以减小时间复杂度。

主要是要理清楚之间的关系

以下便是具体代码

import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        int year = 0;//定义年
        int month = 0;//定义月
        int day = 0;//定义日

        int choice = input.nextInt();//输入选择:1.求下n天  2.求前n天  3.求两个日期相差的天数
if (choice == 1)  // test getNextNDays method
            int m = 0;//定义要求接下来几天
            year = Integer.parseInt(input.next());//得到年
            month = Integer.parseInt(input.next());//得到月
            day = Integer.parseInt(input.next());//得到日

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) //如果判断为非法日期的话
                System.out.println("Wrong Format");//输出
                System.exit(0);
            

            m = input.nextInt();//输入要求接下来几天

            if (m < 0) //m的范围
                System.out.println("Wrong Format");
                System.exit(0);
            

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");//输出
            System.out.println(date.getNextNDays(m).showDate());
         else if (choice == 2)  // test getPreviousNDays method
            int n = 0;//输入要求之前几天,接下来代码和上面基本相同,不再赘述。
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            n = input.nextInt();

            if (n < 0) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
         else if (choice == 3)     //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());//输入要求的第二年的各项数据
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);//开始年份
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);//结束年份

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) //判断两个年份的输入是否合法
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
             else 
                System.out.println("Wrong Format");
                System.exit(0);
            
        
        else
            System.out.println("Wrong Format");
            System.exit(0);
                
    

有的部分运行会超时,还有很多地方可以改进

这一题用到了上一题所写的代码,当时不能直接使用,所以代码写的没有很严谨,换了个环境可能就不能用了,所以可以在其中常用的方法中将其改的更严谨,更易修改,遵循单一原则,每个方法只做一件事,显然这题写的代码并没有全部遵循,但可以改进,让代码呈现高内聚,低耦合。

3.踩坑心得

有很多地方我们要在意细节

 

4.改进建议

 

 

5.总结

以上是关于PTA实验1~3分析及总结的主要内容,如果未能解决你的问题,请参考以下文章

二.PTA函数实验

一,pta循环实验

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

网络1712--c语言一二维数组作业总结

C语言顺序结构和分支结构总结

博客作业04--树