Anshul Desai
Anshul Desai

Reputation: 57

How to make a diamond using nested for loops

So I was assigned to make a diamond with asterisks in Java and I'm really stumped. Here's what I've come up with so far:

public class Lab1 {
    public static void main(String[] args) {
        for (int i = 5; i > -5; i--) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j >= i; j--) {
                System.out.print(" ");
            }
            System.out.println("*");
        }
    }
}

output

Upvotes: 1

Views: 104128

Answers (19)

HariKrishnan V K
HariKrishnan V K

Reputation: 25

public class Main {
private static int l =1;
public static void main(String[] args) {
    int number =9;
    for(int i=1;i<=2*number -1;i++){
        if(i<=number){
            for(int j=1;j<=(number-i);j++)
                System.out.print("   ");
            for(int j=1;j<=i;j++)
                System.out.print("*     ");
        }
        if(i>number){
            for(int j=1;j<=i-number;j++)
                System.out.print("   ");
            for(int j=1;j<=number-l;j++)
                System.out.print("*     ");
            l += 1;
        }
        System.out.println();
    }
}

}

Upvotes: 0

HariKrishnan V K
HariKrishnan V K

Reputation: 25

public class Main {
public static void main(String[] args) {
    int number = 23,l =1,diff = 1,rem = number/2,rep = 0;
    for(int i=1;i<=number;i++){
        if(i < number/2 +1){
            for(int k=rem;k>=1;k--) 
                System.out.print(" ");
            for(int j=1;j<=l;j++) 
                System.out.print("*");
            diff = 2;
            rem -= 1;
        }
        if(i >= number/2 +1){
            for(int k=0;k<rep;k++) 
                System.out.print(" ");
            for(int j=1;j<=l;j++) 
                System.out.print("*");
            diff =3;
            rep += 1;
        }
        System.out.println();
        l = diff == 2 ? (l + 2) : (l - 2);
    }
}

}

//Suitable for only Odd numbers...

Upvotes: 0

Shiv Kumar Yadav
Shiv Kumar Yadav

Reputation: 1

import static java.lang.System.out;
import java.util.Scanner;

public class Diamond {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int row = sc.nextInt();
        sc.close();
        Diamond d = new Diamond();
        d.upperDiamond(row);
        d.lowerDiamond(row - 2);
    }

    public void upperDiamond(int a) {
        for (int i = 0; i < a; i++) {
            for (int j = a - 1; j > i; j--)
                out.print(" ");
            for (int k = 0; k < 2 * i - 1; k++)
                out.print("*");
            out.print("\n");
        }
    }

    public void lowerDiamond(int b) {
        for (int i = 0; i < b; i++) {
            for (int j = 0; j <= i; j++)
                out.print(" ");
            for (int k = 0; k < 2 * (b - i) - 1; k++)
                out.print("*");
            out.print("\n");
        }
    }
}

Upvotes: 0

Amit Nanda
Amit Nanda

Reputation: 1

package practice;

import java.util.Scanner;

public class Practice {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            if (i <= 5) {
                for (int k = 1; k <= 5 - i; k++) {
                    System.out.print(" ");
                }
                for (int j = 0; j <= i; j++) {
                    System.out.print(" *");
                }
            }
            if (i > 5) {
                for (int k = 0; k <= i - 6; k++) {
                    System.out.print(" ");
                }
                for (int j = 0; j <= 10 - i; j++) {
                    System.out.print(" *");
                }
            }
            System.out.println();
        }
    }
}

Upvotes: -1

ka4eli
ka4eli

Reputation: 5424

public class Diamond {
    //Size of the diamond
    private int diagonal;

    public Diamond(int diagonal) {
        this.diagonal = diagonal;
    }

