' [programma da eseguire in QBasic - i grafici sono da aprire con Poligon] ' ' Aziona da RUN il comando START (o premi F5) per avviare il programma ' ' APRI da VIEW il SUB HELP per ulteriori informazioni ' DECLARE SUB MiMa (min#, max#, x1#, x2#) DECLARE SUB Punto (t#, x#, y#) DECLARE SUB DefNomiFile () DECLARE SUB DefTrasformazione (x#, y#) DECLARE SUB Colore () DECLARE SUB DefPt (t#, x#, y#) DECLARE SUB DefFxy (x#, y#, z#) DECLARE SUB MaxMin (a#, b#, x#, m%) DECLARE SUB segno (x#, y#, s%) DECLARE FUNCTION DIF# (x#, y#) DECLARE SUB trsf (x#, x$, s#) DECLARE SUB QUAD (x#, x1#, x2#) DECLARE SUB ZERO (a#, b#, x#) DECLARE SUB INTEG (a#, b#, i#) DECLARE SUB ARR (n%, x#, x$) DECLARE SUB somma (a#, b#, y#) DECLARE SUB FrazGen (x#, p#, q#, nc#) DECLARE SUB DefValA () DECLARE SUB DefValX () DECLARE SUB DefValY () DECLARE SUB DefValB () DECLARE SUB DefValT () DECLARE SUB DefFx (x#, y#) GOTO 15 10 PRINT "Troppi punti: hai esaurito la memoria. Ferma prima la scansione o cambia scala" DEFDBL A-Z: usato = 1: GOTO 16 15 DEFDBL A-Z 16 DIM SHARED pi, grado, ne, nc!, cong%, col%, er%, k0, trasf% DIM SHARED nomefunz$, nomecurv$, nomefxy$, nomederiv$, nomeintegr$ DIM SHARED nomecurvtrasf$, nomefxytrasf$ DIM SHARED param DIM q(20) col% = 14 ON ERROR GOTO GestErrore CALL DefNomiFile ne = EXP(1#): pi = ATN(1#) * 4: grado = ATN(1#) / 45# IF usato = 1 THEN GOTO via PRINT " ----------------------" COLOR 11 PRINT " Programma per"; COLOR 14: PRINT " [1]"; COLOR 7: PRINT " tabulare funzioni a 1 input,"; COLOR 14: PRINT " [4]"; COLOR 7: PRINT " calcolare integrali def.,"; COLOR 14: PRINT " [3]"; COLOR 7: PRINT " risolvere equazioni F(x)=k,"; COLOR 14: PRINT " [5]"; COLOR 7: PRINT " trovare max o min,"; COLOR 14: PRINT " [8]"; COLOR 7: PRINT " calcolare somme del": PRINT " tipo F(a)+F(a+1)+..+F(b),"; COLOR 14: PRINT " [2]"; COLOR 7: PRINT " preparare grafici in formato GFU (per il prog.": PRINT " Poligon) y=F(x)"; COLOR 14: PRINT " [6]"; COLOR 7: PRINT " y=F'(x),"; COLOR 14: PRINT " [7]"; COLOR 7: PRINT " y=Int(x1,x),"; COLOR 14: PRINT " [9]"; COLOR 7: PRINT " tabulare e"; COLOR 14: PRINT " [10]"; COLOR 7: PRINT " prep. graf.": PRINT " di x=x(t), y=y(t),"; COLOR 14: PRINT " [11]"; COLOR 7: PRINT " tabulare funz. a 2 input,"; COLOR 14: PRINT " [12]"; COLOR 7: PRINT " prep. grafici F(x,y)=k," COLOR 14: PRINT " [13]"; COLOR 7: PRINT " impostare trasf. geometriche di curve (fatte con 10 o 12) o definire" PRINT " i valori di un parametro da inserire in P=P(t) per realizzare fasci di curve" PRINT " (mediante 10) o generazione automatica di nomifile. Per altre informazioni ": COLOR 13 PRINT " sospendi"; : COLOR 7: PRINT " (con "; : COLOR 14: PRINT "0"; COLOR 7: PRINT ") l'esecuzione ed esamina dal menu View il"; COLOR 13: PRINT " sub HELP" via: n = 0 WHILE n < 1 OR n > 13 COLOR 14: PRINT "1"; : COLOR 11: PRINT "fx"; COLOR 14: PRINT " 2"; : COLOR 11: PRINT "y=fx"; COLOR 14: PRINT " 3"; : COLOR 11: PRINT "fx=k"; COLOR 14: PRINT " 4"; : COLOR 11: PRINT "int"; COLOR 14: PRINT " 5"; : COLOR 11: PRINT "max"; COLOR 14: PRINT " 6"; : COLOR 11: PRINT "y=Df"; COLOR 14: PRINT " 7"; : COLOR 11: PRINT "y=If"; COLOR 14: PRINT " 8"; : COLOR 11: PRINT "Sf"; COLOR 14: PRINT " 9"; : COLOR 13: PRINT "Pt"; COLOR 14: PRINT " 10"; : COLOR 13: PRINT "P=Pt"; COLOR 14: PRINT " 11"; : COLOR 10: PRINT "fxy"; COLOR 14: PRINT " 12"; : COLOR 10: PRINT "fxy=k"; COLOR 14: PRINT " 13"; : COLOR 15: PRINT "IMP"; COLOR 14: PRINT " 0 "; : COLOR 12: PRINT "?"; : COLOR 15 INPUT ; "", n$ IF n$ = "0" THEN COLOR 7: STOP COLOR 15 UU$ = UCASE$(RIGHT$(n$, 1)) IF UU$ > "A" AND UU$ < "Z" THEN n = VAL(MID$(n$, 1, LEN(n$) - 1)): form$ = UU$ ELSE n = VAL(n$) END IF IF form$ = "" THEN form$ = "R" IF n = n0 THEN LOCATE , 1: PRINT SPACE$(79); : LOCATE , 1 ELSE PRINT IF n = 4 OR n = 5 THEN nc! = 8 ELSE nc! = 12 WEND n0 = n kkkk = 1 ON n GOSUB fx, Graf, Area, Area, Area, Deriv, Integr, Area, Pdit, PPdit, fxy, fxyk, Trasfo GOTO via Area: IF n = 3 THEN INPUT "Introduci k e poi a,b tali che k stia tra f(a) e f(b). k"; k0 IF n = 5 THEN INPUT "Batti 1/-1 se vuoi max/min e poi [a,b] in cui graf. sia /\ o \/. Max/min"; m% INPUT ; "a,b"; a$, b$: PRINT TAB(20); IF UCASE$(a$) = "A" THEN DefValA: PRINT "a="; a ELSE a = VAL(a$) IF UCASE$(b$) = "B" THEN DefValB: PRINT "b="; b ELSE b = VAL(b$) IF n = 4 THEN INTEG a, b, y: out$ = "integr=" ELSE IF n = 3 THEN ZERO a, b, y: out$ = "soluz=" ELSE IF n = 8 THEN somma a, b, y: out$ = "somma=" ELSE MaxMin a, b, y, m%: out$ = "x=" IF y = 1.234567898765432D+300 OR kkkk = 0 THEN PRINT "non calcolabile" ELSE PRINT out$ + " "; IF n = 4 OR n = 5 THEN y! = y: PRINT y!; : GOSUB fr: PRINT fr$; ELSE PRINT y; : GOSUB fr: PRINT fr$ IF n = 4 THEN PRINT IF n = 5 THEN DefFx y, yy: y! = yy: COLOR 7: PRINT " f(x)="; y! END IF RETURN fx: y1 = 1.234567898765432D+300 INPUT ; "x"; x$: PRINT TAB(20); IF UCASE$(x$) = "X" THEN DefValX: PRINT "x="; x ELSE x = VAL(x$) DefFx x, y IF er% THEN er% = 0: y = 1.234567898765432D+300 IF y <> 1.234567898765432D+300 THEN ARR 15, y, sto$ GOSUB fr PRINT "f(x)="; sto$; fr$ END IF RETURN fr: s$ = "": fr$ = "" IF form$ = "N" THEN RETURN IF ABS(y) <= 1E+14 AND ABS(y) >= 1E-15 AND INT(ABS(y)) <> ABS(y) THEN xxx = y nc = nc! + 1 IF xxx < 0 THEN segn$ = "-" ELSE segn$ = "" trsf xxx, x$, s1 a$ = x$ IF nc! > 7.9 AND form$ = "P" THEN trsf xxx / pi, y$, s2 IF s2 < s1 AND s2 < 100000# AND y$ <> "" THEN s1 = s2 IF y$ = "1" THEN x$ = "pi" ELSE x$ = y$ + "pi" END IF b$ = y$ trsf xxx * pi, y$, s3 IF s3 < s1 AND s3 < 100000# AND y$ <> "" THEN s1 = s3 x$ = y$ + "/p" 'AND q3 < 10000# END IF END IF IF ABS(x) <> INT(ABS(x)) THEN o$ = "" FOR j = 1 TO 10 trsf xxx + j, z$, s: IF INSTR(z$, "r") > 0 AND s < s1 - 1 AND s < 100000# THEN o$ = "-": EXIT FOR trsf xxx - j, z$, s: IF INSTR(z$, "r") > 0 AND s < s1 - 1 AND s < 100000# THEN o$ = "+": EXIT FOR trsf xxx + 1 / j, z$, s: IF INSTR(z$, "r") > 0 AND s < s1 - 1 AND s < 100000# THEN o$ = "-1/": EXIT FOR trsf xxx - 1 / j, z$, s: IF INSTR(z$, "r") > 0 AND s < s1 - 1 AND s < 100000# THEN o$ = "+1/": EXIT FOR NEXT IF form$ = "P" THEN s1 = s: C$ = z$: jj = j FOR j = 1 TO 10 trsf xxx / pi + j / pi, z$, s: IF s < s1 - 1 AND s < 10000# THEN o$ = "pi-": EXIT FOR trsf xxx / pi - j / pi, z$, s: IF s < s1 - 1 AND s < 10000# THEN o$ = "pi+": EXIT FOR trsf xxx / pi + 1 / j / pi, z$, s: IF s < s1 - 1 AND s < 10000# THEN o$ = "pi-1/": EXIT FOR trsf xxx / pi - 1 / j / pi, z$, s: IF s < s1 - 1 AND s < 10000# THEN o$ = "pi+1/": EXIT FOR NEXT IF LEFT$(o$, 2) <> "pi" THEN z$ = C$: j = jj END IF IF LEFT$(o$, 2) = "pi" AND z$ = "1" THEN z$ = "" IF o$ <> "" AND z$ <> "" THEN x$ = z$ + o$ + LTRIM$(STR$(j)) END IF IF o$ = "" AND (x$ = "" OR (a$ = "" AND b$ = "" AND y$ = "")) THEN nc! = 0 s$ = " " + CHR$(126) + "= " + segn$ + x$ END IF IF nc! <> 0 THEN fr$ = s$ RETURN Graf: n% = 48: molt = 3 / 2 IF x1 <> x2 THEN INPUT ; "x1 (o '=')", x1$ IF x1$ = "=" THEN GOTO eq0 ELSE x1 = VAL(x1$) ELSE INPUT ; "x1 ", x1 END IF INPUT " x2 ", x2 INPUT ; "y1 (o 'auto') ", y1$ IF UCASE$(y1$) = "AUTO" THEN GOSUB ScalaAutomatica: GOTO eq0 y1 = VAL(y1$) INPUT " y2 ", y2 eq0: INPUT ; " congiungo (1: si', 0: no)"; cong% LOCATE , 1: Colore: COLOR 11: INPUT ; "colore=", col%: COLOR 15 IF col% < 1 OR col% > 15 THEN col% = 14 nome$ = nomefunz$ IF nufile% THEN autofun% = autofun% + 1 IF autofun% > 99 THEN autofun% = 0 popunt% = INSTR(nome$, ".") IF autofun% > 9 THEN primcifr$ = "" ELSE primcifr$ = "0" nome$ = MID$(nome$, 1, popunt% - 1) + primcifr$ + LTRIM$(STR$(autofun%)) + MID$(nome$, popunt%) END IF eq1: PRINT "scansione "; n% OPEN nome$ FOR OUTPUT AS #1 p% = 1 h = (x2 - x1) / n% WRITE #1, .1122334455#, col% FOR i% = 0 TO n% x = x1 + i% * h DefFx x, y IF er% = 1 THEN erro% = 1 ELSE IF y <= y2 AND y >= y1 THEN GOSUB circ: erro% = 0 ELSE erro% = 1 er% = 0 NEXT CLOSE #1 GOSUB ScriviPunti INPUT ; "continuo (1/0)"; x$ LOCATE , 1: PRINT SPACE$(79); : LOCATE , 1 IF x$ = "1" THEN n% = n% * molt: GOTO eq1 RETURN ScalaAutomatica: DefFx x1, y IF er% THEN er% = 0 ELSE min = y: max = y DefFx x2, y IF er% THEN er% = 0 ELSE IF y < min THEN min = y ELSE IF y > max THEN max = y h = (x2 - x1) / 400 FOR i% = 1 TO 399 DefFx x1 + i% * h, y IF er% THEN er% = 0 ELSE IF y < min THEN min = y ELSE IF y > max THEN max = y NEXT MiMa min, max, y1, y2 RETURN ScriviPunti: xx! = .1122334455# mem = 1 DIM punticu1!(p% + 1 + npar), punticu2!(p% + 1 + npar) mem = 0 p% = 0 OPEN nome$ FOR INPUT AS #1 WHILE NOT EOF(1) p% = p% + 1 INPUT #1, punticu1!(p%), punticu2!(p%) WEND CLOSE OPEN nome$ FOR OUTPUT AS #1 IF NOT trasf% THEN PRINT #1, "'" + STR$(x1) + ".." + STR$(x2) + "," + STR$(y1) + ".." + STR$(y2) PRINT #1, p% FOR i = 1 TO p% IF punticu1!(i) = xx! THEN PRINT #1, "s," + LTRIM$(STR$(punticu2!(i))) ELSE WRITE #1, punticu1!(i), punticu2!(i) END IF NEXT CLOSE ERASE punticu1!, punticu2! RETURN circ: SELECT CASE n CASE 10 IF p% > 2 AND iii% > 1 THEN IF cong% = 0 OR erro% = 1 OR ABS(y - y0) + ABS(x - x0) > (ABS(y0 - yy0) + ABS(x - x0)) * 10 THEN p% = p% + 1: WRITE #1, .1122334455#, col% CASE 12 CASE ELSE IF p% > 2 THEN IF cong% = 0 OR erro% = 1 OR ABS(y - y0) > ABS(y0 - yy0) * 10 THEN p% = p% + 1: WRITE #1, .1122334455#, col% END SELECT p% = p% + 1 IF n = 12 AND trasf% THEN WRITE #1, xt, yt ELSE WRITE #1, x, y IF n = 12 THEN p% = p% + 1: WRITE #1, .1122334455#, col% yy0 = y0: y0 = y: xx0 = x0: x0 = x IF erro% = 1 THEN yy0 = y2 - y1 + y0: xx0 = x2 - x1 + x0 RETURN Integr: COLOR 7 PRINT " Viene preso x1 come x inziale; se vuoi procedere a sinistra prendi x2 < x1." COLOR 15 IF x1 <> x2 THEN INPUT ; "x1 (o '=')", x1$ IF x1$ = "=" THEN LOCATE , 1: PRINT x1; x2; " "; y1; y2: GOTO Integr0 ELSE x1 = VAL(x1$) ELSE INPUT ; "x1 ", x1 END IF INPUT " x2 ", x2 INPUT ; "y1 ", y1 INPUT " y2 ", y2 Integr0: INPUT "y corrispondente a x=x1"; k0 INPUT ; " congiungo (1: si', 0: no)"; cong% LOCATE , 1: Colore: COLOR 11: INPUT ; "colore=", col%: COLOR 15 IF col% < 1 OR col% > 15 THEN col% = 14 PRINT nome$ = nomeintegr$ IF nufile% THEN autoint% = autoint% + 1 IF autoder% > 99 THEN autoder% = 0 popunt% = INSTR(nome$, ".") IF autoint% > 9 THEN primcifr$ = "" ELSE primcifr$ = "0" nome$ = MID$(nome$, 1, popunt% - 1) + primcifr$ + LTRIM$(STR$(autoint%)) + MID$(nome$, popunt%) END IF OPEN nome$ FOR OUTPUT AS #1 p% = 1 WRITE #1, .1122334455#, col% h = (x2 - x1) / 400: er% = 0: Traccia% = 0 yy = 0: DefFx x1, y3 FOR i% = 0 TO 400 IF INKEY$ = CHR$(27) OR er% = 1 THEN i% = 400 ELSE x = x1 + i% * h y = yy + k0 IF er% = 1 THEN erro% = 1 ELSE IF y <= y2 AND y >= y1 THEN GOSUB circ: erro% = 0 ELSE erro% = 1 er% = 0 yy1 = y3: DefFx x + h / 2, yy2: DefFx x + h, y3 yy = yy + (yy1 + 4 * yy2 + y3) * h / 6 END IF NEXT CLOSE #1 GOSUB ScriviPunti RETURN Deriv: n% = 48: molt = 3 / 2 INPUT ; "x1 ", x1 INPUT " x2 ", x2 INPUT ; "y1 ", y1 INPUT " y2 ", y2 eqd0: INPUT ; " congiungo (1: si', 0: no)"; cong% LOCATE , 1: Colore: COLOR 11: INPUT ; "colore=", col%: COLOR 15 IF col% < 1 OR col% > 15 THEN col% = 14 eqd1: PRINT "scansione "; n% nome$ = nomederiv$ IF nufile% THEN autoder% = autoder% + 1 IF autoder% > 99 THEN autoder% = 0 popunt% = INSTR(nome$, ".") IF autoder% > 9 THEN primcifr$ = "" ELSE primcifr$ = "0" nome$ = MID$(nome$, 1, popunt% - 1) + primcifr$ + LTRIM$(STR$(autoder%)) + MID$(nome$, popunt%) END IF OPEN nome$ FOR OUTPUT AS #1 p% = 1 h = (x2 - x1) / n% h2 = h + h xx1 = x1: xx2 = x1 + h WRITE #1, .1122334455#, col% FOR i% = 1 TO n% - 1 DefFx xx1, yy1: xx1 = xx2: xx2 = x1 + (i% + 1) * h: DefFx xx2, yy2 y = (yy2 - yy1) / h2 IF er% = 1 THEN erro% = 1 ELSE IF y <= y2 AND y >= y1 THEN x = x1 + i% * h: GOSUB circ: erro% = 0 ELSE erro% = 1 er% = 0 NEXT CLOSE #1 GOSUB ScriviPunti INPUT ; "continuo (1/0)"; x$ LOCATE , 1: PRINT SPACE$(79); : LOCATE , 1 IF x$ = "1" THEN n% = n% * molt: GOTO eqd1 RETURN Pdit: y1 = 1.234567898765432D+300 INPUT ; "t"; x$: PRINT TAB(16); IF UCASE$(x$) = "T" THEN DefValT: PRINT "t="; t ELSE t = VAL(x$) IF npar > 0 THEN PRINT FOR i = 0 TO npar IF npar > 0 AND i = 0 THEN ELSE param = q(i): ppp! = param IF npar > 0 THEN PRINT "param="; ppp!; TAB(20); Punto t, x, y IF er% THEN er% = 0: y = 1.234567898765432D+300 IF y <> 1.234567898765432D+300 THEN SWAP x, y ARR 15, y, sto$ GOSUB fr PRINT "x(t)="; sto$; fr$; SWAP x, y ARR 15, y, sto$ GOSUB fr PRINT " y(t)="; sto$; fr$ END IF END IF NEXT RETURN PPdit: INPUT "Definisci l'intervallo per t. a,b"; a$, b$ IF UCASE$(a$) = "A" THEN DefValA: PRINT "a="; a ELSE a = VAL(a$) IF UCASE$(b$) = "B" THEN DefValB: PRINT "b="; b ELSE b = VAL(b$) n% = 48: molt = 3 / 2 IF npar = 0 THEN INPUT ; "x1 (o 'auto') ", x1$ ELSE INPUT ; "x1 ", x1$ IF npar = 0 AND UCASE$(x1$) = "AUTO" THEN GOSUB ScalaAutomatica2: GOTO PPdit0 x1 = VAL(x1$) INPUT " x2 ", x2 INPUT ; "y1 ", y1 INPUT " y2 ", y2 PPdit0: INPUT ; " congiungo (1: si', 0: no)"; cong% IF npar = 0 THEN LOCATE , 1: Colore: COLOR 11: INPUT ; "colore=", col%: COLOR 15 IF col% < 1 OR col% > 15 THEN col% = 14 END IF nome$ = nomecurv$ IF nufile% THEN IF trasf% THEN auto% = autocurt% ELSE auto% = autocur% auto% = auto% + 1 IF auto% > 99 THEN auto% = -1 popunt% = INSTR(nome$, ".") IF auto% > 9 THEN primcifr$ = "" ELSE primcifr$ = "0" nome$ = MID$(nome$, 1, popunt% - 1) + primcifr$ + LTRIM$(STR$(auto%)) + MID$(nome$, popunt%) IF trasf% THEN autocurt% = auto% ELSE autocur% = auto% END IF IF trasf% THEN nome$ = nomecurvtrasf$ curv1: OPEN nome$ FOR OUTPUT AS #1 PRINT "scansione "; n% p% = 1 h = (b - a) / n% FOR i = 0 TO npar IF npar > 0 AND i = 0 THEN ELSE IF npar > 0 THEN param = q(i): col% = 16 - i: IF col% < 1 THEN col% = col% + 15 WRITE #1, .1122334455#, col%: erro% = 0 FOR iii% = 0 TO n% t = a + iii% * h Punto t, x, y IF er% = 1 THEN erro% = 1 ELSE IF y <= y2 AND y >= y1 AND x <= x2 AND x >= x1 THEN GOSUB circ: erro% = 0 ELSE erro% = 1 er% = 0 NEXT END IF NEXT CLOSE #1 GOSUB ScriviPunti INPUT ; "continuo (1/0)"; x$ LOCATE , 1: PRINT SPACE$(79); : LOCATE , 1 IF x$ = "1" THEN n% = n% * molt: GOTO curv1 RETURN ScalaAutomatica2: t = a: Punto t, x, y IF er% THEN er% = 0 ELSE miny = y: maxy = y: minx = x: maxx = x t = b: Punto t, x, y IF er% THEN er% = 0 ELSE IF y < miny THEN miny = y ELSE IF y > maxy THEN maxy = y IF x < minx THEN minx = x ELSE IF x > maxx THEN maxx = x END IF h = (b - a) / 400 FOR i% = 1 TO 399 t = a + i% * h: Punto t, x, y IF er% THEN er% = 0 ELSE IF y < miny THEN miny = y ELSE IF y > maxy THEN maxy = y IF x < minx THEN minx = x ELSE IF x > maxx THEN maxx = x END IF NEXT MiMa miny, maxy, y1, y2 MiMa minx, maxx, x1, x2 RETURN fxy: INPUT ; "x"; x$: PRINT TAB(20); IF UCASE$(x$) = "X" THEN DefValX: PRINT "x="; x ELSE x = VAL(x$) INPUT ; "y"; x$: PRINT TAB(40); IF UCASE$(x$) = "Y" THEN DefValY: PRINT "y="; y ELSE y = VAL(x$) DefFxy x, y, z IF er% THEN er% = 0: z = 1.234567898765432D+300 IF z <> 1.234567898765432D+300 THEN SWAP z, y ARR 15, y, sto$ GOSUB fr PRINT "f(x,y)="; sto$; fr$ SWAP z, y END IF RETURN fxyk: INPUT "Grafico di f(x,y)=k. Introduci k. k"; k0 n% = 48: molt = 3 / 2 INPUT ; "x1 ", x1 INPUT " x2 ", x2 INPUT ; "y1 ", y1 INPUT " y2 ", y2 LOCATE , 1: Colore: COLOR 11: INPUT ; "colore=", col%: COLOR 15 IF col% < 1 OR col% > 15 THEN col% = 14 nome$ = nomefxy$ IF nufile% THEN IF trasf% THEN auto% = autofxyt% ELSE auto% = autofxy% auto% = auto% + 1 IF auto% > 99 THEN auto% = -1 popunt% = INSTR(nome$, ".") IF auto% > 9 THEN primcifr$ = "" ELSE primcifr$ = "0" nome$ = MID$(nome$, 1, popunt% - 1) + primcifr$ + LTRIM$(STR$(auto%)) + MID$(nome$, popunt%) IF trasf% THEN autofxyt% = auto% ELSE autofxy% = auto% END IF IF trasf% THEN nome$ = nomefxytrasf$ fxy1: PRINT "scansione "; n%; "*"; n% OPEN nome$ FOR OUTPUT AS #1 p% = 1 h = (x2 - x1) / n% K = (y2 - y1) / n% WRITE #1, .1122334455#, col% FOR i% = 0 TO n% x = x1 + i% * h segno x, y1, s1% IF s1% = 0 THEN y = y1: GOSUB circ FOR j% = 1 TO n% y = y1 + j% * K segno x, y, s2% IF s2% = 0 THEN GOSUB circ: s1% = 0 ELSEIF s2% <> s1% THEN IF s2% = -s1% THEN k1 = K / 2 FOR j1% = 1 TO 40 y = y - k1 segno x, y, s2% IF s2% = 0 THEN GOSUB circ: j1% = 40 ELSEIF s2% = s1% THEN y = y + k1 END IF k1 = k1 / 2 NEXT IF s2% = 0 THEN s1% = 0 ELSE y = y - k1: GOSUB circ: s1% = -s1% ELSE s1% = s2% END IF END IF NEXT NEXT FOR j% = 0 TO n% y = y1 + j% * K segno x1, y, s1% IF s1% = 0 THEN x = x1: GOSUB circ FOR i% = 1 TO n% x = x1 + i% * h segno x, y, s2% IF s2% = 0 THEN GOSUB circ: s1% = 0 ELSEIF s2% <> s1% THEN IF s2% = -s1% THEN h1 = h / 2 FOR i1% = 1 TO 40 x = x - h1 segno x, y, s2% IF s2% = 0 THEN GOSUB circ: i1% = 40 ELSEIF s2% = s1% THEN x = x + h1 END IF h1 = h1 / 2 NEXT IF s2% = 0 THEN s1% = 0 ELSE x = x - h1: GOSUB circ: s1% = -s1% ELSE s1% = s2% END IF END IF NEXT NEXT CLOSE #1 GOSUB ScriviPunti INPUT "continuo"; x$ 'IF n% = 50 THEN n% = 0 IF x$ = "1" THEN n% = n% * molt: GOTO fxy1 RETURN Trasfo: INPUT "Vuoi Trasformazione Geometrica di Curva attiva (solo ACapo:NO / 1:SI') "; trasf% INPUT "Vuoi autonumerazione NomiFile attiva (solo ACapo:NO / 1:SI' /2:riavviata) "; nufile% IF nufile% <> 1 THEN autofun% = -1 autoder% = -1 autoint% = -1 autocur% = -1 autocurt% = -1 autofxy% = -1 autofxyt% = -1 END IF INPUT "Hai introdotto un parametro Q a N (<=21)) valori (ACapo:NO / quantita' N)"; npar IF npar > 21 THEN npar = 21: PRINT "Ho preso N=21" IF npar > 0 THEN FOR i = 1 TO npar IF i > 1 THEN PRINT " "; COLOR 11: PRINT MID$(STR$(i), 2) + "^="; : COLOR 15: INPUT ; "", q$ IF i = 2 THEN IF LEFT$(q$, 1) = "+" THEN i = npar: FOR j = 2 TO npar: q(j) = q(j - 1) + VAL(MID$(q$, 2)): ppp! = q(j): PRINT " "; ppp!; : NEXT: PRINT ELSEIF LEFT$(q$, 1) = "*" THEN i = npar: FOR j = 2 TO npar: q(j) = q(j - 1) * VAL(MID$(q$, 2)): ppp! = q(j): PRINT " "; ppp!; : NEXT: PRINT ELSEIF LEFT$(q$, 1) = "/" THEN i = npar: FOR j = 2 TO npar: q(j) = q(j - 1) / VAL(MID$(q$, 2)): ppp! = q(j): PRINT " "; ppp!; : NEXT: PRINT ELSEIF LEFT$(q$, 1) = "^" THEN i = npar: FOR j = 2 TO npar: q(j) = q(j - 1) ^ VAL(MID$(q$, 2)): ppp! = q(j): PRINT " "; ppp!; : NEXT: PRINT ELSEIF LEFT$(q$, 1) = "-" THEN i = npar: FOR j = 2 TO npar: q(j) = q(j - 1) - VAL(MID$(q$, 2)): ppp! = q(j): PRINT " "; ppp!; : NEXT: PRINT ELSE q(2) = VAL(q$) END IF ELSE q(i) = VAL(q$) END IF NEXT PRINT END IF RETURN GestErrore: IF ERR = 7 THEN CLEAR : RUN 10 IF mem = 1 THEN PRINT "errore: troppi punti (ferma prima la scansione)": mem = 0: RESUME via IF ERR = 11 OR ERR = 5 OR ERR = 6 THEN IF kkkk THEN PRINT "fuori dominio o overflow": kkkk = 0 ELSE ON ERROR GOTO 0 END IF er% = 1: RESUME NEXT SUB ARR (n%, x, x$) IF x = 0 THEN x$ = "0": EXIT SUB n0% = n% i% = 0 odg% = INT(LOG(ABS(x)) / LOG(10#)): n1% = odg% - (n0% - 1) a = INT(x * 10# ^ -n1% + .5#) * 10# ^ -(n0% - 1) a$ = STR$(a) IF LEN(a$) = 18 THEN IF RIGHT$(a$, 1) = "1" THEN i% = 17: WHILE MID$(a$, i%, 1) = "0": i% = i% - 1: WEND a$ = LEFT$(a$, i%) END IF IF RIGHT$(a$, 1) = "9" THEN i% = 17: WHILE MID$(a$, i%, 1) = "9": i% = i% - 1: WEND a$ = LEFT$(STR$(a + 10 ^ -i%), i%) END IF END IF x$ = a$ + "E" + LTRIM$(STR$(odg%)) IF odg% = 0 THEN x$ = a$ ELSEIF ABS(odg%) < 7 AND LEN(STR$(VAL(x$))) < LEN(a$) + 2 THEN x$ = STR$(VAL(x$)) END IF END SUB SUB Colore FOR i = 1 TO 15 COLOR i PRINT "[" + MID$(STR$(i), 2) + "] "; NEXT END SUB SUB DefFx (x, y) y = x ^ 2 / 5 - 1 END SUB SUB DefFxy (x, y, z) z = y ^ 2 - x END SUB SUB DefNomiFile ' In percorso$ metti l'indirizzo della cartella in cui vuoi registrare i file ' Se hai il QBasic nella cartella BAS (...\OM\PRG\BAS) e vuoi mettere i file ' nella cartella GFU (...\OM\PRG\GFU) metti: ' percorso$ = "../GFU" ' I nomi sono dei file in cui sono registrati, in ordine, il grafico della ' funzione, quello della curva P=P(t), quello della curva f(x,y)=k, quello ' della derivata (o pendenza) di f, quello dell'integrale tra x1 e x, quello ' della trasformazione di P=P(t), quello della trasformazione di f(x,y)=k. percorso$ = "C:/" nomefunz$ = percorso$ + "fun.gfu" nomederiv$ = percorso$ + "der.gfu" nomeintegr$ = percorso$ + "int.gfu" nomecurv$ = percorso$ + "cur.gfu" nomecurvtrasf$ = percorso$ + "curt.gfu" nomefxy$ = percorso$ + "fxy.gfu" nomefxytrasf$ = percorso$ + "fxyt.gfu" ' C:/DOCUME~1/PIPPO/DOCUME~1/ questo (o con \ al posto di /) e' il possibile ' percorso per arrivare alla cartella Documenti contenuta nella cartella dell' ' utente Pippo contenuta nella cartella Documents and Settings. ' percorso+nome devi usarlo nel box per importare file del programma Poligon. ' Per individuare un percorso puoi usare File-Open e poi copiarlo dalla fine- ' stra di dialogo usando Modifica-Segna dal menu che si apre cliccando in alto ' a sinistra. END SUB SUB DefPt (t, x, y) ' Volendo puoi inserire la variabile Param. Vedi il Sub HELP ' x = COS(t * grado): y = SIN(t * grado) END SUB SUB DefTrasformazione (x, y) ' Metti in (x1,y1) le nuove coordinate x1 = -2 * y y1 = 2 * x + 1 ' Non cancellare la riga seguente x = x1: y = y1 ' ho aggiornato le coordinate END SUB SUB DefValA SHARED a a = 1 END SUB SUB DefValB SHARED b b = SQR(3) END SUB SUB DefValT SHARED x t = SQR(3) END SUB SUB DefValX SHARED x x = SQR(3) END SUB SUB DefValY SHARED y y = SQR(3) END SUB FUNCTION DIF (x, y) w = x - y IF ABS(w) / (ABS(x) + ABS(y)) < .00000000000001# THEN w = 0 DIF = w END FUNCTION SUB ESEMPI........ '---------- 'def. di x -> f(x) usando variabile di appoggio (per DefFx) w = SQR(x - 3.5) y = w + 6 / w '---------- 'ellisse di semiassi 3 e 2 con t in gradi (per DefPt) a = 3: b = 2 x = a * COS(t * grado): y = b * SIN(t * grado) '---------- ' curva in coord. polari (per DefPt) [ e' la cardioide ro = 1 - cos(teta) ] ro = 1 - COS(t) x = ro * COS(t): y = ro * SIN(t) '---------- 'def di (x,y) -> f(x,y) che usa cicli (qui per input interi: e' coeff.bin.: ' (x,y) -> num. sottoinsiemi di y elem. da un insieme di x elementi) IF y > x / 2 THEN y = x - y z = 1: n = x: D = y WHILE D > 0 z = z * n / D D = D - 1: n = n - 1 WEND '---------- ' def di x -> f(x) (per DefFx) che usa (x,y) -> g(x,y) definita in DefFxy ' in questo caso (distrib. binomiale) DefFxy e' come nell'es. precedente n = 50: p = 20 / 100 ' Parametri della distrib. binomiale K = FIX(x + 1 / 2) ' arrotondo agli interi DefFxy n, K, C ' Calcolo z=CBin(N,x) y = C * p ^ K * (1 - p) ^ (n - K) '---------- 'def di fascio di iperboli (per DefPt) x = t: y = param / t '---------- 'def. di trasform. geometrica (per DefTrasformazione) ' rotaz. 30 gradi attorno (0,0) x1 = COS(30 * grado) * x - SIN(30 * grado) * y y1 = SIN(30 * grado) * x + COS(30 * grado) * y '---------- ' f(x,y)=-1 e' parte interna del cerchio, = 1 parte esterna (DefFxy) z = SGN(x * x + y * y - 1) '---------- ' f(x,y)=1 e' il rettangolo [x1,x2]*[y1,y2] che seleziono (DefFxy) ' se uso una trasformazione geometrica ottengo il trasformato del rettangolo z = 1 '---------- END SUB SUB FrazGen (x, p, q, nc) IF x = 0 THEN p = 0: q = 1: EXIT SUB ' p/q frazione che approssima x con nc cifre significative n = INT(LOG(x) / LOG(10#)): ' ord grandezza di x eps = 10 ^ (n - nc) * 5: ' precisione assoluta corrispondente alla scelta di nc ' man mano trovo frazioni p/q che si avvicinano sempre pi- a x ' mi fermo quando raggiungo la precisione richiesta y = x pint = INT(y): pfraz = y - pint p = pint: q = 1: p0 = 1: q0 = 0 WHILE ABS(x - p / q) > eps y = 1 / pfraz: pint = INT(y): pfraz = y - pint p1 = p0 + pint * p: p0 = p: p = p1 q1 = q0 + pint * q: q0 = q: q = q1 WEND END SUB DEFSNG A-Z SUB HELP............ ' ' ## Definisci la FUNZIONE a 1 input nel SUB DefFx, assegnando a y l'output ' di x; puoi usare anche piu' righe di comandi. Se vuoi puoi farti una banca ' di funzioni da incollare nel Sub. Oppure puoi scriverle nel Sub e man mano ' disattivare quelle che non ti servono facendo precedere le righe da un "'". ' Ecco cosa mettere se SUB DefFx (x, y) ' si vuole definire la ====> y = 3*x+1 ' la funzione x -> 3*x+1 END SUB ' In modo analogo puoi definire le funzioni a due input (DefFxy), le curve ' P=P(t) (DefPt), le trasformazioni geometriche (DefTrasf...). ' All'avvio del programma sono provvisoriamente inserite alcune definizioni. ' Vedi il Sub ESEMPI per qualche esempio. ' ' ## Se nelle definizioni delle funzioni vuoi usare PI GRECA, il numero di ' Nepero o ø (ossia PiGreca/180 - in modo da poter usare sin(30ø) o ..) ' indicali: pi ne grado. Ad es. sin(2), sin(2*pi) e sin(2*grado) indicano ' rispettivamente il seno di 2 (radianti), di 2PiGreca (rad) e di 2 gradi. ' ' ## Il comando 5-max puo' essere impiegato per trovare punti di MASSIMO o di ' MINIMO. Puo' essere usato per risolvere equazioni f(x)=k nel caso in cui il ' grafico tocchi senza attraversare y=k. ' ' ## I GRAFICI sono registrati in formato apribile col programma Poligon, con ' i NOMI (e i percorsi) indicati nel SUB DefNomiFile. (In Poligon devi mettere ' percorso+nome nell'apposito box e cliccare su [Imp]; per adattare la scala ' potrai fare un doppio clic su [o]; per unire una figura alla precedente fai ' un doppio clic su [P]). Puoi aprire contemporaneamente piu' sessioni di ' Poligon, in cui visualizzare su scale diverse diverse figure. ' Se dal menu 13-IMP scegli di numerare automaticamente i nomi dei file, ai ' nomi scelti sono aggiunti automaticamente 01, 02, 03,.., 99 con incrementi ' man mano che fai grafici dello stesso tipo. Al riavvio si riparte da 01. ' Ad es. se il percorso e' c:/ e il nome e' FUN.gfu, via via vengono registrati ' FUN01.gfu, FUN02.gfu, ... Se da Poligon importi c:/FUN01.gfu, via via viene ' predisposta l'importazione del "FUN" successivo (FUN02.gfu,..) ' ' ## La SCALA viene impostata introducendo gli estremi degli intervalli ' che definiscono il rettangolo cartesiano [x1,x2]*[y1,y2] da associare alla ' finestra-grafici. Nel caso del grafico di una funzione, se alla richiesta ' di y1 batti "auto" la SCALA verticale viene scelta automaticamente. Lo ' stesso accade per le curve P=P(t). ' Se, avendo gia' tracciato grafici, alla richiesta di x1 batti "=", viene ' mantenuta la scala precedente. Questa opzione e' comoda se vuoi ottenere ' una successione di curve realizzate come P=P(t) da visualizzare una dopo ' l'altra con Poligon senza che venga cambiata la scala, avendo scelto la ' numerazione automatica dei nomi dei file. ' ' ## Se non selezioni un COLORE e premi solo Invio viene scelto il colore 14 ' (giallo). Se rispondi SI' (ossia 1) alla domanda di CONGIUNGERE i punti, ' da Poligon il grafico verra' rappresentato mediante una poligonale, se no ' mediante una successione di punti. Nel caso delle curve definite come ' f(x,y)=k non e' prevista l'opzione di congiungimento, per evitare il con- ' giungimento tra punti di rami di curve diversi; in questo caso puo' essere ' utile tener aperto contemporaneamente Poligon e, via via che si chiedono ' ALTRI PUNTI, da esso riazionare [Imp] (con lo stesso nome nel box) per ' controllare se si e' raggiunto un numero sufficiente di punti; l'aziona- ' mento di [:] permette di ingrandire i punti. ' ' ## Per assegnare durante l'esecuzione ad a, b, x, y o t numeri come 1/7, ' SQR(3)/2, ... puoi calcolarne i valori con la calcolatrice (di Windows o ' quella presente in MaCoSa) e incollarli (usando Modifica - Incolla dal menu ' che si apre cliccando in alto a sinistra); oppure puoi inserili nei sub ' DefValA, ... DefValT e battere come input invece che il valore solo la ' lettera (ad es. se come x per tabulare f volglio introdurre la radice di 2/7 ' metto in DefValX x=SQR(2/7) e alla richiesta "x?" batto "x"). I Copia/Incolla ' dal menu File sono invece "interni" alla applicazione, diversi da quelli ' azionabili nel modo detto sopra. ' ' ## Battendo 0 (end) il programma viene sospeso. Puoi cosi' modificare i ' vari sub Def... Per proseguire l'esecuzione premi F5 o aziona Continua dal ' menu Run; per riavviarla premi Shift+F5 o aziona Start. ' ' ## Nelle USCITE NUMERICHE r(2) e 2pi, ad es., indicano la radice quadrata ' di 2 e 2*PiGreca. Se scegliendo un comando ad OUTPUT NUMERICI (1-fx 4-int ' 5-max 8:Sf 9:Pt 11-fxy) faccio seguire il numero del comando da N, F o P ' impongo che le uscite siano rispettivamente in FORMATO solo numerico, ' numerico e frazionario, numerico e frazionario o 'irrazionale' o usando ' PiGreca (a seconda dei casi). In assenza di suffissi, viene usata la forma ' numerica seguita (se semplice) da una eventuale forma frazionaria o ' 'irrazionale'. Ad es. se in DefFx metto y=atn(x), seleziono il comando fx ' battendo 1 e do' come input -1 ottengo come uscita -0.7853981..; se batto ' 1F ottengo -5132749/6535219; se batto 1P ottengo -1/4pi. ' ' ## Se vuoi TRASFORMARE una curva realizzata come P=P(t) o come f(x,y)=k ' definisci la trasformaz. in DefTrasformazione come x1 = f1(x,y), ' y1 = f2(x,y). Ad es. per la simmetria rispetto a (0,0) metti x1=-x e y1=-y. ' Per attivare la trasformazione aziona il comando 13-IMP. In questo modo i ' comandi P=Pt e fxyk tracciano i trasformati. Per disattivare riusa 13-IMP. ' ' ## Se vuoi tracciare un FASCIO di curve, puoi usare in DefPt il parametro ' param. Ad es. se metti in DefPt x=t y=t^2+param*t puoi ottenere un fascio ' di parabole y = x^2 + param*x al variare di Param. ' I valori di Param possono essere specificati azionando il comando 13-IMP. ' Battendo 0 si annulla l'eventuale precedente definizione di parametri. ' Battendo ad es. 8 si specifica che Param viene fatto variare tra 8 valori. ' I valori possono essere battuti uno ad uno. Oppure, battuto il primo, si ' puo' battere come secondo "+0.5": automaticamente come 2^, 3^,.., 8^ valore ' vengono presi quelli ottenuti a partire dal primo valore introdotto mediante ' successive addizioni di 0.5. Analogamente, al posto di +, si possono usare ' *,-,/ e ^: i valori vengono man mano moltiplicati, diminuiti, divisi o ele- ' vati al numero scritto dopo il simbolo dell'operazione. ' I grafici vengono regsitrati in colori diversi (colore 15, 14, 13, ...). ' ' ## Se si sono definiti dei parametri, la loro memorizzazione si mantiene ' fino a che non si chiude o riavvia il programma. Se lo si sospende col ' comando 0 e lo si fa riprendere con F5 o Continue, non si perdono. ' I parametri sono comodi anche per tabulare funzioni. Se voglio tabulare ' x -> x^2 per x=0,0.1,0.2,..,2 posso mettere x=param y=param^2 in DefPt, ' azionare il comando 13, scegliere 21 valori, battere 0 come primo valore, ' +0.1 invece del secondo valore. Poi aziono 9-Pt e ottengo (battendo Enter ' alla richiesta "t?2) la tabulazione voluta. ' END SUB DEFDBL A-Z SUB INTEG (a, b, i) n0% = 36: n1% = n0% * 32: n% = n0%: h = (b - a) / n%: i0 = 0: d0 = 0: r = 1 DefFx a, s1 DefFx b, i: s1 = s1 + i s2 = 0: FOR j% = 1 TO n% - 1: DefFx a + j% * h, F: s2 = s2 + F: NEXT smetto% = 0 WHILE smetto% = 0 s3 = 0: FOR j% = 0 TO n% - 1: DefFx a + (j% + .5) * h, F: s3 = s3 + F: NEXT i = (s1 + s2 + s2 + s3 * 4) * h / 6: D = i - i0: IF D <> 0 THEN r = d0 / D ii = ABS(i) + ABS(i0) smetto% = 1 IF ii = 0 THEN r = 1 ELSEIF n% = n1% AND ABS(r) > 1 THEN ELSEIF (D <> 0 OR n% > n0% * 4) AND ABS(D) / ii < .00000001# THEN kkk% = 1 ELSEIF n% = n1% + n1% THEN ELSE smetto% = 0: n% = n% + n%: s2 = s2 + s3: h = (b - a) / n%: i0 = i: d0 = D END IF IF INKEY$ = CHR$(27) THEN smetto% = 1 WEND IF ABS(r) > 1 THEN i = i + D / (r - 1) IF ABS(r) <= 1 AND D <> 0 AND kkk% = 0 AND ii > .001 THEN i = 1.234567898765432D+300 kkk% = 0 END SUB SUB MaxMin (a, b, x, m%) h0 = b - a: h = (b - a) / 3 x = 1.234567898765432D+300 WHILE a + h > a AND h <> h0 DefFx a, y1: DefFx a + h, y2: DefFx a + h * 2, y3 IF m% = 1 THEN IF y3 > y2 AND y2 > y1 THEN a = a + h ELSE b = b - h ELSE IF y3 < y2 AND y2 < y1 THEN a = a + h ELSE b = b - h END IF h0 = h: h = (b - a) / 3 IF INKEY$ = CHR$(27) THEN x = 1.234567898765432D+300: h0 = h 'PRINT a, b WEND x = a + h END SUB SUB MiMa (min, max, x1, x2) IF min < 0 THEN min0 = min - min: max0 = max - min ELSE min0 = min: max0 = max IF max0 = min0 AND max0 = 0 THEN max0 = 1 IF (max0 - min0) / (ABS(max0) + ABS(min0)) < .000000000000001# THEN max0 = ABS(max0): min0 = -max0 pot10 = 10# ^ INT(LOG(max0 + max0) / LOG(10#) - 5#) x1 = INT(min0 / pot10 - 5#) * pot10: x2 = INT(max0 / pot10 + 15#) * pot10 IF min < 0 THEN x1 = x1 + min: x2 = x2 + min END SUB SUB Punto (t, x, y) DefPt t, x, y IF trasf% THEN DefTrasformazione x, y END SUB SUB QUAD (x, x1, x2) x1 = 1 FOR i& = 2 TO SQR(x / 2) + 1 y = x / i& / i& IF y = INT(y) THEN x1 = i&: x2 = y NEXT END SUB SUB segno (x, y, s%) SHARED xt, yt DefFxy x, y, z IF er% THEN er% = 0: s% = -2: EXIT SUB s% = SGN(z - k0) IF trasf% THEN xt = x: yt = y: DefTrasformazione xt, yt END SUB SUB somma (a, b, y) y = 0 FOR i = a TO b DefFx i, x: y = y + x IF er% = 1 THEN i = b: y = 1.234567898765432D+300 NEXT END SUB SUB trsf (x, x$, s) SHARED nc, form$ FrazGen ABS(x), p, q, nc x$ = MID$(STR$(p), 2) + "/" + MID$(STR$(q), 2) s = p + q IF p <> 0 AND q = 1 THEN x$ = MID$(STR$(p), 2) ELSEIF form$ <> "F" THEN FrazGen x * x, p, q, nc - 4.9 s1 = p + q IF s1 < s THEN s = s1 IF p = 1 AND q = 1 THEN x$ = "1" ELSEIF p <> 0 AND q <> 1 THEN IF SQR(q) = INT(SQR(q)) THEN QUAD p, x1, x2 IF x1 = 1 THEN x$ = "sqr(" + MID$(STR$(p), 2) + ")" + "/" + MID$(STR$(SQR(q)), 2) ELSE x$ = MID$(STR$(x1), 2) + "sqr(" + MID$(STR$(x2), 2) + ")" + "/" + MID$(STR$(SQR(q)), 2) END IF ELSEIF SQR(p) = INT(SQR(p)) THEN QUAD q, x1, x2 IF x1 = 1 THEN x$ = MID$(STR$(SQR(p)), 2) + "/" + "sqr(" + MID$(STR$(q), 2) + ")" ELSE x$ = MID$(STR$(SQR(p)), 2) + "/(" + MID$(STR$(x1), 2) + "sqr(" + MID$(STR$(x2), 2) + "))" END IF ELSE QUAD p, x1, x2: QUAD q, y1, y2 IF x1 = 1 AND y1 = 1 THEN x$ = "sqr(" + MID$(STR$(p), 2) + "/" + MID$(STR$(q), 2) + ")" ELSEIF x1 = 1 THEN x$ = "sqr(" + MID$(STR$(p), 2) + ")" + "/(" + MID$(STR$(y1), 2) + "sqr(" + MID$(STR$(y2), 2) + "))" ELSEIF y1 = 1 THEN x$ = MID$(STR$(x1), 2) + "sqr(" + MID$(STR$(x2), 2) + ")" + "/sqr(" + MID$(STR$(q), 2) + ")" ELSE x$ = MID$(STR$(x1), 2) + "sqr(" + MID$(STR$(x2), 2) + ")" + "/(" + MID$(STR$(y1), 2) + "sqr(" + MID$(STR$(y2), 2) + "))" END IF END IF ELSEIF p <> 0 AND q = 1 THEN QUAD p, x1, x2 IF x1 = 1 THEN x$ = "sqr(" + MID$(STR$(p), 2) + ")" ELSE x$ = MID$(STR$(x1), 2) + "sqr(" + MID$(STR$(x2), 2) + ")" END IF END IF END IF IF (INSTR(x$, "r") + INSTR(x$, "/") > 0) AND LEN(x$) > 12 AND form$ <> "T" AND form$ <> "F" THEN x$ = "" IF s = s1 THEN prec = SQR(ABS(x * x - p / q)) ELSE prec = ABS((ABS(x) - p / q)) END SUB SUB ZERO (a, b, x) DefFx a, y1: s1% = SGN(y1 - k0): DefFx b, y2: y2 = y2 - k0: h = b - a: metodo% = -1 x = 1.234567898765432D+300 WHILE SGN(y2) <> s1% AND h0 <> h SELECT CASE metodo% CASE 1 x = a + y1 * h / (y1 - y2): ' interpolazione CASE -1 x = a + h / 2: ' bisezione END SELECT DefFx x, y: y = y - k0: IF SGN(y) = s1% THEN a = x: y1 = y ELSE b = x: y2 = y h0 = h: h = b - a: metodo% = -metodo% IF INKEY$ = CHR$(27) THEN x = 1.234567898765432D+300: h0 = h WEND END SUB