2016-06-11 52 views
-1

我正在嘗試編寫一個應該讓笑臉滑到左側的程序。我開發了下面的代碼,但是當我運行它時,它給出了非常錯誤的打印輸出。使用while語句複製數組

void shiftMap (char sourceBitmap [8][8] , char destinationbitmap [8][8]) 
{ 

    for (int i = 0 ; i<8 ; i++) 
    { 
     for (int j = 0 ; j<8 ; j++) 
     { 
      destinationbitmap [i][j] = sourceBitmap[i][j]; 
     } 
    } 

    for (int i = 0 ; i<8 ; i++) 
    { 
     for (int j = 0; j<8 ; j++) 
     { 
      if(destinationbitmap[i][j] == '1') 
      { 
       printf(" "); 
      } 
      else 
      { 
       printf("%c", 'X'); 
      } 

     } 
     printf("\n"); 
    } 
} 
int main() 
{ 
    char bitmap1 [8][8] = 
    { 
     {'1', 'X', 'X', '1', '1', 'X', 'X','1'}, 
     {'1', 'X', 'X', '1', '1', 'X', 'X','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
     {'X', '1', '1', '1', '1', '1', '1','X'}, 
     {'1', 'X', '1', '1', '1', '1', 'X','1'}, 
     {'1', '1', 'X', 'X', 'X', 'X', '1','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
    }; 
    char bitmap2 [8][8] = 
    { 
     {'1', 'X', 'X', '1', '1', 'X', 'X','1'}, 
     {'1', 'X', 'X', '1', '1', 'X', 'X','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
     {'X', '1', '1', '1', '1', '1', '1','X'}, 
     {'1', 'X', '1', '1', '1', '1', 'X','1'}, 
     {'1', '1', 'X', 'X', 'X', 'X', '1','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
     {'1', '1', '1', '1', '1', '1', '1','1'}, 
    }; 

    while (1) 
    { 
     Sleep(1000); 
     system("cls"); 
     shiftMap(bitmap1,bitmap2); 
    } 
} 

我對編程還很陌生。

+0

你應該真的有兩個函數:'shiftMap()'和'printMap()',因爲它們是兩個單獨的任務(也許是第三個函數copyMap()')。複製移位的數據一次(當您修復代碼以進行移位而不是直接複製時),然後需要將移位的數據('bitmap2')複製回源('bitmap1'),以便下一個副本將開始處理移位的數據。就目前而言,您總是將相同的原始版本「bitmap1」轉移,因爲它永遠不會改變。 –

+0

因爲你有兩張地圖,我很想去替換兩個表情符號:笑臉和悲傷,以及滑過屏幕。代碼只是將一個副本複製到另一個,並永久打印相同的內容。 –

回答

0

乍一看,你的shiftMap函數似乎沒有做任何事情,因爲你的源和你的目的地是相同的地圖,你指定destination [i] [j]到source [i] [j]。我不知道這是你的意圖,但既然你說你想讓它向左滑動,我認爲你應該改變它爲j-1或其他東西。

+0

我做了,但即使如此,如果我運行它,它似乎做同樣的事情極其奇怪:/ –

+1

它不會做任何*因爲'bitmap1'和'bitmap2'是相同的,不管,當你將'sourceBitmap'複製到'destinationbitmap'中,它們將會是相同的。您需要一種算法,將每行或每列中的值移動一個所需的值(可能是一個)。另外,不要使用'printf(「\ n」);'(對於任何單個字符)使用'putchar('\ n');'不需要調用variadiac'printf'來打印一個字符。 –

+0

你現在得到什麼輸出?如果我是你,我只需要使用一個位圖「矩陣」和一個變量,告訴你在哪裏開始打印它,你初始化爲零,然後每個循環增加1。這樣你就可以將你的while循環改成for循環(無論如何這是更簡潔的)。然後將其輸入到您的shiftMap函數中。您的shifMap可以簡化爲第二個嵌套for循環,其中j變量從shiftmap的輸入開始。我希望你明白我在說什麼。 – Xentro

0

從評論繼續,沒有任何事情發生,因爲bitmap1bitmap2是相同的。此外,在shiftmap中,您將覆蓋bitmap2並使用bitmap1銷燬可能存在的任何差異。另一個挑戰是事實上,唯一可能發生的轉變是行移位圖下降1最大2次在摧毀您的笑臉之前。

鑑於設置,最簡單的方式來獲得一個「轉移」了/你的笑臉下來是修改bitmap2把笑臉低了(12行),然後簡單的bitmap1印刷之間切換bitmap2。例如,你可以很簡單地實現這一目標的東西,如:

#include <stdio.h> 
#include <unistd.h> 

void prnmap (char (*bitmap)[8]) 
{ 
    int i, j; 
    for (i = 0; i < 8; i++) { 
     for (j = 0; j < 8; j++) 
      if (bitmap[i][j] == '1') 
       putchar (' '); 
      else 
       putchar ('X'); 
     putchar ('\n'); 
    } 
} 

int main (void) { 

    char bitmap1[][8] = { 
     {'1', 'X', 'X', '1', '1', 'X', 'X', '1'}, 
     {'1', 'X', 'X', '1', '1', 'X', 'X', '1'}, 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
     {'X', '1', '1', '1', '1', '1', '1', 'X'}, 
     {'1', 'X', '1', '1', '1', '1', 'X', '1'}, 
     {'1', '1', 'X', 'X', 'X', 'X', '1', '1'}, 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
    }; 
    char bitmap2[][8] = { 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
     {'1', 'X', 'X', '1', '1', 'X', 'X', '1'}, 
     {'1', 'X', 'X', '1', '1', 'X', 'X', '1'}, 
     {'1', '1', '1', '1', '1', '1', '1', '1'}, 
     {'X', '1', '1', '1', '1', '1', '1', 'X'}, 
     {'1', 'X', '1', '1', '1', '1', 'X', '1'}, 
     {'1', '1', 'X', 'X', 'X', 'X', '1', '1'}, 
    }; 
    int toggle = 0, n = 5; 

    while (n--) {    /* do 5 iterations */ 
     if (toggle & 1)   /* if odd, bitmap1 */ 
      prnmap (bitmap1); 
     else     /* even, bitmap2 */ 
      prnmap (bitmap2); 
     toggle ^= 1;   /* toggle 0,1,0,.. */ 
     sleep (1); 
    } 

    return 0; 
} 

(它只是導致笑臉兩行每次迭代反彈上行/下行)

此外,雖然不是錯誤,標準C編碼風格避免caMelCase變量有利於所有小寫。見例如NASA - C Style Guide, 1994camelCase留給C++。

此外,正如評論中所述,從不需要撥打printf來打印單字符printf是一個複雜的可變參數函數,用於打印格式化的字符串。 putchar(或fputc)是簡單的功能,只需打印單字符即可。

查看代碼,查看輸出並讓我知道如果這是你想要完成的。如果不是,我們可以使用另一種算法來實際移動位圖中的值。

+0

我在睡眠函數中遇到錯誤。我得到「不明身份的參考」睡眠「 –

+0

你可以使用你的睡眠功能。你有沒有加入'unistd.h'? (注意:'sleep'函數是POSIX函數,不是標準C庫的一部分,你的編譯器可能不會實現它。) –