在某处,我的if语句搞砸了,我的GSA不能解释我

时间:2018-01-31 14:29:06

标签: c if-statement multidimensional-array

所以,这应该通过一个0' s,' s和1; s(最初都是字符形式,但我设置为整数)的文件,但是当我运行它代码计算相邻的活细胞是错误的,将5个点拉到3个点,其中我的邻居应该有2个。

电流输出; 每个单元格有多少个邻居的邻居方块(计算所有8个周围的区块),然后在基本的生命操作游戏发生后更新矩阵,最后是原始矩阵 这是下面的原始矩阵

0; 0; 0; 0; 0; 0

0; 0; 0; 1; 0; 0

0; 1; 0; 1; 0; 0

0; 0; 1; 1; 0; 0

0; 0; 0; 0; 0; 0

0; 0; 0; 0; 0; 0

其余的过程完美无缺,但邻居的计算并不奏效。我做错了什么?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>  
void manage_board(FILE *input, int counter, int iterate);
int main (int argc, const char * argv[]){
    FILE *input = fopen(argv[1],"r");
    int counter = 0,temp1=0,temp2=0;
    char temp = fgetc(input);
    while (temp != EOF){
        if (temp == '1' || temp == '0'){
        counter+=1;
        }
        temp = fgetc(input) ;
    }
    counter = sqrt(counter);
    rewind(input);
    manage_board(input,counter, atoi(argv[2]));
    fclose(input);
    return 0;
}
void manage_board(FILE *input, int counter, int iterate){
    int matrix[counter][counter];
    FILE *output = fopen("output.csv","w");
    int original[counter][counter];
    int updated[counter][counter];
    int rows = 0,cols = 0, neighbors =0;
    char temp = fgetc(input);
    /*for (int i=0; i<counter; i++){
        for (int j=0; j<counter; j++){
            updated[i][j] = 0; 
        }   
        printf ("\n");
    }*/
    while (temp != EOF){
        //printf("%c",temp);
        if (temp == '1' && temp != ';'){
            matrix[cols][rows] = 1;
            rows++;
        }
        else if (temp == '0' && temp != ';'){
            matrix[cols][rows] = 0;
            rows++;
        }
        if (rows==6){
            cols++;
            rows=0;
        }       
        temp = fgetc(input);
    }   
    for (int i=0; i<counter; i++){
        for (int j=0; j<counter; j++){
            updated[i][j] = 0;          
        }   
        //printf ("\n");
    }
    for (int i=0; i<counter; i++){
        for (int j=0; j<counter; j++){
            original[i][j] =matrix[i][j]; 
        }   
        //printf ("\n");
    }   
    for (int loops = 0; loops < iterate;loops++){
        for (int i=0; i<counter; i++){
            for (int j=0; j<counter; j++){              
                if ( i !=counter-1){ //down one
                    if(matrix[i+1][j] == 1){
                        neighbors ++;
                    }
                }
                if ( i !=0){//up one
                    if(matrix[i-1][j] == 1){
                        neighbors++;
                    }
                }
                if ( j != counter-1){//right one
                    if (matrix[i][j+1] == 1){
                    neighbors++;
                    }
                }
                if (j !=0 ){//left one
                    if (matrix[i][j-1] == 1 ){
                        neighbors++;
                    }
                }
                if (i !=counter-1 && j != counter-1){//bot right
                    if(matrix[i+1][j+1] == 1)
                        neighbors++;
                }
                if (j != counter-1 && i !=0 ){//top right
                    if(matrix[i-1][j+1] == 1){
                        neighbors++;
                    }
                }
                if (j !=0 && i !=0){//top left
                    if (matrix[i-1][j-1] == 1){
                        neighbors++;
                    }
                }
                if (i !=counter-1 && j !=0 ){//bottom left
                    if (matrix[i+1][j-1] == 1){
                        neighbors++;
                    }
                }
                ///printf("%d", matrix[i][j]);
                //printf ("%d ",neighbors);
                if (neighbors < 2 ){
                    updated[i][j]=0;
                }
                else if (neighbors == 2 && matrix[i][j] == 1)
                    updated[i][j]=1;
                else if (neighbors > 3){
                    updated[i][j]=0;
                }
                else if (neighbors = 3){
                    updated[i][j]=1;
                }
                printf("%d ",neighbors);
                neighbors = 0;
            }
            printf("\n");
        }   
        for (int i=0; i<counter; i++){
            for (int j=0; j<counter; j++){
                matrix[i][j]= updated[i][j];
                printf("%d",updated[i][j]);
                updated[i][j] = 0;
            }
            printf("\n");
        }
    }
        printf("original board\n");
        for (int i=0; i<counter; i++){
            for (int j=0; j<counter; j++){
                printf("%d", original[i][j]);
            }
            printf ("\n");
        }       
        //printf(" \nnew matrix\n\n");
/*      for (int i=0; i<counter; i++){
            for (int j=0; j<counter; j++){
                    if (updated[i][j] == 1){
                        fprintf( output, "%d %d \n", i, j);
                        //printf(updated)
                    }
            }
        }
    */  
/* A live cell with fewer than two live neighbors dies. 
A live cell with more than three live neighbors also dies. 
A live cell with exactly two or three live neighbors lives. 
A dead cell with exactly three live neighbors becomes alive.*/
}

这是我的输出

0 0 1 1 1 0
1 1 3 1 3 0
1 1 5 3 3 0
1 3 3 2 3 0
0 1 3 3 1 0
0 0 0 0 0 0


000000
001010
000110
011110
001100
000000
original board
000000
000100
010100
001100
000000
000000

应出现邻居矩阵

0 0 1 1 1 0
1 1 3 1 2 0
1 1 5 3 3 0
1 2 3 2 2 0
0 1 2 2 1 0
0 0 0 0 0 0

1 个答案:

答案 0 :(得分:0)

有一些错误:

1。 首先,您只处理固定数量的列:

    if (rows==6){
        cols++;
        rows=0;
    }       

这一定是

    if (rows==counter){
        cols++;
        rows=0;
    }       

您在阅读6个值后开始新行。为此,您有一个额外的参数counter。请记住:你没有固定的尺寸。

如果您的输入不是6 * 6字段,则会将读取的值放在错误的位置。

2。 除此之外,您的初始数组matrix未初始化并包含垃圾值。这显然会弄乱你的结果。

解决方案很简单: 使用memset或创建一个小循环将所有内容设置为0。

3。 对于每个字符,您增加rows这是错误的。您切换了行和列。但是,由于你只接受方形输入字段,这确实很重要。

4。 最后你的问题: 你的计数是正确的,但在采取行动时你会破坏neighbors的价值。

            else if (neighbors = 3){
                updated[i][j]=1;
            }

应该有== 您的编译器应该对此发出警告。