【设计模式】面向对象作业-超级母牛的故事

留的作业:
农场一头小母牛,
每年生头小母牛,
母牛五岁产母牛,
二十年上多少牛?


马老师给的这个问题我个人感觉不太好理解,就按照我自己的理解吧,我把题目给白话文一下:
农场中引进一只超级母体牛,它每年都可以生一只普通小牛,而它生下的普通小牛到5岁的时候会
生下一只普通小牛,以后就不会再生。问这个农场20年后有多少只牛(包括超级母牛)?

分析问题,这是一个群体繁衍的问题,一定要在每个年份判断清楚谁该生谁不该生。

首先我们要确定主角,肯定是牛了,所以我们设计一个Cow类来代表牛类:

Cow.java:

package cn.edu.OOtest;


public class Cow {
		private int age;


		public int getAge() {
			return age;
		}


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

里面有一个age属性,是用来记录牛的年龄的,这样我们就可以清楚的知道哪头牛5岁了该生牛犊了。


确定了实体类,我们下面来设计生长算法(下面用母体代指超级母牛):
1.首先,母体每年都要生牛犊
2.其次,每过一年所有普通牛(除母体)都涨一岁
3.再次,每一只普通牛到5岁就会出生一只年龄为0的牛犊
4.最后,限制条件,除母体每年生一只牛外,普通牛一生只有5岁时生牛犊


为了统计方便,我决定将所有牛放在"牛圈"里(List集合中),新生牛犊就add。


我写的代码:
package cn.edu.OOtest;


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


public class CowProductTest {
		public static void main(String[] args) {
			 Cow cowParent=new Cow();//这是母体
			 cowParent.setAge(-1);//年龄是-1为了区分母体,因为它每年都生孩子
			 List<Cow> cowList=new ArrayList<Cow>();//list集合,相当于牛圈
			 cowList.add(cowParent);//将母体装入牛圈
			 int year=0;
			 while(year<20){
				 year++;
				 for(int i=0;i<cowList.size();i++){
					 Cow cow=cowList.get(i);
					 if(cow.getAge()!=-1){//非母体的所有牛都涨一岁
						 cow.setAge(cow.getAge()+1);
					 }
					 if(cow.getAge()==5){//有牛长到5岁,就生出一只新的牛
						 Cow cowSon=new Cow();
						 cowSon.setAge(0);//刚出生的牛的年龄为0周岁
						 cowList.add(cowSon);
					 }
				 }
				 //下面是母体每年必生的一只牛
				 Cow cowSon=new Cow();
				 cowSon.setAge(0);//刚出生的牛的年龄为0周岁
				 cowList.add(cowSon);
			 }
			 
			 System.out.println("二十年后共有"+cowList.size()+"只牛");
		}
}
运行结果:二十年后共有57只牛

我们来手算一下这段程序是否正确:
我把year<20改成year<6,也就是6年后是多少,程序运行后是8只牛,下面手算一下:
第一年:母牛一只,新生小牛一只(0岁),共2只
第二年:母牛一只,新生小牛两只(1岁,0岁),共3只
第三年:母牛一只,新生小牛三只(2岁,1岁,0岁),共4只
第四年:母牛一只,新生小牛四只(3岁,2岁,1岁,0岁),共5只

第五年:母牛一只,新生小牛五只(4岁,3岁,2岁,1岁,0岁),共6只

第六年:母牛一只,新生小牛六只(5岁,4岁,3岁,2岁,1岁,0岁)+普通牛生的一只(0岁),共8只

刚好是8只,说明程序没有问题。


完成了视屏中马老师布置的训练面向对象思想的作业,说实话这里面没有体现多少面向对象的思
想,也许是因为之前用面向过程的思想做ACM久了有些习惯一时半会改不了吧。见笑了。


如果有更好的程序,也希望大家提出更好的意见。

转载请注明出处: http://blog.csdn.net/acmman
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值