24小时热门版块排行榜    

查看: 2186  |  回复: 3

MajorMei

金虫 (小有名气)

[求助] 修改一个C语言生命游戏程序

学校的project,一个生命游戏的程序:
------------------------------------------------------------------------------------------------------
#include
#include

#define ARRAYSIZE1 3       /* array size, predefined by the user */
#define ARRAYSIZE2 7
#define NSTEPS 2    /* number of steps take */

int main(int argc, char *argv[]) {
   
    int i, j, n, im, ip, jm, jp, ni, nj, nsum, isum;
    int **old, **new;
    float x;
    FILE *outFile;
        
    ni = ARRAYSIZE1 + 2;  /* add 2 for left and right ghost cells */
  //  nj = ARRAYSIZE2 + 2;
    old = malloc(ni*sizeof(int*));
    new = malloc(ni*sizeof(int*));
   
    for(i=0; i         old = malloc(nj*sizeof(int));
        new = malloc(nj*sizeof(int));
    }
   
    /*  initialize elements of old to 0 or 1 */
   
    for(i=1; i<=ARRAYSIZE1; i++){
        for(j=1; j<=ARRAYSIZE2; j++){
          x = rand()/((float)RAND_MAX + 1);
            if(x<0.5){
                old[j] = 0;
            } else {
                old[j] = 1;
            }
        }
    }
   
    /*  time steps */
    for(n=0; n         
        /* corner boundary conditions */
        old[0][0] = old[ARRAYSIZE1][ARRAYSIZE2];
        old[0][ARRAYSIZE2+1] = old[ARRAYSIZE1][1];
        old[ARRAYSIZE1+1][ARRAYSIZE2+1] = old[1][1];
        old[ARRAYSIZE1+1][0] = old[1][ARRAYSIZE2];
        
        /* left-right boundary conditions */
        
        for(i=1; i<=ARRAYSIZE1; i++){
            old[0] = old[ARRAYSIZE2];
            old[ARRAYSIZE2+1] = old[1];
        }
        
        /* top-bottom boundary conditions */
        
        for(j=1; j<=ARRAYSIZE2; j++){
            old[0][j] = old[ARRAYSIZE1][j];
            old[ARRAYSIZE1+1][j] = old[1][j];
        }
        
        for(i=1; i<=ARRAYSIZE1; i++){
            for(j=1; j<=ARRAYSIZE2; j++){
                im = i-1;
                ip = i+1;
                jm = j-1;
                jp = j+1;
               
                nsum =  old[im][jp] + old[jp] + old[ip][jp]
                + old[im][j ]              + old[ip][j ]
                + old[im][jm] + old[jm] + old[ip][jm];
               
                switch(nsum){
                        
                    case 3:
                        new[j] = 1;
                        break;
                        
                    case 2:
                        new[j] = old[j];
                        break;
                        
                    default:
                        new[j] = 0;
                }
            }
        }
        
        
        for(i=1; i<=ARRAYSIZE1; i++){
            for(j=1; j<=ARRAYSIZE2; j++){
                old[j] = new[j];
            }
        }
    }
   
    /* sum the number of living cells */
    isum = 0;
    for(i=1; i<=ARRAYSIZE1; i++){
        for(j=1; j<=ARRAYSIZE2; j++){
            isum = isum + new[j];
        }
    }
    printf("\nNumber of living cells = %d\n", isum);
   
    return 0;
}
------------------------------------------------------------------------------------------------------




现在的程序直接定义了生命游戏中的初始条件,如下
#define ARRAYSIZE1 3       /* array size, predefined by the user */
#define ARRAYSIZE2 7
#define NSTEPS 2    /* number of steps take */
直接运行可以输出存活细胞数,如下
printf("\nNumber of living cells = %d\n", isum);
   
return 0;




想把程序改成满足以下条件的新程序:

运行程序的时候接受输入,格式为:
[first argument: 演化次数steps] [second argument:调用的文件名]

其中调用的文件包含了初始的grid,格式为
m 行数
n 列数
举例:
5
6
01100
01110
01000
00000
00000
00000

输出格式不变,输出存活细胞数。
请问这个程序要怎么修改呢?请熟悉c语言的前辈多多指教,在线等回复。拜谢!

