PTA题目集总结

                                                                     PTA题目集1-3总结

一:前言

    我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题;题集二有五道题,题量适度,难度也适中;题集三虽然只有三道题,但是难度却骤然提升,前两题还好,尤其是第三题,难度较大。

二:设计与分析

题目集一:  

   7-2:本题为一个将数字与字母转换的题目,他考查了对于数据的输入、字母大小写的转换、if-else语句以及当输入多个连续字符时如何只取第一个字符,在本题中我认为比较关键的在与使用toUpperCase()方法将小写字母转换为大写字母,第二个就是charAt(0),此时0表示为检索字符串中的第一个字符,该方法表示返回指定索引处的值。

letter=letter.toUpperCase();
        char c = letter.charAt(0);

  7-3:本题为一个成绩分级管理题,他考查了switch-case的运用,与C语言类似,需要注意的是case后面break的使用。

  7-5:本题为计算钱币,主要需要注意强制类型转换需要在其前面加上转换的类型,如:

  a = (int)money/10;

  7-6:本题为使用一维数组求平均值,主要考查了java中如何一维数组的使用,如一维数组的声明、创建以及从键盘的输入等。

      int [] number = new int[5];
      int sum=0,average=0;
      for(int i=0;i<number.length;i++) {
          number[i] = in.nextInt();
          sum = sum + number[i];
      }

  7-7:本题为一个排序题,思路其实可以同之前学过的C语言一般使用冒泡,选择等,但在java中我发现直接有函数可以直接使用对其排序即Arrays.sort();方法,使用前先将所有数据存入一个数组中,直接使用该方法即可对数组中的数字进行排序,简洁方便。

int n = in.nextInt();
        int [] number = new int[n];
        int temp;
        for(int i=0;i<n;i++) {
             number[i] = in.nextInt();
        }
          Arrays.sort(number);

           System.out.print("The sorted numbers are:");
           for(int i=0;i<n;i++) {
           System.out.print(number[i]+" ");
      }


  7-8:本题为判断三角形类型,考查的知识有数组,for循环,if-else等。需要考虑的因素有,第一:判断三边输入是否合法;第二:是否能形成三角形(条件为两边之和是否大于最长的一条边,两边之差是否小于最小的那条边);第三:判断三角形的类型。为了能更好的考虑第二和第三个因素,先将三条边存入一个数组,然后对他们进行排序,可以更好的比较三条边的关系,然后使用if-else以及if-else的嵌套进行判断三角形的类型。

    在本题中遇到的问题第一是对各种三角形的情况考虑不够详尽,如在等腰三角形的判断中未考虑到两条短边为等腰边的情况等,第二是在java在判断直角三角形中,对于浮点数的等于判断不能用==来判断,因为计算机表示浮点数都有一个精度限制,对与超出了限制的浮点数计算机会把精度之外的小数部分截掉,所以我们只需要两个浮点数之间的距离小于某个值就可认为他们相等。

import java.util.Arrays;
import java.util.Scanner;
import java.util.*;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Scanner in = new Scanner(System.in);
      double [] length = new double[3];
      for(int i=0;i<3;i++) {
          length[i] = in.nextDouble();
      }
      Arrays.sort(length);
      if(length[2]>200||length[0]<1) {
          System.out.println("Wrong Format");
      }
      else {
          if(length[0]+length[1]<=length[2]||length[2]-length[1]>=length[0]) 
              System.out.println("Not a triangle");
          else if(length[0]==length[1]&&length[1]==length[2])
              System.out.println("Equilateral triangle");
          else if(length[0]==length[1]&&length[0]*length[0]+length[1]*length[1]-length[2]*length[2]<0.000001)
              System.out.println("Isosceles right-angled triangle");
          else if(length[0]==length[1]||length[1]==length[2])
              System.out.println("Isosceles triangle");
          else if(length[0]*length[0]+length[1]*length[1]-length[2]*length[2]<0.000001)
              System.out.println("Right-angled triangle");
          else
              System.out.println("General triangle");
          
      }
      
    }

}

 

题目集二:

   7-1:本题为IP地址转换,将二进制转换为十进制,主要考查的是对字符串和数组的使用,以及两个方法substring(),Integer.parseInt()等。开始我把他看成了数字来处理后来发现比较麻烦于是改成当做字符串来处理,先判断是否合法,其中使用了for循环和charAt()方法进行判断,后面使用for循环和substring()方法将字符串截成四个八位的字符串然后再使用Integer.parseInt()将其转换为十进制。以下为将二进制转换为十进制的关键代码:

