前三次java作业总结

(1)前言

第一次作业的题目量较多共有12题,题目难度不算特别大,但对于那时刚接触java的我来说还是有些难度的,主要是语法方面不太熟悉。其中主要知识点有字符串和数组以及选择循环结构的运用,在java中不单有char类型还有string类型,做题时需要用到许多string类型的方法。第二次作业的题目量较多共有9题,但题目难度不大。题目大多涉及浮点数运用,需要特别注意格式的问题。第三次作业是难度最大的一次,题目量较少。这次作业才正式进入面向对象的学习,主要知识点是类的定义和使用方法。学习了如何使用类中的属性和方法。

(2)设计与分析

第一次作业

7-5 去掉重复的字符

题目:
输入一个字符串,输出将其中重复出现的字符去掉后的字符串

输入格式:

一行字符串

输出格式:

去掉重复字符后的字符串

输入样式:
在这里给出一组输入。例如:

ofiweirowqrigu

输出样式:

在这里给出相应的输出。例如:

ofiwerqgu

代码展示:

复制代码
packpage study;
import java.util.Scanner;
public class Homework{
        public static void main(String[] args){
            Scanner input = new Scanner(System.in); 
            int i,j=0;
            String s=input.next();
            char[] a = new char[s.length()];
            for(i=0;i<s.length();i++)
                a[i]=s.charAt(i);
            for(i=0;i<s.length();i++){
                for(j=0;j<i;j++){
             if(a[i]==a[j]) break;}
             if(i==j) {
                 System.out.print(a[i]);
            }
             }
        }
}   
复制代码

 

 分析如下:

1.在看到这种删除重复数据的题,第一时间就想到了用数组做,但开始时不知道如何将字符串里的字符存到数组中。

2.在查找之后发现可以用charAt(下标)的方法代表字符串中的字符,于是用for循环将字符存入数组。

 

7-7 有重复数据

题目:

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

输入格式:

你的程序首先会读到一个正整数n,n[1,100000],然后是n个整数。

输出格式:
如果这些整数中存在重复的,就输出:YES

否则,就输出:NO

输入样例:

5
1 2 3 1 4

输出样例:
YES

代码展示:

复制代码
import java.util.Arrays;
import java.util.Scanner;
public class Homework{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int i,j,flag=0;
int[] a=new int[n];
for(i=0;i<n;i++)
a[i]=input.nextInt();
Arrays.sort(a);
for(i=0;i<n-1;i++)
if(a[i]==a[i+1]){
flag=1;break;
}
if(flag==1)System.out.println("YES");
else System.out.println("NO");
}
}
复制代码

 

 

 

 

 

分析如下:

1.由于题目n的范围位1~100000,在遍历数组时效率极低,总会出现运行超时的问题。

2.因为,Arrays.sort()方法能够提升效率,所以最终使用Arrays.sort()方法解决了该问题。

第二次作业

7-5 学号识别

题目:

学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号

输入格式:
8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入

输出格式:

学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03

注意:如非法输入,输出“Wrong Format"

输入样例:

在这里给出一组输入。例如:

18011103

输出样例:
在这里给出相应的输出。例如:

入学年份:2018年
学院:材料学院
班级:11
学号:03

输入样例:

在这里给出一组输入。例如:

18013

输出样例:

在这里给出相应的输出。例如

Wrong Format

代码展示:

复制代码
import java.util.Scanner;
public class Homework2{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String id = input.nextLine();
        if(id.length()==8){  
        String a=id.substring(0,2);
        String b=id.substring(2,4);
        String c=id.substring(4,6);
        String d=id.substring(6,8);
           if(!b.equals("01")&&
           !b.equals("02")&&!b.equals("03")&&
           !b.equals("20")){
                System.out.print("Wrong Format");
}
            else{
            System.out.println("入学年份:20"+a+"年");
            System.out.print("学院:");  
            switch(b){
                case "01":System.out.println("材料学院");
                    break;
                case "02":System.out.println("机械学院");
                    break;
                case "03":System.out.println("外语学院");
                    break;
                case "20":System.out.println("软件学院");
                    break;
            }
            System.out.println("班级:"+c);
            System.out.print("学号:"+d);
        }
        }
        else{
            System.out.print("Wrong Format");
        }
    }
}
复制代码

 

 

 

 

