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分析及总结的主要内容,如果未能解决你的问题,请参考以下文章