[ Last edited by MajorMei on 2012-11-28 at 12:06 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

缘不可解

新虫 (初入文坛)

【答案】应助回帖

感谢参与,应助指数 +1
还需要读文件??请麻烦说的具体点,输入数据的具体格式是什么、
坚持奋斗,学会感恩,懂得珍惜
2楼2012-11-28 13:38:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

MajorMei

金虫 (小有名气)

引用回帖:
2楼: Originally posted by 缘不可解 at 2012-11-28 13:38:25
还需要读文件??请麻烦说的具体点,输入数据的具体格式是什么、

想把程序改成用户自定义某些参数运行的模式,输入的数据分为两部分,比如输入

5    grid.txt

就说明生命游戏要执行五步,初始矩阵是grid.txt这个文件里面的样子

grid.txt由三部分构成:m,n和矩阵

m 为行数
n 为列数

举例:
5
6
01100
01110
01000
00000
00000
00000

例子中是grid.txt这个文件的内容

通过命令行中的grid.txt调用此文件中的信息,然后运行程序,输出存活的细胞数。

谢谢您的回复,如果需要更详细的信息我会尽快回复您。请指点!
3楼2012-11-28 13:57:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖


感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢骠骑将军 2012-11-29 23:34:19
读取参数得到执行步数和文件名
读取文件是通用的,先读到行列数,动态分配内存生成矩阵,然后读取内容作为初始状态.
你只需要写一个函数Run(int **mat, int m, int n),这个函数里面就是根据生命游戏的规则,判断邻域来设置当前元素的值.唯一复杂的就是判断4个角点和4条边界,其他内部元素的邻域都是3*3方块中的其他8个.然后求和,根据设定好的规则来设置当前的值.
仔细分析一下不难的.用循环控制运行次数等于指定的执行步数,每次都去调用Run()就行了
Run的伪代码实现,分情况可以有其他分法,例如把左右上角的情况写进第一行里面当做特殊情况处理,不过对于if...else...没有什么简化的空间,写出来看着清楚一些.
CODE:

void Run(int **mat, int m, int n)
{
        int i,j;
        int sum;
        for (i=0;i         {
                for (j=0;j                 {
                        sum = 0;
                        if (i==0 && j==0) // 左上角
                        {
                                // 设置sum
                        }
                        else if (i==m-1 && j==0) // 左下角
                        {
                                // 设置sum
                        }
                        else if (i==0 && j==n-1) // 右上角
                        {
                                // 设置sum
                        }
                        else if (i==m-1 && j==n-1) // 右下角
                        {
                                // 设置sum
                        }
                        else if (i==0) // 第一行
                        {
                                // 设置sum
                        }
                        else if (i==m-1) // 最后一行
                        {
                                // 设置sum
                        }
                        else if (j==0) // 第一列
                        {
                                // 设置sum
                        }
                        else if (j==n-1) // 最后一列
                        {
                                // 设置sum
                        }
                        else // 其他内部元素
                        {
                                // 设置sum
                        }

                        if (sum==3) // 邻域等于3,当前cell活
                        {
                                mat[m][n] = 1;
                        }
                        else if (sum!=2) // 领域不是3也不是2,当前cell死(根据你上面的规则,看起来2的时候不变)
                        {
                                mat[m][n] = 0;
                        }
                }
        }
}

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2012-11-28 19:07:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 MajorMei 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 9zw1gfyi7x 2026-08-01 3/150 2026-08-01 19:00 by Kddn1pB6pAzX
[考博] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 9zw1gfyi7x 2026-08-01 3/150 2026-08-01 18:51 by Kddn1pB6pAzX
[博后之家] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 9zw1gfyi7x 2026-08-01 9/450 2026-08-01 18:43 by Kddn1pB6pAzX
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 9zw1gfyi7x 2026-08-01 7/350 2026-08-01 18:42 by Kddn1pB6pAzX
[公派出国] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 9zw1gfyi7x 2026-08-01 8/400 2026-08-01 18:31 by Kddn1pB6pAzX
[博后之家] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 9zw1gfyi7x 2026-08-01 6/300 2026-08-01 18:31 by Kddn1pB6pAzX
[教师之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 9zw1gfyi7x 2026-08-01 9/450 2026-08-01 18:30 by Kddn1pB6pAzX
[硕博家园] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +3 9zw1gfyi7x 2026-07-31 10/500 2026-08-01 18:03 by Kddn1pB6pAzX
[博后之家] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 jzg3xk1po8 2026-07-31 10/500 2026-08-01 17:51 by Kddn1pB6pAzX
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +4 jzg3xk1po8 2026-07-31 7/350 2026-08-01 17:51 by Kddn1pB6pAzX
[基金申请] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +4 jzg3xk1po8 2026-07-31 12/600 2026-08-01 17:50 by Kddn1pB6pAzX
[教师之家] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 jzg3xk1po8 2026-07-31 9/450 2026-08-01 17:43 by Kddn1pB6pAzX
[基金申请] 面上再次挂了,太难了,躺也躺不了,倦也卷不过,小学校之殇! +16 低垂的野花 2026-07-31 22/1100 2026-08-01 16:39 by Cathyau
[基金申请] 2026年国自然面上资助率 +15 布布和一二 2026-07-30 19/950 2026-08-01 15:18 by 40862026
[基金申请] 微信指数没变化,科研之友没阅读 +14 wangze12014 2026-07-28 18/900 2026-07-31 18:35 by lzchaihuo
[教师之家] 基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊 +8 锦衣卫寒战 2026-07-28 8/400 2026-07-31 18:13 by beefly
[基金申请] 系统今天又提示维护了,估计离放榜不远了 +11 winnerche 2026-07-29 15/750 2026-07-30 23:08 by jnhyjjm
[有机交流] 产物和副产物价值比较 30+4 小汤02 2026-07-27 5/250 2026-07-30 12:44 by czyzsu
[基金申请] 时间戳他又来了 +14 晓晓爱翠翠 2026-07-26 17/850 2026-07-29 16:30 by 呵呵二哥
[分析] 水蒸气蒸馏法乳化现象 +3 月光娇娇 2026-07-26 3/150 2026-07-26 23:25 by caiyun
信息提示
请填处理意见