Day07-面向对象-封装课后练习以及参考答案

文章详细介绍了Java编程中的基础概念,包括成员变量的使用、日期类的实现(如判断闰年和计算日期相关函数)、三角形类的定义与方法、数组工具类的功能以及拔高题中公民类的构建,展示了面向对象编程中类和方法的实践应用。
摘要由CSDN通过智能技术生成

巩固题

包练习

每道作业题可以单独一个包。

在这里插入图片描述

成员变量基础题

第1题:员工

案例需求:

(1)声明员工类Employee,包含属性:编号、姓名、年龄、薪资,

(2)在测试类的main方法中,创建2个员工对象,并为属性赋值,并打印两个员工的信息。

在这里插入图片描述

参考答案:

package com.atguigu.homework1;

public class Employee {
    int id;
    String name;
    int age;
    double salary;
}
package com.atguigu.homework1;

public class TestEmployee {
    public static void main(String[] args) {
        Employee emp1 = new Employee();
        emp1.id = 1;
        emp1.name = "张三";
        emp1.age = 23;
        emp1.salary = 10000;

        Employee emp2 = new Employee();
        emp2.id = 2;
        emp2.name = "李四";
        emp2.age = 22;
        emp2.salary = 11000;

        System.out.println("第1个员工的编号:" + emp1.id +",姓名:" + emp1.name + ",年龄:" + emp1.age + ",薪资:" + emp1.salary);
        System.out.println("第2个员工的编号:" + emp2.id +",姓名:" + emp2.name + ",年龄:" + emp2.age + ",薪资:" + emp2.salary);
    }
}

第2题:日期类

案例需求:

(1)声明一个日期类MyDate,包含属性:年、月、日

(2)在测试类的main方法中,创建3个日期对象,一个是你的出生日期,一个是来尚硅谷的日期,一个是毕业的日期,并打印显示

参考答案:

package com.atguigu.homework2;

public class MyDate {
    int year;
    int month;
    int day;
}

package com.atguigu.homework2;

public class TestMyDate {
    public static void main(String[] args) {
        MyDate bir = new MyDate();
        bir.year = 1995;
        bir.month = 5;
        bir.day = 5;
        System.out.println("生日:" + bir.year + "年" + bir.month + "月" + bir.day + "日");

        MyDate come = new MyDate();
        come.year = 2021;
        come.month = 5;
        come.day = 12;
        System.out.println("来尚硅谷:" + come.year + "年" + come.month + "月" + come.day + "日");

        MyDate go = new MyDate();
        go.year = 2021;
        go.month = 10;
        go.day = 25;
        System.out.println("毕业:" + go.year + "年" + go.month + "月" + go.day + "日");
    }
}

成员方法基础题

第3题:三角形

案例需求:

(1)声明一个三角形类Triangle,包含属性:a,b,c,都是double类型,表示三条边,包含几个方法:

  • boolean isTriangle():判断是否是一个三角形

  • boolean isRightTriangle():判断是否是一个直角三角形

  • boolean isIsoscelesTriangle():判断是否是一个等腰三角形

  • boolean isEquilateralTriangle():判断是否是一个等边三角形

  • double area():根据三条边,用海伦公式求面积

  • double perimeter():求周长

(2)在测试类的main方法中创建三角形对象,将三角形的三条边设置为3,4,5,调用方法测试。

参考答案:

package com.atguigu.homework3;

public class Triangle {
    double a;
    double b;
    double c;

    boolean isTriangle(){
        return a>0 && b>0 && c>0 && a+b>c && b+c>a && a+c>b;
    }

    boolean isRightTriangle(){
        return isTriangle() && (a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a);
    }

    boolean isEquilateralTriangle(){
        return isTriangle() && a == b && b == c;
    }

    boolean isIsoscelesTriangle(){
        return isTriangle() && (a == b || a == c || b == c);
    }

    double perimeter(){
        if(!isTriangle()){
            return 0.0;
        }
        return a + b + c;
    }

    double area(){
        if(!isTriangle()){
            return 0.0;
        }
        double p = a + b + c;
        return Math.sqrt(p * (p-a) * (p-b) * (p-c));
    }
}

package com.atguigu.homework3;

public class TestTriangle {
    public static void main(String[] args) {
        Triangle t1 = new Triangle();
        t1.a = 3;
        t1.b = 4;
        t1.c = 5;
        System.out.println("t1是三角形吗?" + t1.isTriangle());
        System.out.println("t1是直角三角形吗?" + t1.isRightTriangle());
        System.out.println("t1是等腰三角形吗?" + t1.isIsoscelesTriangle());
        System.out.println("t1是等边三角形吗?" + t1.isEquilateralTriangle());
        System.out.println("t1的周长:" + t1.perimeter());
        System.out.println("t1的面积:" + t1.area());
    }
}

