2013-08-07 103 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循环' –