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.