2013-08-07 36 views
3

我無法獲得4個不同的三角形圖案並排顯示。這是一個控制檯應用程序。如何並排顯示4個三角形圖案

這正是我試圖通過使用嵌套的for循環來實現:

*   ********************   * 
**  ********* *********  ** 
***  ******** ********  *** 
****  *******  *******  **** 
*****  ******  ******  ***** 
****** *****   ***** ****** 
******* ****   **** ******* 
******** ***    *** ******** 
********* **    ** ********* 
***********     *********** 

我已經有獨立的模式已經工作,但他們當然會出現一個接一個。

using System; 

class Assignment5 
{ 
    static void Main() 
    { 
     for (int i = 1; i <= 10; i++) // Outer loop for number of rows 
     { 
      for (int j = 1; j <= i; j++) // Inner loop for number of stars 
      { 
       Console.Write("*"); 
      } 
      Console.WriteLine(); 
     } // End First Pattern 

     for (int i = 10; i >= 1; i--) // Outer loop for number of rows 
     { 
      for (int j = 1; j <= i; j++) // Inner loop for number of stars 
      { 
       Console.Write("*"); 
      } 
      Console.WriteLine(); 
     } // End Second Pattern 

     for (int i = 10; i >= 1; i--) // Outer Loop for number of rows 
     { 
      for (int j = 1; j <= 10 - i; j++)   //Inner loop for number of spaces 
      { 
       Console.Write(" "); 
      } 
      for (int k = 1; k <= i; k++) //Secondary inner loop for number of stars 
      { 
       Console.Write("*"); 
      } 
      Console.WriteLine(); 

     } // End Third Pattern 

     for (int i = 1; i <= 10; i++)    //Outer Loop for number of rows 
     { 
      for (int j = 1; j <= 10 - i; j++)   //Inner loop for number of spaces 
      { 
       Console.Write(" "); 
      } 
      for (int k = 1; k <= i; k++) //Secondary inner loop for number of stars 
      { 
       Console.Write("*"); 
      } 
      Console.WriteLine(); 
     } // End Fourth Pattern 

     Console.WriteLine("Press Enter for Part 2 of this Program"); 
     Console.ReadKey(); 
     Console.Clear(); 

    } // End main function 


} // End class Assignment5 
+5

你需要寫所有的人的第一行,然後將其全部的第二行,依此類推。 –

+3

這是功課嗎? – derape

+0

或者你可以移動光標......但我不確定如果屏幕滾動會發生什麼:-) – xanatos

回答

3

沒有指定如何你想要實現的,所以我爲你展示:

 private static void Main() 
     { 
      Console.WriteLine(
@"*   ********************   * 
**  ********* *********  ** 
***  ******** ********  *** 
****  *******  *******  **** 
*****  ******  ******  ***** 
****** *****   ***** ****** 
******* ****   **** ******* 
******** ***    *** ******** 
********* **    ** ********* 
***********     ***********"); 
     } 

[編輯]好吧,這裏是一個不太愛開玩笑的回答。 )

int n = 10; 

for (int i = 0; i < n; ++i) 
{ 
    for (int j = 0; j <= i; ++j) 
     Console.Write("*"); 

    for (int j = 0; j < n-i-1; ++j) 
     Console.Write(" "); 

    for (int j = 0; j < n-i; ++j) 
     Console.Write("*"); 

    for (int j = 0; j < 2*i; ++j) 
     Console.Write(" "); 

    for (int j = 0; j < n-i; ++j) 
     Console.Write("*"); 

    for (int j = 0; j < n-i-1; ++j) 
     Console.Write(" "); 

    for (int j = 0; j <= i; ++j) 
     Console.Write("*"); 

    Console.WriteLine(); 
} 

[第二編輯]

這將是更可讀寫用於輸出n分或空間,像這樣的方法:

static void stars(int count) 
{ 
    for (int i = 0; i < count; ++i) 
     Console.Write("*"); 
} 

static void spaces(int count) 
{ 
    for (int i = 0; i < count; ++i) 
     Console.Write(" "); 
} 

然後:

int n = 10; 

for (int i = 0; i < n; ++i) 
{ 
    stars(i+1); 
    spaces(n-i-1); 
    stars(n-i+1); 
    spaces(2*i); 
    stars(n-i); 
    spaces(n-i-1); 
    stars(i+1); 

    Console.WriteLine(); 
} 
+2

近+1。 *近乎。* –

+0

是的在查看前幾個評論後,我很快意識到這一點。編輯更具體的信息。 – Kerea