第4题:日期类

案例需求:

(1)声明一个日期类MyDate,

  • 包含属性:年、月、日
  • boolean isLeapYear():判断是否是闰年
  • String monthName():根据月份值,返回对应的英语单词
  • int totalDaysOfMonth():返回这个月的总天数
  • int totalDaysOfYear():返回这一年的总天数
  • int daysOfTheYear():返回这一天是当年的第几数

(2)在测试类的main方法中,创建MyDate对象,赋值为当天日期值,调用方法测试。

参考答案:

package com.atguigu.homework4;

public class MyDate {
    int year;
    int month;
    int day;

    boolean isLeapYear(){
        return year%4==0 && year%100!=0 || year%400==0;
    }
    
    int totalDaysOfYear(){
        return isLeapYear() ? 366 : 365;
    }

    int totalDaysOfMonth(){
        if(month == 4 || month == 6 || month == 9 || month == 11){
            return 30;
        }
        if(month == 2){
            return isLeapYear() ? 29 : 28;
        }
        return 31;
    }

    int daysOfTheYear(){
        int days = day;
        for(int i=1; i<month; i++){
            if(i==2){
                days += isLeapYear() ? 29 : 28;
            }else if(i==4 || i==6 || i==9 || i==11){
                days += 30;
            }else{
                days += 31;
            }
        }
        return days;
    }

    String monthName(){
        String[] monthNames = {"January","February","March","April","May","June","July","August","September","October","November","December"};
        return monthNames[month-1];
    }
}

package com.atguigu.homework4;

public class TestMyDate {
    public static void main(String[] args) {
        MyDate my = new MyDate();
        my.year = 2021;
        my.month = 12;
        my.day = 29;

        System.out.println("今年是闰年吗?" + my.isLeapYear());
        System.out.println("月份名是" + my.monthName());
        System.out.println("这个月总天数:" + my.totalDaysOfMonth());
        System.out.println("这一年总天数:" + my.totalDaysOfYear());
        System.out.println("这一天是这一年的几天?" + my.daysOfTheYear());
    }
}

第5题:数组工具类

案例需求:

(1)声明一个数组工具类ArrayTools,包含如下方法:

  • int sum(int[] arr):求所有元素总和
  • int max(int[] arr):求所有元素的最大值
  • int indexOf(int[] arr, int value):查找value在arr数组中第一次出现的下标,如果不存在返回-1
  • int lastIndexOf(int[] arr, int value):查找value在arr数组中最后一次出现的下标,如果不存在返回-1

(2)在测试类的main方法中,调用方法测试,例如:

int[] arr = {1,2,10,4,5,10,7,8,9,10};

参考答案:

package com.atguigu.homework5;

