OO前三次题目总结

OO前三次作业总结;

 


 

      OO  第一次题目小结                                                                                                                                                                             

 

 

1、前言

  初学java什么都还不是很清楚,jAVA语言比原来的C语言要复杂一些,刚学的时候我就感觉到困难了。老师讲的东西实在是一时无法理解透彻,只能机械的模仿老师课堂上的操作,只有课后去学习。

老师布置第一次的作业也是比较基础的,题量较多但简单,主要是让大家熟悉并练习一下java代码的写法以及对面向对象有一个初步的认知。因为在上一学期学的是c,在一开始学习java的时候总是用c的语法去写导致了很多问题,例如数组与输入在java中是类,需要创建引用类型变量指向它的一个对象才可调用,不过随着学习的深入问题自然而然就解决了。

2、设计与分析

  在第一单元的7-8中要求在一行中输入三角形的三条边的值(实型数),判断该三角形为什么类型的三角形。

输入格式:

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

 

输入样例

 

 

50 50 50.0

 

输出样例:

Equilateral triangle

解题思路:题目不难,主要就是用if else语句对输入值不断进行判断,主要各种三角形的判断顺序即可。

解题代码:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        double a,b,c;
    a=sc.nextDouble();
    b=sc.nextDouble();
    c=sc.nextDouble();
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)
System.out.print("Not a triangle");    
        else if(a==b&&b==c)    
    System.out.print("Equilateral triangle");
        else if(((a==b)&&(a*a+b*b-c*c<0.00001))||((b==c)&&(b*b+c*c-a*a<0.00001))||((a==c)&&(a*a+c*c-b*b<0.00001)))
        System.out.print("Isosceles right-angled triangle");
        else if(a==b||b==c||a==c)
System.out.print("Isosceles triangle");
        else if((a*a+b*b-c*c<0.00001)||(b*b+c*c-a*a<0.00001)||(a*a+c*c-b*b<0.00001))
System.out.print("Right-angled triangle");
        else System.out.print("General triangle");
}
    }

}

 

 

3、踩坑心得

  (1)在写这题的时候踩了一个坑:判断直角三角形的时候用用了a*a+b*b==c*c导致一直有问题,后来看书后得知java中实数的计算是有误差的故应用a*a+b*b-c*c<0.00001或者好像还可以用BIgdecimal类但是当初问了一下我们的教官知道了有误差后立马就改正代码提交没有仔细的上百度一下。

  (2)在建立一个数组的时候我曾经用int a[5];来处理,可是报错了,学习之后了解到数组是java中的一个类,需要new一个数组对象才可对其调用

4、改进建议

  在一开始学的时候是对Java没有一个初步的认知,虽然现在也只是比3周前多一点点认知。

  改进的话可以将判断是什么三角形的方法封装到一个类里面去,可以简化main()方法使代码更具可读性,但主要还是可以对代码进行重复利用,万一我那天又要判断三角形了就可以直接调用这个类中的方法了就可以避免自己再写一遍。

5、第一次作业总结

  (1)在第一次作业中了解了java的部分语法知识点,例如逻辑运算符,循环的控制。

  (2)其次对java中的类,与对象有一个初步的认知,我了解类与对象的概念会伴随我学习java的过程,类和对象都是比较抽象的概念,那么什么是类什么是对象呢?我有着如下理解:

     依据我的了解,我们可以认为类相当于一个具体的模板,它规定着对象拥有什么属性以及干了什么样的事(指方法),而对象相当于通过一个模具,也就是那个类创造出来的实体,一个类的对象(实体)有着类规定的属性以及方法。

 

 


 

   

 OO第二次题目小结                                                                     

 

1、前言

     第2次题目集相较于第1次题目集里增加了不少内容,主要涉及到了如何自己定义一个新的方法去解决程序问题。

     

 