+0

行是迴文,所以你只需要創建前半部分,並添加相反的。看到http://stackoverflow.com/a/18099431/44620 –

0

您使用的是Console.WriteConsole.WriteLine命令它們在當前光標位置寫入。你的循環總是工作在10 * 10個字符範圍內,後面跟着一個換行符。

解決問題的方法是絕對光標位置,將光標設置到正確位置,然後繪製一個字符。每個隨後的三角形必須移動一個偏移量:

int leftOffset = 0; 

// draw first triangle 
for x in ... 
    for y in ... 
     Console.SetCursorPosition(x, y); 
     Console.Write("*"); 

leftOffset += 10; 

// draw second triangle 
for x in ... 
    for y in ... 
     Console.SetCursorPosition(x + leftOffset, y); 
     Console.Write("*"); 

. 
. 
. 

請務必在開始之前清潔控制檯!

+0

爲什麼downvote? – Matten

+0

我不認爲移動光標是必要的。通過正確使用數學,您可以逐行實現圖案。 – jnovacho

+0

我沒有投票。我很欣賞你試圖幫助我,並且我對原始文章缺乏清晰度表示歉意。 – Kerea

1

這會給你所需的結果。

using System.IO; 
using System; 

class Program 
{ 
    static void Main() 
    { 
     for (int i = 1; i <= 10; i++) // Outer loop for number of rows 
     { 
      for (int j = 1; j <= i; j++) 
      { 
       Console.Write("*"); 
      } 
      for (int k = 10; k >= i; k--) 
      { 
       Console.Write(" "); 
      }    
      for (int l = 10-i; l >= 0; l--) 
      { 
       Console.Write("*"); 
      } 
      for (int k = 0; k <= i*2; k++) 
      { 
       Console.Write(" "); 
      } 
      for (int k = 10-i; k >= 0; k--) 
      { 
       Console.Write("*"); 
      } 
      for (int k = 10; k >= i; k--) 
      { 
       Console.Write(" "); 
      } 
      for (int j = 1; j <= i; j++) 
      { 
       Console.Write("*"); 
      } 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 
     Console.Clear(); 

    } 
} 
0

另一種解決方案:您創建一個包含所有'*'的數組,然後顯示它。

我已經使用了3維數組:行,列,模式編號。
我甚至已將所有內容都轉移到了0,因爲在C和C#的數組中,基於0的數組是基於0的。
請注意,我甚至填充了數組的「空白」空格。

static void Main() 
{ 
    var chars = new char[10, 10, 4]; 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i >= j) 
      { 
       chars[i, j, 0] = '*'; 
      } 
      else 
      { 
       chars[i, j, 0] = ' '; 
      } 
     } 
    } // End First Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i <= 9 - j) 
      { 
       chars[i, j, 1] = '*'; 
      } 
      else 
      { 
       chars[i, j, 1] = ' '; 
      } 
     } 
    } // End Second Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i <= j) 
      { 
       chars[i, j, 2] = '*'; 
      } 
      else 
      { 
       chars[i, j, 2] = ' '; 
      } 
     } 
    } // End Third Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i >= 9 - j) 
      { 
       chars[i, j, 3] = '*'; 
      } 
      else 
      { 
       chars[i, j, 3] = ' '; 
      } 
     } 
    } // End Fourth Pattern 

    for (int i = 0; i < 10; i++) 
    { 
     for (int k = 0; k < 4; k++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       Console.Write(chars[i, j, k]); 
      } 
     } 

     Console.WriteLine(); 
    } 

    Console.WriteLine("Press Enter for Part 2 of this Program"); 
    Console.ReadKey(); 
    Console.Clear(); 

} // End main function 

正如我告訴過你的,我在數組創建時用空格填充了空格。我可以跳過它,而是換成是chars[i, j, k] == 0' '在Console.Write,像空間:

static void Main() 
{ 
    var chars = new char[10, 10, 4]; 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i >= j) 
      { 
       chars[i, j, 0] = '*'; 
      } 
     } 
    } // End First Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i <= 9 - j) 
      { 
       chars[i, j, 1] = '*'; 
      } 
     } 
    } // End Second Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i <= j) 
      { 
       chars[i, j, 2] = '*'; 
      } 
     } 
    } // End Third Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      if (i >= 9 - j) 
      { 
       chars[i, j, 3] = '*'; 
      } 
     } 
    } // End Fourth Pattern 

    for (int i = 0; i < 10; i++) 
    { 
     for (int k = 0; k < 4; k++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       if (chars[i, j, k] != 0) 
       { 
        Console.Write(chars[i, j, k]); 
       } 
       else 
       { 
        Console.Write(' '); 
       } 
      } 
     } 

     Console.WriteLine(); 
    } 

    Console.WriteLine("Press Enter for Part 2 of this Program"); 
    Console.ReadKey(); 
    Console.Clear(); 

} // End main function 

