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.踩坑心得
有很多地方我们要在意细节,java刚开始学习的时候有很多语法错误,毕竟是一门语言,有很多新入门的人需要注意的东西,比如命名不够规范,不要思想封闭,有问题可以多求助别人
人多力量大,我之前一个人搞代码,花了大把时间,最后没什么收获,效率极其低下。
4.改进建议
有很多命名和格式的地方可以用来改进,不是所有的东西老师都会教,java是一门语言,需要花大量的时间来进行学习,刻苦与用功是必须的。我们需要具有自主学习能力,遇到问题不会要多去询问,在语言学习的过程中不断丰富自我。
5.总结
很高兴我有很多厉害的同学,朋友,老师,路漫漫其修远兮,吾将上下而求索,我还需要更加努力,追上他们的步伐。
浙公网安备 33010602011771号