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-
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.
Une solution simple et amusante:
for (int i = 0; i < 5; i++)
System.out.println(" *********".substring(i, 5 + 2*i));
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.
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:
System.out.print(drawTriangle())
dans votre main ()drawTriangle(3)
ou drawTriangle(5)
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();
}
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");
}
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("");
}
}
}
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("");
}
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();
}
}
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)));
}
}
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.