從那裏,我們可以刪除if,使他們的for的一部分,但它變得相當不可讀...

static void Main() 
{ 
    var chars = new char[10, 10, 4]; 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j <= i; j++) 
     { 
      chars[i, j, 0] = '*'; 
     } 
    } // End First Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 0; j < 10 - i; j++) 
     { 
      chars[i, j, 1] = '*'; 
     } 
    } // End Second Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = i; j < 10; j++) 
     { 
      chars[i, j, 2] = '*'; 
     } 
    } // End Third Pattern 

    for (int i = 0; i < 10; i++) // Outer loop for number of rows 
    { 
     for (int j = 9 - i; j < 10; j++) 
     { 
      chars[i, j, 3] = '*'; 
     } 
    } // End Fourth Pattern 

    for (int i = 0; i < 10; i++) 
    { 
     for (int k = 0; k < 4; k++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       if (chars[i, j, k] != 0) 
       { 
        Console.Write(chars[i, j, k]); 
       } 
       else 
       { 
        Console.Write(' '); 
       } 
      } 
     } 

     Console.WriteLine(); 
    } 

    Console.WriteLine("Press Enter for Part 2 of this Program"); 
    Console.ReadKey(); 
    Console.Clear(); 

} // End main function 
1
using System; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      int length = 10; 

      for (int i = 0; i < length; i++) 
      { 
       string result = String.Format("{0}{1}{2}{3}", 
        fillWithStarFromLeft(i + 1, length), 
        fillWithStarFromLeft(length - i, length), 
        fillWithStarFromRight(length - i, length), 
        fillWithStarFromRight(i + 1, length) 
        ); 

       Console.WriteLine(result); 
      } 

      Console.ReadKey(); 
     } 

     private static object fillWithStarFromRight(int length, int segmentlength) 
     { 
      string result = String.Empty; 

      for (int i = 0; i < length; i++) 
      { 
       result += "*"; 
      } 

      return result.PadLeft(segmentlength, ' '); 
     } 

     private static string fillWithStarFromLeft(int length, int segmentlength) 
     { 
      string result = String.Empty; 

      for (int i = 0; i < length; i++) 
      { 
       result += "*"; 
      } 

      return result.PadRight(segmentlength, ' '); 
     } 
    } 
} 

只是一個快速但希望它有助於

+0

這實際上是非常有趣的步行。我仍然試圖習慣OOP的概念,所以這是一個很好的例子,說明如何以面向對象的方式實現而不是使用過程。 – Kerea

+0

很高興幫助,也注意到如果你只是改變長度爲「int length = 10」的長度,你得到相同的形狀與更多的明星(沒有改變任何其他) – isioutis

0

試試這個(很短的版本)

int sz=10; 
for (int i=0;i<sz;i++){ 
    for(int j=0;j<(sz*4);j++){ 
     if(j<=i || (j>=sz && j<=(sz*2)-(i+1)) 
     || (j>=sz*2 && j>=(sz*2)+i && j<sz*3) 
     || (j>=(sz*4)-(i+1)) 
     ) 
     { 
      Console.Write("*"); 
     } 
     else {Console.Write(" ");} 
    } 
    Console.WriteLine(); 
} 

此處鍵入(未測試)。但這可能會訣竅!

+0

較短的版本:http://stackoverflow.com/a/18099431/44620 –

2

這是您的腦筋急轉彎。

for (int n = 10; n > 0; n--) 
{ 
    var tri = "".PadRight(11 - n, '*').PadRight(10, ' ') + "".PadRight(n, '*').PadRight(10, ' '); 
    Console.WriteLine(tri + String.Join("", tri.ToCharArray().Reverse())); 
} 

輸出:

 
*   ********************   * 
**  ********* *********  ** 
***  ******** ********  *** 
****  *******  *******  **** 
*****  ******  ******  ***** 
****** *****   ***** ****** 
******* ****   **** ******* 
******** ***    *** ******** 
********* **    ** ********* 
***********     *********** 
+0

+1非常好的方法 – bansi

+0

不錯,但OP是做功課的要求是'通過使用嵌套for循環' –