24小时热门版块排行榜    

查看: 2053  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 352求调剂 +3 大米饭! 2026-03-22 3/150 2026-03-22 23:28 by king123!
[考研] 289材料与化工(085600)B区求调剂 +3 这么名字咋样 2026-03-22 4/200 2026-03-22 17:56 by 云民大李老师
[考研] 08工科 320总分 求调剂 +11 梨花珞晚风 2026-03-17 11/550 2026-03-22 17:42 by luoyongfeng
[考研] 一志愿华中科技大学071000,求调剂 +4 沿岸有贝壳6 2026-03-21 4/200 2026-03-22 07:21 by ilovexiaobin
[考研] 085600材料与化工306 +4 z1z2z3879 2026-03-21 4/200 2026-03-21 23:44 by ms629
[考研] 一志愿东华大学控制学硕320求调剂 +3 Grand777 2026-03-21 3/150 2026-03-21 19:23 by 简之-
[考研] 材料与化工(0856)304求B区调剂 +3 邱gl 2026-03-20 7/350 2026-03-21 19:05 by 15709483992
[考研] 336求调剂 +5 rmc8866 2026-03-21 5/250 2026-03-21 17:24 by 学员8dgXkO
[考研] 346求调剂[0856] +4 WayneLim327 2026-03-16 7/350 2026-03-21 04:02 by JourneyLucky
[考研] 一志愿华中科技大学,080502,354分求调剂 +5 守候夕阳CF 2026-03-18 5/250 2026-03-21 01:06 by JourneyLucky
[考研] 考研调剂求学校推荐 +3 伯乐29 2026-03-18 5/250 2026-03-20 22:59 by JourneyLucky
[考研] 290求调剂 +7 ^O^乜 2026-03-19 7/350 2026-03-20 21:43 by JourneyLucky
[考研] 一志愿南理工085701环境302求调剂院校 +3 葵梓卫队 2026-03-20 3/150 2026-03-20 19:28 by zhukairuo
[论文投稿] 申请回稿延期一个月,编辑同意了。但系统上的时间没变,给编辑又写邮件了,没回复 10+3 wangf9518 2026-03-17 4/200 2026-03-19 23:55 by babero
[考研] 081700化工学硕调剂 +3 【1】 2026-03-16 3/150 2026-03-19 23:40 by edmund7
[考研] 085600材料与化工求调剂 +6 绪幸与子 2026-03-17 6/300 2026-03-19 13:27 by houyaoxu
[考研] 344求调剂 +6 knight344 2026-03-16 7/350 2026-03-18 20:13 by walc
[考研] 085601专硕,总分342求调剂,地区不限 +5 share_joy 2026-03-16 5/250 2026-03-18 14:48 by haxia
[考研] 考研求调剂 +3 橘颂. 2026-03-17 4/200 2026-03-17 21:43 by 有只狸奴
[考研] 301求调剂 +4 A_JiXing 2026-03-16 4/200 2026-03-17 17:32 by ruiyingmiao
信息提示
请填处理意见