java课上第十次实验(题解)

1. 肥波的故事
老张的老板在上大学时其实计算机学的不怎么好,但谁让人家会(you)经(qian)营呢,软件开发这个事儿倒也做的风生水起,这不,老板找老张聊天,就为当初学习C语言的痛苦唏嘘不已,尤其是当初不理解的那个所谓"肥波(Fibonacci)数列",是怎么也写不出来啊,老张作为码神一只,心念一动,把你招了过来,咱们写个类哈,想输出多少个肥波数就输出多少肥波数,给老板圆了当初的那个肥波梦。
老张先写出了测试类:

	public static void main(String[] args) {
		for(int i:new Fibo(20)) System.out.println(i);
	}

据说这样就能输出20个Fibonacci数,你能帮老张写出这个Fibo类吗?

题解(仅供参考):

测试类中代码

for(int i:new Fibo(20))

直接运行会报错,是因为Fibo(20)不可以被迭代,我们要对Fibo类实现接口Iterable<Integer>使它可迭代。

import java.util.Iterator;

public class Fibo implements Iterable<Integer> {
    private int n; // 数列中元素个数
    
    // 构造函数,初始化参数指定需要生成多少个数字
    public Fibo(int count) {
        n = count;
    }
    
    // 实现Iterable接口,返回迭代器对象,用于遍历斐波那契数列
    @Override
    public Iterator<Integer> iterator() {
        return new FiboIterator(n);
    }

    // 由于需要访问构造函数传递的参数n,定义为内部类比较方便
    private static class FiboIterator implements Iterator<Integer> {
        private int n;  // 剩余迭代次数
        private int current = 1; // 当前值
        private int next = 1; // 下一个值
        
        // 构造函数,初始化需要迭代的数量和当前和下一个值
        public FiboIterator(int count) {
            n = count;
        }

        @Override
        public boolean hasNext() {
            return n > 0;
        }
        
        //实现f[n] = f[n-1] + f[n-2]
        @Override
        public Integer next() {
            n--;
            int result = current; // 输出当前值
            current = next; // 更新当前值为下一个值
            next += result; // 计算下一个值
            return result;
        }
    }
}
  • FiboIterator 是实际执行数字生成和迭代操作的迭代器。 它跟踪当前迭代的位置,同时使用当前和下一个值来计算下一个斐波那契数,并返回前一个。

通过传递给构造函数的参数,您可以指定要生成多少个数。在main()方法中,20被传递给Fibo的构造函数,表示我们想要生成前二十个Fibonacci数(即F_0到F_{19})。循环遍历得到的迭代器,这样就可以将每个数打印到控制台上。

2. 又接到了宠物店的需求

老张在不断的开发中过着自己的日子,新的需求连着下一个新的需求,这次老张接到了一个宠物店管理软件的开发要求,下面是一部分需求陈述

宠物店的猫猫和狗狗们每天吃饭睡觉,吃多少东西睡多长时间当然和猫猫狗狗的健康息息相关。
每只猫猫都吃鱼,睡12小时
每只狗狗都吃肉,睡8小时
店里总会保持一定数量的猫猫和狗狗,老板期望统计猫猫吃的鱼的数量和狗狗吃的肉的数量(单位:两),当然,也期望能得到每一只猫猫和狗狗的特征,其中:
猫猫的特征包括年龄和毛色
狗狗的特征包括体重和品种
当然,每只猫猫和狗狗也会有自己的名字
期望能在统计时能输出:
猫猫总计吃鱼xxx两,狗狗总计吃肉xxx两
猫猫总计睡眠xxx小时,狗狗总计睡眠xxx小时
输出每只宠物信息时:
猫猫xxx(名字)xx岁,是一只可爱的x色的猫猫
狗狗xxx体重xx公斤,是一只xx狗

题解(仅供参考):

利用面向对象的思想我们可以有Pet类为Cat类和Dog类的父类,再在宠物店类中定义猫猫狗狗的信息和统计修猫修勾的吃饭睡觉。

在Pet类中定义它们的共同特征,如名字,吃的东西,睡眠时间等。

​public class Pet {
    protected String name;
    protected String food;
    protected int sleepTime;
    protected int sleepCount;

    public Pet(String name, String food, int sleepTime) {
        this.name = name;
        this.food = food;
        this.sleepTime = sleepTime;
        this.sleepCount = 0;
    }

    public void eat() {
        System.out.println(this.name + "正在吃" + this.food);
    }
}

在Cat类和Dog类中,我们可以定义它们的特有特征,如毛色和品种等,并且可以重载父类中的方法,实现它们特有的吃和睡觉行为。

public class Cat extends Pet {
    private String color;
    private int age;
    private int eat;

    public int getEat() {
        return eat;
    }

    public void setEat(int eat) {
        this.eat = eat;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Cat(String name, String color, int age , int eat) {
        super(name, "鱼", 12);
        this.color = color;
        this.age = age;
        this.eat = eat;
    }
}
public class Dog extends Pet {
    private String breed;
    private int weight;
    private int eat;

    public String getBreed() {
        return breed;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getEat() {
        return eat;
    }

    public void setEat(int eat) {
        this.eat = eat;
    }

    public Dog(String name, String breed, int weight,int eat) {
        super(name, "肉", 8);
        this.breed = breed;
        this.weight = weight;
        this.eat = eat;
    }
}

有了以上类,就可以创建一个宠物店了!!!!

import java.util.ArrayList;
import java.util.List;

//定义宠物店类
public class PetShop {
    private List<Cat> catList;
    private List<Dog> dogList;

    public PetShop() {
        this.catList = new ArrayList<>();
        this.dogList = new ArrayList<>();
    }

    public void addCat(Cat cat) {
        this.catList.add(cat);
    }

    public void addDog(Dog dog) {
        this.dogList.add(dog);
    }

    public int getFishCount() {
        int fishCount = 0;
        for (Cat cat : this.catList) {
            fishCount += cat.getEat();
        }
        return fishCount;
    }

    public int getMeatCount() {
        int meatCount = 0;
        for (Dog dog : this.dogList) {
            meatCount += dog.getEat();
        }
        return meatCount;
    }

    public void getSleepTime() {
        int catSleepTime = 0;
        for (Cat cat : this.catList) {
            catSleepTime += cat.sleepTime;
        }

        int dogSleepTime = 0;
        for (Dog dog : this.dogList) {
            dogSleepTime += dog.sleepTime;
        }

        System.out.println("猫猫总计睡眠" + catSleepTime + "小时,狗狗总计睡眠" + dogSleepTime + "小时");
    }

    public void showPetsInfo() {
        for (Cat cat : this.catList) {
            System.out.println("猫猫" + cat.name + cat.getAge() + "岁,是一只可爱的" + cat.getColor() + "色的猫猫");
        }
        for (Dog dog : this.dogList) {
            System.out.println("狗狗" + dog.name + "体重" + dog.getWeight() + "公斤,是一只" + dog.getBreed() + "狗");
        }
    }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值