Как сделать программу на C для Game of Life, используя текстовый файл - PullRequest
0 голосов
/ 07 марта 2012

Меня попросили:

Создайте программу ANSI C, которая будет читать текстовый файл, содержащий матрицу 25 x 25 символа «x» или пробел.

Display the initial generation using the function printf.

Calculate the next generation using the rules mentioned above and save it in another textfile.

The filenames of the input and output textfiles should be specified as command-line parameters.

все, что у меня есть, это код, который запрашивает текстовый файл, а затем мой код его печатает. мне не хватает кодов, применяющих правила игры жизни Конвея. Я не знаю, где это поставить. и какие коды использовать. :( Пожалуйста, помогите мне.

вот что у меня сейчас:

#include <stdio.h>
#include <string.h>

#define MAX_LINE_LEN 80
#define N 25

void display(char [][N+1], size_t);

int main(int argc, char *argv[]) {
  FILE *fp;
  char in[MAX_LINE_LEN];
  char grid[N][N+1] = { { '\0' } };
  size_t i = 0;

  printf("Enter filename: ");
  fgets(in, MAX_LINE_LEN, stdin);
  *(strchr(in, '\n')) = '\0';
  if ((fp = fopen(in, "r")) != NULL) {
    while ((i < N) && (fgets(in, MAX_LINE_LEN, fp) != NULL)) {
      *(strchr(in, '\n')) = '\0';
      /* should verify only 'x' and space in string before storing */
      strncpy(grid[i++], in, N);
    }
    /* pad each row with spaces, if necessary, for NxN array */
    for (i = 0; i < N; i++) {
      while (strlen(grid[i]) < N) {
        strcat(grid[i], " ");
      }
    }
    /* For all generations ...
            compute next generation */
            display(grid, N);
    /* End for all generations */
  } else {
    printf("%s not found.\n", in);
    getch();
  }
  getch();
}

void display(char a[][N+1], size_t n) {
    size_t i;
    for (i = 0; i < n; puts(a[i++]));
}

1 Ответ

3 голосов
/ 07 марта 2012
*(strchr(in, '\n')) = '\0'; 

Плохое дзюю.Если strchr вернет NULL, это будет ошибка по умолчанию.Я знаю, что ваши данные всегда будут иметь новую строку, но это плохая привычка. Всегда присваивает результат strchr переменной и сначала выполняет проверку NULL:

char *tmp = strchr(in, '\n');
if (tmp)
  *tmp = 0;

Честно говоря, я считаю, что ваша сетка как массив строк вызовет больше скорби, чемэто решит.Относитесь к нему так же, как к 2d-массиву любого другого типа.Работа с символами новой строки в конце каждой строки во входном файле будет проблемой независимо от того, что вы делаете.

Что касается структурирования кода, подумайте о проблеме на высоком уровне:

  1. Вам нужно загрузить файл в качестве стартовой сетки;
  2. Вам нужно вычислить сетку для следующего поколения для некоторого числа
  3. Вам нужно отобразить каждую сетку;
  4. Вам необходимо записать каждую сетку в файл.

Вы уже разбили код дисплея на его собственную функцию;вам просто нужно сделать то же самое для функций загрузки, вычисления и записи (вы можете оставить код загрузки файла в main, но это сделает код чище, если вы поместите его в свою собственную функцию).

void load(const char *filename, char (*grid)[N], size_t rows) {...}
void calc(char (*grid)[N], size_t rows) {...}
void save(const char *filename, char (*grid)[N], size_t rows) {...}

Таким образом, каждый раз в main вы просто вызываете calc в сетке перед вызовом display, затем вы вызываете save, чтобы записать новую сетку вфайл.

Что касается как вычислить следующую сетку, ну, это часть вашего задания, и я не хочу отдавать ее всем .

...