2015-06-12 59 views
-3

問:我爲什麼能成功編譯我的代碼(沒有任何警告),但奇怪的是它沒有做運行,我沒有想法,它背後的原因。我解決了創建使用C和我的代碼隨機遊走的問題如下─我的隨機漫步程序編譯但不運行


提到這是我一直在努力的問題:

我寫一個C程序randWalk.c生成一個10x10陣列的隨機遊走。

最初,數組只包含點字符('。')和A [0] [0]中的起始位置。

程序必須從元素到元素隨機「走」,總是向上,向下,向左或向右移動一步。該程序訪問的元素將按照訪問的順序(僅在到達字母Z後停止步行)以字母A到Z進行標記。當步行完成該程序將打印最終數組值如下面的例子:

enter image description here

規則 1.執行移動之前,檢查:

•它不會超出陣列。

•它不會走到已經分配字母的元素(被阻擋的元素)。

  1. 如果違反任一條件,請嘗試向另一個方向移動。

  2. 如果所有四個方向都被阻塞,程序必須終止。


我的解決方案/代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define ONE_DOT '.', 
#define TWO_DOTS ONE_DOT ONE_DOT 
#define FIVE_DOTS TWO_DOTS TWO_DOTS ONE_DOT 
#define TEN_DOTS { FIVE_DOTS FIVE_DOTS }, 
#define TWENTY_DOTS TEN_DOTS TEN_DOTS 
#define FIFTY_DOTS TWENTY_DOTS TWENTY_DOTS TEN_DOTS 
#define ONE_HUNDRED_DOTS FIFTY_DOTS FIFTY_DOTS 


int B[10][10] = {ONE_HUNDRED_DOTS}; 
char A[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'J', 'K', 'L', 'M', 'N', 'O', 
       'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 

int main() 
{ 
    int i = 0; 
    int j = 0; 
    int n = 0; 
    int a, b, c, d; 
    int check; 

    while (check != a + b + c + d) 
    { 
     srand(time(NULL)); 
     int r = rand() % 4; 

     switch (r) 
     { 
      case 0: 
       i--; 
       if (B[i][j] == '.') 
       { 
        if (((0 <= i) && (i <= 10))&&((0 <= i) && (i <= 10))) 
        { 
         B[i][j] = A[n]; 
         n++; 
        } 
       } 
       else 
       { 
        check = a + check; 
       } 
       break; 

      case 1: 
       j++; 
       if (B[i][j] == '.') 
       { 
        if (((0 <= i) && (i <= 10))&&((0 <= i) && (i <= 10))) 
        { 
         B[i][j] = A[n]; 
         n++; 
        } 
       } 
       else 
       { 
        check = check + b; 
       } 
       break; 

      case 2: 
       i++; 
       if (B[i][j] == '.') 
       { 
        if (((0 <= i) && (i <= 10))&&((0 <= i) && (i <= 10))) 
        { 
         B[i][j] = A[n]; 
         n++; 

        } 

       } 
       else 
       { 
        check = check + c; 
       } 
       break; 

      case 3: 
       j--; 
       if (B[i][j] == '.') 
       { 
        if (((0 <= i) && (i <= 10))&&((0 <= i) && (i <= 10))) 
        { 
         B[i][j] = A[n]; 
         n++; 

        } 

       } 
       else 
       { 
        check = check + d; 
       } 
       break; 
     } 

     int row, columns; 
     for (int row = 0; row < 10; row++) 
     { 
      for (int columns = 0; columns < 10; columns++) 
      { 
       printf("%d ", B[row][columns]); 
      } 
      printf("\n"); 
     } 
    } 

    return 0; 
} 
+2

您是否試過通過調試器運行它?它進入main()嗎?如果是這樣,它在哪裏阻塞? – KABoissonneault

+0

爲什麼你的一個... DOT'#define's包含'{大括號}'而不是其他? –

+3

我不確定版權聲明是怎麼回事,但用戶對本網站的貢獻屬於[創作共用許可](https://creativecommons.org/licenses/by-sa/3.0/) –

回答

5

我注意到的第一件事是

int a,b,c,d; 
int check; 

while(check!=a+b+c+d) 

使用未初始化的變量會導致不確定的行爲讓你的代碼不起作用

+0

考慮使用do {} while();相反,儘管a,b,c,d和check似乎並沒有在其他地方初始化 – KABoissonneault

+0

@KABoissonneault你能解釋一下嗎請 –

+0

我只是說,如果你不想初始化a,b,c, d並在循環之前檢查,那麼你不應該在循環開始時評估條件,它應該在循環之後進行評估。 但是它似乎也沒有給出任何這些變量的適當值,因此它不會改變程序的未定義行爲 – KABoissonneault

-1

變量檢查a,b,c,d都是單位化的,從而導致垃圾值的比較。 while循環可能永遠不會被執行。

+0

正如@Gopi在20分鐘前已經回答的那樣。 –