Modificando le risposte precedenti per darti effettivamente il triangolo di Pascal, che hai menzionato che stavi tentando in un commento:
set serveroutput on format wrapped
declare
n number(2):=5;
begin
for a in 1..n loop
for b in 1..n-a loop
dbms_output.put(' ');
end loop;
for c in 1..2*a-1 loop
dbms_output.put('*');
end loop;
dbms_output.new_line;
end loop;
end;
/
*
***
*****
*******
*********
PL/SQL procedure successfully completed.
Sia il tuo dbms_output.put_line
le chiamate dovevano essere solo dbms_output.put
, poiché stava stampando ogni *
su una linea da solo. Ma hai bisogno di un'interruzione di riga dopo ogni volta intorno a a
loop, quindi ho aggiunto un dbms_output.newline
alla fine. Stavi anche diminuendo temp
all'interno del b
loop, il che significava che era zero invece di (n-1)
per la seconda volta intorno al a
ciclo continuo; ma non hai davvero bisogno di un temp
separato in quanto è sempre la stessa di (n-a)+1
e il +1
mette solo uno spazio in più su ogni riga. (Ho anche creato il a
ciclo 1..n
come presumo tu voglia cambiare il valore di n
successivamente in un solo luogo). Con n := 8
:
*
***
*****
*******
*********
***********
*************
***************
Fondamentalmente però devi anche set serveroutput on format wrapped
, altrimenti gli spazi iniziali che stai generando nel b
loop vengono scartati.
Puoi anche farlo in semplice SQL, anche se devi fornire il 5
due volte, oppure usa una variabile di associazione o di sostituzione:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Il tuo b
e c
i loop stanno solo facendo un lpad
manuale davvero.