Úprava předchozích odpovědí tak, aby vám ve skutečnosti poskytly Pascalův trojúhelník, o kterém jste se zmínili v komentáři:
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.
Oba vaše dbms_output.put_line
volání musí být pouze dbms_output.put
, protože to tisklo každý *
na samostatné lince. Ale potřebujete zalomení řádku za každým kolem a
smyčku, takže jsem přidal dbms_output.newline
na konci toho. Také jste snižovali temp
uvnitř b
smyčka, což znamenalo, že byla nula místo (n-1)
podruhé kolem a
smyčka; ale ve skutečnosti nepotřebujete samostatnou temp
proměnná vůbec, protože je vždy stejná jako (n-a)+1
a +1
jen vloží místo navíc na každý řádek. (Vytvořil jsem také a
smyčka 1..n
předpokládám, že chcete změnit hodnotu n
později pouze na jednom místě). S n := 8
:
*
***
*****
*******
*********
***********
*************
***************
Důležité je ale také set serveroutput on format wrapped
, jinak úvodní mezery, které generujete v b
smyčky jsou zahozeny.
Můžete to udělat také v prostém SQL, i když musíte zadat 5
dvakrát nebo použijte proměnnou vazby nebo substituce:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Vaše b
a c
smyčky pouze provádějí ruční lpad
opravdu.