    public void drawDiamond() {
        int n = diagonal;
        for (int i = n / 2; i >= -n / 2; i--) {
            for (int k = 0; k < i; k++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= (n - i * 2) && i >= 0; j++) {
                System.out.print("*");
            }
            for (int k = 1; k <= -i && i < 0; k++) {
                System.out.print(" ");
            }
            for (int j = (n / 2) * 2 + 2 * i; j >= -(n % 2 - 1) && i < 0; j--) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        //You pass diamond size here in the constructor
        Diamond a = new Diamond(21);
        a.drawDiamond();
    }
}

The main problem is parity of diagonal. If it's even you can't properly draw top asterisk. So there is 2 types of diamonds - with even and odd diagonal (with 2 and 1 asterisk at the top).

Upvotes: 1

CoderAdroidMan4.5
CoderAdroidMan4.5

Reputation: 1

This should work. You probably only need most of the methods and printDiamond(_);

import java.util.Scanner;
public class StarsTry {
    public static void main(String[] args) {
        int reader;
        Scanner kBoard = new Scanner(System.in);
        do {
            System.out.println("Insert a number of rows: ");
            reader = kBoard.nextInt();
            printDiamond(reader);
        } while (reader != 0);
    }

    public static void printStars(int n) {
        if (n >= 1) {
            System.out.print("*");
            printStars(n - 1);
        }
    }

    public static void printTopTriangle(int rows) {
        int x = 1;
        for (int j = (rows - 1); j >= 0; j--, x += 2) {
            printSpaces(j);
            printStars(x);
            System.out.print("\n");
        }
    }

    public static void printSpaces(int n) {
        if (n >= 1) {
            System.out.print(" ");
            printSpaces(n - 1);
        }
    }

    public static void printBottomTriangle(int rows, int startSpaces) {
        int x = 1 + (2 * (rows - 1));
        for (int j = startSpaces; j <= (rows) && x > 0; j++, x -= 2) {
            printSpaces(j);
            printStars(x);
            System.out.print("\n");
        }
    }

    public static void printBottomTriangle(int rows) {
        int x = 1 + (2 * (rows - 1));
        for (int j = 0; j <= (rows - 1) && x > 0; j++, x -= 2) {
            printSpaces(j);
            printStars(x);
            System.out.print("\n");
        }
    }

    public static void printDiamond(int rows) {
        printTopTriangle((int) rows / 2 + 1);
        printBottomTriangle((int) rows / 2, 1);
    }
}

Upvotes: 0

VirusCD
VirusCD

Reputation: 1

import java.util.Scanner;

public class Diamond {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();
        int min = 1;
        for (int i = 0; i < input; i++) {
            for (int j = input - 1; j > i; j--) {
                System.out.print(" ");
            }
            for (int k = 0; k < min; k++) {
                if (k % 2 == 0) {
                    System.out.print("*");
                } else {
                    System.out.print(".");
                }
            }
            min += 2;
            System.out.println();
        }
        int z = input + input - 3;
        for (int i = 1; i < input; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k < z; k++) {
                if (k % 2 == 0) {
                    System.out.print("*");
                } else {
                    System.out.print(".");
                }
            }
            z -= 2;
            System.out.println();
        }
    }
}

Upvotes: 0

Alok
Alok

Reputation: 123

In order to make a diamond you need to set spaces and stars in shape. I have made this simple program using only nested loops since I am a beginner.

public class Diamond {
    public static void main(String[] args) {
        int size = 9,odd = 1, nos = size/2; // nos =number of spaces
        for (int i = 1; i <= size; i++) { // for number of rows i.e n rows
            for (int k = nos; k >= 1; k--) { // for number of spaces i.e
                                                // 3,2,1,0,1,2,3 and so on
                System.out.print(" ");
            }
            for (int j = 1; j <= odd; j++) { // for number of columns i.e
                                                // 1,3,5,7,5,3,1
                System.out.print("*");
            }
            System.out.println();
            if (i < size/2+1) {
                odd += 2; // columns increasing till center row 
                nos -= 1; // spaces decreasing till center row 
            } else {
                odd -= 2; // columns decreasing
                nos += 1; // spaces increasing

            }
        }
    }
}

