====== 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