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.