2014-03-12 15 views
0

我有麻煩繪製如下方:如何畫一個正方形

* # # # # # 
* * # # # # 
* * * # # # 
* * * * # # 
* * * * * # 
* * * * * * 

這是我寫的方法,但它不能正常工作,因爲它應該是:

public void Draw(int width){ 
    char asterisk = '*'; 
    char hash = '#'; 
    int counter = 0; 
    for (int h = 0; h < 6; h++) { //height? 
     for (int w = 0; w < width; w++) { 
      if (h == counter) 
       Console.Write (asterisk); 
      else 
       Console.Write (hash); 
     } 
     counter++; 

     Console.WriteLine(); 
    } 
    Console.WriteLine(); 
} 

任何我應該做什麼的建議? 我知道當它是第一行時,它應該只畫一個星號,當它是第二行兩個星號等等,但我真的不知道該怎麼做..請幫助。

+5

郵這裏的代碼,而不是在外部網站。問題應該是完整的,而不需要引用外部網站(可以停機,停業等) – crashmstr

+0

我有粘貼我的代碼的麻煩,它一直說我的文章包含的代碼格式不正確 – AlekeyFirefly

+1

如果您縮進代碼由四個空格組成,它將被格式化爲代碼。您也可以選擇代碼並單擊「{}」按鈕。 –

回答

1

本課旨在教導學生使用嵌套循環,並理解內部循環的每個實例都可以訪問外部循環的狀態。不幸的是,大多數教師不明白他們在教什麼,只是給你的問題,而不解釋爲什麼這是一個有益的事情來練習。

因爲您總是需要與您所在的行完全相同的恆星數量,所以您應該直接在列索引和當前行之間進行比較。

public void DrawSquare(int sideLength) 
{ 
    for(int row = 1; row <= sideLength; row++) 
    { 
    for (int col = 1; col <= sideLength; col++) 
    { 
     if (col <= row) 
     Console.Write('*'); 
     else 
     Console.Write('#'); 
    } 
    Console.WriteLine(); 
    } 
} 

有很多快捷鍵和C#的技巧,可以幫助您更快,但這是什麼,你應該嘗試做的精髓。

3

變化h == counterw <= counter

此外,你還可以刪除counter,因爲它總是等於h

5

而不是使用計數器值,你可以改變你的標準從if (h == counter)if (h >= w)

+0

謝謝你的工作! – AlekeyFirefly

0

由於counter總是等於h,您將得到所有星號。與行號h相比,該行上的字符位置w與確定要打印的字符的行號相比。因此,將條件更改爲w <= h

另外,由於要打印正方形,因此高度和寬度將具有相等的邊長。方法簽名更改爲

public void DrawSquare(int sideLength) 

兩個循環,然後將測試循環變量對sideLength

1

爲什麼你不使用重複構造函數,就像這樣。

public void Draw(int width){ 
    int w_counter = 1; 

    for (int l = 0; l < 6; l++) { 
     var asterisk = new String('*', w_counter); 
     var hash = new String('#', width - w_counter); 
     Console.WrilteLine(asterisk + hash); 
     w_counter++; 
    } 
} 
0

其實我一直在尋找一些不錯的算法寫的,所以這裏是我的解決方案只有1 for循環:

private static void Draw(int width) 
{ 
    int numOfS = 1; 
    string temp = ""; 
    int numOfH = width-1; 
    int t1, t2; 
    for (int i = 0; i < width; i++) 
    { 
     t1 = numOfS; 
     t2 = numOfH; 
     while (t1 > 0) 
     { 
     temp += "*"; 
     t1--; 
     } 
     while (t2 > 0) 
     { 
     temp += "#"; 
     t2--; 
     } 
     Console.WriteLine(temp); 
     numOfH--; 
     numOfS++; 
     temp = ""; 
    } 
} 
+0

'For(int t1 = numOfS; t1> 0; t1 - )'和'int t1 = numOfS'在概念上沒有區別。而(t1> 0){t1--; } - 除了你已經從一行代碼中的所有循環條件變成了讓它們分佈在三行(它們甚至可能不是彼此相鄰)。是的,你已經把'for'換成了2'while',但現在你有三個循環和索引變量。爲什麼不去全豬? https://ideone.com/FqMLiU沒有for循環! (但仍然有三個循環和三個索引變量。) –

+0

因此,你沒有改變而不是改爲另一個,這與我的解決方案有什麼不同? – c0ldsh3ll

+0

我試圖指出的是,將'For'循環轉換爲'While'循環並沒有什麼令人印象深刻的,實際上它可能是一個普遍的壞主意,因爲它將循環條件分成幾行代碼。任何沿着索引的迭代最好在'For'循環中處理 - 這就是他們的目的。 'while循環最適用於沒有索引的迭代。 –