====== Mögliche Lösung für Zahl rückwärts ausgeben ======
Die Aufgabenstellung finden Sie [[training:num_reverse:start|hier]].
===== C =====
#include
int main ()
{
int zahl=0;
int quersumme=0;
printf ("Eingabe: ");
scanf("%d", &zahl);
printf ("Ausgabe: ");
while (zahl>0)
{
int stelle = zahl % 10;
quersumme+=stelle;
printf ("%d", stelle);
zahl = zahl / 10;
}
printf("\nQuersumme: %d\n", quersumme);
return 0;
}
===== Fortran =====
Der Ruf der beiden Funktionen (rekursive und iterativ) in der unten dargestellten Reihenfolge funktioniert problemlos. Die umgekehrte Reihenfolge allerdings nicht - die zweite Funktion gibt kein Ergebnis mehr aus (wenn beide Funktionen die Variable ''zahl'' erhalten würden). Das liegt daran, dass Fortran Parameter als Call-by-Reference übergibt, dh. innerhalb der Funktionen können Parameter geändert werden. Das Hauptprogramm bekommt diese Änderungen mit! Dh. wir zerstören effektiv den auf ''zahl'' gespeicherten Wert in der Funktion ''backwards_it''! Wenn Sie sich dagegen schützen wollen, verwenden Sie das Attribut ''PARAMETER'' (oder ''INTENT(IN)'') bei der Variablendeklaration im Unterprogramm, was die Variable konstant setzt. Dann können Sie innerhalb der Funktion den Wert nicht verändern.
program main
implicit none
integer :: zahl = 0, z2
integer :: backwards, backwards_it
integer :: q1, q2
write (*,"(A,$)") "Bitte eine Zahl eingeben: "
read (*,*) zahl
z2 = zahl
q1 = backwards ( zahl )
write (*,*) ""
q2 = backwards_it ( zahl )
write (*, "(/A,I5,I5)") "Quersummen: ", q1, q2
end program
! rekursive Lösung
recursive integer FUNCTION backwards ( zahl ) result (erg)
implicit none
integer zahl
integer tmp
if (zahl > 0) then
tmp = mod(zahl, 10)
write (*,"(I2,$)") tmp
erg = tmp + backwards ( zahl / 10 )
return
endif
erg = 0
end function
! iterative Lösung
integer FUNCTION backwards_it ( zahl ) result (erg)
implicit none
integer zahl
integer tmp
erg = 0;
do while (zahl > 0)
tmp = mod(zahl, 10)
write (*,"(I2,$)") tmp
erg = erg + tmp
zahl = zahl / 10
enddo
return
end function