细胞分裂模拟

功能:

        一种细胞在诞生(即上次分裂)后会在500~2000秒内分裂为两个细胞,每个细胞又按照同样的规律继续分裂。

        本程序模拟了细胞分裂的过程,输出了每个细胞分裂的时间。

环境:VS2010。

           控制台应用程序。

程序:

// cell_split_simulation_use_priority_queue.cpp : 定义控制台应用程序的入口点。
//细胞分裂模拟,输出每个细胞分裂的时间
//一种细胞在诞生(即上次分裂)后会在500~2000秒内分裂为两个细胞,
//每个细胞又按照同样的规律继续分裂。
//

#include "stdafx.h"
#include<queue>
#include<iostream>
#include<cstdlib>  //cstdlib是C++里面的一个常用函数库, 等价于C中的<stdlib.h>。提供一些函数与符号常量。
#include<ctime>

using namespace std;

const int SPLIT_TIME_MIN=500;
const int SPLIT_TIME_MAX=2000; //细胞分裂最短和最长时间

class Cell;
priority_queue<Cell>cellQueue;

class Cell   //细胞类
{
private:
	static int count;  //细胞总数
	int id;            //当前细胞编号
	int time;          //细胞分裂时间
public:

	Cell(int birth):id(count++)  //birth为细胞诞生时间
	{
		//初始化,确定该细胞分裂时间
		time=birth+(rand()%(SPLIT_TIME_MAX - SPLIT_TIME_MIN)) + SPLIT_TIME_MIN;
	}

	int getId()const
	{
		return id; //得到细胞编号
	}

	int getSplitTime()const
	{
		return time; //得到当前细胞分裂时间
	}

	bool operator < (const Cell & s) const
	{
		return time > s.time;  //定义“<”
	}

	void split()  //细胞分裂
	{
		Cell child1(time),child2(time);  //建立两个子细胞
		cout<<time<<"s : Cell #"<<id<<" splits to #"<<child1.getId()<<"and #"<<child2.getId()<<endl;
		cellQueue.push(child1);//将第一个细胞压入优先级队列
		cellQueue.push(child2);//将第二个细胞压入优先级队列
	}
};

int Cell::count = 0;

int _tmain(int argc, _TCHAR* argv[])
{
	srand(static_cast<unsigned>(time(0)));
	int t;                   //用户定义模拟细胞分裂的时间长度
	cout<<"Stimulation time:";
	cin>>t;

	cellQueue.push(Cell(0)); //将第一个细胞压入优先级队列

	while(cellQueue.top().getSplitTime() <= t)
	{
		cellQueue.top().split(); //模拟下一个细胞的分裂
		cellQueue.pop();         //将刚刚分裂的细胞弹出
	}

	int a;
	cin>>a;  //防止程序闪退

	return 0;
}

运行结果:

补充:

随机函数:rand()

时间函数:time() ,获得一个以整数表示的当前时间(精确到秒)。

每个细胞按照产生的顺序从小到大编号,

每个细胞对象有一个分裂时间:诞生时间+随机的时间差

细胞类Cell的“<”运算符:按照细胞分裂时间的反序定义的,即如果a对象比b象分裂时间要晚,那么就有a<b。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值