for(int i=0;i<4;i++) {
        b =num.substring(i*8,i*8+8);
        a=Integer.parseInt(b,2);
        System.out.print(a);
        if(i!=3)
            System.out.print(".");
    }

  7-4:本题是要求下一天,该题要考虑的因素较多,首先考虑是否为闰年,然后判断年月日是否合法,如果年份的不在取值范围[1820,2020] ,月份不在取值范围[1,12] ,日期不在取值范围[1,31] 即为不合法,二月份较为特殊,我们需要单独考虑,闰年二月份只有28天,平年二月份有29天,接着就是考虑剩下的月份,因为剩下只有两种情况30天和31天,因此将月份为30天的存入一个数组,月份为31天的存入另一个数组,这样我们只需要用for循环即可判断输入月份的日期是否正确;

public static boolean checkInputValidity(int year, int month, int day) {
        if (year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > 31) {
            return false;
        }
        if (isLeapYear(year)) {
            if (month == 2) {
                if (day > 29)
                    return false;
            }

        } else {
            if (month == 2) {
                if (day > 28)
                    return false;
            }
        }
        int[] a = { 1, 3, 5, 7, 8, 10, 12 };
        for (int i = 0; i < a.length; i++) {
            if (month == a[i]) {
                if (day > 31)
                    return false;
            }
        }
        int[] b = { 4, 6, 9, 11 };
        for (int j = 0; j < b.length; j++) {
            if (month == b[j]) {
                if (day > 30)
                    return false;
            }
        }
        return true;
    }

    接着就是对下一天的计算,我们需要单独考虑十二月份和闰年,平年的二月份的月末,十二月份下一天年份改变,闰年平年的二月月末分别为28,29,其他月份主要考虑到月末情况时有更多变量即可,主要使用的就是if-else以及for循环。因为我的在跨月份的计算中我直接令日期为1,因此在1,3,5,7,8,10月份判断为月末时应将日期改为0,这样在他们进入到另一个月份时日期才会是1。

public static void nextDate(int year,int month,int day){
         
         int []a= {1,3,5,7,8,10};
         int []b= {4,6,9,11};
         if( isLeapYear(year)) {
                if(month==2) {
                    if(day==29){
                        month++;
                     day=1;
                 }
                 else{
                     day++;
                 }
                }
                
             }
            else {
                if(month==2) {
                    if(day==28){
                        month++;
                        day=0;
                 }
                 else{
                     day++;
                 }
                }
            }
         for(int i=0;i<a.length;i++) {
           if(month==a[i]) {
               if(day==31){
                   month++;
                   day=0;
               }
               else{
                   day++;
               }
           }
       }
         for(int j=0;j<b.length;j++) {
             if(month==b[j]) {
                 if(day==30){
                     month++;
                   day=1;
                 }
                 else{
                     day++;
                 }
             }
         }
         
         if(month==12){
             if(day==31){
                 year++;
                 month=1;
                 day=1;
         }
             else{
                 day++;
             }
     }
         System.out.println("Next date is" + ":" + year + "-" + month + "-" + day);
    }
    

    7-5:本题为求前N天,该题与7-4相似,但是本题需要考虑的情况比前一题要更多,第一:N可能为正数也可能为负数;第二:他前N天可能会到钱一个月也有可能到后一个月;第三:在十二月时,他可能会到下一年,在一月时可能会到上一年,这时需要考虑新的年份是否在合法范围内;第四:闰年,平年的二月份需要另外考虑,所以当月份为三月份时且前N天到了二月份时需要另外考虑;其他的月份按照一般的思路,然后使用if-else进行判断即可。