2、设计与分析

  (1)7-1 IP地址转化

  一个IP地址是用四个字节(每个字节8位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入格式:

  在一行中给出32位二进制字符串。

输入样例:

在此给出一组输入如:

 

11000110101001000011011011011001

 

输出样例:

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

198.164.54.217

 

 

  

  一开始看到题目时我一时无从下手唉,但想到8位一组后突发灵感,有if else对8位一组的二进制数进行十进制转换就行。

解题代码如下:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String s=input.nextLine();
        if(s.length()!=32){
          System.out.println("Wrong Format");  
            
return;}
    int a=0,b=0,c=0,d=0;
    for(int i=0;i<s.length();i++) {
        if(s.charAt(i)!='1'&&s.charAt(i)!='0')
        {System.out.println("Wrong Format");
            return;}
        if(i<=7) {
            if(s.charAt(i)=='1')
            a+=Math.pow(2,(7-i));
        }
        if(i>7&&i<=15) {
            if(s.charAt(i)=='1')
            b+=Math.pow(2,15-i);
        }
        if(i>15&&i<=23) {
            if(s.charAt(i)=='1')
                c+=Math.pow(2,23-i);
        }
        if(i>23&&i<=31) {
            if(s.charAt(i)=='1')
                d+=Math.pow(2,31-i);
        }       
    }System.out.print(a+"."+b+"."+c+"."+d);
    }
}

 

 改进建议:

  后面学习了正则表达式,可以用正则表达式来简化截取8个数字的代码

String str = "11000110101001000011011011011001";
String pattern
= "[0-9]{8}";
Pattern r
= Pattern.compile(pattern);
Matcher m
= r.matcher(str);

 

    

 

(2)7-4 求下一天 

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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

输入样例2:

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

2025 2 10

 

输出样例1:

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

Next date is:2020-3-11

输出样例2:

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

Wrong Format

 

 

 

画出类图

 

 

 解题思路:

      首先完成对闰年以及输入数据判断的方法后,写求下一天的方法,思路为用数组中存放每个月相应的天数来表示几月,后创建一个变量,该变量为输入的天数加1,然后对该变量进行如下判断

 

if(next<=b[month-1]) {//是否到达下月
        System.out.print("Next date is:"+year+"-"+month+"-"+next);
    }else if(++month<=12) {//是否到达下一年
        int nextmonth=month;
        System.out.print("Next date is:"+year+"-"+nextmonth+"-1");
    }else {
        int nextyear=year+1;//到达下一年,该天必为年第一天
        System.out.print("Next date is:"+nextyear+"-1-1");
            }        

 

完整代码如下:

 

import java.util.*;
public class Main {

    public static void main(String[] args) {
int year,month,day;
Scanner sc=new Scanner(System.in);
year=sc.nextInt();
month=sc.nextInt();
day=sc.nextInt();
boolean p=checkInputValidity(year,month,day);
if(p) {
    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) {
    int[]a=new int [12];int[] b=new int[12];
    a[0]=31;a[1]=29;a[2]=31;a[3]=30;a[4]=31;a[5]=30;a[6]=31;a[7]=31;a[8]=30;a[9]=31;a[10]=30;
    a[11]=31;
    b[0]=31;b[1]=28;b[2]=31;b[3]=30;b[4]=31;b[5]=30;b[6]=31;b[7]=31;b[8]=30;b[9]=31;b[10]=30;
    b[11]=31;
    if((year>=1820&&year<=2020)&&(day>=1&&day<=31)&&(month>=1&&month<=12)) {
        if(isLeapYear(year)) {
            if((month==2&&day>29)||day>a[month-1])
                return false;
            else {
                return true;
            }
        }else { 
            if((month==2&&day>28)||day>b[month-1]) {
            return false;
        }else {
                return true;
        }}
    }else return false;
}
public static void nextDate(int year,int month,int day) {
    boolean leap=isLeapYear(year);
    int next=day+1;
    int[]a=new int [12];int[] b=new int[12];
    a[0]=31;a[1]=29;a[2]=31;a[3]=30;a[4]=31;a[5]=30;a[6]=31;a[7]=31;a[8]=30;a[9]=31;a[10]=30;
    a[11]=31;
    b[0]=31;b[1]=28;b[2]=31;b[3]=30;b[4]=31;b[5]=30;b[6]=31;b[7]=31;b[8]=30;b[9]=31;b[10]=30;
    b[11]=31;
if(leap) 
{    
    if(next<=a[month-1]) {
        System.out.print("Next date is:"+year+"-"+month+"-"+next);
    }else if(++month<=12) {
        int nextmonth=month;
        System.out.print("Next date is:"+year+"-"+nextmonth+"-1");
    }else {
        int nextyear=year+1;
        System.out.print("Next date is:"+nextyear+"-1-1");
        
    }    
}else {
    if(next<=b[month-1]) {
        System.out.print("Next date is:"+year+"-"+month+"-"+next);
    }else if(++month<=12) {
        int nextmonth=month;
        System.out.print("Next date is:"+year+"-"+nextmonth+"-1");
    }else {
        int nextyear=year+1;
        System.out.print("Next date is:"+nextyear+"-1-1");
            }        
     }        
} 
}

 

 

 

 

 

 

踩坑心得:

