Mögliche Lösung für Zahl rückwärts ausgeben

Die Aufgabenstellung finden Sie hier.

C

reverse.c
#include <stdio.h>
 
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.

back.F90
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