As you can see nos is the number of spaces. It needs to be decreased until the center row, and the number of stars needs to be increased but after the center row it's the opposite, i.e spaces increase and stars decrease.

size can be any number. I set it to 9 over here so I will have a size 9 star that is 9 rows and 9 columns max... number of space (nos) will be 9/2 = 4.5 . But java will take it as 4 because int can not store decimal numbers and the center row will be 9/2 + 1 = 5.5, which will result in 5 as int.

So first you will make rows... 9 rows hence

(int i=1;i<=size;i++) //size=9

then print spaces like I did

(int k =nos; k>=1; k--) //nos being size/2

then finally stars

(int j=1; j<= odd;j++)

once the line ends...

You can adjust stars and spaces using an if condition.

Upvotes: 4

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79085

java-11

Using String#repeat introduced as part of Java-11, you can do it using a single statement inside a single loop.

public class Main {
    public static void main(String[] args) {
        final int MID_ROW_NUM = 5;
        for (int i = 1 - MID_ROW_NUM; i < MID_ROW_NUM; i++) {
            System.out.println(" ".repeat(Math.abs(i)) + "*".repeat((MID_ROW_NUM - Math.abs(i)) * 2 - 1));
        }
    }
}

Output:

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

By changing the space, you can also print a variant of the diamond:

public class Main {
    public static void main(String[] args) {
        final int MID_ROW_NUM = 5;
        for (int i = 1 - MID_ROW_NUM; i < MID_ROW_NUM; i++) {
            System.out.println("  ".repeat(Math.abs(i)) + "* ".repeat((MID_ROW_NUM - Math.abs(i)) * 2 - 1));
        }
    }
}

Output:

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

Upvotes: 0

asim iqbal
asim iqbal

Reputation: 1

class Inc_Dec {
    public static void main(String[] args) {
        int le = 11;
        int c = 0;
        int j1 = (le / 2) + 1;
        int j2 = le - j1;
        for (int i = 1; i <= le; i++) {
            if (c < j1) {
                for (int k = (j1 - i); k > 0; k--) {
                    System.out.print(" ");
                }
                for (int j = 1; j <= i; j++) {
                    System.out.print("*" + " ");
                }
                c++;
                System.out.println();
            } else {
                for (int k = (i - j1); k > 0; k--) {
                    System.out.print(" ");
                }
                for (int j = (le - i + 1); j > 0; j--) {
                    System.out.print("*" + " ");
                }
                System.out.println();
            }
        }
    }
}

Upvotes: -1

akhilesh
akhilesh

Reputation: 11

public class MyDiamond {
    public static void main(String[] args) {
        //Length of the pyramid that we want.151 is just an example
        int numRows = 151;
        //midrow is the middle row and has numRows number of *
        int midrow = (numRows + 1) / 2;

        int diff = 0;
        for (int i = 1; i < numRows + 1; i++) {
            for (int j = 1; j < numRows + 1; j++) {
                if (((midrow - diff) <= j && (j <= midrow + diff))) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
            if (i < midrow) {
                diff++;
            } else {
                diff--;
            }
        }
    }
}

Upvotes: 1

Brian
Brian

Reputation: 39

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

for (int i = 5; i > 0; i--)
    System.out.println("     **********".substring(i - 1, 5 + (2 * i) - 3));

Upvotes: 3

fiberOptics
fiberOptics

Reputation: 7165

Try this

public class Main {
    public static void main(String[] args) {
        int n = 50;
        int space = n - 1;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < space; j++) {
                System.out.print(" ");
            }

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

        space = 0;

        for (int i = n; i > 0; i--) {
            for (int j = 0; j < space; j++) {
                System.out.print(" ");
            }

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

            System.out.println("");
            space++;
        }
    }
}

Upvotes: 0

Keshav Gera
Keshav Gera

Reputation: 11244

enter image description here

Note: Using Count Global variable we can manage space as well as star increment and decrement.