  这题并未踩到什么很难搞的坑 

改进建议

  在用数组表示每月有多少天时我曾经建立了两个数组a,b 来表示闰年与平年2月份的不同不过这样做显得较为麻烦,可以修正一下通过调用isLeapYear()方法来对二月份天数进行改正,如下:

a[0]=31;a[1]=28;a[2]=31;a[3]=30;a[4]=31;a[5]=30;a[6]=31;a[7]=31;a[8]=30;a[9]=31;a[10]=30;
    a[11]=31;
if(isLeapYear(year))
 a[1]=29;

 

 

 

(3) 7-5 求前N天

    输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”

输入样例1:

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

2018  6 19 8 

 

 

 

输出样例1:

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

8 days ago is:2018-6-11

 

 

   解题思路:

  在写完上一题后,写这题便很简单了,有些方法甚至可以照搬(话说我是不是应该把它弄成一个类方便以后使用,不过好像java里有日期类)。但一开始我没有看清题目,把N>0小于0,对天数加减的情况弄反了,不过这都没啥关系,用绝对值与加负号的方法便负负得正。

  再对给出天数进行加减,之后再利用上一题写出的NextDate()方法对其稍微修改之后便可以对给出的数据进行判断

if(n<0) {     
    n=Math.abs(n);   
    day+=n;
      if(day<=a[month]) {
            System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);
        }else if(++month<=12) {
            day=day-a[month-1];
            System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);
        }else {
            year++;
        day-=31;    
            System.out.print(-n+" days ago is:"+year+"-1-"+day);
            
        }    
       //n大于0结算
}  else if(n>0) {
    n=-n;
    day+=n;
           if(day>=1)
             System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);  
           else if(--month>=1) {
               day=a[month]+day;
              System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day); 
           }else {
               year--;
               day=31+day;
               System.out.print(-n+" days ago is:"+year+"-12-"+day);
           }
}else System.out.print(0+" days ago is:"+year+"-"+month+"-"+day);

 

画出类图:

 

 

 