public class ArrayTools {
    int sum(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    int max(int[] arr){
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    int indexOf(int[] arr, int value){
        for(int i=0; i<arr.length; i++){
            if(arr[i] == value){
                return i;
            }
        }
        return -1;
    }
    int lastIndexOf(int[] arr, int value){
        for(int i=arr.length-1; i>=0;  i--){
            if(arr[i] == value){
                return i;
            }
        }
        return -1;
    }
}

package com.atguigu.homework5;

public class ArrayToolsTest {
    public static void main(String[] args) {
        ArrayTools tools = new ArrayTools();

        int[] arr = {1,2,10,4,5,10,7,8,9,10};

        System.out.println("元素总和:" + tools.sum(arr));
        System.out.println("最大值:" + tools.max(arr));
        System.out.println("第1次出现10的下标:" + tools.indexOf(arr, 10));
        System.out.println("最后1次出现10的下标:" + tools.lastIndexOf(arr, 10));
        System.out.println("第1次出现3的下标:" + tools.indexOf(arr,3));
    }
}

拔高题

第6题:公民类

案例需求:

(1)声明一个日期类MyDate,

  • 包含属性:年、月、日,
  • 包含String dateToString()方法,返回“xxxx年xx月xx日”

(2)声明公民类Citizen,

  • 包含属性:姓名,生日,身份证号,其中姓名是String类型,生日是MyDate类型,身份证号也是String类型。
  • 包含String getInfo()方法,返回“姓名:xx,身份证号码:xx,生日:xxxx年xx月xx日”
  • 包含void setBirthday(int year, int month, int day):设置生日

(3)在测试类的main方法中,创建你们家庭成员的几个对象,并打印信息。

参考答案:

package com.atguigu.homework6;

public class MyDate {
    int year;
    int month;
    int day;
    String dateToString(){
        return year + "年" + month + "月" + day + "日";
    }
}
package com.atguigu.homework6;

public class Citizen {
    String name;
    String cardId;
    MyDate birthday;
    void setBirthday(int year, int month, int day){
        birthday = new MyDate();
        birthday.year = year;
        birthday.month = month;
        birthday.day = day;
    }
    String getInfo(){
        return "姓名:" + name +",身份证号码:" + cardId + ",生日:" + birthday.dateToString();
    }
}
package com.atguigu.homework6;

public class TestCitizen {
    public static void main(String[] args) {
        Citizen citizen = new Citizen();
        citizen.name = "张三";
        citizen.cardId = "110250199512012535";
        citizen.setBirthday(1995,12,1);
        System.out.println(citizen.getInfo());
    }
}

第7题:数组工具类

案例需求:

(1)声明一个数组工具类ArrayTools,包含如下方法:

  • int max(int[] arr):求所有元素的最大值
  • int valueCount(int[] arr, int value):查找value在arr数组中出现的次数,如果不存在返回0
  • int[] maxIndex(int[] arr):找出所有最大值
  • void sort(int[] arr):实现元素从小到大排序
  • void reverse(int[] arr, int start, int end):反转[start,end]范围内的元素
  • int[] copyOf(int[] arr, int newLength):复制arr数组,新数组的长度newLength。如果newLength<=arr.length,则复制arr数组的[0, newLength-1]范围的元素,如果newLength>arr.length,则复制arr数组的所有元素到新数组,剩下的元素则默认就可以。
  • boolean equals(int[] arr1, int[] arr2):判断两个数组的长度和元素是否都相等,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。
  • void fill(int[] arr, int start, int end, int value) :将arr数组[start,end]范围的元素赋值为value。
  • String toString(int[] arr):将元素拼接为"{元素1,元素2,…}"的字符串返回。

(2)在测试类的main方法中,调用方法测试例如:

int[] arr = {1,2,10,4,5,10,7,8,9,10};

参考答案:

package com.atguigu.homework7;

public class ArrayTools {
    int max(int[] arr){
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    int valueCount(int[] arr, int value){
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == value){
                count ++;
            }
        }
        return count;
    }
    int[] maxIndex(int[] arr){
        int max = max(arr);
        int count = valueCount(arr, max);
        int[] all = new int[count];
        for (int i = 0,j = 0; i < arr.length; i++) {
            if(arr[i] == max) {
                all[j++] = i;
            }
        }
        return all;
    }
    void sort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr.length-i; j++) {
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    void reverse(int[] arr, int start, int end){
        for(int i=0; i<(end-start)/2; i++){
            int temp = arr[i+start];
            arr[i+start] = arr[end-i];
            arr[end-i] = temp;
        }
    }

    int[] copyOf(int[] arr, int newLength){
        int[] newArr = new int[newLength];
        for (int i = 0; i < newArr.length && i<arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }

    boolean equals(int[] arr1, int[] arr2){
        if(arr1.length != arr2.length){
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if(arr1[i] != arr2[i]){
                return false;
            }
        }
        return true;
    }

    void fill(int[] arr, int start, int end, int value){
        for (int i = start; i <= end; i++) {
            arr[i] = value;
        }
    }
    String toString(int[] arr){
        String result = "{";
        for (int i = 0; i < arr.length; i++) {
            if(i<arr.length-1){
                result += arr[i] + ",";
            }else{
                result += arr[i];
            }
        }
        result += "}";
        return result;
    }
}

package com.atguigu.homework7;

public class ArrayToolsTest {
    public static void main(String[] args) {
        ArrayTools tools = new ArrayTools();
        int[] arr = {1,2,10,4,5,10,7,8,9,10};

        System.out.println("arr数组为:" +tools.toString(arr));
        int maxValue = tools.max(arr);
        System.out.println("arr数组中的最大值:" + maxValue);
        System.out.println("最大值的个数:" + tools.valueCount(arr,maxValue));
        int[] indexs = tools.maxIndex(arr);
        System.out.println("所有最大值下标:" + tools.toString(indexs));

        tools.sort(arr);
        System.out.println("排序后arr:" + tools.toString(arr));
        tools.reverse(arr, 1,5);
        System.out.println("反转[1,5]下标范围的元素后:"+ tools.toString(arr));

        int[] before = tools.copyOf(arr, 5);
        System.out.println("复制前面5个元素:" + tools.toString(before));
        int[] doubleArr = tools.copyOf(arr, arr.length*2);
        System.out.println("arr的两倍大数组:" + tools.toString(doubleArr));
        tools.fill(doubleArr, arr.length, doubleArr.length-1, 6);
        System.out.println("doubleArr新扩展的元素用6填充后:" + tools.toString(doubleArr));
    }
}
  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值