分析如下:

1.本题主要考察字符串和字符串方法的运用。

2.题目已知学号由8位数字组成,每两位代表不同含义,所以利用substring方法将字符串分成4份。

3.再利用equals方法和switch找到匹配的信息。

 

7-8 判断三角形类型

题目:

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

输入样例1:

50 50 50.0

输出样例1:

Equilateral triangle

输入样例2:

60.2 60.2 80.56

输出样例2:

Isosceles triangle

输入样例3:

0.5 20.5 80

输出样例3:

Wrong Format

代码展示:

复制代码

package study;

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

复制代码

 

   

 

 

 

 

分析如下:

1.本题难度不大,主要考查if-else语句的运用和浮点数。

2.由于double型数据在计算时精度不高,所以在判断直角三角形时,不能直接将x+y==z当作判定条件,而应该用x+y-z<=1E-7判定

3.利用大量的if-else进行选择判断。

7-9  求下天

题目:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天

 

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

1.当输入数据非法及输入日期不存在时,输出“Wrong Format”;

2.当输入日期合法,输出下一天,格式如下:Next date is:年-月-日;

输入样例1:

2020 3 10

输出样例1:

Next date is:2020-3-11

输入样例2:

2025 2 10

输出样例2:

Wrong Format

代码展示:

复制代码
import java.util.Scanner;
public class Homework4{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int year = input.nextInt();
        int month = input.nextInt();
        int day = input.nextInt();
        if(checkInputValidity(year,month,day)){
            nextDate(year,month,day);
        }
            else System.out.print("Wrong Format");    
    }
     public static boolean isLeapYear(int year){
         if((year%4==0&&year%100!=0)||year%400==0)
             return true;
             else return false;
     }
     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;
             else return true;
     }
     public static void nextDate(int year,int month,int day){
             switch(month){
                 case 2:
                     if(isLeapYear(year)){
                         if(day>29)System.out.print("Wrong Format");
                         else if(day==29)System.out.print("Next date is:"+year+"-3-1");
                         else if(day<29)System.out.print("Next date is:"+year+"-2-"+(day+1));
                     }
                     else{
                         if(day>28)System.out.print("Wrong Format");
                         else if(day==28)System.out.print("Next date is:"+year+"-3-1");
                         else if(day<28)System.out.print("Next date is:"+year+"-2-"+(day+1));
                     }
                     break;
                 case 1:
                 case 3:
                 case 5:
                 case 7:
                 case 8:
                 case 10:
                 if(day==31)System.out.print("Next date is:"+year+"-"+(month+1)+"-1");
                     else if(day<31)System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));
                     break;
                 case 4:
                 case 6:
                 case 9:
                 case 11:
                     if(day==30)System.out.print("Next date is:"+year+"-"+(month+1)+"-1");
                     else if(day<30)System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));
                     break;
                 case 12:
                     if(day==31)System.out.print("Next date is:"+(year+1)+"-1-1");
                     else if(day<31)System.out.print("Next date is:"+year+"-12-"+(day+1));
                     break;
                     }      
}
}
复制代码

 

 

 

 

 

分析如下:
1.本题难度较前几题更大,题目开始要求我们编写方法,需要判断输入是否合法合理,输入年份判断是否为闰年,再求出下一天。

2.利用switch将12个月份分成4份,若为2月份还需判断是否为闰年,若为12月需要考虑是否跳转到下一年,其他的则需判断是否

为某月的最后一天,若是最后一天则需要跳转到下一个月,否则天数加1。这样写过于繁琐,后期需要改正。

3.定义两个返回值为boolean型的方法,分别判断日期是否合法合理和是否为闰年。

 

第三次作业

 7-3  定义日期类

题目:

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

 

 输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;

 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日 ;

输入样例1:

1912 12 25

输出样例1:

Next day is:1912-12-26

输入样例2:

2001 2 30

输出样例2:

Date Format is Wrong

 

代码展示:

复制代码
import java.util.Scanner;
public class Homework5{
    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 date1 = new Date(year,month,day);
        if(date1.checkInputValidity()){
            date1.getNextDate();
        }
        else System.out.print("Date Format is Wrong");
    }
}
class Date{
    private int year;
    private int month;
    private int day;
    int[] mon_maxnum= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    Date(){
        
    }
    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){
        if((year%4==0&&year%100!=0)||year%400==0){
            return true;
        }
        else return false;
    }
    public boolean checkInputValidity(){
        if(year>=1900&&year<=2000&&month>=1&&month<=12&&day>=1&&day<=31){
            return true;
        }
        else return false;
}
    public void getNextDate(){
        if(isLeapYear(year))
            mon_maxnum[2]=29;
                       if(month==2){ 
                           if(day>mon_maxnum[2])
                               System.out.print("Date Format is Wrong");
                           else if(day==mon_maxnum[2]){
                               month=3;day=1;
                               System.out.print("Next day is:"+year+"-"+month+"-"+day);
                               }
                           else {day++;
                               System.out.print("Next day is:"+year+"-"+month+"-"+day);
                                 }
                           }
                          else{
                           if(day==mon_maxnum[month])
                           {
                               month++;day=1;
                               if(month==13){
                                   year++;
                                   month=1;
                               }
                               System.out.print("Next day is:"+year+"-"+month+"-"+day);
                           }
                           else if(day<mon_maxnum[month]){
                            day++;
                               System.out.print("Next day is:"+year+"-"+month+"-"+day);
                           }
                           else System.out.print("Date Format is wrong");
                           }         
    }
}
复制代码

 

 

 

 

分析如下:

1.本题有两个类,除了主类外还需创建一个Date类,Date类中有属性和方法,需要在主类中调用Date类中的方法和属性。

2.本题与上题有许多相似之处,但这次我们定义了一个数组用于存储每个月的最大天数。这样就不需要用switch,仅需用

天数是否与数组元素是否相等判断是否为该月最后一天。2月的最大天数需要根据是否为闰年更改。

 

7-4  日期类设计

题目:
参考题目3和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)

程序主方法如下(题目已给出):

复制代码
import java.util.Scanner;

public class Homework6 {
    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();

        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) {
                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);
        }        
    }
}
复制代码

输入格式:

有三种输入方式(以输入的第一个数字划分[1,3]):

  • 1 year month day n //测试输入日期的下n天
  • 2 year month day n //测试输入日期的前n天
  • 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数

输出格式:

 当输入有误时,输出格式如下:

 Wrong Format

 当第一个数字为1且输入均有效,输出格式如下:

 year1-month1-day1 next n days is:year2-month2-day2

 当第一个数字为2且输入均有效,输出格式如下:

 year1-month1-day1 previous n days is:year2-month2-day2

 当第一个数字为3且输入均有效,输出格式如下:

The days between year1-month1-day1 and year2-month2-day2 are:值

输入样式1:

3 2014 2 14 2020 6 14

输出样式1:

The days between 2014-2-14 and 2020-6-14 are:2312

输入样式2:

2 1834 2 17 7821

输出样式2:

1834-2-17 previous 7821 days is:1812-9-19

输入样式3:

1 1999 3 28 6543

输出样式3:

1999-3-28 next 6543 days is:2017-2-24

输入样式4:

0 2000 5 12 30

输出样式4:

Wrong Format

 

代码如下(主类在上面已给出):

