jueves, 3 de mayo de 2007

Codificacion Parte I

Como para ir tratando algo de este tema acá les paso el código del programa principal que les comente. Cuidado esta realizado en un Basic muy añejo Así que con cuidado no le entren muy fuerte a menos que sean veteranos en el tema.

0010 REM "MATRIX"
0020 REM "ALGEBRA MATRICIAL"
0030 REM "LISTADO DE SUBPROGRAMAS"
0040 REM "MATCHI"
0050 REM "MATPRO"
0060 REM "MATDLU"
0070 BEGIN ; PRINT 'CS'
0080 REM "PRIMERA PANTALLA"
0090 LET CH$="MATRIX"; GOSUB 1960; PRINT @(CH,9),CH$,@(GH,10),GH$,@(GH,8),GH$, @(GH,9),"*",@(GF,9),"*"
0100 LET CH$="PULSE UNA TECLA PARA CONTINUAR"; GOSUB 1960; PRINT @(CH,21),CH$, @(GH,20),GH$,@(GH,22),GH$,@(GH,21),"*",@(GF,21),"*"
0110 INPUT (0,ERR=0110,SIZ=1)@(79,22),CH$
0120 PRINT 'CS'
0130 INPUT (0,ERR=0130)@(10,10),"SU NOMBRE ?",N$; IF N$<>"JAVIER" THEN GOTO 0170
0140 INPUT (0,ERR=0140)@(10,11),"SU APELLIDO ?",A$; IF A$="LEIRO" THEN GOTO 0160
0150 IF A$="SOUTO" THEN LET N$="TIO"; GOTO 0170
0160 LET N$="PAPI"
0170 LET UFA$=STBL("QUIEN",N$); PRINT @(10,13),"HOLA ",STBL("QUIEN"); WAIT 1
0180 REM "MENU UNO"
0190 PRINT 'CS'; PRECISION 14; LET CA=0
0200 LET Z$="***************************"; PRINT @(29,2),Z$,@(29,17),Z$,@(29,19),Z$
0210 FOR I=2 TO 19; PRINT @(28,I),"*",@(56,I),"*"; NEXT I
0220 PRINT @(32,3),'BU',"MENU DE OPERACION",'EU',@(32,7),"1-Determinantes",@(3 2,9),"2-Ecuaciones",@(32,11),"3-Inversion matricial",@(32,13),"4-Producto
0220: matricial",@(32,15),"5-Chau !!!"
0230 INPUT (0,ERR=0230)@(32,18),"OPCION ?",CO:(5); IF CO=0 THEN GOTO 0230
0240 IF CO=5 THEN GOTO 0290
0250 IF CO<>2 AND CO<>3 THEN GOTO 0310
0260 PRINT 'CS',@(32,0),'BU',"AUTOCOMPROBACION",'EU',@(5,5),"1-NO",@(5,7),"2-SI"
0270 INPUT (0,ERR=0270)@(10,10),"OPCION ? ",AU:(2); IF AU=0 THEN GOTO 0270
0280 LET AU=AU-1; GOTO 0310
0290 PRINT 'CS'; END
0300 REM "MENU DOS"
0310 PRINT 'CS','SB',@(31,0),'BR',"QUE HACEMOS ",STBL("QUIEN"),'ER'; LET GK=0
0320 LET Z$="**********************"; PRINT 'SB',@(29,3),Z$,@(29,16),Z$,@(29,18),Z$
0330 FOR I=3 TO 18; PRINT @(28,I),"*",@(51,I),"*",; NEXT I
0340 PRINT @(31,4),'BU',"MENU DE EJECUCION",'EU',@(31,7),"1-INGRESO DATOS",@(31,9),"2-LISTADO PANTALLA",@(31,11),"3-CORRECCION",@(31,13),"4-EJECUTE OPC
0340:ION",@(31,15),"5-MENU OPCIONES"
0350 INPUT (0,ERR=0350)@(32,17),"COMANDO ?",CE:(5); IF CE=0 THEN GOTO 0350
0360 IF GK=1 AND CE=1 THEN GOTO 0770
0370 IF CE=5 THEN BEGIN ; GOTO 0190
0380 IF CO=4 OR GK=1 THEN GOTO 0420
0390 PRINT 'CS',@(26,0),'BU',"ELIJA UN METODO DE CALCULO",'EU'
0400 PRINT @(26,3),"1-METODO DE CHIO (MATCHI)",@(26,5),"2-METODO L/U (MATDLU)"
0410 INPUT (0,ERR=0410)@(26,7),"QUE METODO USA ? ",CM:(2); IF CM=0 THEN GOTO 0410
0420 LET CE=CE-1
0430 ON CE GOTO 0450,0820,0890,1240
0440 REM "CARGA DE DATOS"
0450 LET GK=1
0460 LET I=INT((80-LEN(STBL("QUIEN"))-23)/2+.5)
0470 PRINT 'CS',@(I,0),"ESTAS EN CARGA DATOS ",STBL("QUIEN")
0480 IF CO=4 THEN GOTO 0560
0490 INPUT (0,ERR=0490)@(0,3),"GRADO ? ",X:(99); IF X<2 co="CO-1" n="X-1;" v="N;" m="N;" m="X;" m="2*X-1" co="CO-1" err="0570)@(0,3),'CL'," err="0580)@(0,4),'CL'," err="0590)@(0,5),'CL'," m="M-1;" m1="M1-1;" n1="N1-1" n="M;" v="M1">2 THEN GOTO 0660
0630 FOR I=0 TO N; FOR J=X TO M; IF I+X<>J THEN GOTO 0650
0640 LET RM[I,J]=1
0650 NEXT J; NEXT I
0660 LET A$="A"; FOR I=0 TO N; FOR J=0 TO V; GOSUB 1550
0670 PRINT 'CS','CH'
0680 PRINT B$; INPUT (0,ERR=0680)@(10),R[I,J]; IF CO=3 THEN GOTO 0700
0690 LET RM[I,J]=R[I,J]
0700 NEXT J; NEXT I
0710 IF CO<>1 AND CO<>3 THEN PRINT 'CS'; GOTO 0320
0720 IF CO=3 THEN GOTO 0730 ELSE GOTO 0750
0730 LET A$="B"; FOR I=0 TO M1; FOR J=0 TO N1; GOSUB 1550; PRINT 'CS','CH'
0740 PRINT B$; INPUT (0,ERR=0740)@(10),S[I,J]; NEXT J; NEXT I; PRINT 'CS'; GOTO 0320
0750 LET A$="C"; FOR I=0 TO N; GOSUB 1560; PRINT 'CS','CH'
0760 PRINT B$; INPUT (0,ERR=0760)@(10),R[I,X]; LET RM[I,X]=R[I,X]; NEXT I; PRI
0760:NT 'CS'; GOTO 0320
0770 PRINT @(0,21),'SF','BR',"NO TE PASES DE LISTO ",STBL("QUIEN"),@(0,22),"YA CARGASTE LOS DATOS ELEGI OTRA OPCION",'SB','ER'
0780 WAIT 2; GOTO 0350
0790 PRINT @(0,21),'SF','BR',"A OTRO PERRO CON ESE HUESO ",STBL("QUIEN"),@(0,22),"PRIMERO VAS A TENER QUE CARGAR LOS DATOS",'SB','ER'
0800 WAIT 2; GOTO 0450
0810 REM "LISTADO DE DATOS CARGADOS POR PANTALLA"
0820 IF GK=0 THEN GOTO 0790
0830 PRINT 'CS',"LISTADO"
0840 LET A$="A"; FOR I=0 TO N; FOR J=0 TO V; GOSUB 1550; PRINT @(0),B$,R[I,J]; NEXT J; GOSUB 1640; NEXT I; IF CO=3 THEN GOTO 0870
0850 IF CO<>1 THEN PRINT 'CS'; GOTO 0320
0860 LET A$="C"; FOR I=0 TO N; GOSUB 1560; PRINT @(0),B$,R[I,X]; NEXT I; GOSUB 1640; PRINT 'CS'; GOTO 0320
0870 LET A$="B"; FOR I=0 TO M1; FOR J=0 TO N1; GOSUB 1550; PRINT @(0),B$,S[I,J]; NEXT J; GOSUB 1640; NEXT I; PRINT 'CS'; GOTO 0320
0880 REM "CORRECCION DE ERRORES"
0890 IF GK=0 THEN GOTO 0790
0900 LET I=INT((57-LEN(STBL("QUIEN")))/2+.5)
0910 PRINT 'CS',@(I,0),"EN QUE TE EQUIVOCASTE ",STBL("QUIEN"); LET OF=0
0920 IF CO<>1 THEN GOTO 0960
0930 PRINT @(34,2),"QUE CAMBIAS",@(0,4),"1-COEFICIENTES MATRICIALES",@(0,5),"2 -TERMINOS INDEPENDIENTES"
0940 INPUT (0,ERR=0940)@(0,7),"?",OF:(2); IF OF=0 THEN GOTO 0940
0950 FOR I=2 TO 7; PRINT @(0,I),'CL'; NEXT I
0960 INPUT (0,ERR=0960)@(0,2),"INGRESE FILA ",I:(99); IF I<1 of="2" err="0980)@(0,3),">3 THEN LET A=1; GOTO 1030
1000 PRINT @(0,5),"1-MATRIZ A",@(0,6),"2-MATRIZ B"
1010 INPUT (0,ERR=1010,SIZ=1)@(0,7),"?",A:(2)
1020 FOR F=5 TO 7; PRINT @(0,F),'CL'; NEXT F
1030 LET I=I-1; LET J=J-1; IF OF=2 THEN GOTO 1090
1040 ON A GOTO 1010,1080,1050
1050 IF J>N1 THEN GOTO 0960
1060 IF I>M1 THEN GOTO 0960
1070 GOTO 1200
1080 IF J>V THEN GOTO 0960
1090 IF I>N THEN GOTO 0960
1100 LET A$="A"; IF OF=2 THEN LET A$="C"
1110 GOSUB 1700
1120 IF OF=2 THEN GOSUB 1560; LET J=X; GOTO 1140
1130 GOSUB 1550
1140 PRINT @(0,2),B$,R[I,J]," ERROR"
1150 INPUT (0,ERR=1150)@(0,3),"CORRECION =? ",R[I,J]
1160 IF CO=3 THEN GOTO 1180
1170 LET RM[I,J]=R[I,J]
1180 INPUT (0,ERR=1180)@(0,4),"Otro error (S/N)? ",A$:("S"=0910,"N"=1190)
1190 PRINT 'CS'; GOTO 0320
1200 LET A$="B$"; GOSUB 1700; PRINT @(0,2),B$,S[I,J]," ERROR"
1210 INPUT (0,ERR=1150)@(0,3),"CORRECION =? ",S[I,J]
1220 GOTO 1180
1230 REM "CALCULO MATRICIAL"
1240 IF GK=0 THEN GOTO 0790
1250 LET Z$="************************"; PRINT 'CS',@(28,13),Z$,@(28,11),Z$; FOR U=11 TO 13; PRINT @(27,U),"*",@(52,U),"*"; NEXT U
1260 PRINT @(29,12),"ESPERE UN MOMENTO ...."
1270 IF CO=3 THEN GOTO 1420
1280 SETERR 1850
1290 ON CM GOTO 1300,1300,1310
1300 LET SP=1; CALL "MATCHI",CO,N,M,X,R[ALL],E,CH; GOTO 1320
1310 LET SP=2; CALL "MATDLU",CO,N,M,X,R[ALL],E,CH
1320 IF CO>0 AND CH=1 THEN GOTO 1400
1330 IF CO>0 THEN GOTO 1350
1340 LET RN=E; GOSUB 1580; GOSUB 1600; PRINT 'CS',@(0,12),'RB','BU',"Determinante =",'BR',RN,'ER','EU'; GOSUB 1570; GOSUB 1610; IF E$="S" THEN GOTO 1340 ELSE GOTO 1660
1350 GOSUB 1490; GOSUB 1580; PRINT 'CS',"LISTADO DE RESULTADOS"; FOR I=0 TO N; FOR K=X TO M; LET J=K-X
1360 IF CO=1 THEN LET A$="X"; GOSUB 1560; GOTO 1380
1370 LET A$="R"; GOSUB 1550
1380 LET RN=R[I,K]; GOSUB 1600; PRINT @(0),B$,RN; NEXT K; GOSUB 1640; NEXT I;
1380:IF AU=1 THEN GOTO 1720
1390 GOSUB 1610; IF E$="S" THEN GOTO 1350 ELSE GOTO 1670
1400 LET B$=""; LET B$="* No puedo hacerlo "+STBL("QUIEN")+" *"; LET AU=LEN(B$); DIM Z1$(AU,"*"); LET AU=INT((79-AU)/2); PRINT @(AU,11),Z1$,@(AU,12),B$,@(AU,13),Z1$; GOSUB 1570; GOTO 1660
1410 REM "CALCULO DEL PRODUCTO MATRICIAL"
1420 LET A$="S"
1430 SETERR 1850
1440 LET SP=0; CALL "MATPRO",M,M1,N1,R[ALL],S[ALL],P[ALL]
1450 PRINT 'CS'; GOSUB 1590; PRINT 'CS','BR',"RESULTADO DEL PRODUCTO",'ER'
1460 FOR I=0 TO M; FOR J=0 TO N1; LET RN=P[I,J]; GOSUB 1600; GOSUB 1550; PRINT @(0),B$,RN; NEXT J; GOSUB 1640; NEXT I
1470 GOSUB 1610; IF E$="N" THEN GOTO 1660 ELSE GOTO 1450
1480 REM "SUBRUTINAS Y PORQUERIAS VARIAS"
1490 PRINT 'CS'; LET RE=9; LET RN=E; GOSUB 1600; IF RN<>0 OR CA=1 THEN GOTO 1540
1500 PRINT @(36,3),'BU','BB',"CUIDADO",'EU','EB'
1510 PRINT @(12,7),"El progama MATRIX opera con metodos algebraicos",@(12,9),'
1510:BU','SF',"Siempre se debe tener en cuenta el error de truncamiento",'EU'
1520 PRINT @(12,13),'BR',"El presente calculo puede dar errores inaceptables",'ER',@(12,15),"El valor real del determinante es : ",E,@(12,17),'BU',"Tengalo presente al considerar los resultados obtenidos ",'EU'
1530 LET CA=1; GOSUB 1570
1540 RETURN
1550 LET B$=A$+"("+STR(I+1)+","+STR(J+1)+")="; RETURN
1560 LET B$=A$+"("+STR(I+1)+")="; RETURN
1570 INPUT (0,ERR=1570,SIZ=1)@(70,0),G$; IF G$<>" " THEN GOTO 1570 ELSE RETURN
1580 PRINT 'CS'
1590 INPUT (0,ERR=1590,SIZ=1)@(0,5),"CON CUANTOS DECIMALES=? ",RE:(9); RETURN
1600 LET R1=SGN(RN); LET RN=ABS(RN); LET RT=10^RE; LET RN=RN*RT+.5; LET RN=INT (RN)/RT*R1; RETURN
1610 PRINT @(35,12),"RESULTADO CON OTROS DECIMALES (S/N)"
1620 INPUT (0,ERR=1620,SIZ=1)@(35,13),"?",E$; IF E$<>"S" AND E$<>"N" THEN GOTO 1620
1630 RETURN
1640 INPUT (0,ERR=1640,SIZ=1)@(0),G$; IF G$<>" " THEN GOTO 1640
1650 RETURN
1660 BEGIN ; GOTO 0190
1670 PRINT @(35,12),"DESEA EL VALOR DEL DETERMINANTE (S/N)"
1680 INPUT (0,ERR=1680,SIZ=1)@(35,13),"?",E$; IF E$<>"S" AND E$<>"N" THEN GOTO 1680
1690 IF E$="S" THEN GOTO 1340 ELSE GOTO 1660
1700 FOR F=2 TO 4; PRINT @(0,F),'CL'; NEXT F; RETURN
1710 REM "RUTINA DE AUTOCOMPROBACION"
1720 DIM Z1$(19,"*"); PRINT 'CS',@(30,11),Z1$,@(30,12),"* AUTOCOMPROBANDO *",@(30,13),Z1$
1730 IF CO=2 THEN GOTO 1750
1740 DIM S[N,0],P[N,0]; FOR K=0 TO N; LET S[K,0]=R[K,M]; NEXT K; LET F=0; GOTO 1760
1750 DIM S[N,N],P[N,N]; FOR K=0 TO N; FOR L=X TO M; LET J=L-X; LET S[K,J]=R[K,L]; NEXT L; NEXT K; LET F=N
1760 LET G=N
1770 SETERR 1850
1780 LET SP=0; CALL "MATPRO",N,G,F,RM[ALL],S[ALL],P[ALL]
1790 PRINT 'CS',@(26),'BU',"LISTADO DE AUTOCOMPROBACION",'EU'; PRINT 'CL'
1800 IF CO=2 THEN GOTO 1820
1810 FOR K=0 TO N; LET A$="X"; LET I=K; GOSUB 1560; LET C$=B$; LET A$="V"; GOSUB 1560; PRINT @(0),C$,P[K,0],@(40),B$,RM[K,M]; GOSUB 1640; NEXT K; GOTO 1830
1820 FOR K=0 TO N; FOR L=X TO M; LET I=K,J=L-X,A$="R"; GOSUB 1550; LET C$=B$;LET A$="V"; GOSUB 1550; PRINT @(0),C$,P[K,J],@(40),B$,RM[K,L]; NEXT L; GOSUB 1640; NEXT K
1830 PRINT 'CS'; GOTO 1670
1840 REM "ERROR FALTA O DEFECTO EN SUB-PROGRAMAS"
1850 PRINT 'CS'
1860 PRINT @(36,1),'BB','BR',"*CUIDADO*",'EB','ER'
1870 IF ERR=12 THEN GOTO 1880 ELSE GOTO 1940
1880 PRINT @(5,6),"No encuentro en la memoria al Sub-Programa : "
1890 ON SP GOTO 1900,1910,1920
1900 LET A$="MATPRO"; GOTO 1930
1910 LET A$="MATCHI"; GOTO 1930
1920 LET A$="MATDLU"
1930 PRINT @(10,8),'BU',A$,'EU',@(5,10),"Por favor ",STBL("QUIEN")," damelo",@(5,11),"si no lo tengo no puedo hacer lo que me pediste"; GOSUB 1570; GOTO 1950
1940 PRINT @(5,6),"Ha ocurrido un error =",ERR,@(5,8),"durante la ejecucion del calculo",@(5,10),"Por favor ",STBL("QUIEN")," verificalo"; GOSUB 1570
1950 GOTO 0290
1960 LET GH$=""; LET CH=LEN(CH$); FOR V=0 TO CH+3; LET GH$=GH$+"*"; NEXT V; LET GF=CH
1970 LET CH=INT((79-CH)/2); LET GH=CH-2; LET GF=GF+CH+1
1980 RETURN

No hay comentarios.: