2016-05-11 2 views
0
namespace SquareStars 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var n = int.Parse(Console.ReadLine()); 

      for (int i = 0; i <n-1; i++) 
      { 
       Console.Write("*"); 
      } 
      for (int i = 0; i < n-1; i++) 
      { 
       Console.WriteLine("*"); 

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

     } 
    } 
} 

Meine Übungen ist Platz von Stars wie dies zu tun: hängt von „n“ .Ich versuchen for-Schleifen zu verwenden, aber ich kann rechte Seite Platz machen. ich dies tun:Platz des Sternes

*** 
* 
*** 

aber ich möchte dies:

***  **** 
* *  * * 
*** or * * 
      **** 

Kann mich an diesen Code sameone helfen ????

+0

Sie sind tatsächlich sehr nah an ihm, was Sie es fertig up.Note haben verhindert, dass Sie bereits viel elegantere Lösungen haben hier unter, vor allem der von Psychosomatische, aber dein ist schon fast zu Ende. –

Antwort

2

Die folgende tun sollten:

public static string CreateASCIISquare(int squareSideLength, char c = '*') 
{ 
    if (squareSideLength < 1) 
     return ""; 

    if (squareSideLength == 1) 
     return c.ToString(); 

    var horizontalOuterRow = new String(c, squareSideLength); 
    var horizontalInnerRow = $"{c}{new string(' ', squareSideLength - 2)}{c}"; 
    var squareBuilder = new StringBuilder(); 
    squareBuilder.AppendLine(horizontalOuterRow); 

    for (int i = 0; i < squareSideLength - 2; i++) 
    { 
     squareBuilder.AppendLine(horizontalInnerRow); 
    } 

    squareBuilder.Append(horizontalOuterRow); 
    return squareBuilder.ToString(); 
} 

Ok, lässt so den Code ein wenig erklären:

  1. Alwa Sie validieren die Daten, die in Ihre Methode eingehen. In Ihrem Fall kann der Benutzer die Länge der Quadratseite angeben. Gibt es ungültige Werte? Nun ja klar, -2 scheint keine gültige Wahl zu sein.

    Sie haben hier viele Möglichkeiten. Sie können dem Benutzer sagen, dass der Wert nicht gültig ist, Sie können ihn einfach ignorieren, nichts tun und Ihre Anwendung zum Absturz bringen und kläglich sterben lassen, oder Sie können ein leeres Quadrat zurückgeben. Alle sind gültige Entscheidungen, aber wählen Sie bewusst eine und entwerfen Sie entsprechend Ihrer Entscheidung. In meinem Fall habe ich einen leeren Platz zurück:

    if (squareSideLength < 0) 
        return ""; 
    

    Gibt es triviale Fälle, die ich einfach ohne for Schleifen verwalten und Console.Write s usw.? Ja, die Längen 0 und 1 scheinen ziemlich einfach zu sein. Es liegt nahe, dass ich, wenn ich das leere Quadrat für negative Werte zurückgebe, dasselbe für 0 große Quadrate mache. So ändere ich den vorherigen Code zu:

    if (squareSideLength < 1) 
        return ""; 
    

    Gut, jetzt was 1? Nun, das ist auch ziemlich einfach, oder?

    if (squareSideLength == 1) 
        return c.ToString(); 
    

    Moral der Geschichte: kümmern sich zuerst um ungültige Daten oder triviale Fälle. Viele Male triviale Fälle können auch Eckfälle sein, die Ihre allgemeine Lösung erschweren können, sie schnell aus dem Weg räumen!

  2. Ok, lassen Sie uns nun darüber nachdenken, was ein Quadrat aussieht:

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

    Nun das Muster ziemlich offensichtlich zu sein scheint. Ein Quadrat besteht aus zwei Zeilen mit der angegebenen Anzahl von Sternen und 0 oder mehr Zeilen mit nur zwei Sternen und squareSideLength - 2 Zwischenräumen. Nun, es ist nur zwei Arten von Zeilen, lassen sich vorne bauen:

    var horizontalOuterRow = new String(c, squareSideLength); 
    var horizontalInnerRow = $"{c}{new string(' ', squareSideLength - 2)}{c}"; 
    
  3. Great!Wir haben unsere Bausteine, jetzt können wir unser Quadrat bauen:

    Also, wie geht das? Nun, wir beginnen einfach mit dem Hinzufügen einer horizontalOuterRow, dann fügen wir die squareSideLength - 2horizontalInnerRow s hinzu und wir beenden das Hinzufügen einer weiteren horizontalOuterRow.

    und voila, wir haben ihnen unser schönes kleine ASCII Quadrat:

    squareBuilder.AppendLine(horizontalOuterRow); 
    
    for (int i = 0; i < squareSideLength - 2; i++) 
    { 
        squareBuilder.AppendLine(horizontalInnerRow); 
    } 
    
    squareBuilder.Append(horizontalOuterRow); 
    

    Die Tatsache, dass ich ein StringBuilder verwendet habe, ist die Frage nicht wirklich von Belang, sondern in die Gewohnheit dieses Tool zu verwenden, wenn Konstruieren Sie dynamisch aufgebaute Strings, deren Länge Sie nicht kennen. Die Verkettung von Strings kann zu einer ziemlich schlechten Performance führen, daher sollten Sie sie möglichst vermeiden.

  4. Jetzt ist unser schönen ASCII Platz wir zurück zu unserem extatic Benutzer stolz zurückkehren und unter dem allgemeinen Applaus sonnen:

    return squareBuilder.ToString(); 
    

