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() + "狗");
}
}
}