public static void nextDates(int year,int month,int day,int n) {
        
        if(day-n<0) {
            if(month==1) 
              System.out.println(n+" days ago is:"+(year-1)+"-"+12+"-"+(31+(day-n)));
            else if(month==3&&isLeapYear(year))
              System.out.println(n+" days ago is:"+year+"-"+2+"-"+(29+(day-n)));
            else if(month==3&&!isLeapYear(year))
                System.out.println(n+" days ago is:"+year+"-"+2+"-"+(28+(day-n)));
            else if(month==2||month==4||month==6||month==8||month==9||month==11)
              System.out.println(n+" days ago is:"+year+"-"+(month-1)+"-"+(31+(day-n)));
            else 
              System.out.println(n+" days ago is:"+year+"-"+(month-1)+"-"+(30+(day-n)));
        }
        else {
            if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
                if(day-n<=31) {
                    System.out.println(n+" days ago is:"+year+"-"+month+"-"+(day-n));
                }
                else {
                        month++;
                        if(month>12) {month=1;year++;day=day-n-31;}
                        System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
                    }
             }
            else if(month==4||month==6||month==9||month==11) {
                if(day-n<=30) {
                    System.out.println(n+" days ago is:"+year+"-"+month+"-"+(day-n));
                }
            }
            else if(month==1||month==3||month==5||month==7||month==8||month==10) {
                if(day-n>31) {
                    System.out.println(n+" days ago is:"+year+"-"+(month+1)+"-"+((day-n)-31));
                }
             }
            else if(month==4||month==6||month==9||month==11) {
                if(day-n>30) {
                    System.out.println(n+" days ago is:"+year+"-"+(month+1)+"-"+((day-n)-30));
                }
            }
            
            else if(month==2&&isLeapYear(year)&&(day-n)<29)
                System.out.println(n+" days ago is:"+year+"-"+2+"-"+(day-n));
            else if(month==2&&isLeapYear(year)&&(day-n)>29)
                System.out.println(n+" days ago is:"+year+"-"+3+"-"+((day-n)-29));
            else if(month==2&&!isLeapYear(year)&&(day-n)<28)
                System.out.println(n+" days ago is:"+year+"-"+2+"-"+(day-n));
            else if(month==2&&!isLeapYear(year)&&(day-n)>28)
                System.out.println(n+" days ago is:"+year+"-"+3+"-"+((day-n)-28));
            
            
    }
 }

 

题目集三:

    7-2:本题为定义一个日期类Date。本题主要是锻炼我们如何写类,我们要先定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),然后使用他的构造方法,无参构造和有参构造,以及私有属性的获取和修改,再在类中定义计算日期的方法,同题目集7-4,7-5类似。在写这个类时,我没有将属性定义为私有属性,这样可能会导致有些属性被改动,所以这是不太好的。

class Date{
    int year;
    int month;
    int day;
    int [] mon_maxnum1 =  {0,31,29,31,30,31,30,31,31,30,31,30,31};
    int [] mon_maxnum2 =  {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    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;
    }
    
    Date(){
        
    }
    public Date(int year, int month, int day) {
        super();
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

而我们在主函数中需要创建对象才能对类中对象和方法进行调用,同时在对方法的调用时需要使用.操作符。

Date a= new Date();

if(a.checkInputValidity(year,month,day)) {

  a.getNextDate(year,month,day);
  }
 else
  System.out.println("Date Format is Wrong");
  }

   7-3:本题为一元多项式求导,主要要求我们会使用正则表达式,以及如何求导,因未接触过该类题型需提前自学。首先考虑表达式是否合法:第一:考虑为常数项的情况;第二:只有指数时;第三:只有系数时;第四:指数,系数都含有时,使用正则表达式进行判断。最后求导。

 

三:踩坑心得

    在这三个题集,感觉我老是存在的问题是对考虑问题的不够全面,代码排版有的不是很好,还有简单的语法问题,以及对于数组的灵活运用不够好,使得代码特别长和复杂,对于类的使用不太熟系。

四:改进建议

    在类中尽量使用私有属性,这样的话可以防止外面的程序随意修改一个类的成员变量,不然可能会造成不可预料的程序错误;

    在数组中尽量使用length,这样可以对程序员对后续对代码的修改更方便,也可以减少错误。

五:总结

    1:学习到了java的基本使用,如从键盘输入和输出,创建数组等;

    2:学习到了java的许多新函数,如toUpperCase() ,charAt(),Arrays.sort(),substring(),Integer.parseInt()等;

    3:学习到了类,对象,数据域,构造方法等,以及public,private等不同属性,还有this的使用;

    4:对类,对象还不太熟悉,有一些概念等了解不够透彻,上手较慢,还需要多看书,多做题并对自己所做过的题目多加总结和思考;

    5:正则表达式还没有掌握如何正确且灵活的使用,需要继续学习。

posted @ 2021-04-04 21:49  度阡  阅读(594)  评论(0)    收藏  举报