题目: 模拟一个微型生态系统。有青草、兔子、狐狸三种生物。可以用网格表示整个环境,每个格子内用不同字母表示不同事物:空地E青草G兔子R狐狸F。系统规则如下:
1)初始状态随机出现GRF;
2)若格子为G,下一轮其周边八个格子中为E的格子中会至少有一个变为G;
3)若格子为R,若其周围八个格子都没有G或其中一个出现F,则下一轮此格子为E;否则其中一个为G的格子变为R;
4)若格子为F,其周围八个格子都没有R,则下一轮此格子为E;否则其中一个为R的格子变成F;
5)若格子为E,则下一轮会以一定的概率变为G。
请分析并画出类结构图,利用面向对象程序设计思想,完成模拟过程。(必须用到类的继承、虚函数)
问题分析:
感觉没有很大的必要对每一种生物创建一个类,并进行派生,所以这里我只创建了两个类,一个世界(world)作为基类,一个生态系统(ShengTai)作为派生类,继承于基类(world),输出函数(Display)作为虚函数,创建基类指针调用派生类的虚函数。类结构图如下:

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+tPrC68q1z9ajuqOo1MvQ0Lu3vrPOqk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTCjqTwvcD4KPHA+Lyqz9cq8u6/J+sysz7XNs7Tz0KHOqjEwKjEwo6i/ydLUuMSx5KOpo6y/1bXYseTOqsfgst212LXEuMXCys6qNjAlo6i/ydLUuMSx5KOpo6y55tTy1tDEs9Cptdi3vda4s/bEs9Cpx+m/9s/Co6zWwcnZ0ru49rjEseS78tXfxuTW0NK7uPa12Le9uMSx5KOs1eLA7775sLTV1bTTyc+1vc/CtNPX87W909K1xMuz0PKjrNLUs/bP1sL61+PM9bz+tcS12tK7uPa9+NDQuMSx5KOsxuTT4LK7seShoyovPC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#include
#include
#include
using namespace std; const int col = 10; const int row = 10;//初始化生态
系统大小
const int TurnGrass = 60;//空地变为青草地的概率 class world { public: void Init(); virtual void Display(); }; void world::Init() { cout<<"world init"<
= TurnGrass) tmp[i][j] = 1; break; } case 1: { turned = 0; if(s[i-1][j-1] == 0) { tmp[i-1][j-1] = 1; turned = 1; } if(s[i-1][j] == 0&&turned == 0) { tmp[i-1][j] = 1; turned = 1; } if(s[i-1][j+1] == 0&&turned == 0) { tmp[i-1][j+1] = 1; turned = 1; } if(s[i][j-1] == 0&&turned == 0) { tmp[i][j-1] = 1; turned = 1; } if(s[i][j+1] == 0&&turned == 0) { tmp[i][j+1] = 1; turned = 1; } if(s[i+1][j-1] == 0&&turned == 0) { tmp[i+1][j-1] = 1; turned = 1; } if(s[i+1][j] == 0&&turned == 0) { tmp[i+1][j] = 1; turned = 1; } if(s[i+1][j+1] == 0&&turned == 0) { tmp[i+1][j+1] = 1; turned = 1; } break; } case 2: { turned = 0; if(s[i-1][j-1] == 3) { tmp[i-1][j-1] = 3; turned = 1; } if(s[i-1][j] == 3&&turned == 0) { tmp[i-1][j] = 3; turned = 1; } if(s[i-1][j+1] == 3&&turned == 0) { tmp[i-1][j+1] = 3; turned = 1; } if(s[i][j-1] == 3&&turned == 0) { tmp[i][j-1] = 3; turned = 1; } if(s[i][j+1] == 3&&turned == 0) { tmp[i][j+1] = 3; turned = 1; } if(s[i+1][j-1] == 3&&turned == 0) { tmp[i+1][j-1] = 3; turned = 1; } if(s[i+1][j] == 3&&turned == 0) { tmp[i+1][j] = 3; turned = 1; } if(s[i+1][j+1] == 3&&turned == 0) { tmp[i+1][j+1] = 3; turned = 1; } if(turned == 0&& s[i-1][j-1] != 1&&s[i-1][j] != 1&& s[i-1][j+1] != 1&&s[i][j-1] != 1&& s[i][j+1] != 1&&s[i+1][j-1] != 1&& s[i+1][j] != 1&&s[i+1][j+1] != 1) { if(s[i-1][j-1] == 1) { tmp[i-1][j-1] = 2; turned = 1; } if(s[i-1][j] == 1&&turned == 0) { tmp[i-1][j] = 2; turned = 1; } if(s[i-1][j+1] == 1&&turned == 0) { tmp[i-1][j+1] = 2; turned = 1; } if(s[i][j-1] == 1&&turned == 0) { tmp[i][j-1] = 2; turned = 1; } if(s[i][j+1] == 1&&turned == 0) { tmp[i][j+1] = 2; turned = 1; } if(s[i+1][j-1] == 1&&turned == 0) { tmp[i+1][j-1] = 2; turned = 1; } if(s[i+1][j] == 1&&turned == 0) { tmp[i+1][j] = 2; turned = 1; } if(s[i+1][j+1] == 1&&turned == 0) { tmp[i+1][j+1] = 2; turned = 1; } } break; } case 3: { turned = 0; if(i == 0) { if(j == 0) { if(s[i][j+1] != 2&&s[i+1][j] != 2&&s[i+1][j+1] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } else if(j == row-1) { if(s[i][j-1] != 2&&s[i+1][j-1] != 2&&s[i+1][j] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } else { if(s[i][j-1] != 2&&s[i][j+1] != 2&&s[i+1][j-1] != 2&&s[i+1][j] != 2&&s[i+1][j+1] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } } else if(i == col-1) { if(j == 0) { if(s[i-1][j] != 2&&s[i-1][j-1] != 2&&s[i][j+1] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } else if(j == row-1) { if(s[i-1][j-1] != 2&&s[i-1][j] != 2&&s[i][j-1] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } else { if(s[i-1][j-1] != 2&&s[i-1][j] != 2&&s[i-1][j+1] != 2&&s[i][j-1] != 2&&s[i][j+1] != 2&&turned == 0) { tmp[i][j] = 0; turned = 1; } } } else { if(s[i-1][j-1] != 2&&s[i-1][j] != 2&&s[i-1][j+1] != 2&&s[i][j-1] != 2&&s[i][j+1] != 2&&s[i+1][j-1] != 2&&s[i+1][j] != 2&&s[i+1][j+1] != 2) { tmp[i][j] = 0; turned = 1; } } if(s[i-1][j-1] == 2&&turned == 0) { tmp[i-1][j-1] = 3; turned = 1; } if(s[i-1][j] == 2&&turned == 0) { tmp[i-1][j] = 3; turned = 1; } if(s[i-1][j+1] == 2&&turned == 0) { tmp[i-1][j+1] = 3; turned = 1; } if(s[i][j-1] == 2&&turned == 0) { tmp[i][j-1] = 3; turned = 1; } if(s[i][j+1] == 2&&turned == 0) { tmp[i][j+1] = 3; turned = 1; } if(s[i+1][j-1] == 2&&turned == 0) { tmp[i+1][j-1] = 3; turned = 1; } if(s[i+1][j] == 2&&turned == 0) { tmp[i+1][j] = 3; turned = 1; } if(s[i+1][j+1] == 2&&turned == 0) { tmp[i+1][j+1] = 3; turned = 1; } break; } default:cout<<"error develop"<
Display(); p = &your; p->Display();//通过基类指针调用派生类的虚函数 ShengTai w; w.Init(); int i; cout<<"input 1 to display,2 to develop,3 to exit."<
>i; while(i != 3) { if(i == 1) w.Display(); if(i == 2) w.Develop(); cout<<"input 1 to display,2 to develop,3 to exit."<
>i; } return 0; }
运行结果:
1. 类的继承与虚函数的实现

2. 生态系统中空地、青草、兔子、狐狸演化的过程
演化一次

演化二次