M. Pester - LV im SS 2017

Übungen zur Arithmetik (1)

( als PDF-Datei )

  1. Beispiele zur Veranschaulichung der automatischen Typkonvertierung:
    Vergleichen Sie die Ergebnisse verschiedener arithmetischer Ausdrücke bei unterschiedlicher Schreibweise der Konstanten als ganze oder ,,reelle'' Zahlen
     ( 2/3, 2./3, 2d0/3, 1/2*4.0, 1/2.0*4,  usw. ), 
    
    sowie bei Zuweisung des Ergebnisses an Variablen unterschiedlichen Typs (INTEGER oder REAL).
    Werden die Ergebnisse bei Zuweisung an eine Integer-Variable korrekt gerundet oder wird nur der gebrochene Anteil abgeschnitten? - Überprüfen Sie dies anhand geeigneter Ausdrücke mit positiven und negativen Ergebnissen.
  2. Integer-Arithmetik: Berechnung von n! = n·(n-1)·...·1.
    Schreiben Sie ein Funktionsunterprogramm (integer function nfak(n)), welches dieses Produkt innerhalb einer Schleife berechnet.
    Hinweis zu Funktionsunterprogrammen in Fortran:
           integer function nfak(n)
           ...
           nfak = <ausdruck>      ! Funktionswert zurueckgeben
           return
           end
     
    
    Der Funktionsname (nfak) darf (muss aber nicht) innerhalb der Funktion beliebig als lokale Variable benutzt werden, ihm muss aber am Ende der Funktionswert zugewiesen werden.

    Testen Sie zunächst für kleine n, ob das Programm richtige Ergebnisse liefert.

    Zur Darstellung positiver ganzer Zahlen werden 31 Bit benutzt: als Summe: ∑bk 2k,   ( bk ∈ {0|1},  k = 0, … ,30 ).
    Welche Reaktion ist bei ,,zu großem'' n zu erwarten? Testen Sie, ob die erwartete Reaktion auch wirklich eintritt.

    Vergleichen Sie die Ergebnisse der Integer-Arithmetik mit denen von Real und DoublePrecision, indem Sie alle Datentypen (incl. Funktionen) entsprechend ändern, bzw. alle 3 Funktionen in einem Hauptprogramm verwenden:

       integer function nfak(n)
       real function rfak(rn)
       doubleprecision function dfak(dn)
    
    
  3. Stellen Sie fest, ob der verwendete Fortran-Compiler rekursive Funktionsaufrufe zulässt (direkt oder indirekt), so dass man n! nach der Rekursionsvorschrift berechnen kann:
    n! = {
    n·(n-1)! ,
        n > 1
    1,
        sonst
    Direkte Rekursion z.B. durch den Aufruf : nfak = n*nfak(n-1) in der Funktion.
    Indirekte Rekursion z.B. durch 2 Funktionen
          integer function nfak(n)      integer function dummy(n)
          integer n,dummy               integer n,nfak
          ...
          nfak = n*dummy(n-1)           dummy=nfak(n)
    
    
  4. Binomialkoeffizienten
    ( n
    k
    ) =  n!

    (n-k)!·k!
    kann man auf verschiedene Arten berechnen, z.B.

    • nach obiger Definition mit Hilfe eines Unterprogramms, das n! berechnet, oder aber
    • als fortlaufendes Produkt von Quotienten


      Bj=Bj-1*  n+1-j

      j
      ,       d.h. ( n
      k
      ) =  n ·(n-1)·...·(n-k+1)

      1·2·...·k
      Darf man dies mit ganzzahliger Arithmetik ausführen?
    • Rekursiv durch Addition (vgl. Pascalsches Dreieck)
      ( n
      k
      ) = ( n-1
      k
      ) + ( n-1
      k-1
      )
      (Abbruch der Rekursion bei n=k oder k=0)

    Schreiben Sie je ein Unterprogramm für diese drei Berechnungen und ein Hauptprogramm, in dem die Zahlen n und k eingelesen und die drei berechneten Werte ausgegeben werden.




File translated from TEX by TTH, version 3.00.