Die Aufgabenstellung finden Sie hier.
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