复制代码
class DateUtil{
    private int year;
    private int month;
    private int day;
    int[] mon_maxnum= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    DateUtil(){
        
}
    DateUtil(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 checkInputValidity(){
         if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31){
            return true;
        }
        else return false;
    }
public boolean isLeapYear(int year){
          if((year%4==0&&year%100!=0)||year%400==0){
            return true;
        }
        else return false;
}
public DateUtil getNextNDays(int n){
    int i;
    for(i=0;i<n;i++){
        if(isLeapYear(year))
            mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
                       if(month==2){ 
                           if(day>mon_maxnum[2])
                               System.out.print("Wrong Format");
                           else if(day==mon_maxnum[2]){
                               month=3;day=1;
                               }
                           else day++;
                           }
                          else{
                           if(day==mon_maxnum[month])
                           {
                               month++;day=1;
                               if(month==13){
                                   year++;
                                   month=1;
                               }
                           }
                           else if(day<mon_maxnum[month]){
                            day++;
                           }
                            }
    }
    DateUtil date1=new DateUtil(year,month,day);
    return date1;
}
public DateUtil getPreviousNDays(int n){
int i;
    for(i=0;i<n;i++){
    switch(month){
                 case 2:
                 if(isLeapYear(year)){
      if(day>29)System.out.print("Wrong Format");
      else if(day==1){month--;day=31;} 
      else {day--;}
                     }
                 else {
       if(day>28)System.out.print("Wrong Format");
       else if(day==1){month--;day=31;}
       else {day--;}
                     }
                     break;
                 case 1:
            if(day==1){year--;month=12;day=31;}
            else {day--;}
                     break;
                 case 3:
            if(day==1){
            if(isLeapYear(year)){
            month--;day=29;
            }
            else {month--;day=28;}
            }
            else {day--;}
            break;
                 case 5:
                 case 7: 
                 case 10:
                 case 12:
        if(day==1){month--;day=30;}
        else {day--;}
                    break;
                 case 4:
                 case 6: 
                 case 8:
                 case 9:
                 case 11:
        if(day==1){month--;day=31;}
         else {day--;}
                     break;  
                     }
    }
    DateUtil date2 = new DateUtil(year,month,day);
    return date2;
}
public boolean compareDates(DateUtil date){
    if(year>date.getYear()) return true;
    else if(year==date.getYear()){
        if(month>date.getMonth()) return true;
        else if(month==date.getMonth()){
            if(day>date.getDay()) return true;
            else if(day==date.getDay()) return true;
            else return false;
        }
        else return false;
    }
    else return false;
}
public boolean equalTwoDates(DateUtil date){
    if(year==date.getYear()&&month==date.getMonth()&&day==date.getDay())
        return true;
    else return false;
}
public int getDaysofDates(DateUtil date){
    int d=0;
    if(equalTwoDates(date)) return d;
    else {
        if(!compareDates(date)){//新输入的日期大于当前日期
        while(!equalTwoDates(date)){//往下加一天,并比较一次,直到两日期相同
            switch(month){
                 case 2:
      if(isLeapYear(year)){
      if(day==29){month++;day=1;} 
      else if(day<29){day++;}
                     }
                 else {
       
       if(day==28){month++;day=1;}
       else if(day<28){day++;}
                     }
                     break;
                 case 1:
                 case 3:
                 case 5:
                 case 7:
                 case 8:
                 case 10:
        if(day==31){month++;day=1;}
        else if(day<31){day++;}
                    break;
                 case 4:
                 case 6:
                 case 9:
                 case 11:
        if(day==30){month++;day=1;}
         else if(day<30){day++;}
                     break;
                 case 12:
        if(day==31){year++;month=1;day=1;}
        else if(day<31){day++;}
                     break;
                     }
            d++;
        }
    }
     else{//新输入的日期小于当前日期
         while(!equalTwoDates(date)){//让当前日期减小,直到与新日期相同
             switch(month){
                 case 2:
                 if(isLeapYear(year)){
      if(day==1){month--;day=31;} 
      else {day--;}
                     }
                 else {
       if(day==1){month--;day=31;}
       else {day--;}
                     }
                     break;
                 case 1:
            if(day==1){year--;month=12;day=31;}
            else {day--;}
                     break;
                 case 3:
            if(day==1){
            if(isLeapYear(year)){
            month--;day=29;
            }
            else {month--;day=28;}
            }
            else {day--;}
            break;
                 case 5:
                 case 7: 
                 case 10:
                 case 12:
        if(day==1){month--;day=30;}
        else {day--;}
                    break;
                 case 4:
                 case 6: 
                 case 8:
                 case 9:
                 case 11:
        if(day==1){month--;day=31;}
         else {day--;}
                     break;  
                     }
             d++;
    }
         }
        return d;
    }
     }
public String showDate(){
    String s=year+"-"+month+"-"+day;
        return s;
}
}
复制代码

 

 

 

 