Hoffnung diese kleine Antwort, die Ihr hilft.

Denken Sie daran, gut zu codieren, alles in sehr kleine Aufgaben aufzuteilen und sich einzeln um sie zu kümmern. Denk darüber nach, wie du es mit der Hand machen würdest und schreibe es so. Sobald Sie es haben, wird es Zeit geben zu sehen, ob Sie Ihren Code optimieren, umgestalten, usw. müssen. Aber der Schlüssel ist, es so klar wie möglich mit Code zu arbeiten.

+0

Ein bisschen Overkill für solch ein einfaches Problem, aber immer noch gut präsentiert, großartige Erklärungen und Verwendung von C# -Elementen neben "for" Loops. Gut gemacht –

+0

@GioraGuttsait Danke;) Ja es ist ein Overkill, aber das Ziel hier ist es, gute Praktiken zu jemandem zu vermitteln, der eindeutig nur lernt, wie man programmiert. Das Problem selbst ist nur das Mittel dafür. Und mir war langweilig ... – InBetween

+0

Simpler: 'var horizontalOuterRow = neuer String (c, sideSideLength);' –

0
class Program 
{ 
    static void Main(string[] args) 
    { 
     var n = int.Parse(Console.ReadLine()); 

     for (int row = 1; row <= n; row++) 
     { 
      for (int col = 1; col <= n; col++) 
      { 
       if (row == 1 || row == n) 
       { 
        Console.Write("*"); 
       } 
       else 
       { 
        if (col == 1 || col == n) 
        { 
         Console.Write("*"); 
        } 
        else 
        { 
         Console.Write(" "); 
        } 
       } 
      } 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 
    } 
} 
0

Sie können Console.WriteLine in der 2. Schleife wie folgt ändern:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var n = int.Parse(Console.ReadLine()); 

     for (int i = 0; i < n - 1; i++) 
     { 
      Console.Write("*"); 
     } 
     for (int i = 0; i < n - 1; i++) 
     { 
      Console.WriteLine(i == 0 ? "*" : "*" + string.Empty.PadLeft(n - 2) + "*"); 

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

Sie können den string(char, int)-Konstruktor verwenden, um Zeichenfolgen mit sich wiederholenden Zeichen zu erstellen. Auf diese Weise können Sie den Code vereinfachen eine einzige for Schleife zu verwenden:

 var n = int.Parse(Console.ReadLine()); 

     Console.WriteLine(new string('*', n)); 

     for (int i = 0; i < n - 2; i++) 
     { 
      Console.WriteLine("*" + new string(' ', n - 2) + "*"); 
     } 

     Console.WriteLine(new string('*', n));