2011-07-20 50 views
0

我想寫一個帶有「*」和「|」的形狀,形狀如下。 該程序必須從user.Width獲取高度和寬度是沒有「|」的列號。 '。我試着寫,但困惑。我的代碼有時很好,有時是愚蠢的。例如,當我輸入高度:13,寬度:4它再寫一個,如果witdh是1它進入無限循環。當試圖解決它變得太沖突了。我必須解決它還是重寫?下面是代碼:高度= 10,寬度= 5寫出具有特定形狀的星形

 
|*____|  
|_*___| 
|__*__| 
|___*_| 
|____*| 
|___*_| 
|__*__| 
|_*___| 
|*____| 
|_*___| 
 private static void Function() 
     { 
     int height, width; 

     if (width == 2) 
      while (height > 0) 
      { 
       FirstPart(width, height); 
       height -= width; 
      } 
     else 
      while (height > 0) 
      { 
       if (height > 1) 
       { 
        FirstPart(width, height); 
        height -= width; 
       } 
       if (height > 0) 
       { 
        SecondPart(width, height); 
        height -= width - 2; 
       } 
      } 
    } 


    private static void FirstPart(int width,int height) 
    { 

     if(height > width) 
      for (int i = 0; i < width; i++) 
      { 
       for (int j = 0; j < width+2; j++) 
       { 

        if (j == 0 || j == width + 1) 
         Console.Write("|"); 
        else 
         if (i + 1 == j) 
          Console.Write("*"); 
         else 
          Console.Write(" "); 
       } 
      Console.WriteLine(); 
     } 
     else 
      for (int i = 0; i < height; i++) 
      { 
       for (int j = 0; j < width + 2; j++) 
       { 

        if (j == 0 || j == width + 1) 
         Console.Write("|"); 
        else 
         if (i + 1 == j) 
          Console.Write("*"); 
         else 
          Console.Write(" "); 
       } 
       Console.WriteLine(); 
      } 
    } 
    private static void SecondPart(int width,int height) 
    { 

     if(height > width) 

      for (int i = 0; i < width-2; i++) 
      { 
       for (int j = 0; j < width+2; j++) 
       { 

       if (j == 0 || j == width + 1) 
        Console.Write("|"); 
       else 
        if (i + j == width-1) 
         Console.Write("*"); 
        else 
         Console.Write(" "); 
      } 
      Console.WriteLine(); 
     } 
     else 
      for (int i = 0; i < height; i++) 
      {          
       for (int j = 0; j < width + 2; j++) 
       { 
        if (j == 0 || j == width + 1) 
         Console.Write("|"); 
        else 
         if (i + j == width - 1) 
          Console.Write("*"); 
         else 
          Console.Write(" "); 
       } 
       Console.WriteLine(); 
      } 
    }    
+0

w-what?我不明白。 – BoltClock

回答

2
private static void WriteStars(int width, int height) 
    { 
     int j = 0; 
     for (int i = 0; i < height; i++) 
     { 
      Console.Write("|"); 
      for (int f = 0; f < width; f++) 
      { 
       if (f == Math.Abs(j)) 
       { 
        Console.Write("*"); 
       } 
       else 
       { 
        Console.Write(" "); 
       } 
      } 
      j++; 
      if (Math.Abs(j) == width - 1) 
      { 
       j *= -1; 
      } 
      Console.WriteLine("|"); 
     } 
    } 

大概會得到downvoted,給你一個完整的答案,但也許它會告訴你一個正確的做法,你可以從中學到一些東西...

1

我看到

while (Height > 0) 

所以你的無限循環從身高來從未越來越少或等於0。

+0

基本問題是工作不正常,我想讓它運行每個值。 – myildirim

+0

@myildirim - 在擔心如何讓每個價值的當前設計運行之前,您需要解決設計問題。 –

0

重寫最好。當你這樣做時,將代碼解耦成幾個函數,以便一個函數繪製一條線,另一個函數調用前者繪製所有線。

0
void WriteStars(int Width,int Height) 
{ 
    int _sp=1; //Star Pos 
    bool _left = false; 
    for(int i =0;i<Height;i++) 
    { 
     Console.Write("|"); 
     int j; 
     for(j=1;j<Width-1;j++) 
     { 
      if(j==_sp) 
      { 
       Console.Write("*"); 
       if(_left) 
       { 
        _sp--; 
       } 
       else 
       { 
        _sp++; 
       } 
        j++; 
        break; 
      } 
      else 
      { 
       Console.Write("_"); 
      } 
     } 
     for(;j<Width-1;j++) 
     { 
      Console.Write("_"); 
     } 

     Console.WriteLine("|"); 
     if(_sp==0) 
     { 
      _left = false; 
     } 
     else if(_sp==Width) 
     { 
      _left = true; 
     } 

    } 
} 

試試看它是否有效,寫在這裏。

+1

有一個非常簡單的解決方案,它可能是本練習的重點。 – Yuck

+0

@Yuck不會讓星星走向曲折,只是從開始,愛寫''''否則:) – Djole

+0

你只需要考慮到有一個上升片和下降片。相應地調整模態計算。 – Yuck

0

更短:

static void Variante_2(int height, int width) 
{ 
    byte[][] arr = new byte[height][]; 
    int pos = 0; 
    int mov = 1; 
    for (int line = 0; line < height; line++) 
    { 
    arr[line] = new byte[width]; 
    for (int col = 0; col < width; col++) { arr[line][col] = 45; } 
    arr[line][pos] = 42; 
    pos += mov; 
    if (pos == 0 || pos == (width - 1)) { mov *= -1; } 
    Console.WriteLine("|" + ASCIIEncoding.ASCII.GetString(arr[line]) + "|"); 
    } 
    string temp = Console.ReadLine(); 
} 
0

並且可以用更少的代碼來做到這一點:

static void Variante_3(int height, int width) 
{ 
    int pos = 1; 
    int mov = 1; 
    for (int line = 0; line < height; line++) 
    { 
     Console.WriteLine("|" + "*".PadLeft(pos, '_') + "|".PadLeft(width - pos, '_')); 
     pos += mov; 
     if (pos == 1 || pos == (width - 1)) { mov *= -1; } 
    } 
    string temp = Console.ReadLine(); 
} 

對不起,所有沒有做其他^ h omework,但我不能沒有顯示這個g