# Pset1 : the mario question. I don't understand the logic of my own solution, it just doesn't make sense (found it by randomly playing around)

0 down vote

I wonder if someone can clear something up for me. I have been working on this problem, and I have got a solution that works. ie, the numbes of spaces decline, and the number of hashes increases. BUT. I don't understand why it works.

This is part of the code. Height is the integer number given by the user. I then defined an integer s, equaled it to 'line' (has to be line otherwise the program doesn't work,

I initially tried this logic: the number of spaces has to be (height - 1) to start off with, and from there on, each line has one space less, so I tried to place s-- in the 'for loop'. But it didn't work.

What I did was the following, which works perfectly, but the logic seems all wrong to me. It shouldn't work, but it does. Nowhere am I stating I'm decrementing s, so why does the program do it?

``````for (line = 0; line < height; line++){

// print the spaces --> how on earth does this work??? Shouldn't this see
//the spaces increasing? Not decreasing?

for (s = line; s < height - 1 ; s++){
printf(" ");
}
``````

}

Hope someone can shed some light on this. Many thanks

• Where exactly are you printing the #? I do not see the `printf("#");` statement anywhere. Dec 12 '14 at 16:00
• I didn't show that in the question as the #'s aren't relevant to my question. Dec 13 '14 at 20:14

The value of s is increasing but the number of spaces it prints will be decreasing because you are inside the outer loop.

``````#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{
int line, s;
int height = 10;

for (line = 0; line < height; line++)
{
printf("line is %d and s is: ", line);  //  <--- add this

for (s = line; s < height - 1 ; s++)
{
printf("%d ", s);                  //  <--- change to print 's'
}

printf("\n");

}
}
``````

What you will get is this:

``````line is 0 and s is: 0 1 2 3 4 5 6 7 8
line is 1 and s is: 1 2 3 4 5 6 7 8
line is 2 and s is: 2 3 4 5 6 7 8
line is 3 and s is: 3 4 5 6 7 8
line is 4 and s is: 4 5 6 7 8
line is 5 and s is: 5 6 7 8
line is 6 and s is: 6 7 8
line is 7 and s is: 7 8
line is 8 and s is: 8
line is 9 and s is:
``````

Each time the second loop runs, the starting value of `s` is the next larger number, so each line will have one fewer space. That's what you want. Can you see now why your code works?

• fantastic! Thanks for your answer :-) Jan 7 '15 at 21:22
• You're quite welcome! Please upvote and then accept my answer so this falls out of the unanswered queue. :) Jan 7 '15 at 21:30

Your "s" variable is initialized with the "line" variable and as "line" variable is ALWAYS incremented the initial value for inner for loop that is "s" is also incremented each time outer for loop is executed. To get lesser spaces your "s" variable needs to decrement.

The correct code would be

``````for (line = 0; line < height; line++)
{
for (s = height - line; s > 0 ; s--)
printf(" ");
}
``````

Also you need to print "#" as well as get the next "#s" on another line

• I do print the '#''s, I just didn't add that in the question as that's in another loop, I have no problem with the '#''s. Dec 13 '14 at 20:07
• I do print the '#''s, I just didn't add that in the question as that's in another loop, I have no problem with the '#''s. The code as you describe it doesn't work. That code was the first thing I tired . It prints out an equal number of spaces and shifts the whole pyramid to the right x number of spaces. Now the code I entered, most definitely does work. Each line has one space less with my code. With your code each line has the same number of spaces. The problem is, logically this doesn't make sense and I had hoped someone can explain why it does. ie, why does my code work. Thanks Dec 13 '14 at 20:13
• I've fixed the bug. Check it out. Dec 14 '14 at 5:12