2012-11-05 32 views
0

到目前爲止,我所得到的是一個.in文件,它將創建100個陣列,接下來是電路板上有多少個「地雷」,然後是每個數字2個「我的」表示它們將放置在陣列上的位置。這對於我的初級C班來說,老實說,我們還沒有被正確地教授這種先進的東西(我說輕度地使用這個術語是先進的)。我知道如何讀取文件,而且我知道如何創建一個數組,但我不確定如何閱讀這些文件,從地雷切換到重複放置。我也發現自己對於如何根據地雷放置位置將陣列號從0更改爲另一個號碼感到困惑。讀取文件以創建多個「掃雷」ish陣列

一個例子的輸入文件:

1 
4 
1 3 
7 5 
7 3 
3 3 

凡在第一行中的1意味着我們具有一個板。下一行的4表示它將有4枚炸彈。以下4行描述炸彈在陣列中的位置爲row column

任何人都可以提供給我正確的方向嗎?

+1

你能否證明你到目前爲止所嘗試的? – imp25

+0

除了你所嘗試過的,你能描述一下你被教過什麼嗎? 'while while循環?你教過什麼輸入函數?還有,試着對你想要做什麼進行更具體的描述;你能展示一個你想要讀入的文件的例子,或者一個摘錄從它? –

+0

哦,是的,我想一些基本的信息會有所幫助。我被教過/ while和do-while循環,如果語句。意味着輸入函數,所以即時猜測沒有。 –

回答

0

下面是一個部分解決方案,它爲OP留下了幾個部分作爲練習。

#include <stdio.h> 
#include <stdlib.h> 

#define BOARD_SIZE 8 

int main(void) { 

    FILE *fp; 

    fp = fopen("mines.in","r"); 
    if (fp == NULL) { 
      fprintf(stderr,"Could not open file\n"); 
      return 1; 
    } 

    int nBoards = 0; 
    int nMines = 0; 
    int col; 
    int row; 

    int currentBoard = 0; 

    /* We know the first row is going to be the number of boards */ 
    fscanf(fp,"%d",&nBoards); 

    printf("We have %d boards\n",nBoards); 

    while (fscanf(fp,"%d",&nMines) > 0) { 
      int i,j; 
      /* initialize board as all zeros */ 
      int board[BOARD_SIZE][BOARD_SIZE] = { {0} }; 

      currentBoard++; 
      printf("Board %d:\n",currentBoard); 

      /* Read in and set the mines */ 
      for (i=0; i<nMines; i++) { 
        fscanf(fp,"%d %d",&col,&row); 
        board[col-1][row-1] = 9; 
      } 

      /* Add mine proximity */ 
      for (i=0; i<BOARD_SIZE; i++) { 
        for (j=0; j<BOARD_SIZE; j++) { 
          if (board[i][j] == 9) { /* we have a mine */ 
            /* Square to the left */ 
            if (j > 0 && board[i][j-1] != 9) { 
              board[i][j-1]++; 
            } 
            /* Square to the right */ 
            /* Left as exercise for the OP*/ 

            /* Square above */ 
            /* Left as exercise for the OP*/ 

            /* Square below */ 
            /* Left as exercise for the OP*/ 
        } 
      } 

      /* Print out the board */ 
      for (i=0; i<BOARD_SIZE; i++) { 
        for (j=0; j<BOARD_SIZE; j++) { 
          printf("%d ",board[i][j]); 
        } 
        printf("\n"); 
      } 
      printf("\n"); 
    } 
    fclose(fp); 

    if (currentBoard != nBoards) { 
      fprintf(stderr,"Expected %d boards, read in %d boards\n",nBoards,currentBoard); 
      return 1; 
    } 

    return 0; 
} 

的代碼讀取在第一行記錄的板的數量,則它循環在含有地雷和礦井位置的數量的數據塊。 while循環將在包含地雷數量的線上執行fscanf,並且在while循環的主體中,不同的地雷位置將被讀入爲板定義的數字。

一旦我們擁有了所有的礦區位置,我們就可以計算板子上其他方塊的數字,其中只有一個在代碼中顯示(其他方塊相似)。

請注意,上述代碼幾乎不會執行錯誤處理,並且幾乎不會對輸入文件進行驗證 - 如果輸入文件錯誤,您可能會遇到錯誤,即「超出範圍」訪問陣列。我忽略了這些檢查,使程序的基礎邏輯更加清晰。請注意,我假定輸入索引是'1'索引的(即在[1,8]範圍內而不是'0' - 索引爲C預期(即在範圍[0,7 ]),因此board[col-1][row-1] = 9;行中的1代替了