2017-10-22 1 views
2

Ich versuche, das Martini-Glas-Muster mit C# zu drucken. Das Muster ist wie folgt:Wie würde ich Martini-Glas-Muster in C# optimal drucken

für Eingang = 4;

0000000 
00000 
    000 
    0 
    | 
    | 
    | 
    | 
======= 

für Eingang = 5;

000000000 
0000000 
    00000 
    000 
    0 
    | 
    | 
    | 
    | 
    | 
========= 

Ich bin in der Lage, bis Dreieck zu erhalten (0en) .Allerdings, ich versagen, den Hals zu bekommen (|) und am Boden (=).

Mein Code sieht wie folgt aus:

 const int height = 4; 
     for (int row = 0; row < height; row++) 
     { 
      //left padding 
      for (int col = 0; col < row; col++) 
      { 
       Console.Write(' '); 
      } 

      for (int col = 0; col < (height - row) * 2 - 1; col++) 
      { 

       Console.Write('0'); 
      } 
      //right padding 
      for (int col = 0; col < row; col++) 
      { 
       Console.Write(' '); 
      } 
      Console.WriteLine(); 
     } 
     for(int i = 1; i < height; i++) 
     { 
      Console.Write('|'); 
     } 
     Console.ReadKey(); 

Und es druckt wie folgt aus:

0000000 
00000 
    000 
    0 
||| 

jemand kann mir helfen, den Hals und den Boden in der Weiterverarbeitung? Und ist mein Code auch optimal? Sie können den gesamten Code für die Optimierung bearbeiten.

Vielen Dank im Voraus.

Editiert: -Code hinzugefügt, um Hals und unten:

for (int i = 1; i <= height; i++) 
     { 
      // Left padding 
      for (int j = 1; j < height; j++) 
      { 
       Console.Write(' '); 
      } 
      Console.WriteLine('|'); 
     } 
     for (int row = 0; row < height; row++) 
     { 
      for (int col = 0; col < row; col++) 
      { 
       Console.Write('='); 
      } 
     } 

     Console.ReadKey(); 

Antwort

4

Zeichenfolgenkonstruktor lesen ist hilfreich übermäßige Schleifen

int count = 5; 
for(int i = count - 1; i >= 0; i--) 
{ 
    Console.WriteLine(new string('0', 2*i + 1).PadLeft(i+count)); 
} 
Console.Write(new string('|', count).Replace("|","|\n".PadLeft(count+1))); 
Console.WriteLine(new string('=', count* 2-1)); 
1

Sie müssen zuerst die Räume in der linken drucken. Genauso wie bei "0". Left Padding Teil.

for(int i = 1; i <= height; i++) 
{ 
    // Left padding 
    for(int j = 1; j < height; j++) 
    { 
     Console.Write(' '); 
    } 
    Console.WriteLine('|'); 
} 

Und Ihre Halsschleife bis <=height gehen sollte.

Nun, ich denke, Sie können den unteren Teil vervollständigen. (Es wird gleich sein wie die erste Zeile von '0', ohne Polsterung) Bitte lassen Sie mich wissen, wenn Sie irgendwelche Schwierigkeiten haben.

Auch glaube ich nicht, dass Sie rechts Polsterung Teil benötigen.

Ich hoffe, es hilft.

EDIT: Unterteil:

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

Mit diesem Code schreiben zu vermeiden, kann ich den Halsteil richtig zu bekommen, aber der Boden ist leicht linksseitig. Ich denke, es sollte ein bisschen rechts seitig sein. Bitte sehen Sie den bearbeiteten Teil in meiner Frage – Santosh

+0

Aus diesen zwei Lösungen, die optimal sind? – Santosh

+0

Sie benötigen keine verschachtelte Schleife für den unteren Teil. Nur ich Schleife sollte genug sein. Siehe meine Bearbeitung. –

4

Verwenden Sie die string Klassenkonstruktors ein Muster zu wiederholen, anstatt sie über Looping.

