for-loopnested-loopspascal

# Pascal - Shape Drawing

So the task is to draw this shape :

``````******
**  **
*    *
**  **
******
``````

The number of rows is set by the user,and it is labeled as n.In this case it is n=3. So i tried splitting it in two , and i managed to get an output looking like this.

``````***
**
*
**
***
***
**
*
**
***
``````

My code :

``````translation : brojredova is number of rows
brojzvezda is number of stars *
broj praznih is number of empty fields
--------------------------------------------
``````
``````program veasdsa;
var
n,brojredova,brojzvezda,brojpraznih : integer;

begin

// prva polovina 1st half

for brojredova := 1 to n do
begin
// *
for brojzvezda := 1 to ((n-brojredova) + 1) do
begin
write('*');
end;

writeln;
end;

for brojredova := 2 to n do
begin
for brojzvezda := 1 to brojredova do
begin
write('*');
end;

writeln;
end;   // ovde pocinje druga polovina ( second half starts from here)

for brojredova := 1 to n do
begin
//prazna
for brojpraznih := 1 to (brojredova - 1) do
begin
write(' ');
end;

// *
for brojzvezda := 1 to ((n - brojredova) + 1) do
begin
write('*');
end;

writeln;
end;

for brojredova := 2 to n do
begin
//prazna
for brojpraznih := 1 to (n - brojredova) do
begin
write(' ');
end;

// *
for brojzvezda := 1 to brojredova do
begin
write('*');
end;

writeln;
end;
end.
``````

I can't figure out how to get them together.. There is probably an easier way,but i tried doing it like this.

Solution

• Let's simplify by writing a very basic procedure which prints a character repeatedly.

``````procedure print_char_times (ch : char; n : integer);
var
i : integer;
begin
for i := 1 to n do
write (ch)
end;
``````

Now you don't need to repeat this loop over and over. With this defined, you just need to count `i` from 0 to `n - 1` to get the top half of the shape:

• Print `'*'` `n - i` times.
• Print `' '` `i * 2` times.
• Print `'*'` `n - i` times.

It's very straightforward to translate this to code.

``````program Test;
var
i, n : integer;

procedure print_char_times (ch : char; n : integer);
var
i : integer;
begin
for i := 1 to n do
write (ch)
end;

begin
n := 3;

for i := 0 to n - 1 do
begin
print_char_times('x', n - i);
print_char_times(' ', i * 2);
print_char_times('x', n - i);
writeln
end;

for i := n - 2 downto 0 do
begin
print_char_times('x', n - i);
print_char_times(' ', i * 2);
print_char_times('x', n - i);
writeln
end
end.
``````