web-dev-qa-db-fra.com

Créer un triangle avec des boucles for

Je ne semble pas être en mesure de trouver la réponse à ceci- 

Je dois dessiner un simple triangle en utilisant des boucles for.

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

Je peux faire un demi-triangle, mais je ne sais pas comment ajouter à ma boucle actuelle pour former un triangle complet. 

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



  for (int i=0; i<6; i++)
  {
  for (int j=0; j<i; j++)
  {
  System.out.print("*");
  }
  System.out.println("");
  }

Merci-

10
Kerry G

Tout d’abord, vous devez vous assurer que vous produisez le nombre correct de symboles *. Nous devons produire 1, 3, 5 et cetera au lieu de 1, 2, 3. Ceci peut être corrigé en modifiant les variables du compteur:

for (int i=1; i<10; i += 2)
{
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Comme vous pouvez le constater, ceci entraîne que i commence à 1 et augmente de 2 à chaque étape tant que sa taille est inférieure à 10 (c'est-à-dire, 1, 3, 5, 7, 9). Cela nous donne le nombre correct de symboles *. Nous devons ensuite fixer le niveau d'indentation par ligne. Cela peut être fait comme suit:

for (int i=1; i<10; i += 2)
{
    for (int k=0; k < (4 - i / 2); k++)
    {
        System.out.print(" ");
    }
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Avant d'imprimer les symboles *, nous imprimons des espaces et le nombre d'espaces varie en fonction de la ligne sur laquelle nous nous trouvons. C’est à quoi sert la boucle for avec la variable k. Nous pouvons voir que k itère sur les valeurs 4, 3, 2, 1 et 0 lorsque ì est 1, 3, 5, 7 et 9. C’est ce que nous voulons, car plus nous sommes hauts dans le triangle, plus nous avons besoin d’espaces. Plus nous avançons dans le triangle, moins nous avons besoin d'espaces et la dernière ligne du triangle n'a même pas besoin d'espaces. 

16
Simeon Visser

Une solution simple et amusante:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));
20
Marko Topolnik

Pensez d'abord à une solution sans code. L'idée est d'imprimer un nombre impair de *, en augmentant par ligne. Puis centrez le * en utilisant des espaces. Connaître le nombre maximum de * dans la dernière ligne vous donnera le nombre initial d'espaces pour centrer le premier *. Maintenant, écrivez-le dans le code.

3
Pablo Pazos

J'apprécie le fait que l'OP soit nouveau en Java. Les méthodes peuvent donc être considérées comme "avancées". Toutefois, je pense que cela vaut la peine d'utiliser ce problème pour montrer comment vous pouvez attaquer un problème en le décomposant en morceaux.

Pensons à l’écriture d’une méthode pour imprimer une seule ligne, en indiquant à quelle méthode il s'agit:

public void printTriangleLine(int rowNumber) {
    // we have to work out what to put here
}

Nous devons imprimer un certain nombre d'espaces, puis un certain nombre d'étoiles.

En regardant l'exemple, je peux voir que (si la première ligne est 0), il s'agit d'espaces (5-rowNumber) et (2 * rowNumber + 1).

Inventons une méthode qui affiche les lignes de caractères pour nous et utilisons-la:

public void printTriangleLine(int rowNumber) {
    printSequence(" ", 5 - rowNumber);
    printSequence("*", 2 * rowNumber + 1);
    System.out.println(); 
}

Cela ne se compilera pas tant que nous n’aurons pas écrit printSequence ().

public void printSequence(String s, int repeats) {
    for(int i=0; i<repeats; i++) {
        System.out.print(s);
    }
}

Maintenant, vous pouvez tester printSequence lui-même, et vous pouvez {tester printTriangleLine lui-même. Pour l'instant, vous pouvez simplement l'essayer en appelant ces méthodes directement dans main()

public static void main(String [] args) {
    printSequence("a",3);
    System.out.println();
    printTriangleLine(2);
}

... lancez-le et vérifiez (avec vos yeux) qu'il génère:

aaa
   *****

Lorsque vous serez plus avancé dans la programmation, vous voudrez utiliser un framework de test unitaire comme jUnit. Au lieu d'imprimer, il est plus probable que vous écriviez des éléments tels que printTriangleLine pour renvoyer une chaîne (que vous imprimeriez plus haut dans votre programme), et vous automatiseriez vos tests avec des commandes telles que:

assertEquals("   *****", TriangleDrawer.triangleLine(2));
assertEquals("     *", TriangleDrawer.triangleLine(0))

Nous avons maintenant les pièces dont nous avons besoin pour dessiner un triangle.

public void drawTriangle() {
    for(int i=0; i<5; i++) {
        printTriangleLine(i);
    }
}

Le code que nous avons écrit est un peu plus long que les réponses données par d’autres personnes. Mais nous avons pu tester chaque étape et nous disposons de méthodes que nous pouvons utiliser à nouveau pour résoudre d'autres problèmes. Dans la vraie vie, nous devons trouver le bon équilibre entre diviser un problème en trop de méthodes, ou trop peu. J'ai tendance à préférer beaucoup de méthodes vraiment courtes.

Pour un crédit supplémentaire:

  • adaptez cela pour qu'au lieu d'imprimer sur System.out, les méthodes renvoient une chaîne - vous pouvez donc utiliser System.out.print(drawTriangle()) dans votre main ()
  • adaptez cela pour pouvoir demander à drawTriangle () de différentes tailles, c'est-à-dire que vous pouvez appeler drawTriangle(3) ou drawTriangle(5)
  • faites-le fonctionner pour de plus grands triangles. Astuce: vous devrez ajouter un nouveau paramètre "width" à printTriangleLine ().
3
slim

Essayez celui-ci en Java

for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
    for (int j = 0; j < i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < k; j++) {
        System.out.print("*");
    }
    for (int j = 1; j < k; j++) {
        System.out.print("*");
    }
    System.out.println();
}
2
loveleen

Question sur les devoirs? Vous pouvez modifier votre code original 'triangle droit' pour générer un 'triangle droit' inversé avec des espaces.

for(i=0; i<6; i++)
{
for(j=6; j>=(6-i); j--)
{
   print(" ");
}
for(x=0; x<=((2*i)+1); x++)
{
   print("*");
}
print("\n");
}
2
Ganesh Iyer

Cela répondra à votre question. décommentez le code commenté pour afficher uniquement la ligne extérieure :)

