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

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


马老师给的这个问题我个人感觉不太好理解,就按照我自己的理解吧,我把题目给白话文一下:
农场中引进一只超级母体牛,它每年都可以生一只普通小牛,而它生下的普通小牛到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
相关文章
|
3天前
|
设计模式 Java 关系型数据库
面向对象设计原则、设计模式与动态类型语言
面向对象设计原则、设计模式与动态类型语言
|
23天前
|
设计模式 存储 Java
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
14 0
|
2月前
|
设计模式 算法 架构师
【搞懂设计模式】设计模式与面向对象原则
【搞懂设计模式】设计模式与面向对象原则
23 1
|
2月前
|
设计模式 Java 编译器
Java 设计模式最佳实践:一、从面向对象到函数式编程
Java 设计模式最佳实践:一、从面向对象到函数式编程
72 0
|
10月前
|
设计模式
趣解设计模式之《同学们,交作业啦!》
趣解设计模式之《同学们,交作业啦!》
64 1
|
11月前
|
设计模式 算法 C#
28【WinForm】C#实现商场收银软件,从面向过程到面向对象,设计模式的应用
实现商场收银系统从简单的面向过程到面向对象的演变。
111 0
|
12月前
|
设计模式 算法 关系型数据库
设计模式——设计模式简介、分类及面向对象设计原则
23 种设计模式中有些模式今天已经不流行了,有些模型已经被语言机制替代了,有些模式你可能常常会忘记,但这些都不重要,重要的是设计原则,因为有了这些设计原则,你有可能发明自己的模式,你也可以理解未来千千万万其他领域的模式。
57 1
|
设计模式 Java
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
173 0
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
|
12月前
|
设计模式 存储 安全
【大话设计模式】面向对象基础
【大话设计模式】面向对象基础
|
12月前
|
设计模式 C++
面向对象方法-大话设计模式+J2SE视频
面向对象方法-大话设计模式+J2SE视频

相关实验场景

更多