完整代码如下:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
int year,month,day,n;
Scanner sc=new Scanner(System.in);
year=sc.nextInt();month=sc.nextInt();day=sc.nextInt();n=sc.nextInt(); 
        if(checkInputValidity(year, month, day, n))
            nextday(year, month, day, n);
        else System.out.print("Wrong Format");
    }
    public static boolean isLeapYear(int year) {
        boolean ret=false;
        if ((year%100!=0&&year%4==0)||(year%400==0)){
            ret=true;
        }
        return ret;
    }

    public static boolean checkInputValidity(int year,int month,int day,int n){
       
        int[] a={31,28,31,30,31,30,31,31,30,31,30,31};
        if (isLeapYear(year)) 
            a[1]=29;
        if ((year>=1820&&year<=2020)&&(month>=1&&month<=12)&&(day>=1&&day<=a[month-1])&&(n>=-10&&n<=10)){//此处的month-1用来判断不同年份的不同月份的数据是否合法
            return true;
        }else
        return false;
    }
   public static void nextday(int year,int month,int day,int n) {
       int[] a={0,31,28,31,30,31,30,31,31,30,31,30,31};
       if(isLeapYear(year))
           a[2]=29;
if(n<0) {     
    n=Math.abs(n);   
    day+=n;
      if(day<=a[month]) {
            System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);
        }else if(++month<=12) {
            day=day-a[month-1];
            System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);
        }else {
            year++;
        day-=31;    
            System.out.print(-n+" days ago is:"+year+"-1-"+day);
            
        }    
       //n大于0结算
}  else if(n>0) {
    n=-n;
    day+=n;
           if(day>=1)
             System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day);  
           else if(--month>=1) {
               day=a[month]+day;
              System.out.print(-n+" days ago is:"+year+"-"+month+"-"+day); 
           }else {
               year--;
               day=31+day;
               System.out.print(-n+" days ago is:"+year+"-12-"+day);
           }
}else System.out.print(0+" days ago is:"+year+"-"+month+"-"+day);  
   } 
}

 

 

 3、oo第二次作业总结

  

 (1)增强了对java中循环以及其他部分语句的认知

  (2)学习了自己再类中定义方法来解决不同的问题,以及对方法有更近一步的理解   

1、 方法的定义:

 

                      访问控制符 [修饰符] 返回值类型 方法名(参数){
                                      方法体;
                                                    }
                                 例: public void study() {
                                System.out.println(“学习”);
                                         }

2、访问控制符规定了方法的使用范围 访问控制符有 public protected、private等。

     public可以在任意地方调用    

    private属于私有的意思,只能当前类中调用

3、方法的返回值类型

     有void,int,boolean(只返回true与false),double等数据类型

4、方法名

  方法名通常有相关联的英文单词组成,首字母必须小写,如果由多个单词组成,从第二个单词开始首字母必须大写;
方法名一般由一个动词或者动名词构成。

 

 

5参数

       方法可以有多个参数,各个参数之间用逗号“,”间隔。

       当传入的参数为基本数据类型的话,该变量为方法内作用域,在方法内即使与方法之外的变量同名也不会影响方法外的变量,但如果传入的是引用数据类型的话,在方法内改变变量的参数,也会影响方法之外的引用该对象的变量的参数


 

 

 

OO第三次作业小结                                                                       

 

1、前言

  第三次作业主要涉及到的自定义类,并掌握类的声明创建和使用方法。

 

 

2、设计与分析

(1)、 定义日期类

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

 日期的类图如下:

 

 

 

  输入格式:

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

   输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日 

输入样例1:

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

1912 12 25

输出样例1:

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

Next day is:1912-12-26

解题思路:

 改题的思路与第二次作业的求下一天可谓一模一样的,只不过要把有关日期的属性以及方法包含到一个类中去,并且要实行数据的封装。比较简单直接po上源代码

解题代码:

 

import java.util.*;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
int year,month,day;
year=sc.nextInt();month=sc.nextInt();day=sc.nextInt();
Date d=new Date(year,month,day);
boolean p=Date.checkInputValidity(year,month,day);
if(p) {
    d.nextDate(year,month,day);
}else 
    System.out.print("Date Format is Wrong");   
    }

}
class Date{
    private int year;
    private int month;
    private int day;
    private int[] b= {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 static boolean isLeapYear(int year) {
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        else return false;    
    }
    public boolean checkInputValidity(int year,int month,int day) {
        int[] b= {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear(year))
            b[2]=29;
        if((year>=1900&&year<=2000)&&(day>=1&&day<=31)&&(month>=1&&month<=12)) {
            if(isLeapYear(year)) {
                if((month==2&&day>29)||day>b[month])
                    return false;
                else {
                    return true;
                }
            }else { 
                if((month==2&&day>28)||day>b[month]) {
                return false;
            }else {
                    return true;
            }}
        }else return false;
    }    
    public  void nextDate(int year,int month,int day) {
        int[] b= {0,31,28,31,30,31,30,31,31,30,31,30,31};
        boolean leap=isLeapYear(year);
        int next=day+1;
    if(leap) 
        b[2]=29;
    
        if(next<=b[month]) {
            System.out.print("Next day is:"+year+"-"+month+"-"+next);
        }else if(++month<=12) {
            int nextmonth=month;
            System.out.print("Next day is:"+year+"-"+nextmonth+"-1");
        }else {
            int nextyear=year+1;
            System.out.print("Next day is:"+nextyear+"-1-1");
                }        
         }        
    }

 

 

 

 

(2)一元多项式求导

输入格式:

在一行内输入一个待计算导函数的表达式,以回车符结束。

输出格式:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  • 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

输出格式见输入输出示例。

输入样例1:

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

-2*     x^-2+  5*x^12-4*x+       12

输出样例1:

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

4*x^-3+60*x^11-4

 

输入样例2:

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

2*x^6-0*x^7+5

输出样例2:

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

Wrong Format

 

解题思路:

