2011-04-06 4 views
0

Bonjour à tous J'essaie de résoudre le problème d'arbre astérisque et a trouvé mon code ne fonctionne pas correctement et peut être amélioré.créer l'arbre astérisque avec C#

Ceci est la production qui devrait

entrée

: 5

* 
    * * * 
* * * * * 
    * * * 
    * 
entrée

: 4

* * * * 
    * * 
* * * * 

et ceci est mon code

static void Main(string[] args) 
     { 
      Console.Write("input:"); 

      char input = Console.ReadKey().KeyChar; 

      if (char.IsDigit(input)) 
      { 
       int couter = (int)char.GetNumericValue(input); 

       Console.WriteLine(); 

       if (couter % 2 != 0) 
       { 

        for (int i = 1; i <= couter; i++) 
        { 

         for (int j = 3; j > i; j--) 
         { 

          Console.Write(" "); 

         } 

         for (int k = 1; k <= i; k++) 
         { 

          Console.Write(" *"); 

         } 

         Console.WriteLine(); 
        } 

        for (int i = couter - 1; i >= 3; i--) 
        { 
         for (int j = 1; j <= i; j++) 
         { 

          if (j <= couter - i) 
          { 
           Console.Write(" "); 
          } 
          else 
          { 
           Console.Write("* "); 
          } 
         } 

         Console.WriteLine(); 
        } 

       } 
       else 
       { 

        for (int i = couter; i > 3; i--) 
        { 
         for (int j = 1; j <= i; j++) 
         { 
          if (couter - i >= j) 
          { 
           Console.Write(" "); 
          } 
          else 
          { 
           Console.Write("* "); 
          } 
         } 

         Console.WriteLine(); 


        } 

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

         Console.WriteLine(); 
        } 
       } 

      } 
     } 

S'il vous plaît pourriez-vous me aider pour résoudre ce problème problème. Dernièrement, je pense que je suis pauvre en algorithmes et un petit problème complexe. Est-ce que quelqu'un sait lien utile ou comment je peux améliorer cette compétence, s'il vous plaît faites le moi savoir.

Merci,

+2

Que diriez-vous de la sortie désirée pour 3 et 6? –

+0

Je pense que vous avez besoin de quelque chose de plus générique que 5 ou 4 Console.WriteLine() non? Je suppose que vous voulez imprimer un diamant de taille n, pas seulement 5, est-ce que j'ai encore raison? – digEmAll

Répondre

1

Vérifiez cette page pour l'entrée 5 (diamant): http://www.dreamincode.net/forums/topic/126715-diamond-asterisk/

J'ai traduit à C# - maintenant il affiche des diamants avec la taille que vous définissez dans la variable 'lignes':

int rows = 5; 
StringBuilder sb = new StringBuilder(); 
// top part 
for (int i = 1; i <= rows; i++) 
{ 
    for (int j = 1; j <= rows - i; j++) 
     sb.Append(' '); 
    for (int k = 1; k <= 2 * i - 1; k++) 
     sb.Append('*'); 
    sb.AppendLine(); 
} 
//bottom part 
for (int n = rows - 1; n > 0; n--) 
{ 
    for (int l = 1; l <= rows - n; l++) 
     sb.Append(' '); 
    for (int m = 1; m <= 2 * n - 1; m++) 
     sb.Append('*'); 
    sb.AppendLine(); 
} 
Console.Write(sb.ToString()); 
+0

Marek Kwiendacz, merci beaucoup. – embarus

1

j'étais d'abord réticent à poster parce que ça sent vraiment comme les devoirs ...

Quoi qu'il en soit, voici un morceau de code de travail :

static void Main(string[] args) 
{ 
    Console.Write("input:"); 

    char input = Console.ReadKey().KeyChar; 

    if (char.IsDigit(input)) 
    { 
     int couter = (int)char.GetNumericValue(input); 
     Console.WriteLine(); 
     if (couter % 2 != 0) 
      PrintDiamond(couter); 
     else 
      PrintHourGlass(couter); 
    } 
    Console.ReadLine(); 
} 

private static void PrintDiamond(int couter) 
{ 
    bool moreAsterisks = true; 
    for (int row = 0; row < couter; row++) 
    { 
     int nAsterisks = moreAsterisks ? (2 * row) + 1 : 2 * (couter - row - 1) + 1; 
     int nSpaces = (couter - nAsterisks)/2; 

     if (row == (couter - 1)/2) 
      moreAsterisks = false; 

     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     for (int i = 0; i < nAsterisks; i++) 
      Console.Write("*"); 
     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     Console.WriteLine(); 
    } 
} 

private static void PrintHourGlass(int couter) 
{ 
    bool moreAsterisks = false; 
    for (int row = 0; row < couter - 1; row++) 
    { 
     int nAsterisks = moreAsterisks ? couter - 2 * (couter - row - 2) : couter - (2 * row); 
     int nSpaces = (couter - nAsterisks)/2; 

     if (row == (couter - 2)/2) 
      moreAsterisks = true; 

     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     for (int i = 0; i < nAsterisks; i++) 
      Console.Write("*"); 
     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     Console.WriteLine(); 
    } 
} 

P.S.: il fonctionne avec un nombre, non seulement 4-5 ...

+0

digEmAll, Merci beaucoup. – embarus

0

est ici une solution LINQ minified pour votre problème:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("input: "); 
      string line = Console.ReadLine(); 

      int n; 
      if (!int.TryParse(line, out n)) 
      { 
       Console.WriteLine("Enter a valid integer number."); 
       return; 
      } 

      for (int i = 0; i < n; i++) 
      { 
       int l = Math.Abs(n - i * 2 - 1) + 1; 
       if (n % 2 != 0) l = n - l + 1; 

       Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
       Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      } 
     } 
    } 

Il est assez simple; à l'intérieur de la boucle, la première ligne calcule la longueur de la i-ième rangée de diamants si l'entrée est égale, la seconde corrige le calcul de l'entrée impaire. Les deux lignes restantes impriment la i-ième ligne en utilisant quelques astuces LINQ. Si vous n'aimez pas montrer avec LINQ, vous pouvez remplacer ces lignes par des boucles régulières (ce qui sera probablement plus rapide). Alors le code ressemblerait à:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write("input: "); 
     string line = Console.ReadLine(); 

     int n; 
     if (!int.TryParse(line, out n)) 
     { 
      Console.WriteLine("Enter a valid integer number."); 
      return; 
     } 

     for (int i = 0; i < n; i++) 
     { 
      int l = Math.Abs(n - i * 2 - 1) + 1; 
      if (n % 2 != 0) l = n - l + 1; 

      //Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      //Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      for (int c = 0; c < n - l; c++) Console.Write(" "); 
      for (int c = 0; c < l; c++) Console.Write("* "); 
      Console.WriteLine(); 
     } 
    } 
} 
+0

77v, Merci beaucoup. – embarus