Martijn Kerckhaert
Martijn Kerckhaert

Reputation: 494

c# Loops with stars and spaces

I am currently breaking my head over this simple assignment for loops that I have to do.

Basically what I want to achieve is:

1) User gives imput how long the star pyramid should be

2) Make a pyramid with a for loop.

It needs to look something like this: (If it needs to be 5 stories high; first row is 5 spaces 1 star; second row 4 spaces 2 stars and so on.

    *
   **
  *** 
 ****

(Hard to format but you get my intention.)

I currently have this

    public void Pyramid()
    {
        Console.WriteLine("Give the hight of the pyramid");
        _aantal = Convert.ToInt32(Console.ReadLine());

        for (int i = 1; i <= _aantal; i++) // loop for hight
        {
            for (int d = _aantal; d > 0; d--) // loop for spaces
            {
                Console.Write(_spatie);
            }

            for (int e = 0; e < i; e++) // loop for stars
            {
                Console.Write(_ster);
            }

            Console.WriteLine();
        }
    }

The output is always the inserted number amount of spaces and it is not decremented correctly. Although if I debug it it counts down correctly.

Thank you for responding.

Upvotes: 0

Views: 8037

Answers (5)

Jevgeni Geurtsen
Jevgeni Geurtsen

Reputation: 3133

To get a pyramid (with proper spacing) like this:

Pyramid example

You can use:

    static void Main(string[] args)
    {
        // The length of the pyramid
        int lengte = 18;

        // Loop through the length as given by the user
        for (int i = 0; i <= lengte; i++)
        {
            // If its an even number (we don't want 1-2-3.. but 1-3-5.. stars)
            if (i % 2 == 0)
            {
                // Calculate the length of the spaces we need to set
                int spatieLengte = (lengte / 2) - (i / 2);
                // Display spaces
                for (int spaties = 0; spaties <= spatieLengte; spaties++)
                {
                    Console.Write(" ");
                }
                // Display stars
                for (int sterren = 0; sterren <= i; sterren++)
                {
                    Console.Write("*");
                }
                // Newline
                Console.WriteLine();
            }
        }
        Console.ReadLine();
    }

Obviously the if block and spaceLengte variable aren't really needed. But I thought it would make it somewhat easier for OP to read.

Good luck / Succes ermee ;)

Upvotes: 0

King
King

Reputation: 183

Got it !

static void Main(string[] args)
    {
        Console.WriteLine("Give the hight of the pyramid");
        string _spatie = " ";
        string _ster = "*";
        int _aantal = Convert.ToInt32(Console.ReadLine());

        for (int i = 1; i <= _aantal; i++) // loop for height
        {

            for (int d = i; d < _aantal; d++) // loop for spaces
            {
                Console.Write(_spatie);
            }

            for (int e = 1; e <= i; e++) // loop for stars
            {
                Console.Write(_ster);
            }

            Console.WriteLine();
        }

        Console.ReadKey();
    }

Check this out..!! You were missing out the iterator 'i' of the height loop inside the spaces loop.

You will get the triangle :-

   *
  **
 ***
****

You will need odd number of stars always for a symmetrical pyramid.

Upvotes: 0

Ryno Coetzee
Ryno Coetzee

Reputation: 517

I know you wanted to do this as a console app but if you adapt this code it should work fine

Replace textbox1/2 with Consle.Readline/Write

    int pyramidstories = int.Parse(TextBox2.Text);
    int I = 1;

    while (I <= pyramidstories)
    {
        for (int spacecount = 0; spacecount < (pyramidstories - I); spacecount++)
        {
            TextBox1.Text += " ";
        }

        for (int starcount = 1; starcount < I + 1; starcount++)
        {
            TextBox1.Text += "*";
        }

        TextBox1.Text += Environment.NewLine;

        I++;
    }

As your question states you need:
4 spaces 1 star
3 spaces 2 stars
2 spaces 3 stars
etc..

so your pyramid should look something like

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

The code sample above displays a pyramid as illustrated above

Upvotes: 0

Jonesopolis
Jonesopolis

Reputation: 25370

well, your problem is

for (int d = _aantal; d > 0; d--) // loop for spaces

you really want

for (int d = _aantal - i ; d > 0; d--) // loop for spaces

but it really just mirrors what you currently have, and still doesn't create the pyramid look you seem to want.

I think the closest you'll get in a console app is by subtracting a space every other row:

for (int d = _aantal-i; d > 0; d-=2) // loop for spaces

which will give output:

Give the hight of the pyramid: 10

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

Upvotes: 1

Icepickle
Icepickle

Reputation: 12796

You could use the constructor of the string class to create the repetition for you, and then print both values at once, then you don't need the extra for loops

static void Main(string[] args)
{
    int rowHeight = 5;
    for (int row = 1; row <= rowHeight; row++)
    {
        string spaces = new string(' ', rowHeight - row);
        string stars = new string('*', row);
        Console.WriteLine("{0}{1}", spaces, stars);
    }
    Console.ReadLine();
}

UPDATE

for the semantics, i will then also show it with 2 for loops

static void Main(string[] args)
{
    int rowHeight = 5;
    for (int row = 1; row <= rowHeight; row++)
    {
        int totalSpaces = rowHeight - row;
        for (int j = 0; j < totalSpaces; j++)
        {
            Console.Write(" ");
        }
        for (int j = 0; j < row; j++)
        {
            Console.Write("*");
        }
        Console.WriteLine();
    }
    Console.ReadLine();
}

Upvotes: 5

Related Questions