  该题应用正则表达式来对输入的字符串进行判断,先去除多余空格用replaceAll(" ","")

  后学习后写出判断幂函数,一元函数,常数的正则表达式

String pattern = "([-+]?[0-9]+\\*)?x(\\^[-+]?[0-9]+)|([0-9]+\\*)?x|\\d+";

 

 

 

 利用该表达式利用Matter类中的find()方法对输入字符串进行匹配后再进行求导。

 

3、OO第三次作业小结

 (1)、掌握类的定义方法,以及类的使用。

     (2)、了解类的构造方法的定义以及使用。

构造方法 为定义一个对象时对对象进行初始化的方法,主要用来实例化对象。构造方法分为无参构造方法、有参构造方法。

构造方法是一种特殊的成员方法,构造方法的名字与类名完全相同,并且没有返回类型。

构造方法是在调用创建一个对象时new操作进行的。

自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法, 如果写了一个有参的构造方法,就一定要写无参构造方法。一般情况下,我们自定义的类都要手动给出无参构造方法。

构造方法可以重载

     (3)、掌握类的成员变量、成员方法的定义与使用方法

当类的某一属性设置为private型,就表面改变量只能在类的内部访问与修改,需借助gets()与sets()方法获取,修改改变量。

  (4)、理解类变量、类方法与实例变量、实例方法的区别

 

实列方法必须通过创建一个类的对象同过对象进行调用,而静态方法可以直接通过类名或者对象进行调用  如Math.xx()

注意静态方法只能调用类中的静态变量

 


 

 

OO前三次作业总结心得:


   java是一种跨平台的高级语言,自发布之后它的声影便出现十分广泛,毫无疑问java因其安全性、跨平台、简单性、多线程等优点成为一门生命力极强的语言,这些特性也表明其抽象程度。

     对java初步学习后,我对java有一个初步的认识。首先我了解到Java是一门面向对象的语言,其特点为继承、多态、封装、抽象。与之前学习的C语言的面向过程不同。按我的理解,面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,而面向对象,在设计解决问题时需要将问题化作为各个对象,通过对象与对象之间的联系来解决问题。

      例如在C语言中有许多基本数据类型,例如数组等在java中都是对象,需要通过创建一个对象的引用来引用他们,除此之外,Java里面还有许多c语言没有的方法(函数),在处理事情时,部分时候java更具效率也更为方便。

     在学习过程中有些概念不太容易理解,有时候需要想很就才能有那种突然理解的感觉,但不懂就去听课,中国大学生mooc等平台有各个学校的老师讲解,不懂就多看多学多敲。

     面向对象的技术是需要学者自己认真学习体会的,只有认真弄懂每一个不懂的概念才能敲出想要的程序来。

      总的来说当前还是只有一个浅显的认知,以后还应多多学习,增强理解。

     

     最后感谢观看!如有不足之处请多多包涵,错误之处敬请多多指正,不胜感激。

 

posted @ 2021-04-04 17:05  小小菜鸟、  阅读(86)  评论(0)    收藏  举报