资源描述
2.7.1.2 练习 2:生命细胞
***** ** *
** * *
** * *
** ** ****
若一个细胞周围有3个活细胞,当前细胞就活
若一个细胞周围有2个活细胞,当前细胞的生命状态不变
若一个细胞周围有<2或>3,当前细胞就死亡
随机生成10*10的细胞群营,研究历经多少代,群落进入稳定状态。
程序雏形:
char c[10][10];//用于存储细胞阵列
void init(char c[][10]);//用于初始化细胞阵列
void show(char c[][10],int g);//用于显示细胞阵列
int quit(void);//用于接受用户的指令,退出程序
void breed(char c[][10]);//繁殖
srand(time(NULL));
rand();//随机函数
//life.c
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define H 10//宏定义行列便于更改
#define W 10
#define NULL 0
void init(char c[H][W])
{
srand(time(NULL));
int i,j;
for(i=0;i<H;i++)
for(j=0;j<W;j++)
c[i][j]=rand()%2?'*':' ';
}
void show(char c[H][W],int g)
{
int i,j,k=0;//当k在下面进行自增自减的时候,必须进行初始化令k值为0
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
printf("%c",c[i][j]);
if(c[i][j]=='*')
k++;
}
printf("\n");
}
printf("[%d] %d \n",g,k);
}
void quit(void)
{
printf("Press <Q> to quit,press other key to continue...");
char ch;
scanf("%c",&ch);
if(ch=='Q'||ch=='q')
exit(0);
}
void breed(char c[H][W])
{
int i,j;
for(i=0;i<H;i++)
for(j=0;j<W;j++)
{
int u=i-1,d=i+1,l=j-1,r=j+1,k=0;
if(u>=0&&c[u][j]=='*')
k++;
if(d<H&&c[d][j]=='*')
k++;
if(l>=0&&c[i][l]=='*')
k++;
if(r<W&&c[i][r]=='*')
k++;
if(u>=0&&l>=0&&c[u][l]=='*')
k++;
if(u>=0&&r<W&&c[u][r]=='*')
k++;
if(d<H&&l>=0&&c[d][l]=='*')
k++;
if(d<H&&r<W&&c[d][r]=='*')
k++;
if(k==3)
c[i][j]='*';
else
if(k!=2)
c[i][j]=' ';
}
}
int main()
{
char c[H][W];
init(c);
int g;
for(g=1;;g++)
{
show(c,g);
quit();
breed(c);
}
return 0;
}
错误分析:
1)当k需要进行自增自减时候,在声明k的时候,一定要让k值初始化
详解:
1) breed函数
(u,l)
(u,j)
(u,r)
(i,l)
(i,j)
(i,r)
(d,l)
(d,j)
(d,r)
一个点四周共有八个点,这八个点影响它的生命状态,从c[0][0]到c[9][9]这样的顺序一一判断。
2)随机函数:srand(time(NULL));
rand();
这是一个伪随机数,由srand()函数接受一个种子,这个种子是在头文件time.h里面的,接收当前系统时间作为一个种子,种子不同,rand()函数产生的随机数列也会不同,相当于一个种子产生一个随机数列,这个数列无穷大,相同的种子产生的相同的随机数列。
3)rand()%2;
%取余,如:a%b;其中a和b均必须为int类型
a除以b取余数,若a>b,那么余数不会大于b,10%3=1,商为3
若a<b,那么,余数为a,3%10=3,商为0
4)帮助文档,查看系统函数exit();
man exit –S3
在gcc 编译器中,帮助文档的第3章有关于exit函数的详细介绍
展开阅读全文