分析如下:

1.本题难度较大,需要根据给出的主类,创建新类。且该类中需要实现的方法众多,需要理清方法间的关系。

2.本题需要求上N天,下N天以及两天之差,我将其理解为求下一天循环N次,同理循环N次上一天,再将小的

日期循环X次下一天直到和下一天匹配,X就是两天之差。

3.这种做法虽然可行但不太妥当,因为需要进行N次循环,效率不高。

(3)踩坑心得

第一次作业

7-5 去掉重复字符

 

 

 

 

分析如下:

因为字符删除后,字符串的长度会改变,所以我想用n记录被删除的字符的个数,并在两个for循环中都用n作为循环条件。

由于n是改变的,当n变大后会终止循环,但当字符串的首部或尾部出现重复字符时,会出现消除不了的问题。于是我决定

换一种写法.,在判断的同时输出不重复的字符,这样一来就不需要对原数组进行删改了。

修改后:

 

 

 

 7-7  有重复数据

 

 

 

 分析如下:

因为n为手动输入且最大值为100000,当n过大时直接用for循环遍历数值的效率极低,出现运行超时的错误。

只需要在遍历组之前用Arrays.sort()对数组进行排序即可提高遍历效率。

修改后:

 

 

 

 

第二次作业 

7-5  学号识别

 

 

分析如下:

当时并不知道字符串类型的使用方法,以为可以直接用!=判断两个字符串是否相等。而后改用equals方法比较字符串大小

修改后:

 

 

 

 

7-8 判断三角形类型

 

 

 

 分析如下:

a,b,c均为double型,double型变量的计算不够精确,所以不能如图中一样判断两个double型变量是否相等,

而应该将两数相减与一个极小数比较,若小于或等于则表示两数相等。

修改后:

 

 

(4)改进建议

第一次作业  7-7  有重复的数据:遍历数组时需要循环n次,效率十分低下,需要找到更加高效的方法改进。

第一次作业  7-10 GPS数据处理:数据信息以","分隔开,我利用for循环遍历了全部数据信息,将","的位置存入一个数组中,从而做到将不同的数据分开。

改进方法:可以使用split方法以“,”为分隔符将数据分开存入到一个数组中。

第二次作业  7-9 求下一天:在计算下一天时使用了witch语句和大量的if-else语句使得代码过于冗长。

改进方法:可以创建一个数组用于存放每个月的最大天数,再把某个月的天数与该数组对应元素进行比较,以此判断是否为该月最后一天。

(5)作业总结

通过这三次的PTA作业我对java这门高级编程语言有了诸多了解。其中主要是对java语法的学习,我学会了java中个数据类型的表示方式和使用方式,特别是string型。该类型有许多的方法可以使用,例如charAt(),substring(),equals()等,这些方法让我能高效地处理字符串数据。我也认识到double型的数据无法进行精确运算。除了基本类型外,还学习了数组的定义和使用方法,知道了数组的大小一旦确定就无法改变。熟练地掌握了输入数据和输出数据的方法,在做题的过程中,我也学会了如何定义并调用方法。除了基本的语法外,最重要的是了解了面向对象与面向过程编程的不同。在前两次作业中,我都是以面向过程的方式编程,第三次作业才真正开始使用面向对象的方法编程。在第三次作业中,我学会了创建第二个类,并在类中定义它的属性与方法,也掌握了在主类中创建新类对象的方法以及如何调用对象的方法和属性。除此之外,我初步了解了public和private的区别。希望在今后能够更加熟练的掌握java提供给我们的各种方法,能够更加透彻地理解对面向对象的理念。

对老师和课程的建议:希望老师可以在题目集关闭后提供题目的正确代码以及解析。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

  

posted @   轩轩轩轩轩X  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示