SOURCE APPLESOFT de FONCTION.BAS

Pour ceux qui n'ont pas la carte PorteParole, il faut supprimer les trois dernires lignes
et les remplacer par 9010 RETURN

For those who don't have the PorteParloe Speech card, delete the last three lines and
replace them with 9010 RETURN.
 

10 VI = 2: REM  MODE VIDEO
 20 XM = 139:YM = 159: REM    COORDONNEES MAXIMALES
 25 AA = 0:BB = 1:PG = 3:NI = 1: REM  INTEGRATION
 26  DIM IX(5),IW(5)
 30 X0 =  - 3:X1 = 3
 40 Y0 =  - 2:Y1 = 2
 45 FI = 1:FJ = 2:CT = 0: REM  FONCTIONS ET CONSTANTE
 50 EP = 0.001:ZX = 2:ZY = 2:EE = .0001: REM    PRECISION ET ZOOM
 53 FT = 1:XT = 0: REM  TANGENTE
 55  GOTO 100
 60  ON FC GOTO 65,70,75,80,85,90,95,200,200,99,200,200,200,200,200,200,200
 65 Y =  SIN (X): RETURN 
 70 Y =  COS (X): RETURN 
 75 Y = X * X - 4: RETURN 
 80 Y = X * (X * (X - 2)) + 5: RETURN 
 85 Y = X / 2 - 3: RETURN 
 90 Y = 2: RETURN 
 95 Y =  LOG (X): RETURN 
 99 Y = TT * X + BT: RETURN 
 100  GOSUB 2000: GOSUB 1200: GOSUB 1000: GOTO 5000
 120 DX = (X1 - X0) * 2 / (XM + 1)
 130 X = X0: GOSUB 60:J = AY * Y + BY
 140  FOR I = 2 TO XM STEP 2
 150 X = X + DX: GOSUB 60:K = AY * Y + BY
 160  & LI(I - 2,J,I,K)
 170 J = K: NEXT I
 180  RETURN 
 199  REM  CALCUL D'UNE DERIVEE, 10+FONCTION
 200 HH = X * EE: IF  ABS (HH) < EE THEN HH = EE
 210 X = X + HH:FC = FC - 10: GOSUB 60:Y2 = Y:X = X - HH: GOSUB 60:Y = (Y2 - Y) / HH:FC = FC + 10
 220  RETURN 
 1000  REM  TRACE DES AXES
 1010 AX = XM / (X1 - X0):BX =  - X0 * AX
 1020 AY = YM / (Y1 - Y0):BY =  - Y0 * AY + 32
 1025  & CO(15): REM  AXES BLANCS
 1030  IF BX < 0 THEN 1050: REM  PAS D'AXE VERTICAL VISIBLE
 1040  & LI(BX,32,BX,YM + 32)
 1050  IF BY < 32 THEN 1070: REM   PAS D'AXE HORIZONTAL VISIBLE
 1060  & LI(0,BY,XM,BY)
 1070  RETURN 
 1200  REM  PREPARE L'ECRAN
 1205  PRINT  CHR$ (4);"PR#3"
 1210  POKE  - 16301,0: & DI(VI)
 1220  & CO(0): & MO(0)
 1230  & BO(0,0,XM,YM)
 1240  RETURN 
 2000  REM  MOUSE INIT
 2002  PRINT "LOGICIEL D'ANALYSE DE FONCTIONS..."
 2004  PRINT "----------------------------------"
 2006 I = 1: GOSUB 9010
 2010 S9 = 4: REM  MOUSE SLOT
 2020 H9 = 192 + S9: REM   ADRESSE DE BASE $Cn00
 2030  POKE 768,162: POKE 769,H9: POKE 770,160: POKE 771,16 * S9
 2040  POKE 772,169: POKE 774,76: POKE 776,H9
 2050 H9 = H9 * 256:T9 = 1144 + S9
 2060  IF  PEEK (H9 + 12) = 32 AND  PEEK (H9 + 251) = 214 THEN  RETURN 
 2070 H9 = 0: PRINT "Souris non initialisee"chr$(7): GET A$: RETURN 
 2090  REM  F9=FONCTION (0 A 7) A9=VALEUR ACCU X9/Y9=COORDS IN/OUT
 2095  REM  B9=BOUTON+STATUS
 2100  POKE 775, PEEK (H9 + 18 + F9): POKE 773,A9: IF F9 <  > 4 THEN 2200
 2200  IF F9 <  > 5 THEN 2300
 2210 X =  INT (X9 / 256): POKE 1400,X: POKE 1144,X9 - 256 * X
 2220 X =  INT (Y9 / 256): POKE 1528,X: POKE 1272,Y9 - 256 * X
 2300  CALL 768: IF F9 <  > 2 THEN  RETURN 
 2310 X9 =  PEEK (T9 + 256) * 256 +  PEEK (T9)
 2320 Y9 =  PEEK (T9 + 384) * 256 +  PEEK (T9 + 128)
 2340 B9 =  PEEK (T9 + 768): RETURN 
 3000 F9 = 7:A9 = 0: GOSUB 2100: REM   INITMOUSE
 3010 F9 = 0:A9 = 1: GOSUB 2100: REM   SETMOUSE PASSIVE
 3013 F9 = 5:A9 = 0:X9 = 0:Y9 = 139: GOSUB 2100: REM  LIMITES X
 3014 F9 = 5:A9 = 1:X9 = 0:Y9 = 159: GOSUB 2100: REM  LIMITES Y
 3015 F9 = 6:A9 = 0: GOSUB 2100: REM  HOME MOUSE
 3017 XS = 0:YS = YM + 32: & PI(XS,YS,CS): REM  LA COULEUR DU PREMIER PIXEL
 3020 F9 = 2:A9 = 0: GOSUB 2100: REM  READMOUSE
 3030  IF (B9 AND 32) = 0 THEN 3100
 3040  & CO(CS): & LI(XS,YS,XS,YS)
 3050  & CO(15):XS = X9:YS = 191 - Y9
 3060  & PI(XS,YS,CS): & LI(XS,YS,XS,YS)
 3100  IF B9 < 128 THEN 3020
 3105  & CO(CS): & LI(XS,YS,XS,YS)
 3110 XS = XS / AX + X0:YS = (YS - 32) / AY + Y0
 3120  PRINT "Point selectionne:": PRINT "x = "XS" , y ="YS
 3130  GET A$
 3200 F9 = 0:A9 = 0: GOSUB 2100: REM   SETMOUSE DISABLED
 5000  HOME : VTAB (21): PRINT "------------------------------- Menu principal -------------------------------"
 5010  PRINT "1) Axes            2) Efface+trace     3) Trace            4) Quitter"
 5020  PRINT "5) Zoom            6) Fi(x)=a          7) Fi(x)=Fj(x)      8) Fixer precision"
 5030  PRINT "9) Integrale       0) Pointer          A) Centrer          B) Tangente";
 5040  GET A$: PRINT 
 5045  IF A$ = "A" THEN 6400
 5050  IF A$ = "1" THEN 6000
 5055  IF A$ = "2" THEN 7000
 5060  IF A$ = "3" THEN 7010
 5065  IF A$ = "4" THEN 9000
 5070  IF A$ = "5" THEN 6100
 5075  IF A$ = "8" THEN 6200
 5080  IF A$ = "6" THEN 6300
 5085  IF A$ = "7" THEN 6500
 5090  IF A$ = "9" THEN 7100
 5095  IF A$ = "0" THEN 3000
 5097  IF A$ = "B" THEN 6600
 5100  PRINT  CHR$ (7);: GOTO 5040
 5200  PRINT A$" actuel = "X" ";: INPUT A$
 5210  IF  LEN (A$) <  > 0 THEN X =  VAL (A$)
 5230  RETURN 
 5300  IF  ASC (A$) = 39 THEN 5320
 5310 X =  VAL (A$): RETURN 
 5320 X = 10 +  VAL ( MID$ (A$,2,1)): RETURN 
 5999  REM  FIXE LES AXES
 6000 X = X0:A$ = "Xmin": GOSUB 5200:X0 = X
 6010 X = X1:A$ = "Xmax": GOSUB 5200:X1 = X
 6020 X = Y0:A$ = "Ymin": GOSUB 5200:Y0 = X
 6030 X = Y1:A$ = "Ymax": GOSUB 5200:Y1 = X
 6040  GOSUB 1220: GOSUB 1000
 6050  GOTO 5000
 6099  REM  ZOOME SELON ZE
 6100  PRINT "Zoom X actuel fois "ZX;: INPUT A$
 6110  IF  LEN (A$) <  > 0 THEN ZX =  VAL (A$)
 6120 X = (X1 + X0) / 2:Y = (X1 - X0) / (2 * ZX):X0 = X - Y:X1 = X + Y
 6130  PRINT "Zoom Y actuel fois "ZY;: INPUT A$
 6140  IF  LEN (A$) <  > 0 THEN ZY =  VAL (A$)
 6150 X = (Y1 + Y0) / 2:Y = (Y1 - Y0) / (2 * ZY):Y0 = X - Y:Y1 = X + Y
 6190  GOSUB 1220: GOSUB 1000: GOTO 5000
 6199  REM  FIXE LA PRECISION
 6200  PRINT "Precision actuelle "EP" ";: INPUT A$
 6210  IF  LEN (A$) <  > 0 THEN EP =  VAL (A$)
 6220  GOTO 5000
 6300  PRINT "Fonction actuelle F"FI" ";: INPUT A$
 6310  IF  LEN (A$) <  > 0 THEN  GOSUB 5300:FI = X
 6320  PRINT "Equation F"FI"(x)="CT;: INPUT A$
 6330  IF  LEN (A$) <  > 0 THEN CT =  VAL (A$)
 6340  PRINT "Valeur de depart "XS" ";: INPUT A$
 6345  IF  LEN (A$) <  > 0 THEN XS =  VAL (A$)
 6350 FC = FI
 6360 H = EE * XS: IF  ABS (H) < EE THEN H = EE
 6370 X = XS + H: GOSUB 60:YY = Y:X = XS: GOSUB 60
 6380 H = H * (Y - CT) / (YY - Y):XS = XS - H: IF  ABS (H) > EP THEN 6360
 6390  PRINT "Solution x="XS:X = XS: GOSUB 60:YS = Y
 6395  PRINT "et F"FC"(x)="Y: GET A$: GOTO 5000
 6400  PRINT "Centrer sur x = "XS" ";: INPUT A$
 6410  IF  LEN (A$) <  > 0 THEN XS =  VAL (A$)
 6420  PRINT "     et sur y = "YS" ";: INPUT A$
 6430  IF  LEN (A$) <  > 0 THEN YS =  VAL (A$)
 6440 X0 = X0 + XS:Y0 = Y0 + YS:X1 = X1 + XS:Y1 = Y1 + YS
 6450  GOSUB 1220: GOSUB 1000: GOTO 5000
 6500  PRINT "Entrer i pour Fi ou 'i pour sa derivee"
 6505  PRINT "Premiere fonction F"FI;: INPUT A$
 6510  IF  LEN (A$) <  > 0 THEN  GOSUB 5300:FI = X
 6520  PRINT "Seconde fonction  F"FJ;: INPUT A$
 6530  IF  LEN (A$) <  > 0 THEN  GOSUB 5300:FJ = X
 6540  PRINT "Valeur de depart "XS" ";: INPUT A$
 6545  IF  LEN (A$) <  > 0 THEN XS =  VAL (A$)
 6550 FC = FI
 6560 H = XS * EE: IF  ABS (H) < EE THEN H = EE
 6570 X = XS + H: GOSUB 60:YY = Y:FC = FJ: GOSUB 60:YY = YY - Y
 6580 X = XS: GOSUB 60:YZ = Y:FC = FI: GOSUB 60:YZ = Y - YZ
 6590 H = H * YZ / (YY - YZ):XS = XS - H: IF  ABS (H) > EP THEN 6560
 6595  GOTO 6390
 6600  PRINT "Entrer i pour Fi ou 'i pour sa derivee"
 6610  PRINT "Tangente a la fonction "FT" ";: INPUT A$
 6620  IF  LEN (A$) <  > 0 THEN  GOSUB 5300:FT = X
 6630  PRINT "au point x = "XT" ";: INPUT A$
 6640  IF  LEN (A$) <  > 0 THEN XT =  VAL (A$)
 6650 FC = FT:H = XT * EE: IF  ABS (H) < EE THEN H = EE
 6660 X = XT + H: GOSUB 60:TT = Y:X = XT: GOSUB 60:TT = (TT - Y) / H
 6670 BT = Y - TT * XT:FC = 10: & CO(FC)
 6680  PRINT "Equation y = "TT" x + "BT
 6690  PRINT "Fonction "FC"...": GOSUB 120: GET A$: GOTO 5000
 6999  REM  EFFACE PUIS....
 7000  GOSUB 1220: GOSUB 1000
 7009  REM  ... TRACE LES FONCTIONS
 7010  PRINT "Entrer i pour Fi ou 'i pour sa derivee"
 7015  PRINT "Fonctions selectionnees "FC$" ";: INPUT A$
 7020  IF  LEN (A$) <  > 0 THEN FC$ = A$
 7030 NF = 1
 7040  IF NF >  LEN (FC$) THEN 5000
 7045 A$ =  MID$ (FC$,NF,1):FC = 0: IF A$ <  > "'" THEN 7055
 7050 FC = 10:NF = NF + 1:A$ =  MID$ (FC$,NF,1)
 7055 FC = FC +  VAL (A$)
 7060  & CO(FC): IF FC > 10 THEN 7068
 7063  PRINT "Fonction "FC"...": GOTO 7070
 7068  PRINT "Derivee de "FC - 10"..."
 7070  GOSUB 120:NF = NF + 1: GOTO 7040
 7100  PRINT "Integrale de la fonction "FI" ";: INPUT A$
 7110  IF  LEN (A$) <  > 0 THEN  GOSUB 5300:FI = X
 7120 FC = FI: PRINT "de x = "AA;: INPUT A$
 7130  IF  LEN (A$) <  > 0 THEN AA =  VAL (A$)
 7140  PRINT "jusqu'a x = "BB" ";: INPUT A$
 7150  IF  LEN (A$) <  > 0 THEN BB =  VAL (A$)
 7160  PRINT "points de Gauss (3 ou 5) "PG" ";: INPUT A$
 7170  IF  LEN (A$) <  > 0 THEN PG =  VAL (A$)
 7180  PRINT "nombre d'intervalles "NI" ";: INPUT A$
 7190  IF  LEN (A$) <  > 0 THEN NI =  VAL (A$)
 7200  IF PG = 5 THEN 7230
 7210 IX(2) =  SQR (.6):IX(0) =  - IX(2):IX(1) = 0:IW(0) = 5 / 9:IW(2) = IW(0):IW(1) = 8 / 9
 7220  GOTO 7250
 7230 IX(4) = .9061798459:IX(0) =  - IX(4):IX(3) = .5384693101:IX(1) =  - IX(3):IX(2) = 0
 7240 IW(4) = .2369268851:IW(0) = IW(4):IW(3) = .4786286705:IW(1) = IW(3):IW(2) = 128 / 225
 7250 T = (BB - AA) / NI: FOR I = 0 TO PG - 1:IX(I) = (IX(I) + 1) * .5 * T: NEXT I
 7260 SO = 0: FOR I = 0 TO NI - 1:XX = AA + T * I
 7270  FOR J = 0 TO PG - 1:X = XX + IX(J): GOSUB 60:SO = SO + Y * IW(J): NEXT J
 7280  NEXT I:SO = SO * T * .5: PRINT "L'integrale vaut "SO
 7290  GET A$: GOTO 5000
 9000  & DI(0): TEXT : HOME :I = 2: GOSUB 9010: END 
 9010  PRINT  CHR$ (4);"BLOAD /TRAVAIL/BASIC/PAROLE/PORTEPAROLE"
 9020  PRINT  CHR$ (4);"BLOAD /TRAVAIL/BASIC/PAROLE/FONCTION.R"
 9030  POKE 255,I: CALL 768: RETURN 
