10 REM (C) JOSE IGNACIO MESONERO   DICIEMBRE 89   COMPLEJOS
20 PRINT CHR$(15);:ANGLE1:ONERROR GOTO 390:DEFCHR$(&HFC)="0C12A20204":DEFCHR$(&HFD)="B8A8F80800":DEFCHR$(&HFE)="70883f4830":DEFCHR$(&HFF)="7c92929060"
30 V=26:DIM a(V,2),S$(20)
40 CLS:PRINT"CALCULADORA COMPLEJA OPERACION";:INPUT A$:IFLEN(A$)=0 THEN GOTO 930 ELSEFORN=1TOV:a(N,0)=0:NEXT:FORN=1TOLEN(A$):POKE (1023+N),ASC(MID(A$,N,1)):NEXTN:POKE(1023+N),0:MAS=0:KA=-1:MAS$=""
50 P$="":GOSUB 420:GOSUB 250:GOSUB 230
60 FORN=1TOLEN(A$):CLS:P=ASC(MID(A$,N,1)
70 P=P-96:IFP<27ANDP>0 THENIFP>V THEN GOTO 220 ELSE IFa(P,0)=0 THEN C=P:GOSUB 480:a(P,0)=1:PRINT"VALOR DE ";CHR$(P+96);"=";C$;:INPUT d$:IF d$="P" OR d$="p" THEN GOTO 970 ELSE IF d$<>"" THEN C$=d$:GOSUB 560:a(P,1)=X:a(P,2)=Y:a(P,0)=1
80 NEXT
90 IF LEN(A$+P$)>255 THEN Q$=P$:P$=""
100 CLS:PRINTA$;:P$=P$+A$+"=>":PRINT:K=LEN(A$)
110 B$="":FORN=1TOK:M$=MID(A$,N,1):IF M$="(" OR M$="[" THEN I=N ELSE IF M$=")" OR M$="]" THEN F=N:B$=MID(A$,I+1,F-I-1):PRINTB$;:IFLEN(B$)=1THENZ$=B$:GOTO 120:ELSE IF LEN(B$)=4 THEN GOSUB 580 ELSE IF LEN(B$)=3 THEN GOSUB 780
120 IFB$<>"" THEN A$=MID$(A$,1,I-1)+Z$+MID$(A$,F+1,LEN(A$)-F):GOTO 90
130 NEXT N
140 IFLEN(A$)=1 AND MAS=1 THEN C=CH:GOSUB480:S$(KA)=C$:GOSUB 1000:IF iguales=1 AND KA<>0 THEN KA=KA-1:GOTO150:ELSE CLS:PRINT"BUSCANDO LA";STR$(KA+2);" SOLUCION";:A$=MAS$:P$="":FORN=1 TO50:IFINKEY$="" THENNEXT:MAS=0:GOTO 90 ELSE A$=" "
150 IFLEN(A$)=1THENCLS
160 C=CH:GOSUB 480:PRINT "=";C$;
170 IFLEN(A$)<>1 THENRETURN:ELSECLS:GOSUB 180:GOTO 10
180 IF KA<1 THEN KA=0:S$(KA)=C$
190  CLS:PRINT KA+1;"SOLUCIONES";:PRINT :FOR N=1 TO 400:NEXT:FOR N=0 TO KA:PRINT S$(N);:PRINT :i=0:x=VALF(S$(N)):i=1:y=VALF(S$(N))-x:GOSUB 660:FI=u:GOSUB 670:RO=u:PRINT "=";RO;"=";STR$(FI/PI);"":NEXT:RETURN
200 FOR CH=1 TO V:IF a(CH,0)=1 THEN NEXT ELSE RETURN
210 C=0:RETURN
220 CLS:PRINT "ERROR DE SOBRECARACTERES":END
230 FORK=LEN(A$)TO 3STEP-1:M$=MID(A$,K,1):IFM$=")" AND MID(A$,K-2,1)="(" THEN A$=LEFT$(A$,K-3)+MID(A$,K-1,1)+RIGHT$(A$,LEN(A$)-K)
240 NEXT:RETURN
250 DIM W$(5):W$(1)="^":W$(2)="*":W$(3)="/":W$(4)="+":W$(5)="-"
260 FOR C=1 TO 5:FOR N=LEN(A$) TO 1 STEP-1:W$=MID$(A$,N,1):IF W$=W$(C)THEN GOSUB 280:CLS:PRINT A$;
270 NEXTN:NEXTC:RETURN
280 IF N=2 THEN A$="("+A$:GOTO 330
290 IFMID$(A$,N-1,1)=")"OR MID$(A$,N-1,1)="]" THEN GOTO 300 ELSEA$=LEFT$(A$,N-2)+"("+RIGHT$(A$,LEN(A$)-N+2):GOTO 330
300 S=0:FOR K=N-1 TO 1 STEP -1:M$=MID(A$,K,1):IF ASC(M$)>64 AND ASC(M$)<91 THEN GOTO 320 ELSE  IFM$="("OR M$="[" THENS=S+1 ELSEIFM$=")" OR M$="]" THENS=S-1
310 IFS=0THENA$=LEFT$(A$,K-1)+"("+RIGHT$(A$,LEN(A$)-K+1):GOTO 330
320 NEXT K:A$="("+A$
330 N=N+1
340 IFN+1=LEN(A$)THENA$=A$+")":RETURN
350 IFMID$(A$,N+1,1)="(" OR MID$(A$,N+1,1)="[" THEN GOTO 360 ELSEA$=LEFT$(A$,N+1)+")"+RIGHT$(A$,LEN(A$)-N-1):RETURN
360 S=0:FOR K=N+1TOLEN(A$):M$=MID(A$,K,1):IF ASC(M$)>64 AND ASC(M$)<90 THEN 380 ELSE IFM$="("OR M$="[" THENS=S+1 ELSEIFM$=")" OR M$="]" THENS=S-1
370 IFS=0THENA$=LEFT$(A$,K)+")"+RIGHT$(A$,LEN(A$)-K):RETURN
380 NEXTK:A$=A$+")":RETURN
390 CLS:IF ERR=1THENPRINT "EDITE LINEA 30 Y HAGA V=";INT((FRE2-400)/71);:PRINT:IFFRE2+FRE1>2000 THEN CLEAR 2000:RESUME 30
400 IF ERR=15THENCLEAR:RESUME 30
410 PRINT"ERROR";ERR;"LINEA";ERL:RESUME 30
420 CLS:FOR N=LEN(A$) TO 1 STEP -1:M=ASC(MID(A$,N,1)):LOCATE 0,0:PRINT A$;:IF M>65 AND M<91 THEN GOSUB 440
430 NEXT:RETURN
440 A$=LEFT$(A$,N-3)+"["+MID(A$,N-2,3)+RIGHT$(A$,LEN(A$)-N):N=N+2:M$=MID(A$,N,1):IF M$="[" OR M$="(" THEN GOSUB 450:RETURN:ELSE A$=LEFT$(A$,N-1)+"("+MID(A$,N,1)+")]"+RIGHT$(A$,LEN(A$)-N):N=N-3:RETURN
450 N=N-3:S=0:FOR K=N+3 TO LEN(A$):M$=MID(A$,K,1):IFM$="("OR M$="[" THENS=S+1 ELSEIFM$=")" OR M$="]" THENS=S-1
460 IFS=0THENA$=LEFT$(A$,K)+"]"+RIGHT$(A$,LEN(A$)-K):RETURN
470 NEXTK:A$=A$+"]":RETURN
480 X=a(C,1):Y=a(C,2)
485 X$=STR$(X):Y$=STR$(Y)
490 IF X=0 AND Y=0 THEN C$="0":RETURN
500 IF LEFT$(X$,1)=" " THEN X$="+"+RIGHT$(X$,LEN(X$)-1)
510 IF LEFT$(Y$,1)=" " THEN Y$="+"+RIGHT$(Y$,LEN(X$)-1)
520 IF Y$="+0" THEN Y$="" ELSE IF Y$="+1" THEN Y$="+i" ELSE IF Y$="-1" THEN Y$="-i" ELSE Y$=Y$+"*i"
530 IF X$="+0" THEN X$=""
540 C$=X$+Y$:IF LEFT$(C$,1)="+" THEN C$=RIGHT$(C$,LEN(C$)-1)
550 RETURN
560 IF C$="" THEN X=0:Y=0:RETURN:ELSE i=0:X=VALF(C$):i=1:Y=VALF(C$)-X :IF ABS(X)<1E10 AND ABS(Y)>.1 THEN X=0 ELSE IF ABS(Y)<1E10 AND ABS(X)>.1 THEN Y=0
570 RETURN
580 F$=LEFT$(B$,3):V$=RIGHT$(B$,1):GOSUB 200:Z$=CHR$(CH+96):PRINT "=";Z$;:E=ASC(V$)-96:x=a(E,1):y=a(E,2)
590 RESTORE 860:FOR N=1 TO 17:READ F1$:IF F$=F1$ THEN ON N GOSUB 610,620,630,630,640,650,670,680,690,700,710,720,730,740,750,760,770:a(CH,1)=u:a(CH,2)=v:a(CH,0)=1:GOSUB 140:RETURN
600 NEXT:PRINT B$;:PRINT "OPERACION INDEFINIDA":GOTO 10
610 GOSUB 680:a=u:b=v:x=-x:y=-y:GOSUB 680:w=u:z=v:x=a:y=b:GOSUB850:u=u/2:v=v/2:RETURN
620 GOSUB 680:a=u:b=v:x=-x:y=-y:GOSUB 680:w=u:z=v:x=a:y=b:GOSUB840:u=u/2:v=v/2:RETURN
630 u=SINx*HYPCOSy:v=COSx*HYPSINy:RETURN
640 u=COSx*HYPCOSy:v=SINx*HYPSINy:RETURN
650 IFx=0 ANDy=0 THEN u=0:v=0:RETURN:ELSE IF MAS=1 THEN GOTO 660:ELSE MAS$=A$:MAS=1:KA=KA+1:IFx=0 ANDy>0 THENu=PI/2+2*KA*PI:v=0:RETURN:ELSE IFx=0 ANDy<0 THEN u=3*PI/2+2*KA*PI:v=0:RETURN:ELSEu=ATN(y/x)+2*PI*KA:v=0:IFx<0 THENu=u+PI:RETURN:ELSE RETURN
660 IF x=0 AND y=0 THEN u=0:v=0:RETURN:ELSE IF x=0 AND y>0 THEN u=PI/2:v=0:RETURN:ELSE IF x=0 AND y<0 THEN u=3*PI/2:v=0:RETURN:ELSE u=ATN(y/x):v=0:IF x<0 THEN u=u+PI:RETURN:ELSE RETURN
670 u=SQR(x^2+y^2):v=0:RETURN
680 u=EXPx*COSy:v=EXPx*SINy:RETURN
690 GOSUB 650:v=u:u=LN(SQR(x^2+y^2)):RETURN
700 u=x:v=-y:RETURN
710 u=x:v=0:RETURN
720 u=y:v=0:RETURN
730 u=-x:v=-y:RETURN
740 w=1/2:z=0:GOSUB 810:RETURN
750 w=1/3:z=0:GOSUB 810:RETURN
760 GOSUB 640:w=u:z=v:GOSUB 630:x=u:y=v:GOSUB 830:RETURN
770 sh1=x:sh2=y:GOSUB 620:sh3=u:sh4=v:x=sh1:y=sh2:GOSUB 610:x=u:y=v:w=sh3:z=sh4:GOSUB 830:RETURN
780 V1$=LEFT$(B$,1):V2$=RIGHT$(B$,1):F$=MID(B$,2,1):GOSUB 200:Z$=CHR$(CH+96):PRINT "=";Z$;:E=ASC(V1$)-96:x=a(E,1):y=a(E,2):E=ASC(V2$)-96:w=a(E,1):z=a(E,2)
790 RESTORE 870:FOR N=1 TO 5:READ F1$:IF F$=F1$ THEN ON N GOSUB 810,820,830,840,850:a(CH,1)=u:a(CH,2)=v:a(CH,0)=1:GOSUB 140:RETURN
800 NEXT:PRINT B$;:PRINT "OPERACION INDEFINIDA":GOTO 10
810 GOSUB 690:x=u:y=v:GOSUB 820:x=u:y=v:GOSUB 680:RETURN
820 u=(x*w-y*z):v=(y*w+x*z):RETURN
830 z=-z:GOSUB 820:u=u/(w^2+z^2):v=v/(w^2+z^2):RETURN
840 u=x+w:v=y+z:RETURN
850 u=x-w:v=y-z:RETURN
860 DATA .SH,.CH,SEN,SIN,COS,ARG,MOD,EXP,.LN,CON,.RE,.IM,NEG,SQR,CUR,TAN,.TH
870 DATA ^,*,/,+,-
880 V$="":FOR N=1 TO V:IF a(N,0)=1 THEN V$=V$+CHR$(N+96)
890 NEXT
900 CLS:PRINT "PRESIONE LA VARIABLE DESEADA                           <EXE>";:LOCATE 0,1:PRINT V$;
910 B$=INPUT$(1):IF B$=CHR$(13) THEN RETURN ELSE C=ASC(B$)-96:IF C<0 OR C>V THEN 900
920 GOSUB 480:CLS:LOCATE 30,0:PRINT B$;:LOCATE 0,0:PRINT C$;:PRINT :x=a(C,1):y=a(C,2):GOSUB 670:PRINT "=";u;:GOSUB 660:PRINT "=";STR$(u/PI);"";:GOTO 910
930 CLS:PRINT "1 VER VARIABLES 2 VER DESARROLO 3 VER SOLUCION  4 MODO DIRECTO";
940 B$=INPUT$(1):IF B$=CHR$(13) THEN GOTO 10 ELSE IF B$="2" THEN 960 ELSE IF B$="1" THEN GOSUB 880:GOTO 930 ELSE IF B$="3" THEN GOSUB 180:GOTO 930:ELSE IF B$=CHR$(13) THEN 10 ELSE IF B$="4" THEN 1020
950 GOTO 940
960 CLS:IF Q$<>"" THEN PRINT Q$,P$:GOTO 930:ELSE PRINT P$:GOTO 930
970 CLS:x=a(P,1):y=a(P,2):a(P,0)=1
980 GOSUB 670:RO=u:GOSUB 660:FI=u:PRINT CHR$(96+P);" =";RO;:LOCATE 0,1:PRINT ;"   =";FI;:LOCATE 5+LEN(STR$(RO)),0:INPUT RO:LOCATE 2,1:PRINT "";:LOCATE 5+LEN(STR$(FI)),1:INPUT FI:a(P,1)=RO*COS(FI):a(P,2)=RO*SIN(FI):GOTO 80
990 IF KA=0 THEN PARAR =0:RETURN:ELSE C$=S$(0):GOSUB 560:X0=X:Y1=Y:C$=S$(KA):GOSUB 560:IF ((X-X0)^2+(Y-Y0)^2)<1E8 THEN PARAR =1:RETURN:ELSE PARAR=0:RETURN
1000 F$=S$(0)+"-"+S$(KA):ER=0:FOR i=1 TO 10:ER=ER+VALF(F$)^2:NEXT:IF ER<1E-12 THEN iguales=1:RETURN
1010 iguales=0:RETURN
1020 CLS
1030 MAS=0:KA=-1:EXE=0:LOCATE 0,0:PRINT CHR$(15);
1040 B$=INPUT$(1):IF B$=CHR$(13) THEN EXE=EXE+1:IF EXE=2 THEN LOCATE 0,2:PRINT CHR$(9);:PRINT "OPERACION?";:B$=INPUT$(1):GOTO  1100
1050 PRINT B$;:GOTO 1040
1100 IFB$=CHR$(13) THEN GOTO 10
1105 IFB$="H" THEN B1$=INPUT$(1)
1110 GOSUB 2000:i=0:x=VALF(V1$):w=VALF(V2$):i=1:y=VALF(V1$)-x:z=VALF(V2$)-w:GOTO 2050
2000 N=-1:V1$=" "
2010 N=N+1:A=PEEKN:IF A<>0 THEN V1$=V1$+CHR$(A):GOTO 2010
2030 N=31:V2$=" "
2040 N=N+1:A=PEEKN:IF A<>0 THEN V2$=V2$+CHR$(A):GOTO 2040
2043 IF V1$=" " THEN V1$="0"
2044 IF V2$=" " THEN V2$="0"
2045 RETURN
2050 IF B$<>"H" THEN 2070 ELSE IF B$1="S" THEN GOSUB 610 ELSE IF B$1="C" THEN GOSUB 620 ELSE IF IF B$1="T" THEN GOSUB  770
2060 GOTO 2500
2070 RESTORE 5000:FOR N=1 TO 15:READ D$:IF D$=B$ THEN 2090 ELSE NEXT
2080 PRINT "OPERACION INDEFINIDA";:EXE=EXE-1:GOTO 1040
2090 ON N GOSUB 630,640,650,670,680,690,710,720,730,760,810,820,830,840,850
2100 LOCATE 0,3:X=u:Y=v:GOSUB 485:IF KA=-1 THEN KA=1:S$(0)=C$:GOTO 2510
2500 S$(KA)=C$:PRINT C$;"                               ";:GOSUB1000:IFiguales=1 ANDKA<>0 THEN2510:ELSELOCATE0,4:IF MAS=1 THEN PRINT"BUSCANDO OTRA SOLUCION";:IF INKEY$<>"" THEN 2510 :ELSE MAS$="":MAS=0:GOTO 1110
2510 KA=KA-1:GOSUB 190:GOTO 1020
5000 DATA  S,C,A,M,E,L,R,I,N,T,^,*,/,+,-
