1. Ablaufsteuerung – Umwandlung in römische Zahlen
Schreiben Sie ein Programm, welches Integer-Zahlen als römische Zahlen darstellt.
1=I, 5=V, 10=X, 50=L, 100=C, 500=D, 1000=M
Würde ein Zeichen mehr als 3 mal hintereinander vorkommen, wird stattdessen das
nächste höherwerte Zeichen genommen und der Wert davor subtrahiert:
zB 4 → IV (anstatt IIII), 40 → XL (anstatt XXXX)
-
1. Schreiben Sie einen PL/SQL-Block, der den Wert der Variablen v_zahl in eine römische Zahl umwandelt. Implementieren Sie dabei die oben beschriebene Vorgangsweise mittels Schleifen und Case-Ausdrücken. Geben Sie das Resultat aus.
-
2.Legen Sie eine weitere Schleife um die Umrechnungsroutine. Ermitteln Sie 20 Zufallszahlen, die jeweils umgerechnet werden. Lassen Sie die Zahl zu Kontrollzwecken auch von Oracle selbst umrechnen, indem Sie folgenden Befehl nutzen: TO_CHAR(<Zahl>, 'RN'). Geben Sie dann Ihren ermittelt Wert und den Kontrollwert von Oracle nebeneinander aus, und ergänzen Sie die Zeile mit OK bzw. NOK, je nachdem ob die Werte identisch sind.
Zufallszahlen können Sie mittels folgendem Befehl ermitteln: DBMS_RANDOM.VALUE(1, 3999); // 3999 = Max. Wert der RN-Option
create or replace function ROMAN_NUMBERS(enter in number)
return varchar
as
v_output varchar(200);
p_input pls_integer;
begin
p_input := enter;
while (p_input >= 1)
loop
case
when p_input >= 1000 then
v_output := v_output || 'M';
p_input:= p_input - 1000;
when p_input >= 900 then
v_output := v_output || 'CM';
p_input := p_input - 900;
when p_input >= 500 then
v_output := v_output || 'D';
p_input := p_input - 500;
when p_input >= 400 then
v_output := v_output || 'CD';
p_input := p_input - 400;
when p_input >= 100 then
v_output := v_output || 'C';
p_input := p_input - 100;
when p_input >= 90 then
v_output := v_output || 'XC';
p_input := p_input - 90;
when p_input >= 50 then
v_output := v_output || 'L';
p_input := p_input - 50;
when p_input >= 40 then
v_output := v_output || 'XL';
p_input := p_input - 40;
when p_input >= 10 then
v_output := v_output || 'X';
p_input := p_input - 10;
when p_input >= 9 then
v_output := v_output || 'IX';
p_input := p_input - 9;
when p_input >= 5 then
v_output := v_output || 'V';
p_input := p_input - 5;
when p_input >= 4 then
v_output := v_output || 'IV';
p_input := p_input -4;
when p_input >= 1 then
v_output := v_output || 'I';
p_input := p_input - 1;
else
DBMS_OUTPUT.PUT_LINE('');
end case;
end loop;
return v_output;
end;
/
select ROMAN_NUMBERS(41) from dual;
select to_char(1, 'fmRN') from dual;
declare
v_number pls_integer;
v_roman varchar(255);
begin
for i in 1..20
loop
select DBMS_RANDOM.VALUE(1, 3999) num into v_number from dual;
DBMS_OUTPUT.PUT_LINE('arabic number: ' || v_number);
select ROMAN_NUMBERS(v_number) num into v_roman from dual;
DBMS_OUTPUT.PUT_LINE('roman number: ' || v_roman);
end loop;
end;
declare
v_number pls_integer;
v_roman_solution varchar(255);
v_roman varchar(255);
v_loops pls_integer;
begin
v_loops := 500;
for i in 1..v_loops
loop
select DBMS_RANDOM.VALUE(1, 3999) num into v_number from dual;
select to_char(v_number, 'fmRN') roman into v_roman_solution from dual;
if v_roman not like v_roman_solution then
DBMS_OUTPUT.PUT_LINE('found error');
DBMS_OUTPUT.PUT_LINE('exprected: ' || v_roman_solution || ' got: ' || v_number);
end if;
end loop;
DBMS_OUTPUT.PUT_LINE('Checked ' || v_loops || ' random test results');
end;