Thema_6

fehler_1.lst

' Behandlung von Laufzeitfehlern
'
//Programml zur  lokalen Fehlerbehandlung in Prozeduren
// siehe GFA- HILFE
OPENW #1, 0,0,_X,_Y,$0
PRINT "Das Reziproke ganzer Zahlen:"
PRINT
test
TEXT 300,460,"  ---> weiter Esc Taste"
REPEAT
UNTIL INKEY$=CHR$(27)
CLOSEW #1
//-------------------------
PROCEDURE test
  LOCAL i%
  TRY
    FOR i% = -9 TO 9
      PRINT "      1/";i%;"     ";@rezip(i%)  // siehe AUFGABE 1.
    NEXT i%
  CATCH
  TEXT 20,400, "Ein Fehler ist aufgetreten in PROCEDURE test bei   i% = " +STR$(i%)
  TEXT 20,420,"FehlerNr. "+STR$(ERR)
  TEXT 20,440,ERR$(ERR)
RETURN
//---------------------
FUNCTION rezip(x%)
  RETURN 1/x%
ENDFUNC
//
FUNCTION rezip1(x%)
  TRY
    RETURN 1/x%
  CATCH
  RETURN 1E308 // "fast" unendlich (großes double)
ENDFUNC
'
' AUFGABEN:  1. Funktionsaufruf in Prozedur test
'               in @rezip1 ändern!

sinus_2.lst

' Anwendung der Fehlerbehandlung in einem Grafikprogramm
'
//Programm SINUS-Grafik
// siehe GFA- HILFE
OPENW #1,0,0,_X,_Y,$2f0
y0&=_Y/2,ys&=_Y/2
CLS GETNEAREST(0,255,255)
COLOR GETNEAREST(255,255,0)
FOR j&=0 TO _Y STEP 3      // Schleife zum Zeichnen
  jx = (j&-_Y/2)/20,jx2 = jx*jx
  FOR i&=0 TO _X STEP 2
    ix = (i&-_X/2)/20, f = SQR(ix^2 + jx2)
    z& = y0& - @sinx_by_x(f)*ys&   // Funktionsaufruf
    PSET i&,z&,15
    LINE i&,z&+1,i&,_Y
  NEXT i&
  y0&++
NEXT j&
COLOR GETNEAREST(255,255,255) ,GETNEAREST(0,0,0)
TEXT 10,10 ,"         Ende mit Esc          "
REPEAT
UNTIL INKEY$ = CHR$(27)
CLOSEW #1
//
FUNCTION sinx_by_x(x)
  TRY
    RETURN SIN(x)/x
  CATCH
  RETURN 1   // der Grenzwert sin(x)/x für x=0
ENDFUNC

rekufa_3.lst

' rekursive Funktionen
' Bedeutung des Stacks
' HINWEIS: die GFA-interne Funktion FACT(n) liefert es auch!
'
//Programm reku
//
STACKSIZE 65535   // ... der Defaultwert könnte knapp sein!
OPENW #1,50,50,_X*0.8,_Y*0.5,$2f0
TITLEW #1,"Fakultät als rekursive Funktion"
INPUT "Berechne die Fakultät von a: ";a
a| = INT(ABS(a))                // Variablentypen beachten
TEXT 10,40, "Byte- Argument der rekursiven Funktion: " + STR$(a|)
IF a| > 0 AND a| < 171          // (*) siehe AUFGABE 1.
  fak$=STR$(@fak(a|))
ELSE
  fak$="nicht möglich!"
ENDIF
REPEAT
  SLEEP
  TEXT 10,60,"Die Fakultät von |a| ist: "+fak$
UNTIL MENU(1)=4 OR INKEY$=CHR$(27)
CLOSEW #1
//------------------------------------------
FUNCTION fak(w|)
  IF w|=1
    RETURN 1
  ELSE
    RETURN @fak(w|-1)*w|
  ENDIF
ENDFUNC
'
' AUFGABEN: 1. Änderung in der Zeile (*):
'              Zahl 171 vergrößern und entsprechende Eingabe.
'           2. Typ der Argument-Variablen (a) verändern. - Wirkungen?

rekuzi_4.lst

' Anwendung rekursiver Funktionen
'
//Programm REKUZINS
//
OPENW #1,50,50,400,200,$2f0
INPUT "Anfangskapital = ",kapital
INPUT "Zinssatz in % = ",zinssatz
zins= zinssatz/100
INPUT "Jahre = ",jahre&
endkapital=@verzinsung(kapital,zins,jahre&)
CLS 4
REPEAT
  SLEEP
  TEXT 10,16,"Anfangskapital = "+STR$(kapital)+SPACE$(100)
  TEXT 10,32,"Zinssatz in % = "+STR$(zinssatz)+SPACE$(100)
  TEXT 10,48,"Jahre = "+STR$(jahre&)+SPACE$(100)
  TEXT 30,80,"Das Endkapital beträgt   "+ STR$(endkapital,10,2)+ " DM"+SPACE$(100)
UNTIL MENU(1)=4
CLOSEW #1
//------------------------------------------------------------
FUNCTION verzinsung(kapital,zins,jahre&)
  IF jahre&=0
    RETURN kapital
  ELSE
    RETURN @verzinsung(kapital,zins,jahre&-1)*(1+zins)
  ENDIF
ENDFUNC
'
' AUFGABEN: 1. Überlegen Sie sich eine weitere Anwendung für eine
'              rekursive Funktion oder Prozedur.
'              Bedenken Sie: Der Ablauf/ die Berechnung bezieht sich
'              immer auf den Vorgänger. Ein Anfangspunkt ist zu setzen.