2011-07-20 1 views
0

"*"と "|"の形を書いて、下の形にしたいと思います。 プログラムは、user.Widthから高さと幅を取る必要があります。私はコードを書くことを試みましたが、混乱しました。私のコードは時にはうまく機能し、時にはばかげています。たとえば、高さを入力すると13、幅は4、もう1つは書く、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つの正しいアプローチを紹介し、あなたがそこから何かを学ぶことができます...

1

私は決して0

に以下になっていないので、あなたの無限ループは、高さから来ている

while (Height > 0) 

を見ます

+0

基本的な問題は、正しく動作していない、私はすべての値を実行するようにしたいです。 – myildirim

+0

@myildirim - すべての値に対して現在のデザインを実行する方法を心配する前に、設計上の問題を解決する必要があります。 –

0

書き換えが良いです。その場合、コードを複数の関数に分割して、1つの関数が1行を描画し、もう1つが関数を呼び出してすべての行を描画します。

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(); 
} 
他のすべての時間をしていないと申し訳

予期せぬことですが、私はこれを見せないと眠れませんでしたg

関連する問題