public class TrianglePattern {

    public static void main(String[] args) {
        // This logic will generate the triangle for given dimension
        int dim = 10;
        for (int i = 0; i < dim; i++) {
            for (int k = i; k < dim; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                //if (i != dim - 1)
                //  if (j == 0 || j == i)
                //      System.out.print("*");
                //  else
                //      System.out.print(" ");
                //else
                    System.out.print("*");
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}
1
Chandra
  for (int i=0; i<6; i++)
  {
     for (int k=0; k<6-i; k++)
     {
        System.out.print(" ");
     }
     for (int j=0; j<i*2+1; j++)
     {
        System.out.print("*");
     }
     System.out.println("");
  }
1
citydeer
private static void printStar(int x) {
    int i, j;
    for (int y = 0; y < x; y++) { // number of row of '*'

        for (i = y; i < x - 1; i++)
            // number of space each row
            System.out.print(' ');

        for (j = 0; j < y * 2 + 1; j++)
            // number of '*' each row
            System.out.print('*');

        System.out.println();
    }
}
1
Fahim Faysal

Eh bien, il y aura deux séquences size-n pour les espaces et (2*(n+1)) -1 pour les étoiles. Voici.

public static void main(String[] args) {
    String template = "***************************";
    int size = (template.length()/2);
    for(int n=0;n<size;n++){
        System.out.print(template.substring(0,size-n).replace('*',' '));
        System.out.println(template.substring(0,((2*(n+1)) -1)));
    }
}
0
zawhtut

Cela vous permet d'avoir un peu plus de contrôle et un temps plus facile pour le rendre:

public static int biggestoddnum = 31;

public static void main(String[] args) {
    for (int i=1; i<biggestoddnum; i += 2)
    {
        for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
        {
            System.out.print(" ");
        }
        for (int j=0; j<i; j++)
        {
            System.out.print("*");
        }
        System.out.println("");
    }
}

Remplacez simplement la valeur de public static int biggestoddnum par le nombre impair souhaité et la fonction for(int k...) a été testée.

0
user8742736