class HelloWorld { 
    static void Main() { 
     const int height = 1 ; 
     for (int row = 0; row < height; row++) 
     { 
      var spaces = new String(' ', row); 
      var zeroes = new String('0', ((height - row) * 2) -1); 
      Console.WriteLine(spaces + zeroes); 
     } 
     for(int i = 1; i <= height; i++) 
     { 
      var spaces = new String(' ', height -1); 
      Console.WriteLine(spaces + '|'); 
     } 
     Console.WriteLine(new String('=', (height *2) -1)); 
     Console.ReadKey(); 
    } 

} 

bearbeiten

Aber optimal ich schneller Ausführungszeit gehe davon aus. Aber für relativ kleinere Werte sehe ich nicht, wie die beiden einen signifikanten Unterschied machen könnten. Aber ich lief es immer noch auf BenchmarkDotNet

Erste verweist auf meinen Code und Zweite ist kazem's.

Ich bin nicht sicher, was aus diesem Ausgang zu machen.Aber ich nehme Sie mehr auf sie aus their documentation

// * Detailed results * 
MartiniBenchMark.First: DefaultJob 
Runtime = .NET Framework 4.6.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.6.1586.0; GC = Concurrent Workstation 
Mean = 1.7365 ms, StdErr = 0.0081 ms (0.47%); N = 15, StdDev = 0.0315 ms 
Min = 1.6916 ms, Q1 = 1.7099 ms, Median = 1.7309 ms, Q3 = 1.7626 ms, Max = 1.8087 ms 
IQR = 0.0527 ms, LowerFence = 1.6309 ms, UpperFence = 1.8417 ms 
ConfidenceInterval = [1.7028 ms; 1.7702 ms] (CI 99.9%), Margin = 0.0337 ms (1.94% of Mean) 
Skewness = 0.45, Kurtosis = 2.58 


MartiniBenchMark.Second: DefaultJob 
Runtime = .NET Framework 4.6.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.6.1586.0; GC = Concurrent Workstation 
Mean = 1.8580 ms, StdErr = 0.0147 ms (0.79%); N = 96, StdDev = 0.1440 ms 
Min = 1.6291 ms, Q1 = 1.7440 ms, Median = 1.8311 ms, Q3 = 1.9782 ms, Max = 2.2573 ms 
IQR = 0.2342 ms, LowerFence = 1.3927 ms, UpperFence = 2.3295 ms 
ConfidenceInterval = [1.8081 ms; 1.9079 ms] (CI 99.9%), Margin = 0.0499 ms (2.69% of Mean) 
Skewness = 0.42, Kurtosis = 2.22 


Total time: 00:12:04 (724.8 sec) 

// * Summary * 

BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 1 (10.0.14393) 
Processor=Intel Core i3-3110M CPU 2.40GHz (Ivy Bridge), ProcessorCount=4 
Frequency=2338445 Hz, Resolution=427.6346 ns, Timer=TSC 
    [Host]  : .NET Framework 4.6.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.6.1586.0 
    DefaultJob : .NET Framework 4.6.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.6.1586.0 


Method |  Mean |  Error | StdDev | 
------- |---------:|----------:|----------:| 
    First | 1.737 ms | 0.0337 ms | 0.0315 ms | 
Second | 1.858 ms | 0.0499 ms | 0.1440 ms | 

// * Hints * 
Outliers 
    MartiniBenchMark.First: Default -> 3 outliers were removed 
    MartiniBenchMark.Second: Default -> 4 outliers were removed 

// * Legends * 
    Mean : Arithmetic mean of all measurements 
    Error : Half of 99.9% confidence interval 
    StdDev : Standard deviation of all measurements 
    1 ms : 1 Millisecond (0.001 sec) 
+0

Von diesen beiden Lösungen, die optimal sind? – Santosh

+0

Auch in der zweiten 'for' Schleife sollte' i' nicht bei '0' beginnen? Andernfalls wird weniger als die erwartete Ausgabe gedruckt. –

+0

Sie haben wieder Recht. Wenn die Höhe 1 ist, würde die IT nichts drucken. – thebenman

Verwandte Themen