import java.util.*;
public class ParamidExample {
    public static void main(String args[]) {
        System.out.println("Enter a number");
        Scanner sc = new Scanner(System.in);
        int no = sc.nextInt();

        int count = 1;
        for (int i = 1; i <= 2 * no - 1; i++) {
            for (int j = count; j <= no; j++) {
                System.out.print("  ");
            }
            for (int k = 1; k <= count * 2 - 1; k++) {
                System.out.print("* ");
            }
            if (i < no)
                count++;
            else
                count--;
            System.out.println("");
        }
    }
}

Upvotes: 1

user14940971
user14940971

Reputation:

You can print a diamond of asterisks (mathematical operators) as follows:

int m = 4;
int n = 4;
for (int i = -m; i <= m; i++) {
    for (int j = -n; j <= n; j++) {
        int val = Math.abs(i) + Math.abs(j);
        System.out.print(val > Math.max(m, n) ? " " : "∗");
        if (j < n) {
            System.out.print(" ");
        } else {
            System.out.println();
        }
    }
}

Output:

        ∗        
      ∗ ∗ ∗      
    ∗ ∗ ∗ ∗ ∗    
  ∗ ∗ ∗ ∗ ∗ ∗ ∗  
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
  ∗ ∗ ∗ ∗ ∗ ∗ ∗  
    ∗ ∗ ∗ ∗ ∗    
      ∗ ∗ ∗      
        ∗        

Upvotes: 0

hokwanhung
hokwanhung

Reputation: 647

I have the exact classwork in my university which also requires me to finish it in 3 for loops.

And this is how I did it.

In a simple way of explanation, I divide the diamond into two parts.

no. of lines no. of spaces no. of stars total no. of slots
1 4 1 5
2 3 3 6
3 2 5 7
4 1 7 8
5 0 9 9
6 1 7 8
7 2 5 7
8 3 3 6
9 4 1 5

I want to find the no. of slots and the no. of spaces with each line, then allocating the no. of stars would be really easy.

And considering the no. of slots, line 1 - 5 and line 6 - 9 would become two separate groups(i.e. middleLine).

The equation of the no. of slots of the first half would be numberOfLines(i.e. i) + (middleLine - 1) where middleLine - 1 would be 4 when the maxNumberOfLines is 9.

The equation of the no. of slots of the last half would be middleLine(i.e. replacement of I) + (middleLine - 1)(i.e. same as above) - (i - middleLine) where i - middleLine would be -1 when i = 6.

And for the space, the first half would be middleLine - i and last half would be i - middleLine, which are exactly in a negative relationship(or symmetrical regarding their slopes).

public class printOutDiamondWith3Loops {

public static void main(String[] args) {
    
    int userInput = 9;

    double maxNumberOfLines = userInput;
    // double type is used instead of integer type in order to prevent removal of remainder when a division performed.
    double middleLine = Math.ceil(maxNumberOfLines/2);

    // Print out the diamond.
    for (int i = 1; i <= maxNumberOfLines; i++) { 
    // Determine the number of lines, which is also the maximum number of slots (the line in the middle).
        if (i <= middleLine) { 
        // Separate the whole diamond into two parts(as mentioned above).
            for (int j = 1; j <= i + ((middleLine - 1)); j++) {
            // Determine the no. of slots in each line from line 1 to 5.
                if (j <= middleLine - i) { 
                // Determine the no. of spaces and stars.
                    System.out.print(" ");
                } else {
                    System.out.print("*");
                }
            }
        } else { // i > middleLine
            for (int k = 1; k <= (middleLine + (middleLine - 1)) - (i - middleLine); k++) {
            // Determine the no. of slots in each line from line 6 to 9.
            // For better understanding, I did not simplify the above condition.
            // Noticeably, the first middleLine in above for loop is a replacement of i.
                if (k <= i - middleLine) {
                // Determine the no. of spaces and stars.
                    System.out.print(" ");
                } else {
                    System.out.print("*");
                }
            }
        } 
        System.out.println();   
    }

}

With such a framework, it is much easier to make further changes, such as letting the user input the no. of lines they want.

Hope this answer could help you.

I could lend you a more detailed version of my work, though not necessarily in need(the above explanation already explains the concepts): print-Out-Diamond-With-3-Loops-Advanced-Version.java

Upvotes: 0

Masoud Rezaei
Masoud Rezaei

Reputation: 31

package com.DiamondPrintingProgram;

import java.util.Scanner;

public class DiamondPrintingProgram {

    public static void main(String[] args) { 
        int num = getInput();
        int middle = (int) num / 2 + 1;
        printOutput(num,middle); 
    }
    public static int getInput() {
        Scanner sc = new Scanner(System.in);
        int num;
        System.out.print("Enter a odd number: ");
        while (true) {
            num = sc.nextInt();
            if (num % 2 != 0) {
                break;
            }
            System.out.print("Please Enter a ODD NUMBER: ");
        }
        return num;
    }
    private static void printOutput(int num, int middle){
        char asterisk = '*';
        for (int j = 0; j < num; j++) {
            for (int i = 1; i <= num; i++) {
                if (j < middle) {
                    if ((i < (middle - j) || i > (middle + j))) {
                        System.out.print(' ');
                    } else {
                        System.out.print(asterisk);
                    }
                } else {
                    if ((i < (j - middle + 2)) || (i > (2 * num - j - middle))) {
                        System.out.print(' ');
                    } else {
                        System.out.print(asterisk);
                    }
                }
            }
            System.out.println();
        }
    }
}

Upvotes: 0

KHW1031
KHW1031

Reputation: 136

import java.util.Scanner;

public class MakeDiamond {
public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    while (true) {

        System.out.println("Let's Creat Diamonds");
        System.out.println("If number increases Diamonds gets bigger. Please input number lager than 1 : ");

        int user_input = sc.nextInt(); //gets user's input
        System.out.println("");

        int x = user_input;
        int front_space =  -5;

        for (int i = 0; i < 2 * user_input + 1; i++) {
            for (int a = front_space; a < Math.abs(i - user_input); a++) {
                System.out.print("    "); //Change a bit if diamonds are not in good shape
            }

            if (i < user_input + 1) {
                for (int b = 0; b < 2 * i + 1; b++) {
                    System.out.print("*  "); //Change a bit if diamonds are not in good shape
                }

            } else if (i > user_input) {
                for (int c = 0; c < 2 * x - 1; c++) {
                    System.out.print("*  "); //Change a bit if diamonds are not in good shape
                }
                x--;
            }
            System.out.print('\n');
        }

        System.out.println("\nRun Again? 1 = Run,  2 = Exit : ");

        int restart = sc.nextInt();
        System.out.println("");

        if (restart == 2) {
            System.out.println("Exit the Program.");
            System.exit(0);
            sc.close();
        }
    }
  }
}

When making diamonds with while or for loops. I think using 'Math.abs' will be the simplest way to make it.

You can put number by Scanner, and when input number increases diamonds will get bigger.

I used Eclipse to make this program. so, the Space will be differ by your running environment. like another IDE, CMD or Terminal. if diamonds are not in good shape. Just change spaces.

Upvotes: 0

henderso
henderso

Reputation: 1045

I can see what you are trying to do and this is a pretty neat way to think about the diamond.

You will have some issues with the j counter when i goes negative..look at how to use Math.abs()

Also try writing some pseudo code in basic steps with comments to get the pattern clear:

 //print 5 spaces + 1 star
 //print 4 spaces + 2 stars
 //print 3 spaces + 3 stars
 //print 2 spaces+ 4 stars
 .
 . 
 .  
 //print 5 spaces + 1 star

Then, literally substitute variables (j and i) for the numbers.

You now have a model. This is often the hardest part in programming..getting the model right. Only jump into coding when you have a good idea for how the model works.

Once you have the variables substituted, you can try to convert the whole thing into an automated loop.

Upvotes: 0

Related Questions