Está en la página 1de 69

MANUAL DE PROGRAMACION USER RPL PARA LA CALCULADORA HP-48G POR SEBASTIAN RIVAS milun@sta m!

"ia#$%m

CONTENIDO

&#

aprender el )!$', ya que el )!$' es un subconjunto del !"!#$%* +dems, para programar en system&rpl, se necesitan ms herramientas, y si se quisiera hacer en la misma hp48, se necesitara una ampliada, con ,-./b de memoria, en cambio, para u&rpl solo se necesita cualquier calculadora hp y tu imaginacin*

I PARTE
CAPITULO ' - (INTRODUCCION NECESARIA( CAPITULO ) - (HOLA MUNDO( CAPITULO * - (TRABA+ANDO CON TE,TOS( CAPITULO 4 - (ALGUNOS COMANDOS SUELTOS - ACLARACIONES( CAPITULO . - (COMIEN/A LO BUENO( CAPITULO 0 1 ALGUNAS COSAS SUELTAS SOBRE COMANDOS MATEMATICOS OTROS CAPITULO 2 1 PIDIENDO DATOS AL USUARIO DE TU PROGRAMA CAPITULO 8 1 (LISTAS( CAPITULO ' NECESARIA( (INTRODUCCION

CAPITULO ) - (HOLA MUNDO(


+ntes de empe0ar con un programa bsico 1$ #2(3 453L+ %)6137, se debe saber que el formato de un programa tpico en user&rpl est encerrado entre los signos 8998 y 8::8* $l primer comando que veremos ser 8% !;3<8, el cual imprime un te=to que se le entregue en un cuadro en la pantalla* $l te=to, por supuesto, debe ir encerrado entre comillas dobles >8te=to8? entonces, el cdigo del programa hola mundo sera@ 99 853L+ %)6138 % !;3< :: Aemos, que el programa se inicia con el signo 8998, luego, pone en la pila el te=to 853L+ %)6138, " despus, el comando 8%! ;3<8 toma ese te=to y lo imprime en pantalla y finalmente el programa termina con el signo 8::8* ;ueno, ese sera el primer programa, aunque humilde, esta muy bien para empe0ar* +hora, para ejecutar este programa o cualquier otro en la hp48 se debe guardar como variable >ver el comando !#3?* B? $L comando 8%! ;3<8 actCa sobre un te=to que se encuentre en el primer nivel de la pila cuando este se ejecuta* Donsideremos el programa @

La calculadora cientfica hp48 se diferencia mucho de los otros modelos y marcas ms que nada por su poder de programacin, ya que sta se puede programar en varios lenguajes, como son el ensamblador, el L, el !"!#$%&'(L, " nuestro )!$'&'(L* $l lenguaje principal de la hp48 es el !"!#$%&'(L, es en ese lenguaje en el que se hacen los ms poderosos programas, pero para llegar a aprender !"!#$%, primero hay que

99 %! ;3< :: $ste programa debe generar un error si lo ejecutamos cuando en el primer nivel de la pila de la calculadora no hay un te=to, pero Equ ocurrira si en el primer nivel de la calculadora se encuentra el te=to 853L+ %)6138F pues, el resultado es el mismo que en el primer ejemplo**** o sea que@ 99 853L+ %)6138 %! ;3< :: dara el mismo resultado que 99 %! ;3< :: siempre que cuando se evaluara este Cltimo, en la pila estuviera el te=to 853L+ %)6138* $l comando %! ;3< tiene un lmite m=imo de caracteres a imprimir en pantallas, en caso de querer escribir ms de una lnea se debe dividir el te=to en dos, y aplicar dos veces el comando, o sea, el programa quedara@ 99 853L+ %)613, D3%3 $!#+!, $!($'3 G)$ ;2$6 " G)$ D+''$#$+6138 %! ;3< 85+'#3 H)6#3 + L+! $!#'$LL+! 1$L '+6 $!(+D238 %! ;3< :: $sto es muy simple, pero es para ilustrar el uso del comando, note que el programa@ 99 8(26I" " D$'$;'38 %! ;3< 8!36 $62+L$!8 %! ;3< :: 1ara e=actamente el mismo resultado que@ 99 8(26I" " D$'$;'38 8!36 $62+L$!8 %! ;3< %! ;3< :: ,? $l comando 83JJ8 lo Cnico que hace es apagar la calculadora, y por eso no lo veremos en profundidad, ya que no tiene aplicacin sin otros cdigos que lo acompaKen* Aeamos el siguiente cdigo@ 99 8$!#3" +('$612$613 )!$'8 %! ;3< 3JJ 853L+8 % !;3< :: $stas lneas de cdigo, deben mostrar en pantalla el primer mensaje, luego se apaga la calculadora automticamente y al encenderla aparece el segundo mensaje*

+partando un poco los comandos se puede decir que en la calculadora, al igual que se puede sumar, restar, sacar logaritmos, o funciones trigonomtricas, en los programas se puede hacer todo eso igualmente, y de eso se trata la programacin, por ejemplo, un programa que saque el promedio de , nCmeros que uno ponga en la calculadora>en la pila? sera as@ 99 L , M :: +hora analicemos el cdigo del programa, lo primero que hace es sumar los dos nCmeros con el comando 8L8 luego, pone un 8,8 en la pila y divide el resultado anterior entre ese ,, con lo que en la pila queda el promedio de los , nCmeros* +hora, un programa que sacara el promedio entre N nCmeros como sera@ 99 L L N M :: (rimero, el programa suma dos de los tres nCmeros que estn en la pila, luego este resultado lo suma con el otro nCmero, despus pone un 8N8 en la pila, y divide, obteniendo as el promedio* $l objetivo de esto es que usted siga variando su programa, y aKadindole ms cosas o combinando lo que va aprendiendo, entendido esto seguimos con los comando* N? $l comando 8DL$+'8 borra todo lo que se encuentra en la pila, considere el ejemplo@ 99 8('3 '+%+ (+'+ L2%(2+' L+ (2L+8 %! ;3< DL$+' :: 4? $l comando 8!#38 guarda un objeto como variable, por ejemplo, si se quiere guardar el numero - con el nombre 8D26D37 sera@ - D26D3 !#3 6tese que el nombre de la variable, en este caso D26D3, 63 debe ir con comillas dobles, solo se debe escribir el nombre* $n las variables se puede guardar informacin programas, etc* 1espus de que una variable es almacenada con el comando !#3, sta se puede llamar por su nombre a la pila cuando se quiera* $l comando 8()' $8 ;orra una variable, y su uso es de la manera, O A+'2+;L$P+P;3''+' Q

()' $ , donde A+'2+;L$P+P;3''+' es el nombre de la variable a borrar, !26 comillas dobles por supuesto* 1espus de ver estos dos potentes comandos, Equ podemos hacer de interesante con ellosF , pues eso solo depende de la creatividad de cada uno* Aeamos el siguiente ejemplo@ 99 + !#3 ; !#3 + ; L + ; & + ; R O + ; Q ()' $ :: $ste programa toma dos nCmeros de la pila, y devuelve su suma, su resta, y su multiplicacin* Lo primero que hace el programa es guardar el primer nCmero de la pila con el nombre 8+8, luego, guarda el segundo nCmero de la pila con el nombre 8;8, luego llama los dos nCmeros, y los suma, luego los llama y los resta, y luego los llama nuevamente y los multiplica, al final del programa, borra los dos nCmeros de las variables* )na variante del programa sera@ 99 ; !#3 + !#3 + ; L + ; & + ; R O + ; Q ()' $ :: +qu hay que resaltar que el orden en que guardan los nCmeros en las variables, es dedcir, primero se guarda el Cltimo nCmero de la pila y luego el segundo de manera que +&; no es igual a ;&+* 3tro ejemplo@ 99 D !#3 ; !#3 + !#3 ; SLM&T ; S=U,T 4 + D R R & Srai0 cuadradaT L , + R M ; SLM&T ; S=U,T 4 + D R R & Srai0 cuadradaT & , + R M O + ; D Q ()' $ :: $ste programa nos da las races de una ecuacin cuadrtica, al cual se le pasen los coeficientes + ; y D segCn la ecuacin general@

(ero sera muy engorroso estar guardando variables cada ve0 que se necesiten ocupar varias veces los elementos que se le pasan a los programas, para esto se crearon las 8A+'2+;L$! L3D+L$!8 las cuales funcionan igual que las globales >que se guardan con !#3?, solo que e=isten UNICAMENTE DENTRO DEL PROGRAMA, dicho de otra forma stas variables son temporales, es decir, cuando el programa termina, desaparecen* Aeamos el siguiente ejemplo@ 99 &: + ; D 99 + ; D L L N M :: :: $ste programa toma N nCmeros de la pila, y da su promedio* !e debe hacer notar, que en esta forma de programar el orden de los nCmeros ingresados no vara, es decir, para sacar el promedio de los valores B , N el programa anterior tomar +VB ;V, DVN +dems, no se necesita el cdigo 99 O + ; D Q ()' $ ::, ya que las variables en la realidad no e=isten, sino solo dentro del programa* 3tra forma de usar las variables locales para tareas sencillas es mediante el uso de un par de comillas simples >W W? para encerrar lo que se quiere hacer con las variables, es decir para el ejemplo anterior seria@ 99 &: + ; D W>+L;LD?MNW :: 6tese que aqu, W>+L;LD?MNW es lo mismo que 99 + ; D L L N M :: La forma con las comillas simples parece ser ms corta y fcil y en realidad es as, pero con el tiempo se ver que para tareas mas complejas, se usa los signos 99 y ::* (ara el clculo de las races de una ecuacin cuadrtica el cdigo queda de la siguiente manera@ 99 &: + ; D 99 ; S=U,T 4 + D R R & Srai0 cuadradaT L , + R M ; SLM&T ;

AX 2 + BX + C = 0
6uevamente que tener en cuenta que los tres coeficientes se dan en el orden + & ; & D o sea que en la pila quedarn en el orden inverso*

S=U,T 4 + D R R & Srai0 cuadradaT & , + R M :: :: " lo Cltimo es que las variables locales se pueden anidar, es decir, que por ejemplo, el cdigo@ 99 &: + ; +)#3 99 + +)#3 L ; M L6 &: D 99 D BXXX L + M :: :: :: L+! A+'2+;L$! L3D+L$!, 2 )+L G)$ L+! L3;+L$! >!#3?, ()$1$6 #$6$' 63%;'$! 1$ A+'2+! L$#'+!*

pila tenemos la cadena 81'+ 36 ;+LL Y8 , y aplicamos el comando !2Y$, lo que obtenemos es el nCmero BN, y la cadena desaparece* Domando @ L !eguramente ms de alguien se sorprendi con este signo de la suma, y es que las cadenas tambin se pueden 8sumar8, lo digo entre comillas por que lo que hace el comando L con dos cadenas es 8concatenarlas8, si el termino no se entiende bien, me e=plico, supongamonos que tenemos en la pila los te=tos N@ ,@ 8%336!($LL $! )6 ')(38 B@ 81$ ;L+DI %$#+L $ntonces si aplicamos el comando L , el resultado sera @ ,@ B@ 8%36!($LL $! )6 ')(31$ ;L+DI

CAPITULO * - (TRABA+ANDO CON TE,TOS(


;ueno, ahora veremos las herramientas de programacion que nos proporciona la hp48 para manipular cadenas de caracteres>te=tos?* Las cadenas se reconocen por que siempre estan entre comillas dobles $jemplo @ 8#odo esto es una D+1$6+8

%$#+L8

"a vimos en el segundo capitulo la instruccion %! ;3<, la cual tomaba un te=to y lo imprima en pantalla dentro de un recuadro* $ste metodo tena un lmite de caracteres* +hora comen0aremos a ver otras instrucciones o comandos que nos permitiran manipular te=tos poderosamente, sobre todo en el futuro cuando se cono0can las tecnicas de estructuras condicionales, de bucle y de deteccion de errores, lo cual se ver en capitulos posteriores* Domando @ !2Y$ $ste comando lo que hace es tomar una cadena del nivel B de la pila y devolver el nCmero de letras que la forman, incluyendo los espacios, y aunque no se vea claramente su utilidad, en el futuro se pueden hacer programas ampliamente poderosos para manejar te=to**** (or ejemplo, si en el primer nivel de la

E!e entendi, espero que si* Lo que hace este comando con dos cadenas es 8juntarlas8, esa es la palabra precisa* 6otese que en el resultado, las palabras ')(3 y 1$ quedaron sin espacio, esto es por que el comando solo junta las cadenas, nada mas, no agrega espacio, entonces para que el resultado hubiera sido el esperado, se habra necesitado un espacio al final de la primera cadena, o al principio de la segunda cadena* #ambien, si en los dos primeros niveles de la pila de la hp48 tenemos una cadena y otro objeto y aplicamos el comando L , este casi en todos los casos los juntara igual* $jemplo@ ,@ 4-XX B@ 8 autos corrieron la carrera 6otese que en el segundo nivel se tiene

un simple nCmero, el resultado al aplicar al comando L sera @ ,@ B@ 84-XX autos corrieron la carrera8 ;ueno, eso sera con el comando L para las cadenas y quisiera decir que este comando es para mi uno de los que le da mas poder al lenguaje u&rpl* Domando @ 3;H&: Lo que hace es desarmar una cadena, es decir, sacarle las comillas, pero todo quedar mas claro con un ejemplo @ !i tenemos en la pila lo siguiente @ N@ ,@ B@ 8$stoy escuchando a LacunaDoil8 y aplicamos el comando 3;H&: el resultado ser @ 4@ N@ ,@ B@ W$stoyW WescuchandoW WaW WLacunaDoilW

N@ WL+W ,@ -4Z-XB B@ W%+L12#+W $spero que haya quedado claro, sino ya sabes, solo escrbeme a milun[starmedia*com*** +ntes de seguir con las cadenas, quisiera ver rapidamente un comando muy simple, pero de mucha ayuda, es el comando 1)(, lo que hace el 1)( es simplemente duplicar lo que se encuentra en el nivel B@ de la pila, ejemplo@ N@ 8hola chile8 ,@ -4X.*N4 B@ 8!+%+$L8 +l aplicar el 1)( quedara @ 4@ 8hola chile8 N@ -4X.*N4 ,@ 8!+%+$L8 B@ 8!+%+$L8 EJacil de entender, verdadF, bueno, como hemos estado un poco flojos para programas, os doy el siguiente desafo, crear un programa que tome un te=to de la pila y nos diga como resultado suponiendo que el te=to fuera 8blac/ metal8 , el resultado que se requiere es que en un recuadro nos apare0ca 8$L #$<#3 &blac/ metal& contiene BB caracteres8 ****** a ver quien lo hace sin ayuda****** '$!()$!#+ @ $l codigo sera **** 99 &: (+L+;'+ 99 8$L #$<#3 &8 (+L+;'+ L 8& contiene 8 L (+L+;'+ !2Y$ L %! ;3< :: :: ;ien, analicemos el cdigo este, primero, se toma la cadena como variable local con el nombre (+L+;'+* Luego se pone en la pila el te=to 8$L #$<#3 &8 , despues se llama a (+L+;'+, y se concatena o 8suma8 con 8$L #$<#3 &8* Luego de eso, se pone en la pila el te=to

3 sea que lo que hace el 3;H&: es separar una cadena en todas las palabras que la componen* Eque pasara si en memora tenemos una variable llamada '+#+ que guarda un nCmero por ejemplo el nCmero -4Z-XB y en la pila tenemos el te=to 8L+ '+#+ %+L12#+8 y aplicamos el comando 3;H&: F ser8 @ ;ueno, entonces, el resultado 8deviera N@ WL+W ,@ W'+#+W B@ W%+L12#+W (ero como e=iste una variable llamada '+#+, entonces lo que en verdad se obtendra sera @

8& contiene 8 , el cual a su ve0 se concatena con la cadena anterior* 1espues se llama a la cadena (+L+;'+ y se obtiene su longitud mediante el comando !2Y$, y este nos devuelve un nCmero con la longitus de la cadena, el cual se concatena con la cadena* +h tenemos armado ya el te=to completo, solo falta imprimirlo en pantalla, con el tpico comando %! ;3< * 63#+ @ >8#engase muy en cuenta que para la hp48, WholaW 63 es lo mismo que W53L+W , y tampoco es lo mismo que W53laW, o sea que el )!$'&'(L $! 8case sensitive8, es decir, las mayusculas y minusculas son diferentes para l8? ;ueno, ahora veremos el comando inverso a 3;H&:, su nombre es &:!#' y lo que hace es transformar cualquier cosa que est en la pila en una cadena, o sea, encerrarlo entre comillas dobles* $jemplo, tenemos en la pila lo siguiente @ ,@ B@ 4-,4*,N4 +l aplicar el comando &:!#', el resultado obtenido es @ ,@ B@ 84-,4*,N48 %uy facil de entender, claro, pero pon mucha atencion a todo esto, por que la gracia de la programacion 63 es saberse todos los comandos de memoria, sino D3%;26+'L3! 1$ %+6$'+ $J2D2$6#$ (+'+ '$+L2Y+' A)$!#'3! ('3 '+%+!, incluso a mi a veces algunos comandos se me olvidan sus nombres, o lo que hacen, y voy a mi manual y los reviso* Domando @ (3! Lo que hace este comando es indicarnos cual es el primer lugar de un te=to en donde se encuentra un

determinado caracter, para eso se debe poner en el nivel ,@ la cadena que se quiere revisar, y en el nivel B@ el caracter que se busca, por supuesto que entre comillas dobles**** ejemplo @ tenemos en la pila lo siguiente @ ,@ 8educacion de mierda8 B@ 8a8 entonce si aplicamos ah el comando (3!, el resultado sera @ ,@ B@ -

ya que la letra se encuentra por primera ve0 en la posicion cinco de la cadena anali0ada* ;ueno, todos los caracteres de la calculadora hp48 tienen asignado un nCmero, por ejemplo el nCmero del caracter 8+8 es el .-* >>>Ecual es el nCmero del caracter 8;8F , el .., claro??? $ntonces hay dos instrucciones que nos permiten jugar con esta propiedad de los caracteres, estas son 6)% y D5' , lo que hace 6)% es devolvernos el nCmero del caracter que esta en el nivel B@ de la pila , y el comando D5' hace lo contrario, o sea, dado un nCmero entero en la pila, este lo reempla0a por su correspondiente caracter**** $stos comandos encriptar te=tos* son usados para

Domo nota digamos que si en el primer nivel de la pila tenemos una cadena de varios caracteres, y aplicamos el comando 6)%, este nos devolvera solo el codigo del primer caracter* 63#+ @ 3"$, #$ 12 3 G)$ !2 G)2$'$! 1$ A$'1+1 +('$61$' + ('3 '+%+', 1$;$! ('3 '+%+', %$ $6#2$61$!, 3 !$+, 63 #$ L$+! #313 $L %+6)+L " L)$ 3

D3%2$6D$!, !263 G)$ +61+ D'$+613 21$+! + %$121+ G)$ A+ +A+6Y+613 $L D)'!3, +!\ #$ 2'+! 5+D2$613 $L 5+;2#3 %$6#+L 1$ L+ ('3 '+%+D236* ;ueno, sigamos por un rato con los comandos para manipular cadenas de te=to***** Domando @ 5$+1 Lo que hace este comando es muy simple, es e=traer el primer caracter de cualquier cadena*** ejemplo * ,@ B@ 8'+123 +'($ 238 +l aplicar el comando 5$+1 se obtiene @ ,@ B@ 8'8 eso es todo* Domando @ #+2L Lo que hace este comando es borrar el primer caracter de una cadena**** ejemplo @ ,@ B@ 8sha/ira est rica8 despues de aplicar #+2L lo que se obtiene es @ ,@ B@ 8ha/ira est rica8 muy simple, no F, pero importante* Domando @ '$(L 9,,,,,este es un poco mas avan0ado,,,,,: Lo que hace el comando '$(L es reempla0ar en una cadena un caracter por otro que nosotros le damos* $n el tercer nivel de la pila va la cadena a manipular, en el segundo nivel va el numero del caracter que queremos reempla0ar, y en el nivel uno por supuesto que va el caracter que queremos poner en la cadena,

ejemplo @ 4@ N@ 8ejemplo del comando '$(L8 ,@ BX B@ 8+8 +l aplicar el comando '$(L el resultado obtenido es @ ,@ B@ 8ejemplo d+l comando '$(L8 y ha quedado claro que se reempla0 el caracter que estaba en el lugar numero BX de la cadena del nivel N@ , o sea, reempla0 la 8e8 por una 8+8* ;ueno, eso ser todo por ahora en cuando a cadenas, tampoco quiero aburrirlos con eso

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& milun[starmedia*com ]]]*geocities*comM=jN-u-=

fin del capitulo N

CAPITULO 4 - (ALGUNOS COMANDOS SUELTOS - ACLARACIONES(

;ueno, este capitulo lo aprovechar para mostrar algunos comandos un poco aislados de la hp48, as como para intentar introducir temas como lo son la recursividad en user&rpl y otras cosillas**** ;ien, primero les mostrar el funcionamiento de un comando sencillo pero muy divertido, el cual combinado con recursividad puede hacer cosas interesantes ^&: Domando @ ;$$( Lo que hace es tocar un pitido dada una

frecuencia en el nivel ,@ y un tiempo de duracion en el nivel B@ , o sea que la 8nota8 se pone en el nivel ,@ y el tiempo que quieres que dure ese pitido se pone en el nivel B@ Domo dato tecnico devo decir que la frecuencia se mide en hert0ios y el tiempo en segundos de reloj* ejemplo @ ;$$( :: 99 BXXX N ;$$( -XXX , ;$$( NXXX B

1ado el nombre de un subdirectorio, encerrado entre los signos O Q borra el directorio sin preguntar nada, junto con todo lo que este contiene* 8^&: a ver si se imaginan que su podra hacer con el ****jaja Domando @ 1'3( ;orra lo que se encuentra en el nivel B@ de la pila Domando @ !_+( $ste es importante, lo que hace es rotar el contenido del nivel B@ de la pila con el del nivel ,@ , me e=plico, ejemplo @ N@ 8basura maldita8 ,@ 8A2A+ D52L$8 B@ B8X-*ZZ +l aplicar el comando !_+( es obvio que se obtiene @ N@ 8basura maldita8 ,@ B8X-*ZZ B@ 8A2A+ D52L$8 L $spero que haya quedado claro****9@o?&&&

;ueno, no hay mucho que e=plicar aqu, solo son tres pitidos, el primero de frecuencia BXXX y duracion N segundos y los demas idem*** ;ueno, si usted toca algCn instrumente, puede visitar alguna pgina en donde se muestre la equivalencia entre las notas musicales y las frecuencias, y as poder escribir canciones****** $l uso de este comando se puede combinar con otros ya vistos para crear programas mas buenos* " lo Cltimo, se supone que para que suenen los pitidos, tiene que estar habilitado el sonido en la hp48, Ecomo se habilitaF ndate a la cresta* Domando @ A+'! Lo que hace es mostrarnos una lista con todas las variables, pero por ahora no profundi0aremos, ya que aCn no hemos estudiado las lista, parte mas que importantsima de la programacion u&rpl* Domando @ D'12' Lo que hace es dado un nombre en el nivel B@ de la pila, y entre comillas WsimplesW , crea un subdirectorio con ese nombre* Domando @ ( 12'

;ueno, ahora hablemos un poco de recursividad @ 8La recursividad consiste simplemente en que un programa se llame a si mismo8 , pero hay que entender bien esta definicion, lo que se quiere decir es que el programa, dentro de su ejecucion, se llama a si mismo, y hace lo mismo de nuevo, y de nuevo y de nuevo* (or eso es un poco complicado entender este tema, ya que se cometen muchos errores en cuanto a recursividad, tomemos por ejemplo el programa @ 99 ('3 '+%+B :: y guardemoslo en memoria con el nombre ('3 '+%+B , entonces que ocurrir cuando lo ejecutemos FFFFFF

;ueno, simplemente, se estar llamando a si mismo para siempre, hasta que lo interrumpamos o se le acab la memora a la calculadora* %ira el siguiente ejemplo 99 8hola8 ('3 '+%+, :: EGue ocurre si este programa lo guardamos con el nombre ('3 '+%+, " luego lo ejecutamos FFFF ;ien, simplemente, escribir en la pila infinitamente la palabra 8hola8 hasta que se acabe la memora o hasta que lo interrumpamos $s por estas cosas por las que hay que tener cuidado con la recursividad, por Cltimo tome este pequeKo cdigo que podra darle mas de un dolor de cabe0a a un uruario @ 99 3JJ ('3 '+%+N :: imaginense* ;ueno, pero la recursividad no sirve de mucho sin las estrucuras de bifurcacion y 8bypass8 en los programas, esto lo veremos ms adelante* Domando @ 1$(#5 Lo que hace es entregarnos el nCmero de objetos que estan en la pila****** (or ejemplo, si hacemos 1$(#5 y en la pila se encontraban 8 objetos cualquiera, aparecer un 8 en el primer nivel de la pila, y todos los objetos se despla0aran un nivel hacia arriba* !i tenemos por ejemplo B` objetos diferentes de cualquier clase en la pila, y ejecutamos 4 veces el comando 1$(#5 que pasar F (ues es claro que los primeros 4 niveles de la pila seran @

4@ N@ ,@ B@

B` B8 BZ ,X

por que cada ve0 que haces 1$(#5 +(+'$D$ )6 6)%$'3, $L D)+L 3D)(+ )6 L) +'* Eque resultado nos dara el siguiente codigo !2$%('$ F 99 DL$+' 1$(#5 :: por supuesto que X*

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& milun[starmedia*com ]]]*geocities*comM=jN-u-=

fin del capitulo 4

CAPITULO . - (COMIEN/A LO BUENO(


$n este captulo veremos las primeras estructuras condicionales que son junto con lo bucles, los pilares de la programacion u&rpl* >se me olvidaba incluir las listas? ;ien, vamonos al asunto de inmediato, la primera instruccion de estructura condicional que veremos es el 2J #5$6 $61 (ero me vengo dando cuenta que antes se necesita una introduccion a las comparaciones*****>disculpar? ;ien, para hacer correr todas las estructuras condicionales se requieren comparaciones de distintos tipo, ahora las veremos rapidamente Domparador @ : !i el nCmero del nivel , de la pila es mayor que el del nivel

B devuelve un B>si? , y si no un X>no? Domparador @ 9 Lo mismo que el anterior pero al reves* tambien estan los comparadores 8mayor o igual8 y 8menor o igual8 los cuales no tengo los simblos e=actos aqu, as que en el manual los distinguire mediante los signos @ :V mayor o igual 9V menor o igual Domparador @ VV devuelve un B si los dos objetos son iguales, sino da un X el contraro a este tampoco lo puedo escribir aqu, pero lo designar como aV , este, es claro que devuelve un B si los objetos son diferentes y un X si son iguales* 63#+@ se debe tener en cuenta que en estas cosas, el B significa verdadero y el X significa falso* >cualquiera mayor que B tambien es verdadero? Domparador @ +61 devuelve un B si los dos objetos son distintos de X, sino un X D3mparador @ 3' devuelve un B si alguno de los dos objetos es distinto de X Domparador @ 63# Dambia el valor de verdad del nivel B de la pila, o sea, si hay un B lo cambia a X, y si hay un X lo cambia a B* Domparador @ !+%$ 9&&& poderrrrrrrr 1evuelve un verdadero>B? si los dos objetos don 21$6#2D3! y un X en caso contrario ;ueno, con esos comparadores basta por ahora para comen0ar con el 2J #5$6 $61* ;ien, ahora, lo Cltimo es esplicar lo que son las estructuras condicionales* $llas son estructuras dentro de los programas, que le permitan a un programa 1$D212' que hacer

frente a diversos sucesos* )n ejemplo de la vida cotidiana sera @ 8!i voy al concierto de moonspell, entonces gastar plata en copete8 +h, se ve que si se cumple la condicion 8si voy al concierto de moonspell8 , tembien se cumplir el resto de la oracion, eso es una estructura condicional**** $structura @ 2J #5$6 $61 $sta estructura se usa de la siguiene manera, $n el codigo se pone un 2J , seguido de una 8prueba de verdad8 , y si se cumple la prueba, se ejecuta el codigo que est entre #5$6 y $61, si no se cumpliese la prueba , entonces el programa salta a lo que continCa despues del $61*** 2J >prueba de verdad? #5$6 >codigo que se ejecuta si la prueba arroja un valor verdadro? $61 sigue el programa "o se que es un poco dificil de entender al comien0o, veamos un programita que va a poner en la pantalla el mensaje 8si8 si el nCmero que este en la pila es igual a B8 99 B8 2J VV #5$6 8si8 %! ;3< $61 :: cdigo@ ;ueno, ah esta pues, vamos a anali0ar el

(rimero, se pone un B8 en la pila, con lo que el nCmero que ya estaba en ella se corre un nivel hacia arriba* Luego, se aplica la palabra 2J , y la prueba aqu es el signo VV , ya que este dar un valor de verdad si es que los dos nCmeros son iguales, y entonces, tenemos que si se cumple que el nCmero es B8, se imprimir en pantalla el mensaje 8si8 , y si no es igual a B8, no pasar nada, ya que no hay nada despues del $61 3tra forma de hacer lo mismo es con variables locales, que seguramente ser lo que usted usar en el futuro para estas cosas @ 99 &: 6)%$'3 99 2J W6)%$'3VVB8W #5$6 8si8 %! ;3< $61 :: :: otra forma sera @

99 &: 6)%$'3 99 6)%$'3 B8 2J VV #5$6 8si8 %! ;3< $61 :: :: y seguramente hay otras muchas maneras de hacerlo, y este ejemplo me sirvi para mostrar esto, que se me haba olvidado mencionar, en el user&rpl, siempre hay varias maneras distintas de resolver un problema, la gracia es encontrar la que ocupe menos espacio y sea mas rpida* $structura @ 2J #5$6 $L!$ $61 $sta estructura es parecida a la anterior, solo que esta tambien incluye un codigo que se ejecutar se la prueba de verdad es falsa**** o sea, 2J >prueba? #5$6 >ha0 esto? $L!$ >sino ha0 esto otro? $61 ah, se comprueba la clausula de verdad,y se ejecuta lo que est entre #5$6 " $L!$, saltandose despues hasta lo que biene despues del $61, y si la clausula de verdad es falsa, el programa se salta el codigo que esta entre #5$6 y $L!$ y ejecuta solo lo que esta entre $L!$ y $61, continuando despues con el programa* (ara ilustrar esto mejor, sera bueno, hacer un programn* 5aremos un programa que diga si un numero cualquiera es positivo o no* una forma de hacerlo sera la siguiente @ 99 X 2J : #5$6 8el numero es positivo8 % !;3< $L!$ 8el nCmero no es positivo8 %! ;3< $61 :: ;ueno, antes de que anali0aremos un poco este cdigo@ me vaya,

anterior con el siguiente @ 99 X 2J : #5$6 8el numero es positivo8 $L!$ 8el nCmero no es positivo8 $61 %! ;3< :: !e dan cuenta F, ahora en todo el cdigo va una sola ve0 la instruccion %! ;3< , pero entregando el mismo resultado, eso es lo que se llama optimi0acin del cdigo* ;ueno, puede que en este ejemplo no se note la diferencia en la ejecucin, pero imaginemos un programa que pesa varios /b , entonces estas cosas valen muchsimo* +demas, antes de irme a comer, mencionar que la optimi0acion del codigo en el )!$'&'(L es un aspecto muy importante, ya que el lenguaje es un poco lento en s, sobre todo comparado al !"!#$%, esto devido a que el )!$' reali0a muchas comprobaciones de seguridad, esto qui0 lo hablemos mas adelante, ahora me voy a comer, cuando vuelva veremos la estructura D+!$ , una de las ms poderosas del lenguaje, sobretodo para los que deseen hacer juegos en )!$'&'(L* 8&? +h, hola de nuevo, ya es de noche****EFEF E * continuemos con lo nuestro, en que ibamos FFF, ahhh, qued en que os enseKara la segunda y Cltima estructura condicional que podemos usar en la hp48* $structura @ D+!$ #5$6 $61 $61 ;ien, ahora, esta es un poco mas dificil de e=plicar, pero muy facil de amar, ya que sirve mucho para hacer cosas como juegos o porgramas similares, claro, en conjunto con otras sentencias que veremos un poco ms adelante* La estructura D+!$ lo que hace es parecido al 2J #5$6 $L!$ $61 , solo que en el 2J, se podan tomar dos opciones dependiendo del valor de verdad de una prueba* Don la estructura D+!$, en cambio, se pueden tomar deciciones dependiendo de mCltiples pruebas* (or ejemplo, supongamos que deseemos un programa que nos diga si un numero es positivo, negativo o cero* $ste ejemplo qui0 se pueda reali0ar solo con el 2J pero sera muy engorroso, y otros problemas mucho mas complejos escapan al 2J, para eso es que se introduce la estructura condicional D+!$* La sinta=is para usar esta estructura es @ primero

(rimero se compara el nCmero con el X, si el nCmero es mayor, se despliega en pantalla el mensaje 8el numero es positivo8, y si no, el mensaje 8el nCmero no es positivo8, luego el programa termina* y aqu sin querer queriendo, podremos ver una pincelada de optimi0acion, esto es, que este codigo que vemos aqu se puede reducir, con el consecuente aumento de velocidad en la ejecucin, pero el programa har e=actamente lo mismo* comparemos el cdigo

va la sentencia D+!$, donde comien0a todo, luego, una prueba de verdad, y un #5$6, los comandos que se quieren ejecutar si la prueba es verdadera, y despues un $61, despues se puede poner una segunda prueba de verdad con otro #5$6 y otros comandos seguidos claro de un $61, y as se pueden poner todas las pruebas que se quiera, teniendo en cuenta que despus del Cltimo $61 debe ir otro $61 por obligacion, para que el programa sepa que ah se termina la estructura D+!$, y muy importante lo que dir ahora, entre medio de los dos Cltimos $61 puede optativamente ir otro cdigo ms, que sera el codigo 8por defecto8, o sea, que si no se cumplen ninguna de las clausulas de verdad anteriores, se ejecutar ese cdigo* + mi no me gusta mucho dar e=plicaciones obvias, ya que esto es un manual de programacion y no uno de usuario, pero !)(36 3 que tu sabes ya que de todos los codigos que estan dentro de la estructura D+!$ )63 !3L3 !$ $H$D)#+, y despues el programa salta hasta lo que biene despues del )L#2%3 $61* ;ueno, parece que sali un poco larga la e=plicacin, pero como siempre, todo se aclarar con un ejemplo***** ('3 '+%+ G)$ 63! 12D$ !2 )6 6)%$'3 $! 6$ +#2A3 3 (3!#2A3 el codigo sera @ 99 &: < 99 D+!$ W<:XW 8(3!2#2A38 %! ;3< $61 8D$'38 %! ;3< $61 #5$6 W<VVXW #5$6 #5$6

respectivo #5$6 " $61, y salta a la siguiente prueba de verdad, la cual resulta ser verdadera, con lo que se ejecuta el codigo que esta entre el #5$6 y $61 de esa prueba* Luego, el programa se salta todo lo que queda y termina, ya que siempre solo se ejecuta uno solo de los cdigos* " no olvidar que en caso de que ninguna prueba resulte verdadera, se ejecutar lo que se encuentre entremedio de los dos Cltimos $61 * +hora, haremos algunas cosillas para que quede claro el uso de esta 2%(3'#+6#\!2%+ estructura***** $scribamos un programa que tome un nCmero de la pila, y nos diga su nombre, claro que solo uno del B al -* $l codigo sera @ 99 &: A"! 99 D+!$ 8)638 %! ;3< $61 813!8 %! ;3< $61 8#'$!8 %! ;3< $61 8D)+#'38 %! ;3< $61 8D26D38 %! ;3< $61 $61 :: :: WA"!VVBW #5$6 WA"!VV,W #5$6 WA"!VVNW #5$6 WA"!VV4W #5$6 WA"!VV-W #5$6

W<9XW 86$ +#2A38 %! ;3< $61 $61 :: ::

" ah esta nuestro programa, ha0lo funcionar y ve que pasa si pones el B , si pones el 4, y si pones el . FFFFF entonces el programa no har nada, ya que no hay nada entre los dos Cltimos $61 de la estructura D+!$* (ero desde ahora en adelante tenemos que ir acostumbrandonos a que los programas sean bien decentes, o sea que no queden esos 8agujeros8, eso puede traer problemas en el futuro* >sino preguntenle a la microsoft @&? ;ien, entonces, programa anterior ser @ 99 &: A"! 99 D+!$ 8)638 %! ;3< $61 813!8 %! ;3< $61 8#'$!8 %! ;3< $61 8D)+#'38 %! ;3< $61 8D26D38 %! ;3< $61 una variante del

Listo, ah esta el programa que necesitbamos, pero un pequeKo analisis no le hace daKo a nadie, verdad F ***** (rimero, se toma el nCmero como variable local con el nombre 8<8 , luego , comien0a la estructura D+!$ , y se empie0an a poner las pruebas de verdad con sus respectivos codigos a ejecutar en caso de ser verdaderas una de ellas* !upongamos que se introduce el nCmero X entonces el programa lo toma, le aplica la primera prueba de verdad, y resulta falsa, entonces ignora el codigo que est entre el

WA"!VVBW #5$6 WA"!VV,W #5$6 WA"!VVNW #5$6 WA"!VV4W #5$6 WA"!VV-W #5$6

$! $L 8 A"! L %! ;3< $61 :: ::

8$L 6)%$'3

Gue pasa entonces F prubalo* (ero sigamos arreglando nuestro programita, ahora preocupemonos de la optimi0acin, Ete das cuenta de que la instruccin %! ;3< aparece !$2! veces en el programa, qui0 pudiendo aparecer solo una ve0* 1igo qui0 por que hay veces en que el cdigo simplemente no se puede reducir, pero este no es el caso* Aeamos el siguiente cdigo @ 8)638 813!8 8#'$!8 99 &: A"! 99 D+!$ $61 $61 $61 WA"!VVBW #5$6 WA"!VV,W #5$6 WA"!VVNW #5$6 WA"!VV4W #5$6 WA"!VV-W #5$6 8$L 6)%$'3

;ueno, yo se que este captulo puede parecer un poco pesado, pero es #3#+L%$6#$ 6$D$!+'23 ya que todo el poder del lenguaje esta en estas cosas, junto con otras ms* $spero que lo que viene a continuacion sea de su agrado, son las $!#')D#)'+! 1$ ;)DL$ , las cuales nos sirven muchsimo combinadas con las e*condicionales para hacer programas e=tremadamente poderosos y muy muy fle=ibles* &&&&$!#')D#)'+! 1$ ;)DL$&&&& Listo, comencemos* Las estructuras de bucle dicho en buen chileno con para repetir un nCmero determinado o indeterminado de veces la ejecucin de un cdigo* " sin ms introduccin que esa, metmonos al agua ****** $structura @ !#+'# 6$<# $sta estructura lo que hace es simplemente repetir un nCmero bien determinado de veces el codigo que se encuentra entre !#+'# y 6$<#* el nCmero de veces que se ejecuta el codigo esta dado por dos nCmeros enteros que deben haber en la pila, el primero de ellos, se supone, debe ser menor que el segundo, y casi siempre se usa como primer nCmero el B* $jemplo, supongamos que quisiermos un programa que pusiera en la pila B` veces el te=to 8$L L+13 ;'2LL+6#$ $! !)2D21238, el cdigo sin la estructura !#+'# sera @ 99 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 8$L 8$L 8$L 8$L 8$L 8$L 8$L 8$L 8$L L+13 L+13 L+13 L+13 L+13 L+13 L+13 L+13 L+13 ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ $! $! $! $! $! $! $! $! $!

8D)+#'38 $61 8D26D38 $61 $! $L 8 A"! L $61 %! ;3< :: ::

EDambia la cosa o noF , y el resultado es el mismoFFF (or supuesto que si* #ambien podramos reducir el nombre que le dimos a la variable local, ya que contiene N letras, podramos pasarlo solo a una* ;ueno, eso es lo Cltimo que se podra hacer me parece* Domo ven, anali0ar el cdigo que uno escribe es muy gratificante* Lo Cltimo que dir sobre las dos estructuras condicionales que hemos aprendido a usar, es que estas tambin se pueden anidar, pero siempre con cuidado* Aea el siguiente ejemplo***** 99 4 2J !+%$ #5$6 - 2J VV #5$6 853L+8 $L!$ 8D5+38 $61 $L!$ 8D'+1L$8 $61 :: )n poco raro no FF , trata de entender lo que hace este programn, no es nada inteligente, pero sirve para darse cuenta que dentro de las acciones de los 2J o los D+!$, pueden ir metidas otras estructuras ms, y destro de estas otras , y dentro de estas***me vuelvo loco*****>&@ Lo importante es que es totalmente vlido hacerlo, que cada uno le de el uso que desee*

!)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 !)2D21238 ::

8$L 8$L 8$L 8$L 8$L 8$L 8$L 8$L

L+13 L+13 L+13 L+13 L+13 L+13 L+13 L+13

;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$ ;'2LL+6#$

$! $! $! $! $! $! $! $!

L :: 6$<# 1'3( :: :: poco* ;ien, listo, igual tuve que pensar un

(ajero no FF , para esto es que e=isten las estructuras de bucle* $l ejemplo no es para nada inteligente, lo s, pero es para que los principiantes como tu puedan entender el funcionamiento* Aeamos ahora como sera el cdigo usando la estructura !#+'# 99 B B` !#+'# 8$L L+13 ;'2LL+6#$ $! !)2D21238 6$<# :: )n pequeKo cambio no F Domo profesor que estoy siendo de ustedes en este momento, les dar una tarea, escriba un programa que haga e=actamente lo mismo que el anterior, pero sin usar la estructura !#+'#, y por supuesto que diferente que el primer programa* (iense y trate de hacerlo* Guien quiera la respuesta al problema, escriba a milun@sta m!"ia#$%m $scribamos el cdigo de un programa que dado un nCmero entero, nos muestre en un te=to todos los nCmeros naturales que lo anteceden* 3 sea, suponiendo que al programa se le entrega el nCmero ` , el resultado al ejecutarlo deviera ser @ 8B,N4-.`8 $l codigo que yo escribira para este problema sera @ 99 &: + 99 88 B B + !#+'# &: D 99 D L D B

Analisis @ (rimero se toma el nCmero como variable local y se le pone el nombre 8+8 , luego, se pone una cadena vacia en la pila, que es donde iremos concatenando los nCmeros, luego se pone un B que servira como primer elemento* 1espues se pone el inicio y final del bucle o sea, B y + y comien0a el bucle, en el cual, otra ve0 se pesca una variabla local de nombre D y cada ve0 que se repite el bucle, lo que se hace es, Doncatenar D en la cadena, y luego sumar uno a D, con lo que cuando se repita el bucle, la variable D cambiar su valor a D L B * +l final se debe poner un 1'3(, ya que la Cltima ve0 que se ejecuta el bucle, queda suelto el numero 8D L B8 * +hora quiero otro programa parecido al anterior, pero que me d los nCmero desde el X , y separados por espacios* el codigo sera @ 99 &: + 99 88 X B + !#+'# &: D 99 8 8 D L L D B L :: 6$<# 8 8 !_+( L L :: :: (equeKas modificaciones logran lo que queriamos* ;ueno, no dar mas ejemplos, pero tu debes imaginar ms cosas que hacer con esta importante estructura* $sctructura @ !#+'# !#$( $sta estructura es parecida a la anterior* La diferencia est en que aqu se puede elegir el incremento al contador del bucle* $n la otra estructura, el incremento !2$%('$ es B* #omar la e=plicacion del manual de usuario para indicar la sinta=is de esta estructura* 99 **** inicio final !#+'# codigoPaPejecutar incremento !#$( *** :: 3 sea lo mismo que la estructura anterior, solo que la palabra 6$<# se cambia por !#$( , y que antes de !#$( debe ir un nCmero que ser el incremento*

(or ejemplo, podramos hacer un programa que escribiera cien veces en la pantalla el mensaje 8hola8 de la siguiente manera 99 B BX !#+'# 8hola8 X*B !#$( :: !i te fijas, solo se va desde el B al BX, sin embargo, se imprime en pantalla BXX veces la palabra 8hola8, esto es devido a que elejimos el incremento como X*B %ira los siguientes cdigos @ 99 B , !#+'# 8hola8 X*XB !#$( :: :: 99 X B !#+'# 8hola8 X*XB !#$( 99 Z Z*B !#+'# 8hola8 X*XXB !#$( :: X*XB !#$( :: 99 -4 -4*- !#+'# 8hola8 8hola8

8'+#!3D+ + "3A $%8 +hora me voy a hacer tuto, ya que maKana tengo clases de clculo, nos vemos* maKana qui0 escriba, nos tocar aprender la estructura de bucle J3'* chau****** 5ola de nuevo, recuerda que por cualquier duda escrbeme* $n que estbamos F , ah, les iva a enseKar el J3', bueno, entonces para que esperar ms***** $structura J3' 6$<# $sta estructura de bucle es una de las ms importantes, ya que nos permite repeticiones con opciones ms avan0adas que el simple y querido !#+'#* La Cnica diferencia con el !#+'# es que en la estructura J3' se puede 8usar8 el contador en cada repeticion o pasada del cdigo del bucle* 3 sea, en otras palabras, tienes a tu dispocicin el contador del bucle* #odo qued siempre ms claro con un ejemplo, pero antes, la sinta=is del J3' es la siguiente @ (rimero van , nCmeros, que son el inicio y final de las veces que se quiere repetir el bucle, luego la instruccion J3' seguida del nombre que le daremos al contador>algo as como una variable local dentro del bucle?* 1espues viene todo el cdigo que forma el bucle, y al final la palabra 6$<#* 5agamos un programa que dado un nCmero entero, ponga todos los nCmeros naturales que le anteceden en la pila @ 99 &: + 99 B + J3' ; ; 6$<# :: :: $se sera el cdigo, primero se toma un nCmero de la pila como variable local con el nombre +, luego se comien0a el bucle y al contador le llamamos ;* $ntonces, el cdigo que realmente 8hace8 el bucle, es lo que se encuentra entre el nombre del contador &&en este caso ;&& y la palabra 6$<#* Aemos que lo que hay entre esas palabras, es simplemente una llamada al contador, con lo que en cada pasada del bucle, el contador se lan0a a la pila, dandonos el resultado deseado* ;ueno, pero ese era el ejemplo fcil,

#odos ellos dan el mismo resultado al ser ejecutados* 5agamos algo divertido antes de pasar al J3', escribe un programa que saque el promedio de todos los nCmeros que hayan en la pila, suponiendo que en la pila hay solo nCmeros, pero no importa cuantos******EpuedesF "o si puedo, y el programa sera @ :: :: 99 1$(#5 &: + 99 , + !#+'# L 6$<# + M mas que facil ah****^&: o mejor todava, 99 1$(#5 &: + 99 , + !#+'# L 6$<# + M 8$l promedio es 8 !_+( L :: :: ;ueno, les dejo el analisis a ustedes, porque creo que est fcil* (or Cltimo, para recordar las funciones de cadenas, haga un programa que de vuelta una cadena, me entiendes F o sea que si le paso la cadena 8%$ A3" + +D3!#+'8 por ejemplo, el resultado sea @

ahora les doy el desafo de hacer un programa que nos d el factorial de un nCmero dado* !upongo que se darn cuenta que !26 usar el comando a * 5ganlo primero con J3' y despus traten de hacerlo con !#+'#* ;ien, para J3', el cdigo sera @ 99 &: numero 99 B , numero J3' contador contador R 6$<# :: :: +hora, si algCno de ustedes mira bien el cdigo, se dar cuenta de que si calcula realmente el fctorial, pero que pasa si el nCmero dado es el X o el B FFFF $ntonces el programa falla* 5aga una modificacion que corrija ese bug********** 9*****;) V$''3'V_2613_!****@&?*: 99 &: numero 99 D+!$ #5$6 B $61 WnumeroVVBW #5$6 B $61 J3' contador contador R 6$<# WnumeroVVXW

hasta el que est en la pila>el nb 8dado8?* $l que no sabe mucho de matemticas habra escrito lo siguiente@ 99 &: <y 99 B , <y J3' 'N 'N L 6$<# :: :: $l que sabe matemticas, simplemente hubiera puesto @ 99 1)( B L R , M :: (ero como lo que estamos estudiando es el J3', el que hi0o el primero gana >EFEFEFEF?* $structura @ J3' !#$( Lo mismo que el anterior, solo que con este se puede especificar el incremento de la variable contadora del bucle* >ver !#+'# !#$(? ;ueno, veamos, hagamos un programa que dado un nCmero y un incremento, ponga en la pila todos los nCmeros desde el X hasta el numero dado, pero cada un intervalo que ser el incremento dado* $l numero dado ira en el segundo nivel de la pila, y el incremento dado en el primero @ 99 &: numero incremento 99 X numero J3' contador contador incremento !#$( :: :: ;ueno, la verdad es que yo no ocupo mucho el J3' !#$( pero siempre hay que aprenderlo igual, ya que en alguna situacion nos podra servir* 5a0 un programa que de todos los nCmeros naturales pares anteriores a un nCmero dado*>ah se ve el uso de J3' !#$(? 99 &: + 99 X + J3' ; ; , !#$( :: :: 1ejemos hasta aqu lo que son las estructuras por un rato, ms adelante veremos la 13 )6#2L $61 y la _52L$ '$($+# $61* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& milun[starmedia*com

B , numero $61 ::

!i se fijan, para el nCmero X doy el valor B , esto no es ningCn error, por convencion internacional se defini el factorial de X como B* $l codigo que yo escrib para esto usando !#+'# es @ 99 &: numero 99 D+!$ #5$6 B $61 WnumeroVVBW #5$6 B $61 numero !#+'# &: %2D36# R %2D36# B L :: WnumeroVVXW

B B B 99 %2D36# 6$<# 1'3( $61 ::

;ueno, al anlisis de ese cdigo se los dejo a los que les interese la cosa a fondo, ya que cualquiera con sentido comCn hubiera resuelto el problema utili0ando la estructura J3'* 3tro problema @ 5aga un programa que sume todos los nCmeros nturales, desde el B

fin del capitulo -

]]]*geocities*comM=jN-u-=

CAPITULO 0 1 ALGUNAS COSAS SUELTAS SOBRE COMANDOS MATEMATICOS OTROS


;ueno, en este captulo dar algunos comando muy Ctiles para mtematicas y tambin otros 2%(3'#+6#\!2%3! para hacer programas interactivos con el usuario, por ejemplo, que bajo determinadas condiciones, el programa le pida informacion al usuario o cosas de ese tipo* #ambien veremos el comando _+2# , importante a la hora de crear juegos y otras cosas aCn ms interactivas* Domando @ 2( Lo que hace este comando es quitarle a un nCmero cualquiera su parte fraccionaria* (or ejemplo si le aplicamos 2( al nCmero 4*,NXN el resultado que obtendremos ser simplemente 4 y en caso de aplicarlo sobre un nCmero entero no pasa nada* 99 1)( 8el numero 8 !_+( L 8sin parte fraccionaria es 8 L !_+( 2( L %! ;3< :: Domando @ J( Lo contrario del anterior, es decir, nos d la parte fraccionaria de un nCmero dado* 8 99 1)( 8la parte fraccionaria del numero !_+( L 8es 8 !_+( J( L :: +hora me largo por un rato, chao* >hola de nuevo? La calculadora hp48 dispone de un '+6 nCmero de comandos matemticos, y describir el funcionamiento de todos sera una gran paja, as que eso se lo dejo a ustedes* Duando yo necesite un comando, solo lo har aparecer, y a lo m=imo dir lo que hace* Domando @ #2%$ Lo que hace este es darnos la hora, pero en un e=traKo formato****** lo hace dandonos un nCmero decimal con muchos decimales, en el cual la parte entera son las horas, los dos primeros decimales son los minutos, y los dos

Cltimos decimales son los segundos*****;ueno, y supongo que todos los demas decimales son algo as como las centecimas, milesimas y ****si, cmillonesimasa de segundo, aunque yo me confiara solo hasta de los segundos* o sea , si el comando nos da B`*XB,8 significa que son las - con B minuto y ,8 segundos* Domando @ 1+#$ 5ace lo mismo que el anterior, pero con

la fecha*

Domando @ '3# 'ota los N primeros elementos de la pila, parecido al !_+(, pero con N elementos* Domando @ 3A$' Dopia al B@ nivel de la pila lo que hay en ejemplo grupo de blac/ metal8

el ,@

,@ N4-4*N4-, B@ 8ever eve es un gran la

entonces, despues de aplicar instruccion 3A$' el resultado sera @

N@ N4-4*N4-, ,@ 8ever eve es un gran grupo de blac/ metal8 B@ N4-4*N4-, Domando @ $A+L $valCa cualquier cosa que est en la pila, por ejemplo un programa o una e=presion matemtica, etc* ejemplo, har dos programas que hacen e=actamente lo mismo para que se entienda el comando $A+L 99 8arcturus es otro gran grupo oscuro8 %! ;3< :: 99 99 8arcturus es otro gran grupo oscuro8 %! ;3< :: $A+L :: los dos hacen lo mismo* Domando @ 'DL

6o estoy seguro, pero parece que este ya lo pase, pero por las dudas aqu esta>ademas me da paja revisar todo el documento?***Lo que hace es darnos el contenido de una variable cuyo nombre le demos entre O Q * supongamos que la variable llamada cradlePofPfilth contiene el nCmero N4,N*B,88N.,B4, entonces si en la pila ponemos O cradlePofPfilth Q y hacemos 'DL el resultado ser el nCmero N4,N*B,88N.,B4 Domando #"($ 6os d el tipo de objeto que est en la

decimal de N cifras, esto es, dos enteras y un decimal, ejemplos @ N4*, B,*N NN*B B4*B y en general ab*c donde 8a8 es la columna, 8b8 la fila y 8c8 es la modificacion de te=to, o sea, puede ser el bloqueo para letras, la flecha verde o la flecha morada* ;ien, ahora, vamos a la idea principal que estoy siguiendo**** Donsidera el siguiente cdigo @ 99 X _+2# &: + 99 2J W+VVBB*BW #5$6 8L+ #$DL+ ()L!+1+ J)$ L+ 1$ L+ $!G)26+ !)($'23' 2YG)2$'1+8 $61 :: :: " si usramos un D+!$ FFFF bueno, las posibilidades son infinitas, solo hay que usar el craneo, o mejor dicho lo que est adentro***** ^&? Domando @ I$" 1evuelve la tecla que se pulsa justo despus de ejecutar el comando, muy parecido a X _+2#* Domando @ J'$$Y$ Dongela la pantalla por 8n8 segundos, dado 8n8 en la pila* !i n es negativo congela la pantalla hasta que se presione una tecla* bien, eso sera todo lo que se me ocurre por ahora*

pila*

ejemplo @ si en la pila est un nCmero real, y aplicamos #"($ el resultado ser X ya que el tipo numero real es el X O34!t% Num! %5ti6%7

6Cmero real ****************** X 6Cmero complejo ************** B Dadena *********************** , ;ueno, se me olvidaba, este es un manual de programacion, as que si quieres saber el resto de los tipos de objetos anda al apendice 5 del manual de usuario a la pgina NB C%man"%s 8til!s 6a a 4u!9%s % m!4% "i$:% 6a a ($%nt %l!s "! a6li$a$i%n!s int! a$ti;as( Hajaja, el ttulo terrible formal, bueno, en realidad los comandos no s si fueron hechos para eso, pero al menos yo los ocupo padeso* Domando @ _+2# Lo que hace este gran comando es 8esperar8 n segundos dado n en la pila, o sea se retrasa, pero cuando n es menor o igual a X, se queda esperando hasta que se aprete una tecla, y nos da la ubicacion de la tecla* Los ms pillos ya se habrn dado cuenta de lo que se puede hacer con eso, pero igual demos las e=plicaciones necesarias para*****bueno, para t qui0, disculpa****** ;ueno, antes que nada dire que internamente en la hp48, una de las maneras de ver a las teclas es por medio de su ubicacion, y esto se logra simplemente a trave0 de un nCmero

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& milun[starmedia*com ]]]*geocities*comM=jN-u-=

fin del capitulo .

CAPITULO 2 1 PIDIENDO DATOS AL USUARIO DE TU PROGRAMA


$n la hp hay algunas manera de comunicarse con el posible usuario del programa que hagas* Aeremos algunas en este captulo* Domando @ 26()# (ide la entrada al usuario de 8algo8* La sinta=is es una cadena en el ,@ nivel, la cual supuestamente le dice al usuario la informacin que debe entregar, y en el nivel B tambin va una

cadena, con el valor por defecto del usuario, la que puede estar vacia si se quiere* $l resultado !2$%('$ se entrega automticamente como cadena, o sea 8encerrado entre estas comillas8* $jemplo@ (rograma que nos pide el nombre y luego nos saluda* 99 853L+ 8 812 + !) 63%;'$ (3' J+A3'8 88 26()# L %! ;3< :: ;ien, resulta muy fcil anali0ar el cdigo, el 853L+8 del principio, es para luego concatenarlo con el nombre que se ingresa* Lo puse al principio, ya que si lo hubiera puesto en otro lugar, habra tenido que usar tambien el !_+( , o sea as @ 99 812 + !) 63%;'$ (3' J+A3'8 88 26()# 853L+8 !_+( L %! ;3< :: Gui0 se entienda mejor as, pero la primera forma esta optimi0ada* ;ien, luego va el mensaje que pide el nombre, luego una cadena vacia y el 26()#* Lo que el usuario ponga como nombre, se ir a la pila encerrado entre 8 8* 1espues, se concatena con la palabra 853L+ 8 y para finali0ar, un lindo %! ;3< que nos saluda cordialmente* $l 26()# es muy usado, ya que es una de las ms rpidas formas de pedir informacion al usuario* 5agamos otro programa, esta ve0 ser un programa encuesta, que nos haga una pregunta que pueda tener la respuesta !2 o 63 de parte del usuario, y que dependiendo de la respuesta del usuario, se le muestre otro mensaje, veamos @ :' 99 8E)!#$1 $! )6 L+%%$'F8 88 26()# &

en caso de que el usuario responda !2, 63, o si da cualquier otra respuesta, y parece que el problema est solucionado, pero que pasa si el usuario da la respuesta 8si8 3 8no8 FFF "a dije en capitulos anteriores que para la hp48 8$!#38 no es lo mismo que 8esto8 ni tampoco que 8e!t38, entonces, mejoramos el programa para el caso en que el usuario diga 8si8 o 8no8, ya que es muy dificil que dijera 8!i8 o 8s28 o 86o8 o 8n38******** @&? :' #5$6 99 8E)!#$1 $! )6 L+%%$'F8 88 26()# & 99 D+!$ ' 8!28 !+%$ ' 8si8 !+%$ 3' 8$6#36D$! $'$! )6+ %2$'1+8 ' 8638 !+%$ ' 8no8 !+%$ 8;2$6, %)" ;2$68 %! ;3<

%! ;3< $61 3' #5$6 $61

8'$!(361$ !2 3 63 H$#368 %! ;3< $61 :: :: +h si* 5aga un programa que nos pida la edad* Gue si tenemos menos de B- nos diga una cosa, o si estamos entre B- y ,- otra, y si somos mayores de ,- otra**** 99 826 '$!$ !) $1+18 88 26()# &: ' 99 D+!$ W'9B-W #5$6 B - !#+'# 8%3D3!38 %! ;3< 6$<# $61 W':,-W #5$6 8#$ G)$1+ (3D+ A21+8 %! ;3< 3JJ $61 812!J')#+ 1$ #3%+' " 1'3 +'#$ 5+'#33338 %! ;3< $61 :: :: +h esta problemilla*** la solucin a nuestro

99 D+!$ ' 8!28 !+%$ #5$6 8$6#36D$! $'$! )6+ %2$'1+8 %! ;3< $61 ' 8638 !+%$ #5$6 8;2$6, %)" ;2$68 %! ;3< $61 8'$!(361$ !2 3 63 H$#368 %! ;3< $61 :: :: +h esta pues, se dan acciones a reali0ar

63#+ @ si algCn ]eon se ofende por lo mensajes que pongo de ejemplo en el te=to vayase a la ****** no, mejor no, mejor abre tu cagada de mente y date cuenta de que este es un manual de programacin y no uno de moral*****jajajaja** pero y que pasa con la generacion que tiene B8 aKos en el cuerpo, como yo, y qui0 como tu**** bueno, arreglemos el cdigo*** 99 826 '$!$ !) $1+18 88 26()# &: '

99 D+!$ W'9B-W #5$6 B - !#+'# 8%3D3!38 %! ;3< 6$<# $61 W':,-W #5$6 8#$ G)$1+ (3D+ A21+8 %! ;3< 3JJ $61 W'VVB8W #5$6 B BXXX 8L3 %+<2%3********8 %! ;3< 6$<# $61 812!J')#+ 1$ #3%+' " 1'3 +'#$ 5+'#33338 %! ;3< $61 :: :: Aamos con otro ejemplo @ 99 8es usted na0i FFF8 88 26()# &: # 99 D+!$ # 8!28 !+%$ #5$6 A+'! ()' $

X*`.`.NX`BBN-. X*,X-NXNXXN4N X*-`Z,ZBX-`NX4 X*NXBB`X48,8X4 $sos son el tipo de nCmeros que casi siempre nos d el comando '+61* #area @ 5aga un programa que nos de un nCmero aleatorio del X al Z* 5ay muchisimas maneras de enfrentar el problema, mi programa sera@ 99 '+61 BXXXX R 2( &:!#' B N !#+'# #+2L 3;H&: :: Los resultados 8probados8 que arroj este programa son @ N,`,N,,,B,N,X,N,8,`,4,.,, Don todo lo que ya hemos pasado, yo creo que ya sera hora de que tu vayas creando tus propias cosillas, no crees F, ;ien, aqu voy a e=poner algunas ideas para que revises antes de continuar con la materia* PP(rograma que saca todas las vocales de un te=toPP ;ien, la idea es hacer un cdigo que compare cada letra con todas las vocales, y si alguna es igual, la saque, y si no la mantenga en el te=to, yo lo hara as @ (ero antes, dense cuenta de que por primera ve0 har un programa que tiene dos partes independientes, a una la llamar pB y a la otra p,* Lo que har pB ser poner el primer caracter de una cadena en el Cltimo lugar, o sea, de 8sebastian8 pasara a 8ebastians8* $l p, har lo haga falta* 99 1)( 5$+1 L #+2L :: $!$ $! (B Y 99 1)( !2Y$ B !_+( !#+'# 1)( 5$+1 &: 99 D+!$ Y 8+8 VV #5$6 #+2L $61 Y 8$8 VV #5$6 #+2L $61 Y 828 VV #5$6 #+2L $61 Y 838 VV #5$6 #+2L $61 Y 8)8 VV #5$6 #+2L $61 (B

$61

# 8638 !+%$ #5$6 8J$L2D2#+D236$!8 $61 $61 :: :: Domando @ A+'! 6os d una lista con los nombres de las variables* ejemplo@ Omate ___ Q !igamos haciendo cdigos con el 26()# @ &&&(rograma original de ejemplo&&& Lo siguiente es un programa que se me ocurri la primevera del ZZ, cuando estaba en 4to medio, es un juego en el que nunca se puede ganar***** : vane :: :: igual* 99 82ngrese un nCmero8 88 26()# 3;H&: & 99 8perdiste, yo elijo 8 a B L L %! ;3< ;ueno, si, s que es un poco fome, pero

Domando @ '+61 6os d un nCmero aleatorio, o sea totalmente al a0ar* Lo raro y que yo no entiendo mucho, es que siempre es un nCmero decimal de muchassss cifras decimales y siempre una sola cifra entera, la cual la mayora de las veces es X o B* +lgunos ejemplos de los nCmeros que nos da '+61 son@ >sacados de la hp48?

$61 :: 6$<# :: ese es p, !i se dan cuenta, no es tan necesario haber hecho dos programas, ya que en donde dice (B en el (,, se podra reempla0ar el cdigo de (B y listo, pero el objetivo era que te dieras cuenta de que un programa puede tener varias partes* !e acuerdan del comando #2%$ F 3jal, ya que ahora haremos un programa que nos de la hora, pero decentemente, en un formato ms amigable**** mi codigo es @ 8@8 L + 99 8!on las ****** 8 #2%$ &: + 99 + 2( L

O'$63%;'+' 1$!#')2' D3(2+' E+(+ +'F D'$12#3! Q B D533!$ 1'3( &: ' 99 D+!$ ' '$63%;'+' VV #5$6 1)( 'DL !_+( OQ L ()' $ 86)$A3 63%;'$ F8 88 26()# 3;H&: !#3 $61 ' 1$!#')2' VV #5$6 OQ L ()' $ $61 ' D3(2+' VV #5$6 'DL 86)$A3 63%;'$ F8 88 26()# 3;H&: !#3 $61 ' E+(+ +'F VV #5$6 DL$+' 3JJ $61 ' D'$12#3! VV #5$6 8('3 '+%+ 1$ $H$%(L3 D'$+13 (3' =jN-u-=8 %! ;3< $61 :: :: !aben, la verdad es que me da flojera probarlo en la hp, ya que tendra que copiarlo todo, as que si tiene fallas me avisan**** $s hora de entrar en el mundo de las listas, del cual no deben asustarse, ya que es mucho mas facil de lo que puede parecer**** &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& milun[starmedia*com ]]]*geocities*comM=jN-u-=

J( BXX R 2( L 8@8 L + BXX R J( BXX R 2( L %! ;3< :: :: +hora veremos otro comando muy bueno para pedir opciones al usuario, es el comando D533!$* Domando @ D533!$ ;ien, lo que hace este comando, es que dado en al pila una cadena que hace de 8titulo8, una O lista Q con varias palabras, y un nCmero que no sobrepase el nCmero de palabras que hay en la lista, nos despliega un cuadro de dilogo preguntndonos cual de las opciones escogemos**** +qu sera muy dificil mostrar como funciona , as que a tomar su hp y evaluar el siguiente cdigo* 99 8como es este programaFFFF8 O ;)$62!2%3 ;)$63 63'%+L %+L3 %2$'1+ Q B D533!$ :: $ntonces tienen que idear cosas*****bueno, pa los que son medios ****, no, aqu hay un ejemplo que ilustra el uso, pero este ser el primer programa en serio que habremos hecho* 5aremos un administrador de archivos que pueda borrar, renombrar, o copiar un archivo* tambin tendra la opcion de apagar calculadora y de mostrar los credits* 99 8J2L$! +1%26 ;" =jN-u-=8 A+'! B D533!$ 1'3( 8G)$ 5+ 3 D36 8 3A$' L 8F8

fin del capitulo `

CAPITULO 8 1 (LISTAS(
;ien, comencemos definiendo lo que es una lista para nuestra bienamada calculadora hp48* )na lista es simplemente un grupo de objetos, lo cuales pueden ser de cualquier tipo, ya sea nCmeros de cualquier tipo, cadenas, programas, nombres de variables, etc**** La lista puede tener cualquier nCmero de objetos siempre que la memora de la calculadora lo permita, as que aqu les doy algunos ejemplos de listas @ OB,N4-Q O B 4 -- ..*- N4*,N4,N4 &BXXXX hola Q O =jN-u-= y vanN--a sN aman Q O 99 8hola mother fuc/er8 %! ;3< A+'! ()' $ :: 4- tirol >4,-? Q Donsidera ahora esta otra lista @ N4 Q O andrea juana berta O eliana raquel Q ana

#e das cuenta F, si, en una lista un elemento o ms de ella pueden ser listas, las que a su ve0 cumplen con esta misma propiedad* Los elementos en las listas se separan por espacios 5ay algunos comandos de las cadenas que se aplican perfectamente a las listas, estos son @ la lista lista 5$+1 @ devuelve el primer elemento de #+2L @ elimina el primer elemento de la

Domo ejemplo, recuerde que el comando A+'! nos da los nombres de todas nuestras variables dentro de una lista

II PARTE
CAPITULO ' 1 (COMANDOS AVAN/ADOS PARA LISTAS - CADENAS - OTRAS COSILLAS COMO UNA NUEVA >ORMA DE TOMAR EL MANUAL DE A?U@ EN ADELANTE CAPITULO ) - (EL PROGRAMA DUEAO UNA PINCELADA A LA PROGRAMACION DE +UEGOS O APLICACIONES INTERACTIVAS MEDIANTE EL USO DE LA INMERSION - LAS ESTRUCURAS B4*.u.B# UN POCO DE CADENAS ( CAPITULO * 1 (CADENAS AVAN/ADAS< LA ENCRIPCICN(

!2Y$ @ nos entrega el nCmero de elementos de la lista L @ en las cadenas el L las concatenaba, en las listas, lo que hace es meter un objeto dentro de una lista, ejemplo***** ,@ O m o o n s p e lQ B@ l +l sumar el resultado sera @ ,@ B@ O m o o n s p e l l Q Si s! suman "%s listas< l% =u! s! 6 %"u$! !s uni t%"%s l%s !l!m!nt%s "! las "%s listas !n una s%la# Domando @ &:L2!# lo que hace este comando, es que si hay n elementos en la pila y ponemos el nCmero n, se crea una lista con todos esos elementos metidos en la lista, igual si hay ms de n elementos y se eligen n* ejemplo @ 4@ joe N@ vasconcellos ,@ grande B@ N +l aplicar &:L2!# queda ,@ B@ Ojoe vasconcellos

CAPITULO ' 1 (COMANDOS AVAN/ADOS PARA LISTAS - CADENAS - OTRAS COSILLAS COMO UNA NUEVA >ORMA DE TOMAR EL MANUAL DE A?U@ EN ADELANTE
+qu veremos como dice el ttulo cosas interesantes que se pueden hacer con las listas y cadenas mediante las instrucciones que nos proporciona el )!$'&'(L* ;ien, si a una lista se le aplica un comando matemtico que requiere un solo valor de entrada y da un valor de salida>ra0 log, etc? la lista se transforma en el resultado de aplicar el comando a cada uno de sus terminos* $jemplo @ queda @ B@ O B 4 Z B. ,- N. Q +l aplicar por ejemplo rai0 cuadrada nos B@ O B , N 4 - . Q

grandeQ

$spero que se haya entendido* $sto funciona solo si la lista contiene nCmeros o nombres de variables que representen nCmeros* Domando @ !); $ste comando es otro de los tantos que funcionan sobre listas y cadenas de caracteres* Lo que hace es, dada una lista en el nivel N@ , y dos nCmeros en los niveles ,@ y B@ , el primero menor o igual que el segundo y los dos menores o iguales que el nCmero de elementos que tiene la lista, $=trae de la lista el intervalo que se le pasa* )n poco complejo F $jemplo @ 4@ N@ O primero segundo tercero cuarto quinto se=to Q ,@ N B@ 4 $sa es la sinta=is necesaria, entonces al aplicar !); nos quedaria @ N@ ,@ B@ O tercero cuarto Q Ese entendio ahoraF Lo mismo ocurre con las cadenas de caracteres* 4@ N@ 8terra internet ms ,@ ` B@ B4

#5$ %3368

4@ N@ 8#5$ 1+'I !21$ 3J ,@ B@ BN 8+8

+l aplicar '$(L nos queda @ ,@ B@ 8#5$ 1+'I !21+ 3J

#5$ %3368 listas******

$=actamente lo mismo ocurre con las

4@ N@ O ;3'I6+ +' #2+%+# 62 5#_2!5 %336!($LL Q ,@ , B@ O D'+1L$P3JPJ2L#5 Q !i aplicamos el '$(L queda @ ,@ B@ O ;3'I6+ +' D'+1L$P3JPJ2L#5 62 5_2!5 %336!($LL Q $s imbecil darse cuenta que en el caso de las cadenas el caracter a insertar deve ir entre (!st%( y en el caso de las listas, deve ir entre D !st% E# $n la primera parte vimos un comando que se llamaba &:L2!# , el cual transformaba 8n8 elementos de la pila, dado 8n8 en B@, en una lista que contena los n elementos* $l siguiente es el contrario de &:L2!# Domando @ 3;H&: 'ecuerdas que en las cadenas le quitaba las 8comillas8 F, bueno, en las listas, suelta todos los elementos en la pila, y en Cltimo lugar queda el nCmero de objetos que contena la lista* $jemplo @ ,@ B@ O blac/ doom gothic

cara que nunca8

+l aplicar !); quedara @ N@ ,@ B@ 8internet8 Domando @ '$(L Lo que hace es @ dado una cadena, un numero natural 8n8, y un caracter, reempla0a el caracter en la cadena en el lugar 8n8* $jemplo @

romantic speed Q

+l aplicar el 3;H&: nos da @

4@ gothic N@ romantic ,@ speed B@ Aes, te da el nCmero de elementos y todos los elementos desplegados hacia arriba* +hora, si no sabes adonde estan las palabras blac/ y doom, entonces andate a la misma mierda, usa un par de dias la calculadora y despues trata de entrar en programacion, si no sabes esto, estas mas perdido que ******* #area @ haga un programa que invierta el orden de los objetos de una lista, o sea, dado por ejemplo O B , N 4 - Q que nos entregue O-4N,BQ !aben, F tom una decision* %e estoy dando cuenta de que este manual ya no est para que siga describiendo cada comando por separado, si alguien esta leyendo esto, deve ser por que cuando apare0ca un comando que no he descrito, o bien se lo sabe, o bien toma el manual de usuario y v para lo que sirve* Lo siento, se acabaron los comandos, ahora vamos a ir con pura pura programacion, Lo que pasa es que me estoy aburriendo mucho* (ara los que estaban aprendiendose los comandos aqu les pido disculpas, tendran que ir al manual de usuario* $n todo caso, al final hay , apendices bien buenos, que describen todos los comandos de la hp48* 1isculpas, pero debe comen0ar la accin*******cWcWcWEEFEFEFEEWcWccWEEFEEFFE +ntes de seguir recomiendo mucho aprender el uso de las listas, y sobre todo el manejo de los grficos* $l comando +62%+#$ y todo lo que se pueda leer del manual de usuario* y DJ* #ambin aprenda las flags o banderas* !J

99 8!on las ****** 8 #2%$ &: + 99 + 2( L 8@8 L + J( BXX R 2( L 8@8 L + BXX R J( BXX R 2( L %! ;3< :: :: $se cdigo nos hacia aparecer en un cuadro %! ;3< la hora en horas@minutos@segundos* (ero si es que lo ejecutaron un par de veces se darn cuenta de que con el tiempo se va haciendo una verdadera paja tener que apretar luego de haber visto la hora la tecla que indica 3I o D+6D$L* +hora por medio de grficos solucionaremos el problema* 5aremos un programa que nos muestre la hora por B segundo y luego desapare0ca* %i cdigo es @ 99 8!on las 8 #2%$ &: + 99 + 2( L 8@8 L + J( BXX R 2( L 8@8 L + BXX R J( BXX R 2( L N $'+!$ &: '3; O B O eBBh eB8h Q B B Q +62%+#$ 1'3( 1'3( $'+!$ :: :: mejor* lista $ntonces el programa se hace mCcho (ara los que se quedaron pegados en la

O B O eBBh eB8h Q B B Q les digo que la Cnica forma de producir animaciones no es la que ustedes conocen* La otra es esta* B@ raphic === R === ,@ O a O b c Q d f Q a@ 6umero de grficos a animar b@ Doordenada 8=8 de donde se quiere hacer la animacion c@ Doordenada 8y8 de donde se quiere hacer la animacion d@ !egundos que se muestra cada grfico f@ 6umero de veces que se quiere repetir la animacion Luego el comando +62%+#$ Lo Cltimo>1'3( 1'3( $'+!$? podra cambiarse por un simple DL$+' pero lo que pasa es que pens, si se est trabajando en la calculadora y de repente se quiere saber la hora, y despues de ejecutar nuestro programa reloj los

;ien, espero que se haya estudiado los comandos para manipular grficos y todo eso, que es muy importante para hacer programas interactivos* 'ecuerdan el programa ese que nos deca la hora pero en un formato ms 8decente8, el cdigo era @

datos se le van a la cresta al to, este pensar 8puta la ]ea de programa penca8, entonces por eso lo hice as, para que no moleste a nadie* (ero Eque pasara si nuestro to esta haciendo un proyecto de dibujo en la hp48, o digamoslo en chileno, el ]eon est dibujando y en un entretiempo, prende la calculadora y ve la hora* Luego se va a (2D#)'$ y quiere seguir trabajando con su dibujo y **** este ya no est* $ntonces el cdigo se debe mejorar aCn ms, para que cada ve0 que se va la hora no se pierda la pantalla de grficos* 99 (2D# 'DL 8!on las 8 #2%$ &: + 99 + 2( L 8@8 L + J( BXX R 2( L 8@8 L + BXX R J( BXX R 2( L N $'+!$ &: '3; O B O eBBh eB8h Q B B Q +62%+#$ '3# (2D# !#3 DL$+' :: :: !i te parece muy lento qujate con la hp& corp y no conmigo* ;ien, ahora analicemos esta cosa* 6o me refiero al cdigo sino al hecho de que siempre en nuestros trabajos como "!sa %lla"% !s "! s%FtGa ! us! - 6l debemos preocuparnos por el producto final, o sea, pensar que el Z-f de los usuarios de la hp48 son ms ignorantes que la cresta* 1evido a esto es muy importante que el programa sea intuitivo y fcil de usar>onda ]indo]s?* (or eso es que son muy importantes las estructuras de deteccin de errores* $stCdialas ya que sirven mCcho* #ambin sera muy bueno tener a mano el manual de usuario y el cable de interfase entre el computador y la hp* !i no lo tienes ni se te ocurra comprar el original que vende la he]lett pac/ard ya que cuesta como g`X o N. lucas* $n cada universidad puedes preguntar por alguien que 8haga8 cables para la hp48, no te cobraran ms de - lucas>gBX?* ;ien, luego de ese reseso vamonos a la programacin amada* PROGRAMACION E+ERCICIOS DE

usua i% !s (3i!n( % (mal(< H %t a !s6u!sta si "a una !s6u!sta "iF! !nt!# D!sa %ll! un 6 %9 ama us! - 6l =u! B% ! TODO l% =u! :aH !n la $al$ula"% a# IIII Ha9a un 6 %9 ama =u! in;i! ta !l % "!n "! las ;a ia3l!s "!l "i !$t% i% a$tual Ha9a un 6 %9 ama =u! ll!n! la $al$ula"% a $%n 3asu a "iFi$il "! =uita "! man! a =u! al usua i% s! l! a9%t! la m!m% ia#IIII Ha9a un 6 %9 ama =u! InF!$t! t%"%s l%s "!mas 6 %9 amas "!l "i !$t% i% a$tual $%n un $J"i9% !s$%n"i"% =u! al Final "!l 6 %9 ama s! 6!9u! H =u! al !4!$uta l%s 6 %9 amas inF!$ta"%s n% s! !4!$ut! !l $J"i9% =u! s! 6!9J# 5;K i$% sua;!7#IIIII D!sa %ll! un s%FtGa ! =u! "a"a una lista "! n8m! %s $ual=ui! a !n la 6ila< n%s !nt !9u! %t a lista $%n l%s n8m! %s % "!na"%s "! maH% a m!n% ;ien, ahora larguemonos a ver los cdigos de los programas que les mand hacer, y si ustedes ni siquiera se dieron el trabajo de tratar de hacer los ejercicios entonces vayanse a la misma mierda, pues no aprenderan nada* +hhhh, y se me lvidaba, para todos aquellos que quieren impresionar a sus amigos con el cdigo del virus que dar vayanse a ver tata colores y a hecharse una pajita, ya que no dar aqu los cdigos de los programas marcados al final con IIIII, y si tu eres un real programador, demuestramelo en simples palabras y e=plicame que no te la pudiste con alguno de los trabajos y escribe a milun[starmedia*com y te mando al tiro los cdigos* 'ecuerda siempre ignorar y aborrecer a toda esa manga de pendejos que anda por ahi dndoselas de hac/er maligno* $jercicio B @ 99 85ola 8 8EDual es su nombreF8 88 26()# L 8, como estF8 L 88 26()# &: A"! 99 D+!$ A"! ;2$6 VV #5$6 8G)$ ;)$638 %! ;3< $61 A"! %+L VV #5$6 8G)$ ($6+8 %! ;3< $61 8'$!(361$ ;2$6 3 %+L, H$#368 %! ;3< 3JJ :: ::

Ha9a un 6 %9 ama =u! n%s 6 !9unt! !l n%m3 ! H lu!9% n%s salu"! 6% nu!st % n%m3 ! H n%s 6 !9unt! $%m% !stam%s# ?u! "! "%s !s6u!stas< "!6!n"i!n"% "! si la !s6u!sta "!l

$jercicio N @ 99 A+'! '$AL2!# 3'1$' :: Gue fcil no F, al menos aprendiste el comando '$AL2!# y 3'1$'* !i los conocias desde antes, mejor, vas por el buen camino* $jercicio . @ 99 !3'# '$AL2!# :: 6o digas nada y date cuenta de el funcionamiento del !3'# EGue pasara si ahora escribimos un programa en s! i%F* + ver, despues de pensar un rato record un programa que hice el aKo pasado* era para trabajo con tringulos* %e imagino que la mayora de los posibles lectores de este manual estar de alguna manera relacionado con los tringulos, o al menos estudiando matematicas* $ntonce haremos un programa que conste de varias partes, )na primera parte que dados los tres lados del tringulo nos d el valor del area de tringulo>5ern?* )na segunda parte que dados los tres lados del tringulo nos diga si es acutngulo, rectngulo o obtusngulo* 3tra tercera parte que dados los tres lados del tringulo nos entregue el valor de sus ngulos interiores en grados se=agesimales* )na cuarta parte que dados los tres lados nos d el valor de sus trs alturas* )na quinta parte que nos d el valor de sus tres transversales de gravedad y una se=ta parte que nos d el valor de sus tres bisectrices* ;ien, desde aqu se ve duro el trabajo, pero les doy un buen consejo, hagan el trabajo ustedes* 63 se limiten a estudiar solo el cdigo* #raten y se sentiran mucho mejor, no hagan nada y sern siempre una mierda asquerosa y sarnosa que se podrir en el inodoro infectado de porqueria humana* !i conocen los tringulos, se darn cuenta de que me faltaron las !2%$#'+L$!* $sto devido a que el trabajo para encontrar las simetrales dados los tres lados es un poco mas complicado* " las medianas no las puse por que simplemente es muy facil calcularlas*

;ueno, quisiera dejar en claro que yo no me las llevo 8pelas8 ya que este programa lo perd hace mucho tiempo en un 8memory clear8 que me ocurri hace varios varios meses, as que tendr que trabajar duro yo tambin para hacer nacer el cdigo desde lo profundo de mi alma de programador* juijuijui* $n la escritura del cdigo , pondr al principio de cada parte del cdigo de una parte del programa el nombre de esa parte* >debido a problemas del te=to, el digno de la rai0 cuadrada lo escribire de la forma >4?UX*-, o sea, cuatro elevado a X*[RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [&&&&&&&&&&&&&&&&&&&&(rograma $!#'2+6 )L+13'&&&&&&&&&&&&&&&&&&&&&&&[ [&&&&&&&&&&&&&&&&&&&&&&&&by =jN-u-=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[ [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [ %dulo @ 5$'36 [ Ddigo @ 99 &: + ; D 99 + ; D L L , M &: ! W>!R>!&+?R>!&;?R>!& D??UX*-W :: :: [ %dulo @ +'3 [ Ddigo @ 99 &: + ; D 99 + , U ; , U D , U &: a b c 99 a b c L 9 bacL9 c a b L 9 3' 2J 3' #5$6 8+D)#+6 )L38 %! ;3< $L!$ a b c L VV b c a L VV c a b L VV 3' 2J 3' #5$6 8'$D#+6 )L38 %! ;3< $L!$ a b c L : c a b L : b a c L : 3' 2J 3' #5$6 83;#)!+6 )L38 %! ;3< $61 $61 $61 :: :: :: [ %dulo @ +6 )L3! [ Ddigo @ 99 1$ &: + ; D 99 ; , U D , U L + , U & , ; D R R M +D3! + , &:L2!# + , U D , U L ; , U & , + D R R M +D3! ; , &:L2!#

:L2!#

+ , U ; , U L D , U & , + ; R R M +D3! D , & :: ::

[ %dulo @ +L#)'+! [ Ddigo @ 99 &: + ; D 99 + ; D 5$'36 &: +'$+ 99 +'$+ , R + M + , &:L2!# +'$+ , R ; M ; , &:L2!# +'$+ , R D M D , &:L2!# :: :: :: [ %dulo @ #'+6!A$'!+L [ Ddigo @ 99 &: + ; D 99 + , M ; , M D , M ;,UD,UL+,U&,;DRRM +D3! + , U D , U L ; , U & , + D R R M +D3! + , U ; , U L D , U & , + ; R R M +D3! &: a b c +LJ+ ;$#+ +%%+ 99 D , U a , U L D a R , R ;$#+ D3! R & X*- U + , &:L2!# + , U b , U L + b R , R +%%+ D3! R & X*- U ; , &:L2!# ; , U c , U L ; c R , R +LJ+ D3! R & X*- U D , &:L2!# :: :: :: [ %dulo @ ;2!$D#'2Y [ Ddigo @ 99 1$ &: + ; D 99 ; , U D , U L + , U & , ; D R R M +D3! +,UD,UL;,U&,+DRRM +D3! + , U ; , U L D , U & , + ; R R M +D3! &: alfa beta gamma 99 D beta !$6 R B8X beta & alfa , M & !$6 M + , &:L2!# + gamma !$6 R B8X gamma & beta , M & !$6 M ; , &:L2!# ; alfa !$6 R B8X alfa & gamma , M & !$6 M D , &:L2!# :: :: :: [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [ (rogramado por !ebastian 'ivas milun[starmedia*com [

[ Doncepcion&Dhile aKo ,XXX copyleft [ [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ " ah por fn est nuestra !)2#$ de tringulos* !i fuiste un buen niKo y trabajaste duro para sacar adelante tu cdigo propio mil F!li$ita$i%n!s, entonces si tienes partes mejores o ms optimi0adas que las mas ha0melo saber, estas en todo tu derecho, o planteame tus diferencias o detalles, o lo que sea* Jelicitaciones para quien logr o trat al menos de desarrollar el programa* " como dato ilustrativo quisiera decir que el programa en s tiene algo que se le puede optimi0ar, lo cual lo puse a propsito* adios* ;ien, ahora un descan0o por un tiempo*

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& fin del capitulo B milun[starmedia*com ]]]*geocities*comM=jN-u-=

CAPITULO ) - (EL PROGRAMA DUEAO UNA PINCELADA A LA PROGRAMACION DE +UEGOS O APLICACIONES INTERACTIVAS MEDIANTE EL USO DE LA INMERSION - LAS ESTRUCURAS B4*.u.B# UN POCO DE CADENAS (
$l nombre de este captulo se debe a que veremos otro cdigo pero este yo creo que es ms fcil que el del programa 8estriangulador8* Lo que hace el programa es que en el encendido de la calculadora apare0ca el nombre del dueKo de la calculadora por B segundo, claro que para esto la calculadora se debe apagar ejecutando al programa* $n el resto del captulo iremos mirando otras cosas muy interesantes* (or primera ve0 veremos una tcnica que por ahora llamaremos 2nstalacion previa, la cual consiste en que los programas se instalan y crean ellos mismos otros archivos ejecutables para luego auto&aniquilarse y dejar el programa 8hijo8 residente en memoria*

99 99 (2D# 'DL $'+!$ 3JJ 63%;'$== O B O e-h eB8h Q B B Q 2J$'' +62%+#$ #5$6 O 1)$h3 Q ()' $ $61 1'3( 1'3( (2D# !#3 :: 1)$h3 2J$'' !#3 #5$6 8$L ('3 '+%+ "+ $!#+ 26!#+L+13 " !) 63%;'$ $! 1)$h38 %! ;3< $L!$ 812 +%$ !) 63%;'$8 88 26()# N & : '3; 63%;'$== !#3 8$L ('3 '+%+ 5+ !213 26!#+L+13 D36 $<2#38 %! ;3< $61 :: simple* ;ueno, para que anali0ar una cosa tan

Guisiera hacer un disclaimer, por favor, cualquier error que se encuentre en mis cdigos hganmelo saber y os dar las gracias, ya que yo igual soy humano y me puedo equivocar a pesar de que casi siempre los pruebo en mi propia humilde hp489 * !i, yo poseo una hp48g y no una hp48g=, aunque ya me esta quedando muy chica esta **********y no es chiste****** :8U? 99 8($'12!#$8 %! ;3< :: $se cdigo es de un juego muy muy dificil* $jecutadlo**** ;ueno, pongmonos serios otra ve0* + ver, de que podramos hablar***mmmm****hablemos un rato de la programacin de juegos en la hp48* La primera ve0 que me aventur a hacer un juego grfico fue el aKo ZZ , cuando llevaba como ` meses usando mi hp en el cuarto medio o el Cltimo aKo de preparatoria* 'ecuerdo que comenc planteandome el desafo de hacer un programa que imitara a una pelota que rebotara por toda la pantalla de la hp48* La pelota sera un simple punto, y despues de muchos fallos y derrotas, lo logr* $ra un poco lenta, claro, debido a que yo aCn ni me saba la mitad de los comandos de la hp y en ocasiones por no saber un comando, lo imitaba con 4 o - instrucciones conocidas por mi, y debido tambin a la natural lentitud del lenguaje user&rpl* ;ueno, entonces, cuando la pelota estaba lista y funcionaba, se me ocurri que podra ser un juego si lograba poner en uno de los lados de la pantalla una barra que actuara como paleta>parecido a los antiguos juegos de atar mientras cargaban?, que se

moviera dependiendo de las teclas que yo apretara* $ntonces conoc el gran comando _+2# y comenc la mounstrosa tarea* $s que para mi, que apenas saba un poco, era muy dificil llegar a eso* (ero al final lo logr* (ero entonces no estube contento con una sola paleta, y se me ocurrio que se podra hacer con , jugadores, onda tenis o ping pong* " tambin eso lo logr* $l programa era ridiculamente lento, pero fu lo que me anim a meterme en la programacion user&rpl* ;ien, ahora, yo se que qui0 eso a ustedes no les interesa en lo ms mnimo, pero deben e=traer del te=to la palabra _+2#, por que aunque s que he mejorado como programador, es la misma idea que se me ocurrio aquella ve0 la que sigo usando para mis juegos* $s la estructura que yo uso y que por no tener nombre oficial llamar 8$structura =jN-u-=8 >disculpen por poner mi nic/ ah, pero******ccsoy humanoaa me gusta eso***** ^&: $structura @ =jN-u-= Lo que hace esta estructura es usar de manera conveniente los comandos _+2# ,+62%+#$ y (A2$_ la estructura D+!$ #5$6 $61 $61 para manejar los grficos de la hp de forma que nosotros queramos, con respuestas a las teclas que se pulsan y el tiempo, etc* $n realidad, todo lo que se nos ocurra* Domo primer ejemplo veremos un programa que lo Cnico que hace es mover un punto hacia donde nosotros queramos, con las teclas de direccion* Dodigo ejemplo B @ 99 O()6#3<Q ()' $ >X,X? 99 1)( (2<36 OeX eXQ (A2$_ X _+2# &: + 99 D+!$ W+VVN.*BW #5$6 1)( (2<3JJ >*-,X? L ()6#3< $61 W+VVN4*BW #5$6 1)( (2<3JJ >&*-,X? L ()6#3< $61 W+VV,-*BW #5$6 1)( (2<3JJ >X,*-? L ()6#3< $61 W+VVN-*BW #5$6 1)( (2<3JJ >X,&*-? L ()6#3< $61 8A2A+ $L $6'2G)$ %3L26+8 %! ;3< O()6#3<Q ()' $ $61 :: ()6#3< !#3 ()6#3< :: !e acuerdan de la palabra

optimi0acion FFF Dodigo mejorado ejemplo B @ 99 O()6#3<Q ()' $ >X,X? 99 1)( (2<36 OeX eXQ (A2$_ X _+2# &: + 99 D+!$ W+VVN.*BW #5$6 1)( (2<3JJ >*-,X? W+VVN4*BW #5$6 1)( (2<3JJ >&*-,X? W+VV,-*BW #5$6 1)( (2<3JJ >X,*-? W+VVN-*BW #5$6 1)( (2<3JJ >X,&*-? 8A2A+ $L $6'2G)$ %3L26+8 %! ;3< O()6#3<Q ()' $ $61 2J$'' L ()6#3< #5$6 $61 $61 :: ()6#3< !#3 ()6#3< :: +s nos ahorramos unos cuantos bytes y ahora @ 99 O()6#3< <=Q ()' $ 99 1)( (2<3JJ :: <= !#3 >X,X? 99 1)( (2<36 OeX eXQ (A2$_ X _+2# &: + 99 D+!$ W+VVN.*BW #5$6 <= >*-,X? W+VVN4*BW #5$6 <= >&*-,X? W+VV,-*BW #5$6 <= >X,*-? W+VVN-*BW #5$6 <= >X,&*-? 8A2A+ $L $6'2G)$ %3L26+8 %! ;3< O()6#3< <=Q ()' $ $61 2J$'' L ()6#3< #5$6 $61 $61 :: ()6#3< !#3 ()6#3< :: %ejor* ;ien, ademas de ilustrar el uso de una estrucura =jN-u-=, el ejemplo sirvi tambin para ejemplari0ar el uso de otra tecnica, la que consiste en que los programas creen otros programas en tiempo real y los ejecuten* por que si te das cuenta, el ejemplo hara lo mismo que este cdigo @ 99 1)( (2<36 OeX eXQ (A2$_ X _+2# &: + 99 D+!$ W+VVN.*BW #5$6 <= >*-,X? W+VVN4*BW #5$6 <= >&*-,X? W+VV,-*BW #5$6 <= >X,*-? W+VVN-*BW #5$6 <= >X,&*-? 8A2A+ $L $6'2G)$ %3L26+8 %! ;3< O()6#3< <=Q

$61

()' $ $61 2J$'' L ()6#3< #5$6 $61 ::

!iempre y cuando se guardara con el nombre ()6#3< y al momento de ejecucion hubiera un par ordenado en el nivel B@ de la pila* (ero como siempre hay gente muy muy, bueno, el tpico usuario, ms vale de la primera forma* (or ejemplo si haces un programa que tiene varias partes y quieres distribuirlo pensaras que a cada ]eon que quiera usarlo tendras que pasarle como 8 archivos* $ntonces es %)" util esta tcnica a la que por ahora llamaremos 26%$'!236* $n sintesis, la tecnica de inmersion es transformar un programa que contiene varios archivos a uno que tenga uno solo, y que cuando sea ejecutado crear a los demas archivos y ejecutar el principal*>se hechan de menos las funciones de D ?* Luego de la ejecucin, todos los archivos au=iliares son destruidos nuevamente* 1isculpen por salirme del tema, pero es que en algCn momento tena que decirles lo de la 26%$'!236* +hora, siguiendo con las estructuras =jN-u-=, veremos algo en donde usemos +62%+#$* 5agamos un programa que desplace por la pantalla a nuestro antojo un objeto de grficos que de antemano dibujaremos y guardaremos como variable con un nombre determinado que en $!#$ caso ser +B* (odra ser un crculo,un cuadrdo, o****siaaa, tambin podra ser una nave espacial intergalctica* ;ien, ahora, sabiendo que e=iste la variable +B que contiene un grfico el cdigo sera @ +ntes de dar el cdigo quisiera e=plicar una ve0 ms que el uso de este manual sin el manual de usuario, o sin ningCn conocimiento del lenguaje o los comandos ser de escasa o nula ayuda en tu carrera de programador, si estas solo copiando los cdigos a la hp y jugando, est muy bien si no te interesa la programacin, pero si quieres hacer lo que yo hago, y mejor, entonces estaras puro cagndola, por que ademas, cada uno tiene que tener su propio estilo*

99 99 O B O eXd eXd Q X B Q (2D# 'DL O eXd eXd Q #3BBB :: #3D$'3 !#3 99 &: _ 99 <B 3' !_+( +62%+#$ X _+2# &: Y 99 D+!$ WYVVN.*BW #5$6 _ 1)( (<&:D >*-,X? L D&:(< #3,,, $61 W<VVN-*BW #5$6 _ 1)( (<&:D >X,&*-? L D&:(< #3,,, $61 W<VV,-*BW #5$6 _ 1)( (<&:D >X,*-? L D&:(< #3,,, $61 W<VVN4*BW #5$6 _ 1)( (<&:D >&*-,X? L D& :(< #3,,, $61 8('3 '+%+13 (3' =jN-u-=8 %! ;3< O #3D$'3 #3BBB #3,,, Q ()' $ $61 :: :: :: #3BBB !#3 99 &: + ; 99 !_+( + (<&:D <, '$(L ; #3BBB :: :: #3,,, !#3 O #3BBB Q ;"#$! 1'3( 2J e.X8-Nd VV #5$6 #3D$'3 $L!$ O #3D$'3 #3BBB #3,,, Q ()' $ $61 :: $se es el cdigo necesario sabiendo que en el directorio actual hay una variable llamada <B con un dibujo y otra llamada <, igual que grande que <B pero vacia* " en caso de que sea un programa para pasarselo a tus ignorantes amigos FFFF EEEacaso ellos dibujarn un grfico y crearan un ;L+6I FFFF no, entonces el cdigo sera***** 99 O <B <, #3D$'3 #3BBB #3,,, Q ()' $ 99 O B O eXd eXd Q X B Q (2D# 'DL O eXd eXd Q #3BBB :: #3D$'3 !#3 99 &: _ 99 <B 3' !_+( +62%+#$ X _+2# &: Y 99 D+!$ WYVVN.*BW #5$6 _ 1)( (<&:D >*-,X? L D&:(< #3,,, $61 W<VVN-*BW #5$6 _ 1)( (<&:D >X,&*-? L D&:(< #3,,, $61 W<VV,-*BW #5$6 _ 1)( (<&:D >X,*-? L D&:(< #3,,, $61 W<VVN4*BW #5$6 _ 1)( (<&:D >&*-,X? L D& :(< #3,,, $61 8('3 '+%+13 (3' =jN-u-=8 %! ;3< O <B <, #3D$'3 #3BBB #3,,, Q ()' $ $61 :: :: :: #3BBB !#3 99 &: + ; 99 !_+( + (<&:D <, '$(L ; #3BBB :: :: #3,,, !#3 '3; 8 8 DB,,B4B4B4,,DBXX <B !#3 '3; 8 8 XXXXXXXXXXXXXXXX <, !#3 O #3BBB Q ;"#$! 1'3( 2J e.X8-Nd VV #5$6 #3D$'3 $L!$ O #3D$'3 #3BBB #3,,, <B <, Q ()' $ $61 ::

#en en cuenta que el programa lleva una pequeKa proteccin* 5a0lo correr as como est y luego en donde dice =jN-u-= pon tu nombre y v que pasa* $staramos acercandonos poco a poco a un importante tema para nosotros los programadores, que es proteger nuestros programas de gente charcheta que le gusta darselas de programador o de vacan simplemente, pero en realidad son lo ms poser de lo poser, lo ms nerdie de lo nerdie* +s es este manual, este es un manual de programacion o mejor dicho de ideas de programacin* 'ecuerdo que el primer ejemplo de programacin fu @ 99 853L+ %)6138 % !;3< :: 5emos avan0ado eh****** ;ien, tengo varias ideas en la cabe0a pero no se cual mostrar primero**** a ver*** dejemos de lado un rato las estructuras =jN-u-= para pasar a anali0ar algunos temas* $n todo caso, yo no creo que vuelva a hablar mucho de las e*=jN-u-= , ya que con lo que dije, solo falta ms imaginacin para crear cosas ms interesantes* $n base a eso yo program un juego llamado gato, y aunque el juego en si es simple, qued muy bien hecho* Lo que quiero decir es que la tecnica de usar las estructuras =jN-u-= es muy poderosa, basta con pensar en que a mi me ha bastado durante al menos un aKo programando distintos tipos de cosas* Amonos ahora a hablar un ratito sobre algo que a algunos puede desagradar un poco* Las matemticas* #odos sabemos que el ZZ*ZZf de los usuarios de hp48 estan en estudios que incluyen a las matematicas de alguna forma, entonces, debido a este hecho es que la programacin de aplicaciones matemticas se hace imprescindible* "o s que muchos de lo usuarios que hay all afuera no usan la hp para otra cosa que no sea jugar, pero, hay otro porcentaje que quiere hacer cosas ms productivas con ella* #ambin hay que tomar en cuenta el porcentaje de usuarios que la usan para su trabajo* %i nivel de matemticas no es tan alto, ya que en el momento que estoy escribiendo este

manual voy en primer aKo de ingeniera, por lo que mi cultura matemtica no es muy alta, pero para los programadores ms mate&magos les dejo el desafo de crear aplicaciones que les sean Ctiles* La hp48 es un intrumento que fu creado para las matemticas, numricas y simblicas, as que no es nada nada en vano programar aplicaciones matemticas* 1ar algunos problemillas para la casa @&? 5aga un programa que pase de radianes a grados* 5aga un programa que nos diga en cualquier momento cuanto falta para el aKo ,XXB* 5aga un programa que nos d el area de un pentgono regular dado su lado* 5aga un programa que nos d el volumen de una esfera dado su radio>e=tremadamente fcil? 5aga un programa que nos d la medida del lado de un dodecgono regular, el cual est ins$ it% en una circunferencia, dado el lado de un pentgono regular $i $uns$ it% en la misma circunferencia* >e=tremadamente difcil? 5aga un programa que dados dos nCmeros 8a8 y 8b8 en la pila de la forma @ ,@ B@ a b

yo creo que lo mejor sera hablar un rato sobre las cadenas* $l manejo de las cadenas es algo muy importante en todo lenguaje de programacin, ya que nos permite una fcil comunicacin con el usuario* Los programas de inteligencia artificial estn la mayora escritos en lenguajes que tienen mucho poder sobre las cadenas como por ejemplo el L2!(* " bueno, como algunos de ustedes sabran, el !"!#$%&'(L es como un hijo del L2!(, y el lenguaje que ustedes estn aprendiendo en este momento es un hijo del !"!#$%&'(L* a ver quien saca la conclusion******* @&???????? +hora, si quieres ser un buen programador aprende a manejar bin las cadenas>strings?* $stas tambin son muy importantes para entregar los resultados matemticos en forma ms legible para el tpico usuario* 5agamos un programa que dado un te=to en 8minCsculas8 nos lo entregue en 8%+")!D)L+!8# +ntes que nada diremos que el cdigo de la letra 8+8 en la hp48 es el nCmero .- y el de la letra 8a8 es el Z`* $ntonces, sabiendo que el te=to dado est en minCsculas, lo que tenemos que hacer es restarle al cdigo de cada letra del te=to la cantidad >Z`&.-VN,? y volverla a transformar en caracter otra ve0* $l cdigo que yo escrib para esto fu @ >+tencin* La persona que escriba un programa que yo le pida, como los ejercicios, y lo haga con menos cdigo que yo, o ms rpido, pondr su nombre en este manual? 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% N, & D5' Y !_+( '$(L 6$<# :: 6unca pens que sera tan fcil, en serio* $ste cdigo transforma un te=to que est en minCsculas a %+")!D)L+!* !i se anali0a el cdigo, la duracin de la ejecucin depende de la cantidad de caracteres que tiene el te=to, ya que el programa cambia cada caracter por su mayuscula*

nos diga si a es divisible por b o no* ;ien, con esos ejercicios basta por ahora* >quien los haga y quiera mi felicitacin que me mande su cdigo fuente y yo lo probar y le enviar mis felicitaciones personales**** P! % a:% a !s :% a "! un ;! "a"! % "!saFK%# Es$ i3a un 6 %9 ama =u! simul! una 6!l%ta =u! !3%ta inFinitam!nt! 6% la 6antalla< !s "!$i =u! nun$a 6a a######a ;! =ui!n s! la 6u!"!###### ;ien, realmente no se por donde seguir,

;ien, ahora, vamos a ir por partes arreglando el cdigo* (rimero que nada, este programa sirve solo para cadenas que no contengan espacios, o sea solo para palabras, ya que el caracter espacio lo transforma tambin* $so yo lo arreglara as @ 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 2J N, aV #5$6 N, & $61 D5' Y !_+( '$(L 6$<# :: 'ecuerda que el signo aV representa en este manual a 12J$'$6#$ o sea lo contrario del signo VV* VV FFF E(uedes hacer el programa con el signo 1emasiado fcil, una ofensa FFF

'$(L 6$<# :: " lo contrario seria @ 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 1)( Z` 9 !_+( NN : 2J +61 #5$6 N, L $61 D5' Y !_+( '$(L 6$<# :: 6o s, pero qui0 el Cltimo cdigo se pueda optimi0ar un poquito* #raten ustedes ^&??? +hora, a lo que queramos llegar, un programa que cambe todas las letras de mayCscula a minCscula o de minCscula a mayCscula segCn sea el caso de que la letra sea minCscula o mayCscula y que no modifique los espacios* 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% &: + 99 D+!$ W+VVN,W #5$6 D5' Y !_+( '$(L $61 W+:Z`W #5$6 N, & D5' Y !_+( '$(L $61 N, L D5' Y !_+( '$(L $61 :: :: "a estamos listos* +hora, si el te=to tubiera otros caracteres raros aparte de las letras y los espacios, los cuales no quisieramos modificar @ 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% &: + 99 D+!$ W+VVN,W #5$6 D5' Y !_+( '$(L $61 W+:Z` +61 +9B,NW #5$6 N, & D5' Y !_+( '$(L $61 W+:.4 +61 +9ZB #5$6 N, L D5' Y !_+( '$(L $61 $61 :: :: 'ecuerden que no todos los cdigos los pruebo, as que si alguno tiene falla lo arreglas yM o me avisas* cadenas* 1ejemos tranquilas un rato a las +lguien se acuerda del programa

99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 2J N, LL #5$6 D5' Y !_+( '$(L 6$<# $61 N, & :: !igamos perfeccionando el cdigo* (ero primero hagamos un programa que transforme un te=to de %+")!D)L+! a minCsculas @ 6o podra ser ms fcil**** 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 2J N, aV #5$6 N, L $61 D5' Y !_+( '$(L 6$<# :: o tambin @ 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 2J N, LL #5$6 D5' Y !_+( '$(L 6$<# $61 N, L :: ;ueno, pero sigamos ]ebeando un ratito* +hora quiero que hagas un programa que transforme todas las letras de un te=to a %ayCsculas, o !ea lo mismo que lo anterior, pero que las letras %+")!D)L+! se mantengan as* 99 1)( B 3A$' !2Y$ J3' Y 1)( Y 1)( !); 6)% 1)( 2J Z. : #5$6 N, & $61 D5' Y !_+(

$!#'2+6 )L+13' F +qu esta la version , que resuelve tambin las simetrales @ [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [&&&&&&&&&&&&&&&&&&& (rograma $!#'2+6 )L+13' , &&&&&&&&&&&&&&&&&&&&[ [&&&&&&&&&&&&&&&&&&&&&&&& by =jN-u-= &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[ [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [ %dulo @ 5$'36 [ Ddigo @ 99 &: + ; D 99 + ; D L L , M &: ! W>!R>!&+?R>!&;?R>!& D??UX*-W :: :: [ %dulo @ +'3 [ Ddigo @ 99 &: + ; D 99 + , U ; , U D , U &: a b c 99 a b c L 9 bacL9 c a b L 9 3' 2J 3' #5$6 8+D)#+6 )L38 %! ;3< $L!$ a b c L VV b c a L VV c a b L VV 3' 2J 3' #5$6 8'$D#+6 )L38 %! ;3< $L!$ a b c L : c a b L : b a c L : 3' 2J 3' #5$6 83;#)!+6 )L38 %! ;3< $61 $61 $61 :: :: :: [ %dulo @ +6 )L3! [ Ddigo @ 99 1$ &: + ; D 99 ; , U D , U L + , U & , ; D R R M +D3! + , &:L2!# + , U D , U L ; , U & , + D R R M +D3! ; , &:L2!# + , U ; , U L D , U & , + ; R R M +D3! D , & :L2!# :: :: [ %dulo @ +L#)'+! [ Ddigo @ 99 &: + ; D 99 + ; D 5$'36 &: +'$+ 99 +'$+ , R + M + , &:L2!# +'$+ , R ; M ; , &:L2!# +'$+ , R D M D , &:L2!#

:: :: :: [ %dulo @ #'+6!A$'!+L [ Ddigo @ 99 &: + ; D 99 + , M ; , M D , M ;,UD,UL+,U&,;DRRM +D3! + , U D , U L ; , U & , + D R R M +D3! + , U ; , U L D , U & , + ; R R M +D3! &: a b c +LJ+ ;$#+ +%%+ 99 D , U a , U L D a R , R ;$#+ D3! R & X*- U + , &:L2!# + , U b , U L + b R , R +%%+ D3! R & X*- U ; , &:L2!# ; , U c , U L ; c R , R +LJ+ D3! R & X*- U D , &:L2!# :: :: :: [ %dulo @ ;2!$D#'2Y [ Ddigo @ 99 1$ &: + ; D 99 ; , U D , U L + , U & , ; D R R M +D3! +,UD,UL;,U&,+DRRM +D3! + , U ; , U L D , U & , + ; R R M +D3! &: alfa beta gamma 99 D beta !$6 R B8X beta & alfa , M & !$6 M + , &:L2!# + gamma !$6 R B8X gamma & beta , M & !$6 M ; , &:L2!# ; alfa !$6 R B8X alfa & gamma , M & !$6 M D , &:L2!# :: :: :: [%dulo @ !2%$#'+L [Ddigo @ 99 1$ &: + ; D 99 ; , U D , U L + , U & , ; D R R M +D3! +,UD,UL;,U&,+DRRM +D3! + , U ; , U L D , U & , + ; R R M +D3! &: < " Y 99 2J WY9"W #5$6 Y #+6 $L!$ " #+6 $61 + R , M 8s8 + L &:#+ 2J W"9<W #5$6 " #+6 $L!$ < #+6 $61 ; R , M 8s8 ; L &:#+

$61 L &:#+ :: :: ::

2J W"9<W #5$6 " #+6 $L!$ < #+6 D R , M 8s8 D

[RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[ [ (rogramado por !ebastian 'ivas milun[starmedia*com [ [ Doncepcion&Dhile aKo ,XXX copyleft * >vLsLj?* [ [RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR[

bsico por que no sera nada de dificil desencriptar ese te=to* La gracia de la encripcin es que el te=to encriptado sea muy dificil de desencriptar, y ojal imposible>esto es imposible?, de manera que solo bajo determinadas condiciones se pueda recuperar el te=to encriptado* "a sea mediante una clave o algo as* %e voy por un tiempo* !on las N@X, de la maKana* $stoy bajando el Cltimo disco de therion* $l 1$ 2+L* 3ye, un consejo****si te gusta la mCsica anda a ]]]*napster*com o ]]]*imesh*com pura mCsica gratis******* 99 B 3A$' !2Y$ J3' ' 1)( ' 1)( !); 6)% B- L D5' ' !_+( '$(L 6$<# :: +h est nuestro primer encriptador* !e debe tener en cuenta que la hp cuenta con ,-- caracteres ascii y que no hay que preocuparse por que en alguna de las sumas de encripcin se supere esta cifra, ya que la hp lo arregla por nosotros igual que los ngulos>4-XbVZXb?, o sea que el caracter ,-` es el ,* +hora, como sera el 8crac/eador8 de nuestro ejemplo de encripcin FF !i no se te ocurre****mmmmmmmm******bueno, no importa* 99 B 3A$' !2Y$ J3' ' 1)( ' 1)( !); 6)% B- & D5' ' !_+( '$(L 6$<# :: 5ay que preocuparse eso s por el signo & ya que para este ejemplo no hay problema, puesto que es el crac/ del anterior, pero si este fuera un encriptador, hay que cuidarse del & por que todos los caracteres negativos la hp los toma como el caracter X* Don esto quiero decir que en todo proceso de encripcion que se desarrolle en la hp48 se deve tener en cuenta que el cambio de caracter siempre debe ser por otro cuyo cdigo sea %+"3' que el primero* Aeamos otro ejemplo un poquitin ms complejo @ 99 B 3A$' !2Y$ J3' ' 1)( ' 1)( !); 6)% B L D5' ' !_+( '$(L 1)( ' B L 1)( !); 6)% , L D5' ' B L

La optimizacin de este cdigo era transformar e cdigo ! "" #$ A % C "" % & ' C & ' ( A & ' # & % C ) ) * ACO+ A&'C&'(%&'#&AC))* ACO+ A & ' % & ' ( C & ' # & A % ) ) * ACO+ $$ En ,n md, o aparte- .a /,e se repet0a en 1arios de os otros md, os2 De este modo se a3orra espacio2 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& fin del capitulo , milun[starmedia*com ]]]*geocities*comM=jN-u-=

CAPITULO * 1 (CADENAS AVAN/ADAS< LA ENCRIPCICN(


"o siempre he encontrado la raja la palabra encripcin* %e gusta como suena, como a misterio, como a un jeroglfico* " justo eso es lo que se trata de hacer en la encripcin, esconder un te=to de manera conveniente* )n ejemplo muy muy muy bsico de encripcin sera por ejemplo a cada letra de un te=to sumarle tanto para que cada letra cambi y sea ilegible* 1igo que sera un ejemplo muy

!_+( '$(L , !#$( :: $ste ya sera un poco ms complicadito, aunque muy bsico aCn* (ero al menos ya costara un poco darse cuenta del algoritmo de encripcin* #ambin se podra combinar este programa con uno que de vuelta entera la cadena* 99 ' OVER SI/E START DUP HEAD M TAIL NE,T B 3A$' !2Y$ J3' ' 1)( ' 1)( !); 6)% B L D5' ' !_+( '$(L 1)( ' B L 1)( !); 6)% , L D5' ' B L !_+( '$(L , !#$( :: Lo que est con n!9 ita es lo que da vuelta la cadena* Luego se aplica un encriptador y el resultado es un poco ms rebuscado* #engan en cuenta que la gracia del manual es que ustedes vayan creando cosas al mismo tiempo que yo les voy enseKando ideas* ;ueno, pero hagamosle una pruebita al encriptadorrrr @ !i ingreso el te=to 8temuco es una bella ciudad8 lo que obtengo es @ 8 8 Lo primero que se me viene a la mente si estamos hablando de ocultar el te=to original, es que la segunda cadena tiene el mismo !2Y$ que la primera, as que esto se debe solucionar de forma inteligente* + ver****no podemos ponerle a cada te=to que encriptemos unos caracteres de ms siempre iguales, ya que el posible 8desencriptador8 se dara cuenta de que todos los te=tos encriptados siempre comien0an con la misma cosa o terminan con la misma cosa* Lo que se me ocurre es que se le sumen caracteres al te=to de acuerdo al te=to, o sea que se vare segun el te=to el nCmero de caracteres a aKadir* $s una buena idea*

$61 $61 !#3L $61

2J W+:.W #5$6 O <HN Q >B,X? !#3& 2J W;:NW #5$6 O <HN Q >X,B? !#3& 2J W+9&-*-W #5$6 O <HN Q >B,X?

2J W;9&NW #5$6 O <HN Q >X,B? !#3L $61 " <HN L (2<36 O eXh eXh Q I$" 2J X VV #5$6 (A2$_ " <HN L G, $L!$ O <HN ((+' GB G, Q ()' $ 8by =jN-u-=8 %! ;3< DL$+' $61 :: :: G, !#3 G, :: USANDO ANIMATE 1 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O II, Q 'DL ;"#$! 2J ;`.`h VV #5$6 O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, :: IIB !#3 $L!$ A+'! ()' $ $61 99 1)( D&:' &: # + ; 99 !_+( # _G, '$(L 2J W+:-*8W #5$6 O <HN, Q >B,X? !#3& $61 2J W;:,*-W #5$6 O <HN, Q >X,B? !#3& $61 2J W+9&-*`W #5$6 O <HN, Q >B,X? !#3L $61 2J W;9&,*8W #5$6 O <HN, Q >X,B? !#3L $61 # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L II, $L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: $s evidente que el programa corre mucho ms rpido con (A2$_ pero se debe tener en cuenta la ventaja que con +62%+#$ se puede cambiar el tonto punto por una figura predefinida por nosotros* !i se quiere hacer correr el ejemplo tengase en cuenta no modificarlo ^&?

USANDO PVIEN 1 99 99 O <HN Q ()' $ >X*-,X*-? <HN !#3 $'+!$ >X,X? (2<36 O eXh eXh Q (A2$_ >X,X? G, :: GB !#3 99 1)( D&:' &: " + ; 99 " (2<3JJ

III PARTE
CAPITULO ' 1 (ANALISIS DEL CCDIGO >UENTE DEL PROGRAMA PELOTA< EL CUAL HACE ?UE UN PUNTO REBOTE POR LA PANTALLA SIMULANDO EL MOVIMIENTO DE UNA PELOTA( CAPITULO ) 1 (INTENTEMOS CREAR UN VIRUS VERDADERO( CAPITULO * (PROTEGER NUESTROS TRABA+OS DE LOS >ALSOS HACOERS< TAMBIEN LLAMADOS PPHACOERS DE PLQSTICORR( CAPITULO 4 (ENCRIPCION DE TE,TOS EN LA HP-48( CAPITULO . (SSSS LIBRERIAS TTTT( CAPITULO 0 (AL >ILO DE LA MUERTE< LIBEVAL - S-SEVAL< LOS COMANDOS DEL IN>IERNO#( CAPITULO ' 1 (ANALISIS DEL CCDIGO >UENTE DEL PROGRAMA PELOTA< EL CUAL HACE ?UE UN PUNTO REBOTE POR LA PANTALLA SIMULANDO EL MOVIMIENTO DE UNA PELOTA(
Les hablar un poco de mi* Duando veo por ejemplo el cdigo en lenguaje D de un programa llamado !3'# el cual dado un arreglo de nCmeros los ordena de mayor a menor, no se por donde empe0ar* 1e primera, lo Cnico que veo son muchos geroglificos que no entiendo para nada, es decir, tres ciclos for anidados daban el resultado correcto, pero de que yo entend el cdigo*****la verdad es que aCn

no* (or esto, y adems por un e&mail que me llego de un amigo de Aene0uela dicindome que estaba un poco difcil el cdigo de la pelota, es que decid dedicarle un capitulo entero a su discusin* !i alguien as lo desea, puede seguir en el segundo capitulo sin problemas, ya que en este primer capitulo no dar ningCn comando nuevo ni nada por el estilo, lo que har ser hacerles a ustedes entender, cada idea que estuvo en mi cabe0a en el momento en que se me ocurri el cdigo para hacer el programa, o sea, entender completamente la funcionalidad del cdigo* ;ueno, esperenme un poco, voy a buscar el cdigo que lo tengo en la segunda parte****** )!+613 (A2$_ @ 99 99 O <HN Q ()' $ >X*-,X*-? <HN !#3 $'+!$ >X,X? (2<36 O eXh eXh Q (A2$_ >X,X? G, :: GB !#3 99 1)( D&:' &: " + ; 99 " (2<3JJ 2J W+:.W #5$6 O <HN Q >B,X? !#3& $61 2J W;:NW #5$6 O <HN Q >X,B? !#3& $61 2J W+9&-*-W #5$6 O <HN Q >B,X? !#3L $61 2J W;9&NW #5$6 O <HN Q >X,B? !#3L $61 " <HN L (2<36 O eXh eXh Q I$" 2J X VV #5$6 (A2$_ " <HN L G, $L!$ O <HN ((+' GB G, Q ()' $ 8by =jN-u-=8 %! ;3< DL$+' $61 :: :: G, !#3 G, :: )!+613 +62%+#$ @ 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O II, Q 'DL ;"#$! 2J e ;`.`h VV

#5$6

O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, $L!$ A+'! ()' $ $61 :: IIB !#3

99 _G, '$(L !#3& $61 !#3& $61 !#3L $61 !#3L $61 II,

1)( D&:' &: # + ; 99 !_+( # 2J W+:-*8W #5$6 O <HN, Q >B,X? 2J W;:,*-W #5$6 O <HN, Q >X,B? 2J W+9&-*`W #5$6 O <HN, Q >B,X? 2J W;9&,*8W #5$6 O <HN, Q >X,B? # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L

objetos, como la gran mayora de ustedes sabrn, necesita para e=istir de , parmetros, su coordenada 8=8 y su coordenada 8y8, esto es as al menos en , dimensiones* ;ueno, entonces decidimos lo mas adecuado para representar los puntos, o sea, la misma forma en que la hp los representa, y esta forma es >a,b? donde a es la coordenada 8=8 y b es la coordenada 8y8* ;ueno, pero adems de un simple punto, tambin necesitamos que este punto se mueva, o sea, que vari su ubicacin, o por lo tanto, que varen sus coordenadas segCn sea necesario* $ntonces se me ocurrio la idea que viene a continuacin, y que es la parte medular de este cdigo* Lo que necesitaba era un 8sumador8, o sea, otra coordenada que se sumara a la original para producir el efecto de movimiento* $l 8sumador8 solo tendra algunos valores para tomar* $n efecto, son 4* >B,B? este es cuando se mueve hacia arriba&derecha, ya que le suma B a cada coordenada, con lo que se produce el efecto de que se mueve para arriba y a la derecha* +nlogamente pasa con @ >&B,B? 9& arriba y a la i0quierda >B,&B? 9& abajo y a la derecha >&B,&B? 9& abajo y a la i0quierda !i alguien no entendi esta parte le dar un pequeKo ejemplo @ !upongamos que las coordenadas actuales del punto son >X,X? y el punto en ese momento se va moviendo en direccin arriba&derecha, entonces, suponiendo que la diferencia entre un punto y otro es X*-, se supone que la siguiente ubicacin del punto sera >X*-,X*-? punto que efectivamente se encuentra arriba y a la derecha del >X,X?*

$L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: ;ueno, primero que nada, ah esta el cdigo de los dos programas que hacen lo que nosotros queramos* )no usa el comando (A2$_ y el otro el comando +62%+#$>este es mi favorito?* empecemos por el cdigo del (A2$_ @ 99 99 O <HN Q ()' $ >X*-,X*-? <HN !#3 $'+!$ >X,X? (2<36 O eXh eXh Q (A2$_ >X,X? G, :: GB !#3 99 1)( D&:' &: " + ; 99 " (2<3JJ 2J W+:.W #5$6 O <HN Q >B,X? !#3& $61 2J W;:NW #5$6 O <HN Q >X,B? !#3& $61 2J W+9&-*-W #5$6 O <HN Q >B,X? !#3L $61 2J W;9&NW #5$6 O <HN Q >X,B? !#3L $61 " <HN L (2<36 O eXh eXh Q I$" 2J X VV #5$6 (A2$_ " <HN L G, $L!$ O <HN ((+' GB G, Q ()' $ 8by =jN-u-=8 %! ;3< DL$+' $61 :: :: G, !#3 GB :: ;ueno, lo que haremos ser ir construyendo de a poco el cdigo* Lo que necesitamos es un punto* )n simple punto* ;ueno, este

$spero se haya entendido* $se es el primer ra0onamiento para hacer el programa* (ero ahora debemos preguntarnos, cuando variar el 8sumador8 FFF $sto es muy simple de responder, sobre todo si estamos tratando de simular el movimiento de una pelota***** !implemente, supongamos que el movimiento va para arriba, entonces, cuando la pelota llegue al limite superior de la pantalla, en ese momento es cuando se debe cambiar el valor >B,B? por el valor >B,&B? para que el movimiento siga para abajo* " como resolvemos esa parte, simplemente decidiendo si las coordenadas se encuentran en esos lmites* ;ueno analicemos el primer mdulo @ 99 O <HN Q ()' $ >X*-,X*-? <HN !#3 $'+!$ >X,X? (2<36 O eXh eXh Q (A2$_ >X,X? G, :: al que se le ha llamado GB* > GB !#3 ? Lo primero, la lnea O <HN Q ()' $ es por que simplemente la variable <HN es el 8sumador8 del que hablbamos endenante* Luego, se crea la variable <HN con el valor >X*-,X*-?* 1espus, se borra la pantalla de grficos con el comando $'+!$ y luego se pinta un punto en la ubicacin >X,X? en la lnea >X,X? (2<36 el cual ser el primer punto del ciclo* $ntonces, mediante la lnea O eXh eXh Q (A2$_ se muestra el punto en pantalla y tu lo ves por primera ve0* 1espus de haberlo mostrado, se pone el valor >X,X? en la pila, que representa la ubicacin del punto recin pintado, y se llama al programa G,, que es el otro mdulo del programa pelota* este es @ 99 1)( D&:' &: " + ; 99 " (2<3JJ 2J W+:.W #5$6 O <HN Q >B,X? !#3&

$61 !#3L $61

2J W;:NW #5$6 O <HN Q >X,B? !#3& 2J W+9&-*-W #5$6 O <HN Q >B,X?

2J W;9&NW #5$6 O <HN Q >X,B? !#3L $61 " <HN L (2<36 O eXh eXh Q I$" 2J X VV #5$6 (A2$_ " <HN L G, $L!$ O <HN ((+' GB G, Q ()' $ 8by =jN-u-=8 %! ;3< DL$+' $61 :: :: ;ien, ahora vemos que dentro de este cdigo no se vuelve a llamar nunca mas al programa GB, por lo que nos damos cuenta que el GB se ejecuta solo una ve0 para luego pasar el control total a este otro modulo del programa, al que hemos llamado G,* ;ien, lo primero que hacemos es duplicar la coordenada dejada por GB, y luego mediante un par de cosas dejamos en la pila por ejemplo @ si el GB haba dejado ,@ B@ >X,X?

nosotros, en la lnea 1)( D&:' lo que hacemos es dejar eso de esta manera @ N@ ,@ B@ >X,X? X

esto es, en el nivel N, tenemos la ubicacin, en el dos la coordenada = y en el uno la coordenada y* $ntonces procedemos a tomarlas como variables locales en la lnea &: " + ; en donde " es la ubicacin X,X?***+ es la coordenada 8=8 y ; es la coordenada 8y8* Lo primero que hago dentro de este mdulo, es borrar el punto anterior, para que se cumpla la simulacin de movimiento con la lnea " (2<3JJ $ntonces procedemos a hacer algo muy importante, que es comparar las coordenadas de el punto con los lmites de la pantalla, mediante las lneas

$61

$61 $61 !#3L $61 !#3L $61

2J W+:.W #5$6 O <HN Q >B,X? !#3& 2J W;:NW #5$6 O <HN Q >X,B? !#3& 2J W+9&-*-W #5$6 O <HN Q >B,X? 2J W;9&NW #5$6 O <HN Q >X,B?

" <HN L Jinalmente se llama nuevamente el mismo programa en forma recursiva* $n caso de que el valor arrojado por I$" fuera distinto, lo que se hace es borrar las variables con las que trabaj el programa, o sea, O <HN ((+' GB G, Q ()' $ ((+' es una variable que aparece automticamente cuando se ejecuta (A2$_* Lo Cltimo es una pantallita donde dice 8by =jN-u-=8, jeje, ese soy yo, el autor* Don la palabra DL$+' se borra el contenido de la pila* $so sera todo el cdigo, si a alguien no le qued algo claro, no tiene que pensar nada tonto, solo escrbame y yo le e=plicare lo que quiera* =jN-u-= milun[starmedia*com http@MM]]]*geocities*comM=jN-u-= $H$%(L3 D36 +62%+#$ +53'+ A$+%3! $L

+h vemos que se comparan las coordenadas con los lmites de la pantalla y segCn eso se cambia el valor de la variable <HN que es nuestro 8sumador8* Luego viene el cdigo " <HN L (2<36 O eXh eXh Q I$" el cual lo que hace es @ B&(ona la variable local que contiene la ubicacin en la pila ,&Llama al sumador y se lo suma N&(inta el pi=el Luego, ponemos el O eXh eXh Q para poder visuali0ar luego la pantalla de grficos conteniendo el punto* (ero antes de eso, se llama a I$", que sirve para ver si se ha presionado una tecla* $sto es para hacer que el programa termine si se presiona una tecla*** 2J X VV #5$6 (A2$_ " <HN L G, $L!$ O <HN ((+' GB G, Q ()' $ 8by =jN-u-=8 %! ;3< DL$+' $61 $so es lo Cltimo, se compara el valor arrojado por I$" con X* " si X es igual al valor arrojado, significa que no se ha presionado ninguna tecla, y el bucle infinito debe seguir* $sto se reali0a mediante@ (A2$_ " <HN L G, $sto, con (A2$_, se muestra la pantalla de grficos, ya que las coordenadas estn en la pila*> O eXh eXh Q ? Luego, se pone la coordenada en donde fue pintado el pi=el@

)!+613 +62%+#$ @ 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O II, Q 'DL ;"#$! 2J e ;`.`h VV

#5$6

O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, $L!$ A+'! ()' $ $61 :: IIB !#3 99 1)( D&:' &: # + ; 99 !_+( # _G, '$(L 2J W+:-*8W #5$6 O <HN, Q >B,X? !#3& $61 2J W;:,*-W #5$6 O <HN, Q >X,B? !#3& $61 2J W+9&-*`W #5$6 O <HN, Q >B,X? !#3L $61

!#3L $61 II,

2J W;9&,*8W #5$6 O <HN, Q >X,B? # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L

;ueno, si se ejecuta el programa de las dos formas funcionar igual, la diferencia esta en una sola parte* !upongamos que yo soy un 85ac/er& #36#38, o sea, la persona que quiere hacer algo raro a nuestro cdigo, algo raro como cambiar la frase 8by =jN-u-=8 por 8creado por hac/er&#36#38 +lgo muy comCn entre todos los perdedores que quieren jugar un rato a lo crac/ersMhac/er* ;ueno, la cosa es que con ese cdigo e=tra, si alguien intentase cambiar de cualquier forma la frase 8by =jN-u-=8 al ejecutar el cdigo lo Cnico que vera sera como todas sus variables del directorio actual se borran* > A+'! ()' $ ? $sto a menos que la primera variable fuera un directorio no vaco, pero esto es una trivialidad tcnica, lo que importa es el hecho* )na de las formas de proteccin de los programas es mediante el uso del comando ;"#$!, el cual nos da la suma de verificacin de cualquier cosa* $ntonces lo que yo hice fue hacerle un ;"#$! al modulo que contiene la frase, y lo comparo con el verdadero valor que ya he obtenido* $ntonces, la gracia del asunto es que es hac/er&#36#3 ya no le ser posible llegar a reempla0ar las cadenas por lo que el quiera, por que cada cadena podramos guardarla en variables, o hacerles ;"#$!* ;ueno, esto no es una proe0a, ya que alguien con los conocimientos adecuados podra fcilmente crac/ear el cdigo, pero mis amigos, para los que no lo sepan, as funciona el mundo de la informtica* Luego, en captulos posteriores, desarrollaremos mtodos ms avan0ados de proteccin*

$L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: ;2en, empe0are desde lo mas importante, aqu vamos a hablar un poco sobre la proteccin de nuestros programas, considere el cdigo siguiente @ 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, :: IIB !#3 99 1)( D&:' &: # + ; 99 !_+( # _G, '$(L 2J W+:-*8W #5$6 O <HN, Q >B,X? !#3& $61 2J W;:,*-W #5$6 O <HN, Q >X,B? !#3& $61 2J W+9&-*`W #5$6 O <HN, Q >B,X? !#3L $61 2J W;9&,*8W #5$6 O <HN, Q >X,B? !#3L $61 # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L II, $L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: 5ay una ligera diferencia, en este Cltimo falta la lnea @ O II, Q 'DL ;"#$! 2J ;`.`h VV #5$6 y al final falta $L!$ A+'! ()' $ $61

+hora, bueno, disculpen por salirme del tema, lo que bamos a hacer era una investigacin sobre el cdigo fuente de la ($L3#+ que salta por toda la pantalla, usando el comando +62%+#$* ;ueno, si vamos a hacer esto, hagmoslo sin la proteccin, ya que no viene al caso****** 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, :: IIB !#3 99 1)( D&:' &: # + ; 99 !_+( # _G, '$(L 2J W+:-*8W #5$6 O <HN, Q >B,X? !#3& $61 2J W;:,*-W #5$6 O <HN, Q >X,B? !#3& $61 2J W+9&-*`W #5$6 O <HN, Q >B,X? !#3L $61 2J W;9&,*8W #5$6 O <HN, Q >X,B? !#3L $61 # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L II, $L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: ;ueno, la idea es muy parecida al programa anterior* !olo que ahora en ve0 de usar puntos, usaremos pequeKos dibujos que simularan puntos* Las lneas '3; B B BX _G !#3 '3; B B XX _G, !#3 Lo que hacen es crear dos grobs de BRB pi=eles* )nos de ellos esta pintado y el otro no* $l que no esta pintado ser usado como 8goma de borrar8* $sto debido a que es ms rpido que usar el $'+!$, el cual borra toda la pantalla de grficos*

+hora, la sinta=is del comando +62%+#$ es un poco distinta a la del comando (A2$_* $l comando +62%+#$ requiere que en el nivel , de la pila se encuentre el grob a visuali0ar, y en el nivel B de la pila se debe encontrar una lista que contenga los siguientes parmetros @ a & 6umero de grobs a mostrar b & Doordenada 8=8 en formato OQ de donde se quiere mostrar el grob* c & Doordenada 8y8 en formato OQ de donde se quiere mostrar el grob* d & #iempo que se mostrar cada grob en segundos* e & 6umero de veces a mostrar la animacin* Don las siguientes salvedades* !i d es cero, la animacin se muestra automticamente, muy rpido* !i e es cero, la animacin se muestra indefinidamente* " la lista es de la siguiente forma@ O a O eb ec Q d e Q 3 sea una lista con 4 elementos*

2gual que la versin con (A2$_, el programa constar de dos mdulos que se crean y se destruyen cuando comien0a y termina el programa respectivamente* $l primero de ellos es @ 99 O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, :: Lo primero es borrar las variables usadas por el programa, en caso de cualquier problema

mediante la lnea @ O <HN, ((+' IIB II, _G _G, Q ()' $ Luego, se guarda el primer sumador con >X*-,X*-? <HN, !#3 1espus, mediante la lnea $'+!$ (2D# 'DL 3btenemos un grob del porte de la pantalla, para trabajar sobre l*

llamamos IIB* $l cdigo del segundo mdulo, llamado este II, es @ 99 _G, '$(L !#3& $61 !#3& $61 !#3L $61 !#3L $61 II, 1)( D&:' &: # + ; 99 !_+( # 2J W+:-*8W #5$6 O <HN, Q >B,X? 2J W;:,*-W #5$6 O <HN, Q >X,B? 2J W+9&-*`W #5$6 O <HN, Q >B,X? 2J W;9&,*8W #5$6 O <HN, Q >X,B? # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L

la lnea @

+ntes de seguir, debemos decir, el nombre de las variables que se crean en el programa***** _G 9& es el punto _G, 9& la goma de borrar, o sea un punto vaco* <HN, 9& sumador IIB 9& modulo que empie0a el programa II, 9& modulo principal +hora continuemos***** $l programa sigue con @ >X,X? _G 3' Lo que hace esto es pegar el contenido de _G en el grob base que anteriormente creamos, en la coordenada >X,X?* $ntonces, ya tenemos un primer grob, con el punto pintado en la ubicacin >X,X? listo para empe0ar***** $sto se reali0a con la lnea @ O B O eXh eXh Q X B Q +62%+#$ >X,X? II, La cual lo que hace es mostrar el dibujo en pantalla, y luego, pasarle el valor en donde fue pinado el pi=el al modulo II,* $ntonces, eso sera todo lo que hace este primer mdulo, al que

$L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: Lo primero es lo mismo que el cdigo (A2$_, o sea, tomar tres objetos como variables locales, la ubicacin entera, la coordenada = y la coordenada y* 1)( D&:' &: # + ; Aemos que ahora la ubicacin se llama #* ;ueno, entonces, pensemos en que es lo que pasa en ese momento*** Domo tomamos la ubicacin como variable local junto con sus partes, lo que queda en la pila seran dos cosas@ N@ ,@ BP grobPactual O B O eXh eXh Q X B Q

$ntonces, como debemos trabajar siempre solo con el grob, usamos la palabra !_+( Luego, se borra el punto recin mostrado mediante la lnea@ # _G, '$(L

ya que # es la ubicacin y _G, es el punto vaco que borra el anterior* Luego lo mismo de antes para decidir si la pelota ha llegado a los limites de la pantalla y segCn eso cambiar el sumador@ !#3& $61 !#3& $61 !#3L $61 !#3L $61 2J W+:-*8W #5$6 O <HN, Q >B,X? 2J W;:,*-W #5$6 O <HN, Q >X,B? 2J W+9&-*`W #5$6 O <HN, Q >B,X? 2J W;9&,*8W #5$6 O <HN, Q >X,B?

quise hacer esto en lenguaje D no me cost nada* !iendo un total ignorante en la programacin c* Lo que ocurri fue que como yo haba hecho el programa para la hp&48 ya tena la idea, y la 8traduje8 a lenguaje D* #odas sus dudas a milun[starmedia*com $spero que se haya entendido algo de toda esta mugre**** jaja**** J26 1$L D+(2#)L3 B &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

1espus, se pone la Cltima ubicacin del punto nuevamente, se le suma el correspondiente sumador, y se llama a la variable _G, la cual contiene el punto a visuali0ar* #eniendo estos tres parmetros en la pila>grob, ubicacin, grob? ya podemos pegar un nuevo punto**** #odo esto en la lnea@ # <HN, L _G 3' !_+( $se !_+( es para dejar listo el grob con los parmetros necesarios para hacer una nueva animacin* 1espus se llama al I$" para ver si se presiona una tecla, y en caso de que no se presione ninguna, se hace la animacin, y se pone en la pila el valor de las coordenadas>ubicacin? del punto pintado recin, llamndose luego el programa II, a si mismo, en forma recursiva* 2J X VV #5$6 +62%+#$ # <HN, L II, $n caso de que se presiona una tecla, tenemos el cdigo @ $L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $l cual ya sabemos lo que hace, terminar correctamente el programa, borrando las variables que us temporalmente* ;ueno, eso sera todo* La verdad es que a mi me ha ayudado bastante, ya que cuando

CAPITULO ) 1 (INTENTEMOS CREAR UN VIRUS VERDADERO(


Aamos a revisar la teora y programacin de un muy simple virus* Lo que har este virus ser infectar a todos los otros programas user&rpl que se encuentren en el directorio actual insertndole un pequeKo tro0o de cdigo al final de cada archivo user&rpl que se encuentre* Domando@ #"($ Lo que hace este comando es decirnos el tipo de objeto que se encuentra en el nivel B de la pila* Lo que devuelve es un nCmero que variar segCn el tipo de objeto* Aase la siguiente tabla @ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6)%$'3 i #2(3 1$ 3;H$#3 i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && X &&&i&& 6)%$'3 '$+L &&&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B &&&i&& 6)%$'3 D3%(L$H3 &&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && , &&&i&& D+1$6+ 1$ D+'+D#$'$! 3 !#'26 &&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && N &&&i&& !2!#$%+ '$+L &&&&&&&&&&&&&&&&&&&&&&&&&i

&&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && 4 &&&i&& !2!#$%+ D3%(L$H3 &&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && - &&&i&& L2!#+ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && . &&&i&& 63%;'$ L3;+L &&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ` &&&i&& 63%;'$ L3D+L &&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && 8 &&&i&& ('3 '+%+ aaaaaa &&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && Z &&&i&& 3;H$#3 +L $;'+2D3 &&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && BX &&i&& $6#$'3 ;26+'23 &&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && BB &&i&& 3;H$#3 1$ 'jJ2D3! &&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B, &&i&& 3;H$#3 $#2G)$#+13 &&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && BN &&i&& 3;H$#3 1$ )621+1$! &&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B4 &&i&& 63%;'$ 1$ <L2; &&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B- &&i&& 12'$D#3'23 &&&&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B. &&i&& ;2;L23#$D+ &&&&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B` &&i&& 3;H$#3 1$ !$ )'21+1 &&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && B8 &&i&& J)6D236 26D3'(3'+1+ &&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && BZ &&i&& D3%+613 26D3'(3'+13 &&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,X &&i&& !2!#$%+ ;26+'23 &&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,B &&i&& '$+L $<#$61213 &&&&&&&&&&&&&&&&&&&&&&&i

&&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,, &&i&& D3%(L$H3 $<#$61213 &&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,N &&i&& !2!#$%+ '$L+D236+13 &&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,4 &&i&& D+'+D#$' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,- &&i&& 3;H$#3 1$ Dk12 3 &&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,X &&i&& 1+#3! 1$ ;2;L23#$D+ &&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i && ,B &&i&& 3;H$#3 $<#$'63 &&&&&&&&&&&&&&&&&&&&&&&i &&&&&&&&i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i PPPPPPPPi PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP i !$ 1+'+6 D)$6#+ G)$ $L G)$ 63! !2'A$ $! $L 8* 5ago esta aclaracin por que necesitaremos detectar las variables que contengan programas para modificarlos segCn nosotros queramos* (ero lograr esto viene mucho 1espus, luego de unos buenos ra0onamientos* Domando@ #A+'! Lo que hace este comando, es, dado un nCmero cardinal en la pila, nos entrega una lista conteniendo los nombres de todas las variables del directorio actual, cuyo tipo sea el que representa el numero dado* ;ien, veamos al asunto de inmediato* Lo que haremos en sntesis ser detectar todas las variables que sean programas user&rpl y sus respectivos nombres* Luego, transformamos todos esos programas a cadenas de te=to* 1espus, le concatenamos el te=to que nosotros queramos @&?, y 1espus, volvemos a transformar la cadena en programa, y le ponemos sus respectivos nombres* Dlaro que todo esto no es nada fcil, ni me lo imagino como lo haremos, pero s que es posible**** #rataremos de hacer algo bonito* @&?

Gue hace el siguiente cdigo@ 99 DL$+' 8 #A+'! ::

B8X-ZZ 1'3( :: $so se concatenaba al final del cdigo**** " a estas alturas supongo que sabrs que lo Cnico que hace es poner el nCmero B8X-ZZ en la pila y borrarlo automticamente sin que el usuario se de cuenta**** 3 sea, era un virus 82nofensivo8, en otras palabras, que no hace gran daKo al usuario**** 1e hecho no le hace nada a nadie, a parte de la memoria que se usa para aumentar el archivo* E (or que B8X-ZZ F $s la fecha de nacimiento de alguien especial**** " por eso, bautic a este tipo de virus con ese nombre*** simplemente 99 B8X-ZZ ::* Gue pasara si en ve0 del anterior cdigo hubiera puesto @ X (A+'! 5$+1 1)( 1$#+D5 ()' $ :: $so sera algo as como que cada ve0 que se ejecutara el programa infectado se borrara una librera* !e pueden hacer tantas cosas con esta maquinita*****

Lo Cnico que hace es mostrarnos una lista con los nombres de las variables que son programas en el directorio actual* $sa ser la base sobre la que trabajaremos* +hora me voy, por que tengo mucho sueKo* chau***** 99 8%+h+6+ 63! A$%3!8 %! ;3< :: ;ueno, estoy de vuelta como una semana 1espus de que me 8fui8, jaja , bien, ahora, vamos viendo****+hhh, el virus, una ve0 lo hice, recuerdo que funcionaba bien, pero era un poco lento, sobre todo si en el directorio actual se encontraban muchos programas, los cuales deba infectar uno por uno**** $sto tambin ocurra en caso de que los programas presentes fueran de gran tamaKo* 3tro tipo de virus, ntegramente creado por mi, lo pueden estudiar y entender en @ http@MM]]]*geocities*comM=jN-u-=M=vir*html +unque este es menos inteligente que el que anali0amos aqu, es mucho ms destructivo* $s parte de mi pgina, en la cual encontraras informacin sobre la hp&48* La direccin ra0 de mi pgina es http@MM]]]*geocities*comM=jN-u-= La verdad de las cosas, es que en este momento no puedo programar nada, ya que tengo la calculadora sin pilas**** +lguien en mi casa me las ocup para el control remoto, as que cuando compre pilas continuar con la programacin del virus* 'ecuerdo que en la primera versin del virus, lo que se pegaba al final de cada programa user del directorio era @

)ps, estoy de vuelta, 1espus de como , semanas sin escribir nada, mil disculpas, aunque a ustedes realmente no les afecta***** Aamos a ir creando lentamente el cdigo del virus B8X-ZZ* (rimero, traigamos a la pila una lista con los nombres de todos los archivos o variables que contienen programas user&rpl* $sto lo logramos de la siguiente forma @ 99 8 #A+'! :: Luego, esa lista la duplicamos, y obtenemos luego, otra lista, con los contenidos de cada variable***** o sea, ampliemos el cdigo a@ 99 8 #A+'! 1)( 99 'DL :: 13L2!# ::

!i no se entendi la parte del 13L2!#, este es un comando que nos permite aplicar a una lista, un pequeKo programa, en este caso 99 'DL ::* ahora podemos ver algo como esto @ N@ ,@ O programaB programa, programaN ***** programa>n? Q B@ O 99cdigoB:: 99cdigo,:: 99cdigoN::*****99cdigo n:: Q +hora, lo que vamos a hacer, es un ciclo, el cual se repetir un nCmero 8n8 de veces, o sea, el nCmero de programas que se infectar* Domo hacemos esto FFF ;ueno, se supone que cada uno debe ra0onar el problema, y segCn su estilo resolver el problema en su cabe0a, aplicando la programacin y el lenguaje a la resolucin del problema**** ;ueno, supongo que as funciona el hbito de programar***** "o , lo primero que hara, sera obtener en la pila los elementos de la lista que est en el nivel B@ de la pila, o sea, la lista que contiene el cdigo de los programas que se quiere infectar* )sando el comando 3;H&: nos quedan todos los elementos en la pila y en el nivel B@ nos queda el nCmero de elementos que tena la lista* $ste es el famoso nCmero n que utili0aremos para repetir el ciclo que ir infectando cada cdigo* o sea, el nuevo cdigo ser* 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 [[[[ :: :: +h esta nuestra nueva versin, aqu, se supone que luego de ejecutar el comando 3;H&: tomamos el nCmero de programas a infectar como variable local, que en este caso llamamos +* Luego, lo que pusimos como [[[[ es lo que deberemos reempla0ar con el cdigo que trabajar a los cdigos de los programas, para ir infectndolos uno por uno* !igamos ampliando el cdigo, ahora lo que har ser dejar todo listo para aplicar cmodamente el ciclo que se debera repetir n o

>n&B? veces todava no estoy seguro, pero veamos***** 1espus de haber tomado el n como variable local voy a meter una lista vaca, en donde iremos ingresando cada cdigo modificado, y la intercambiare de posicin con el Cltimo cdigo, o sea**** $jemplo@ supongamos que hay N programas y estamos en el momento justo 1espus de haber tomado el numero de programas como variable local* 4@ O nombreB nombre, nombreN Q N@ 99 cdigo B :: ,@ 99 cdigo , :: B@ 99 cdigo N :: +hora veamos como queda la pila luego de meter un lista vaca en el nivel , de la pila, o sea, intercambindola de posicin con el 99 cdigo N :: 4@ 99 cdigo B :: N@ 99 cdigo , :: ,@ O Q B@ 99 cdigo N :: (ara hacer eso necesitamos ampliar el cdigo a @ 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 O Q !_+( :: ::

+h tenemos nuestra lista vaca, entonces, el ciclo completo que necesitamos sera en seudo&cdigo @ Ptransformar el cdigo en string Pduplicar ese string Pobtener su largo Pel largo es lo mismo que la ubicacin de la Cltima letra o simbolo* $n caso de ser un programa, que lo es*** el Cltimo signo siempre es 8::8 por lo que debemos reempla0arlo por 8 B8X-ZZ 1'3( ::8 Pvolver el string a programa* Pmeterlo en la lista*

cdigo

Phacer s]ap, y continua con el otro

Lo haremos con una secuencia de repeticin !#+'# 6$<# o sea @ 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 O Q !_+( B + !#+'# &:!#' [Ptransformar el cdigo en string 1)( [Pduplicar ese string !2Y$ [Pobtener su largo 8 B8X-ZZ 1'3( ::8 [Pcambiar 8::8 por 8B8X-ZZ ::8 '$(L 3;H&: [Pvolver el string a programa* L [Pmeterlo en la lista* !_+( [Phacer s]ap, y continua con el [Potro cdigo 6$<# ::

para volver a trabajar con los cdigos, y luego, '$AL2!#, para invertir el orden de los cdigos, el cual fue invertido durante el ciclo infectador* luego nos queda el virus @ 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 O Q !_+( B + !#+'# &:!#' 1)( !2Y$ 8 B8X-ZZ 1'3( ::8 '$(L 3;H&: L !_+( 6$<# !_+( '$AL2!# :: ::

::

Luego de esto, podemos comprobar, que debido al Cltimo !_+( antes de terminar cada repeticin del bucle infectado, nos queda en el primer nivel de la pila la lista con los nombres de los programas, y en el ,do nivel los cdigos infectados* #ambin debemos darnos cuenta de algo muy importante, esto es que al ir tomando cada cdigo de la pila y luego de infectarlo meterlo en la pila se produce el efecto de que los cdigos quedan 8al revs8, o sea, para nuestro ejemplo anterior, nos quedara en la pila @ N@ ,@ O 99cdigo n::*****99cdigoNiii:: 99cdigo,iii:: 99cdigoBiii:: Q B@ O programaB programa, programaN ***** programa>n? Q ;ueno, entonces ahora hacemos !_+(

;ien, ahora tenemos todo listo para aplicar el querido !#3, pero nos falta algo no FFF que aCn no hemos borrado las variables programas para reempla0arlas por las infectadas***** (ara esto, usamos la lista con los nombres, la duplicamos, y a esta duplicacin le aplicamos ()' $, con lo que se van los viejos programas* 1espus, ponemos de nuevo en el ,@ los nombres y en el B@ los cdigos infectados, y aplicamos !#3 3 sea, esta primera versin funcional del virus sera@ 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 O Q !_+( B + !#+'# &:!#' 1)( !2Y$ 8 B8X-ZZ 1'3( ::8 '$(L 3;H&: L !_+( 6$<# !_+(

'$AL2!# !_+( 1)( ()' $ !_+( !#3 :: L2!#3 aaaaa 5emos terminado la primera versin del virus 8B8X-ZZ8 y lo mejor es que funciona a* ;ueno, ahora depuremos nuestra obra,*** me puedo dar cuenta que hay una parte que se puede optimi0ar, me refiero a esta parte@ !_+( '$AL2!# !_+( 1)( ()' $ !_+( !#3 ::

!ebastian 'ivas*

3;H&: L !_+( 6$<# 1)(

[virus B8X-ZZ [creado por

::

()' $ [milun[starmedia*com !_+( []]]*geocities*comM=jN-u-= '$AL2!# !_+( !#3 :: :: +hora, 1espus de haber programado un virus, me voy a acostar, pues son las N*4. de la madrugada, saludos a todos quienes lean esto* 6os vemos******* +ntes de irme os planteo un desafo, arreglar el programa, para que no produ0ca ningCn error en caso de que en el directorio actual no hayan programas user&rpl o haya solo B* J26 1$L D+(2#)L3 , &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

::

$se cdigo se puede reducir a@ 1)( ()' $ !_+( '$AL2!# !_+( !#3 Jjate que solo reducimos el cdigo en una instruccin, qui0 lo encuentres tonto, pero esto es muy importantsimo en programas grandes* sera@ o sea, el cdigo final del virus 8B8X-ZZ8 99 8 #A+'! 1)( 99 'DL :: 13L2!# 3;H&: &: + 99 O Q !_+( B + !#+'# &:!#' 1)( !2Y$ 8 B8X-ZZ 1'3( ::8 '$(L

CAPITULO * (PROTEGER NUESTROS TRABA+OS DE LOS >ALSOS HACOERS< TAMBIEN LLAMADOS PPHACOERS DE PLQSTICORR(

$ste es un tema muy importante a mi parecer, que todos los programadores de aplicaciones para la hp&48 deberan tener en cuenta* $mpecemos por definir al hac/er de plstico de la hp&48* (rimero que nada, de hac/er****nada* 3 sea, nos referimos al tpico estCpido que 1espus de un aKo de intentos aprende a usar la librera 5+DI, que es una gran librera, y lo que hace este chicuelo pendejo, es cambiar algunos crditos, o por ejemplo, donde

va el nombre del programa, lo cambia por uno a su gusto* #ambin puede ponerle que fue l quien lo desarrollo* Aamos a aprender algunas tcnicas bsicas anti&crac/ para nuestros programas* $n todo caso, no estoy usando bien la palabra crac/, ya que en ese caso, estoy ofendiendo a mis amigos los crac/ers, cuyos ideales, dicen que ellos modifican los programas con el Cnico fin de mejorarlos y quitarles limitaciones y errores* ;ueno, la verdad es que aqu no veremos a verdaderos crac/ers* L3 que veremos como ya dije es a un mocoso armado con una librera rompe&libreras* Domo por ejemplo, la querida librera 5+DI* $nseKar algunas tcnicas bsicas para que no puedan ser modificados los programas que escribis* 5ace como B aKo, yo estaba en Cltimo aKo de preparatoria, entonces, por milagro, en mi curso haban como 8 hp&48, y yo estaba aprendiendo a programarla, y creando mis primeros programas matemticos, pero haba alguien en el curso que se dedicaba a crac/ear programas de manera estCpida, o sea, lo Cnico que haca era reventar una librera, y cambiar los te=tos por otros inventados por l* (ongamos el ejemplo de un conocido programa llamado 8<#'+6!J$'8, el cual en realidad es una aplicacin de otro programa, llamado 8)!$618, pero mucho ms fcil de usar* %uy Ctil para los principiantes y usuarios comunes, ya que permita de forma muy fcil traspasar informacin entre dos hp&48* ;ueno, en donde deca 8<#'+6!J$'8, el cambio el te=to por 8!$61l $#8, y tambin cambi otros te=tos del programa por cosas como 8D+'D)'3 ,XXX8 y cosas por el estilo* Luego de eso, volva a armar la librera, y la distribua diciendo que l era lo m=imo* #odos mis compaKeros quedaban asombrados* "o en realidad lo encontraba cmico* #otal, lo que estaba jodiendo era un programa hecho por otra persona* (ero esa gracia paso completamente cuando sent en mi propia carne el hecho de que te modifiquen un programa que has hecho tC* Gue ha salido de lo profundo de tu alma de programador* $n ese momento me di cuenta de que tena que hacer algo* $ste chico tena en sus manos el poder para modificar programas )!$' a su gusto, y lo peor es que sin ningCn tipo de

conocimientos de programacin* ;ueno, empec a pensar, y a leer las instrucciones de los comandos e=traKos de la hp&48* Domenc a buscar un comando que me ayudara en mi tarea, y despus de un tiempo de investigar, me encontr con algo que me podra ayudar**** $l comando ;"#$!* Lo siguiente es la documentacin oficial de hp&48 acerca del comando@ ****1$A)$LA$ $L #+%+h3>$6 ;"#$!? " L+ D3%('3;+D2k6 1$ )6 3;H$#3><?*** $so fue e=traido de la pgina &. del manual de usuario* Aerdad que no nos dice nada WFFFFFF ;ueno, empec a probar el comando**** 'esultaba que uno pona un objeto de cualquier clase en la pila, y le entregaba dos nCmeros**** (or ejemplo, si pona el nCmero 4-.` lo que pasaba era esto**** antes @ ,@ B@ 4-.`

despus @ N@ ,@ B@ e -BB8`d BX*-

;ueno, dejando de lado las definiciones formales, lo que me di cuenta 1espus de aplicarle el comando a muchos objetos, incluyendo programas, te=tos, nCmeros, listas, etc*** fue que jams se repeta el nCmero del nivel ,@ * 3 sea que cada objeto que uno hiciera, tena su propio nCmero en el nivel ,@* ;astaba con que fueran diferentes dos objetos para que automticamente sus nCmeros del nivel ,@ tambin lo fueran* $sto me llev al siguiente ra0onamiento***** E Gue pasara si F luego de haber programado nuestro programa, haberlo guardado en una variable, le aplicsemos el comando ;"#$!* 1e esta manera obtendramos ese nCmero Cnico, el cual deberamos usar para

modificar el programa, de manera que se haga un ciclo 2J #5$6 $L!$ en el cual ese nCmero se compare con el verdadero, y en este caso, D)+LG)2$' modificacin al cdigo hara que el programa no funcionase* (ero hay que tener en cuenta que al haber modificado el programa para introducirle el nCmero secreto, se habr cambiado este nCmero nuevamente, por lo que ser necesario volverle a aplicar el comando y de esta manera, se producira un ciclo infinito en el cual nunca podramos ponerle el nCmero al programa* $s importante entender este ra0onamiento**** (ara verlo ms claro, tomemos en cuenta el siguiente cdigo, el cual no hace nada, pero ilustraremos que no se puede insertar el nCmero secreto ese***** (or ejemplo , tengamos el cdigo @ 99 853L+8 %! ;3< :: +hora, si le aplicamos ;"#$! a eso, supongamos que nos da como resultado el nCmero e ,84.,d $ntonces ahora tratemos de ingresarle este nCmero al programa**** 99 853L+8 %! ;3< e ,84.,d :: 5ay lo tenemos, pero si nos damos cuenta, ahora ese nCmero no nos sirve, ya que como lo modificamos su nCmero secreto habr cambiado**** RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ %e encuentro un poco ridculo diciendo 8nCmero secreto8, as que de ahora en adelante dir 8suma de verificacin8 RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRR $ntonces, aplicndole nuevamente el comando ;"#$! nos dar otro valor distinto, y de nuevo, al modificar el programa para insertar esa nueva suma de verificacin, esta habr cambiado**** 1e esta manera sacamos una conclusin importante, un solo mdulo de un programa no se puede defender a si mismo de esta manera***** (ero sin embargo, usando un poco el crneo, se nos podra ocurrir hacer algo inteligente para que un modulo se pudiera

defender a si mismo, esto, lo haremos utili0ando una pequeKa 8inmersin8* 3 sea, meteremos el modulo dentro de otro, y este decidir si se ejecuta el cdigo o n* (or ejemplo, para nuestro pequeKo programa anterior@ 99 853L+8 %! ;3< :: !u suma de verificacin era e ,84.,d $ntonces, consider el siguiente cdigo@ 99 99 853L+8 %! ;3< :: 1)( ;"#$! 1'3( 2J e ,84.,d VV #5$6 $A+L $L!$ DL$+' $61 ::

;ien, vamos por partes, antes de decir los defectos o virtudes de esta manera de proteger el programa, vamos a anali0arlo, para los que aCn no hayan entendido la idea* (rimero que nada, debemos tener en cuenta que la suma de verificacin del programa 99 853L+8 %! ;3< :: es e ,84.,d $ntonces, vamos por partes, primero, se pone el programa en la pila, luego se duplica* 1espus, mediante la duplicacin que hicimos, aplicamos el comando ;"#$!, y obtenemos la suma de verificacin del programa 99 853L+8 %! ;3< ::* (ero ah hay metido un comando 1'3( , por que FFF recordemos que el comando ;"#$! nos entrega 13! resultados, en el nivel B el tamaKo, y en el dos la suma de verificacin, entonces, como lo que a nosotros nos interesa es la suma de verificacin, hacemos 1'3(, borrando de esta manera el tamaKo de la pila, y quedndonos solo con la suma de verificacin , que es lo que nos interesa* 1espus de eso, lo que hacemos es comparar el nCmero obtenido con el que sabemos que es verdadero, o sea, el nCmero e ,84.,d* " dependiendo si son iguales, ejecutamos o no el cdigo, mediante esa estructura 2J #5$6

$L!$ 3 sea, pongmonos en el caso de que un mocoso que se cree crac/er, pero no sabe nada de programacin, tiene en sus manos este programa hecho por nosotros,,, o mejor debera decir que lo tiene en su calculadora @&? +hora, supongamos que el mocoso cambia la palabra 53L+ por la palabra D5+3, el cdigo modificado por nuestro super crac/er sera@ 99 99 8D5+38 %! ;3< :: 1)( ;"#$! 1'3( 2J e ,84.,d VV #5$6 $A+L $L!$ DL$+' $61 ::

enseKamos aqu es en contra de gente con nulos conocimientos de programacin, o muy pocos* (or lo tanto, lo que quiero decir, es que un crac/er de plstico, no tiene idea de lo que significa la palabra 1'3( por ejemplo, o ;"#$!, pero en cambio, si que puede modificar las cadenas de te=to a su gusto, y esperar que el programa corra como si nada, con las modificaciones que l hi0o* $ntonces, es de esto que nos estamos protegiendo, que el modificar un programa en cualquier forma, luego este no se pueda ejecutar correctamente* " como estamos en esto, les hablar un poco sobre mis ideas* La mayora de la gente solo dispone de B hp&48, y en este hecho se basa lo que estoy a punto de deciros* (or ejemplo, en el programa anterior, si el atacante modificaba el programa, este simplemente no corra* (ero esto le da mucho tiempo al atacante para probar otras cosas* (ues bien, yo creo que lo mejor es que en caso de que se trate de modificar el cdigo de nuestro programa, el efecto no debe ser algo tan suave como 8no hacer nada8, en mi caso personal, el efecto de defensa que produ0co al tratar de modificar mis programas, es simplemente hacerle daKo al atacante, por ejemplo, borrando todo lo que hay en la calculadora* (or supuesto que cada uno hace lo que quiere con los atacantes, yo solo cumplo con decirles lo que "3 hara* +dems, sera como un castigo al atacante, y por otro lado, automticamente, le quita la posibilidad inmediata de seguir tratando de hacer cosas con nuestro programa, ya que antes deber conseguirlo y todo eso* ;ueno, sigamos la discusin de los defectos de la proteccin que dimos recin* !u cdigo era@ 99 99 8D5+38 %! ;3< :: 1)( ;"#$! 1'3( 2J e ,84.,d VV #5$6 $A+L $L!$ DL$+' $61 ::

(ero en este caso, se habr modificado el contenido del programa que queremos ejecutar, y esto ser detectado por la estructura 2J #5$6 $L!$, la cual, debido a que la suma de verificacin del programa ser distinta a la que se le dio para comparar, decidir no hacer nada > DL$+' ? o mejor dicho, lo que hace es borrar la pila con el comando DL$+'* !era muy positivo si los ejemplos que voy dando en el manual los vayas probando al mismo tiempo* $n caso de encontrar errores en algCn cdigo, o tu crees que se puede mejorar de alguna forma, mndamelo a milun[starmedia*com y yo lo publicar en la pgina* +hora anali0aremos los defectos de esta proteccin* ;ueno, debemos aclarar que este es una proteccin que debera funcionar, pero recordemos contra quien estamos luchando, nuestro enemigo en este momento es un crac/er& de&plstico, el cual no tiene idea de programacin* 1ebe quedar en claro para los que aCn no saben esta regla universal de los crac/ers**** #313 ('3 '+%+ !$ ()$1$ D'+DI$+'* $sto es una ley inquebrantable* $ntonces, la proteccin de programas que

$l primer gran error que pienso tiene esta proteccin es que realmente es poco probable, pero a un atacante con paciencia, de repente podra ocurrrsele borrar parte del programa, y ver si funciona*** por ejemplo, si el atacante, luego de varios intentos fallidos, borrara parte del programa, y este quedar solo as @ 99 8D5+38 %! ;3< :: $ntonces estamos fritos, ha destruido toda la proteccin, y encima tiene un programa mas liviano* " peor que todo esto, es que cuando se encuentre con algo similar, ya sabr que hacer para destruir la proteccin* (or eso, si se ha de usar algo como esto, o sea, que un programa se defienda a si mismo, es mejor que los efectos para el atacante al primer intento, sea algo que no le deje ganas de volver a jugar al crac/er* ;ien, ahora, esto que discutimos no es tan peligroso en programas grandes* $s ms peligroso en programas pequeKos* 3tro defecto de este tipo de proteccin, es que antes de ejecutar el programa, se debe poner este en la pila, lo que en programas grandes, produce penali0aciones en la velocidad de inicio del programa* 3tra cosa a tener muy en cuenta a la hora de hacer protecciones, es jams incluir cadenas de te=to en los efectos de la defensa* Donsidere el siguiente ejemplo, en el cual cambiaremos los efectos de nuestra anterior proteccin***** 99 8D5+38 %! ;3< :: 1)( ;"#$! 1'3( 2J e ,84.,d VV #5$6 $A+L $L!$ DL$+' 8$'$! )6 %+L12#38 %! ;3< $61 :: $n este caso, como supongo la mayora de ustedes se habr dado cuenta, lo que se hace 99

en caso de que el atacante modifique el cdigo es borrar lo que hay en la pila con el comando DL$+', y enviarle el mensaje a la pantalla *** 8$'$! )6 %+L12#38 %! ;3<* $l hecho de poner te=tos en las protecciones yo considero que es un grave error, ya que, luego de que el atacante vea el efecto, podra ir al cdigo, y buscar en este la frase que le mandamos* 1e esta manera, podra llegar fcilmente a destruir la proteccin* Lo mejor es hacer que los efectos en el cdigo sea solo eso, cdigo, entonces, un ine=perto no entender nada de lo que pasa* +hora, entendamos otra forma de proteger nuestras creaciones de los crac/ers&de& plstico* " antes, me gustara, por si anda algCn crac/er verdadero leyendo esto, decirle que mi intencin con la frase crac/er&de&plstico es ofender a los lamers que andan por ah* "o tengo amigos crac/ers> y no solo de hp @&?, y los respeto mucho a ellos y a sus ideales* ;ien, continuemos con la nueva forma de proteccin, a la cual llamaremos 8hermandad8, la cual sirve solo en programas que consten de varios mdulos* La idea se trata de que un modulo protege a otro que no es l* (or esto bautic la proteccin con el nombre 8hermandad8* Lo bueno de esto es que ya no se necesita inmersin, a menos de que se trate de un programa que esta incluido en una librera, en cuyo caso se necesita inmersin, pero veremos ms adelante que esta forma que doy a conocer tampoco es tan buena como la que viene a continuacin* $jemplo@ Domo ejemplo, tomaremos el programa que desarrollamos al comien0o, o sea, el que simula en la pantalla un punto rebotando por todos lados* 99 '3; B B BX _G !#3 '3; B B XX _G, !#3 99 O II, Q 'DL ;"#$! 2J e ;`.`h VV

#5$6

O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3

$'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, :: IIB !#3 $L!$ A+'! ()' $ $61 99 1)( D&:' &: # + ; 99 !_+( # _G, '$(L 2J W+:-*8W #5$6 O <HN, Q >B,X? !#3& $61 2J W;:,*-W #5$6 O <HN, Q >X,B? !#3& $61 2J W+9&-*`W #5$6 O <HN, Q >B,X? !#3L $61 2J W;9&,*8W #5$6 O <HN, Q >X,B? !#3L $61 # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L II, $L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: II, !#3 IIB :: ;ueno, en realidad, aqu s tenemos inmersin, o sea, el programa en realidad, crea dos programas, y les pone nombre, luego los ejecuta, y 1espus de terminado el programa, los borra, quedando solo el programa padre* (ero aqu el cdigo lo desarmaremos y pensaremos en un programa que consta de dos mdulos**** o sea @ + este le llamamos IIB @ VV #5$6 99 O II, Q 'DL ;"#$! 2J e ;`.`h

!#3& $61 !#3L $61 !#3L $61 II,

2J W+9&-*`W #5$6 O <HN, Q >B,X? 2J W;9&,*8W #5$6 O <HN, Q >X,B? # <HN, L _G 3' !_+( I$" 2J X VV #5$6 +62%+#$ # <HN, L

$L!$ O ((+' <HN, IIB II, _G _G, Q ()' $ DL$+' 8by =jN-u-=8 %! ;3< $61 :: :: +ntes que nada, vemos que IIB se modific* $n la Cltima lnea, introduje el cdigo $L!$ DL$+' $61 $L!$ $sto es para completar el ciclo 2J #5$6

$ntonces tenemos un programa que consta de dos mdulos independientes, cada uno de los cuales cumple una funcin especfica, las cuales ya estan muy comentadas en el primer capitulo de esta tercera parte de mi manual* Lo que importa es que aqu tenemos una hermandad* (rimero que nada, debemos recordar que el mdulo encargado de comen0ar el programa es IIB* $n caso de que se ejecutase primero II, dara error puesto que este necesita algCnos parmetros que le proporciona IIB* " si nos damos cuenta, en el mdulo II, no hay ninguna referencia a IIB, por lo que concluimos que el programa IIB lo Cnico que hace es comen0ar la ejecucin y preparar las cosas para que II, funcione bien* (ero lo importante de este programa es la hermandad* $n este caso la hermandad se la proporciona IIB a II,, ya que en IIB, antes de comen0ar la ejecucin del programa propiamente tal, o sea, lo de la pelotita, se le pide la suma de verificacin a II, y se compara con la que se le ha sido proporcionada* $ntonces, en caso de que II, haya sido modificado lo que se producir ser simplemente que se borrar la pila* Lo bueno de esta tctica es que para el hac/er tonto es ms difcil detectar donde esta la comprobacin, sobre todo en programas grandes, y lo mejor es que no se enlentece el

O <HN, ((+' IIB II, _G _G, Q ()' $ >X*-,X*-? <HN, !#3 $'+!$ (2D# 'DL >X,X? _G 3' O B O eXh eXh Q X B Q +62%+#$ >X,X? II, L $L!$ DL$+' $61 :: " a este otro le llamamos II,@ 99 1)( D&:' &: # + ; 99 !_+( # 2J W+:-*8W #5$6 O <HN, Q >B,X? 2J W;:,*-W #5$6 O <HN, Q >X,B?

_G, '$(L !#3& $61

programa en forma desmedida con esta tcnica* +hora veamos la tercera forma que enseKar de proteger los programas que desarrollemos* 5ay que tener en cuenta que esta forma es la mejor segCn yo, y tambin que es mejor aplicarla en grandes programas* !e trata de proteger 6o el cdigo de los programas, sino solamente las cadenas de te=to* 3 sea, las cadenas se guardan como tales en mdulos aparte, y luego, cuando se ejecuta el programa, se llama a las cadenas de te=to, para comprobar si cumple con los 8requisitos8, y luego se usan para armar el programa y ejecutarlo en forma correcta* + esta forma le llamaremos 8comprobacin de objetos8 +s mismo, debemos considerar que a veces, en programas grandes, es bueno incluir grficos, como dibujos, o crditos de lujo, animaciones etc*** Don respecto a esto, debemos decir que lo que vamos a hacer con las cadenas, tambin podemos hacerlo con grficos >grobs?* (or ejemplo, consideremos un pequeKo programa, que lo que haga sea decir el nombre del dueKo de la calculadora**** 99 3JJ 8$!#+ D+LD)L+13'+ ($'#$6$D$ + !$;+!#2+6 '2A+!8 %! ;3< :: $se programa sera Ctil para apagar la calculadora, ya que 1espus cuando la prendieramos, aparecera el mensaje del nombre del dueKo, en el cual podra especificar la direccin de correo electrnico, la direccino el telfono etc etc*** (ero lo que el crac/er&peo hara con nuestra gran creacin *** 99 3JJ 8$!#+ D+LD)L+13'+ ($'#$6$D$ + H)+6 H3' $8 %! ;3< :: " todo se ha podrido**** $ntonces, mejor hacemos un programa

que conste de dos mdulos, uno de los cuales no haga nada, y no sea un programa, sino una simple variable que contiene la cadena que se quiere mostrar***** %odulo @ D5+3 99 D+1$6+ ;"#$! 1'3( 2J e N.,.`d VV #5$6 D+1$6+ 3JJ %! ;3< $L!$ DL$+' :: %dulo @ D+1$6+ 8$!#+ D+LD)L+13'+ ($'#$6$D$ + !$;+!#2+6 '2A+!8 !i nos damos cuenta, el mdulo D+1$6+ no es un programa, sino una simple cadena de te=to* +hora sera mucho ms difcil para el crac/er&poto crac/ear nuestro programa, o sea, para nosotros es una estupide0, pero un ignorante se hara todo un problema**** " todos estos mtodos, usados en conjunto, en programas metidos en libreras, brindan una gran seguridad* #ambin hablaremos sobre un pequeKo y poderoso programa que anda por ah, llamado #3D31$ y escrito en otro lenguaje, no estoy seguro si es system o assembler* $ste nos permite encriptar nuestras creaciones de manera fcil y rpida* !implemente transforma cualquier te=to, dibujo, ('3 '+%+, en una simple palabra bajo la cual se esconde el objeto, y mediante la cual se esconde el cdigo, y solo con la hp48 vaca es imposible ver el objeto original* La palabra es Dode* 3 sea, supongamos que tenemos un programa en la pila de esta forma @ ,@ B@ 99 programa :: +l aplicar el #3D31$ nos queda @ ,@ B@ Dode

!implemente eso, y al evaluar eso, mediante $A+L, o solo guardndolo en una variable como lo haramos con cualquier otro programa, podemos ejecutarlo como si fuera cualquier otro programa, y sin posibilidad para un principiante de reventar este 8Dode8* $l programa #3D31$ lo pueden bajar de mi pgina en 2nternet, http@MM]]]*geocities*comM=jN-u-= 1e ah van a hp&48 y a la seccin 5$''+%2$6#+! 1$L ('3 '+%+13'* ;ueno, con eso damos fin a este tercer captulo* +hora solo depende de ti si tus programas que hagas sean o no reventados y crac/eados* Lo importante de todo esto, es que las tcnicas que nombr aqu no fueron sacadas de ningCn manual, ni copiadas de otro lenguaje, simplemente fueron una 8idea8 mia* 1e esta misma forma, tu debes pensar y desarrollar tus programas conociendo el lenguaje y aplicando tus propias ideas**** +s irs conformando tu estilo* J26 1$L

clave* (rimero veamos un programa que modifique un te=to@ 99 1)( !2Y$ B !_+( J3' + 1)( + 1)( !); 6)% B L D5' + !_+( '$(L 6$<# :: (ruebe este programa con una cadena* Domo se puede dar cuenta, lo que hace es modificar cada caracter de una cadena de te=to, esto lo logra de la siguiente forma***** (rimero, saca el caracter de la cadena, obtiene su nCmero de caracter ascii, luego a este nCmero le suma B* 1espus, con este nuevo nCmero se saca otro caracter, el cual se reempla0a en la cadena por el original* #odo esto, como se puede apreciar, mediante un ciclo J3' 6$<#* $ntonces, lo que hicimos con este modesto cdigo fue encriptar una cadena, bueno, una encripcin bastante humilde, pero digna para empe0ar**** Dambiemos el nCmero que se suma por BX @ 99 1)( !2Y$ B !_+( J3' + 1)( + 1)( !); 6)% BX L D5' + !_+( '$(L 6$<# :: +h esta un poquito ms decente* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del +utor @ $ste captulo tiene por objeto, adems de simplemente aprender algo nuevo sobre programacin en la hp&48 introducirlo en el apasionante mundo de la D'2(#3 '+J2+, es por esto que iremos discutiendo cada mtodo de encripcin, y algunas formas de reventar los criptogramas>lograr descifrar el mensaje encriptado?* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR (ero esto no nos sirve mucho slo, ya que necesitamos otro programa, el cual nos desencripte el te=to encriptado* E !e les ocurre como sera el desencriptador de este humilde encriptador F

D+(2#)L3 N &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

CAPITULO 4 (ENCRIPCION DE TE,TOS EN LA HP-48(


(artamos este interesante captulo con una pregunta**** E Gue es la $ncripcin F La $ncripcin para mi, es el arte, el conjunto de ciencias para ocultar a los ojos de cualquiera una informacin que se considera confidencial* 3 sea, se trata de aplicarle un programa a una cadena de te=to, y obtener otra, de la cual no podr ser e=trada la informacin original, a menos que se 8sepa8 algo, como por ejemplo una

!upongo que si***** @&? 99 1)( !2Y$ B !_+( J3' + 1)( + 1)( !); 6)% BX & D5' + !_+( '$(L 6$<# :: !implemente, hacemos la operacin inversa, o sea, al caracter en ve0 de sumrsele BX, se le resta* #ome en cuenta, que dados estos dos programas usted no est en condiciones de decir cual es el encriptador, y cual es el desencriptador, ya que cualquier te=to que se encripte con uno, se puede desencriptar con el otro* $l Cltimo prrafo es ciertoF 6o* +dems de solo programar la hp&48 debemos conocer sus propiedades* 3 sea, debemos saber que a cualquier te=to le podemos sumar un nCmero y obtener otro, y luego reali0ar la operacin inversa, en cambio si le restamos demasiado, nos darn caracteres negativos, los cuales, la hp&48 los interpreta todos como el caracter nulo, o sea, el de numeracin X* 1e esta manera, es mucho ms fcil con la suma como encriptador y la resta como desencriptador* +hora, digamos que haramos en caso de que supiramos que este es el mtodo que usa un encriptador, pero no tenemos forma de saber cual es el nCmero que se le suma, para lograr reventar el criptograma***** !e les ocurre FFF ;ueno, es algo bastante tonto todava, pero es bueno ir ra0onando estas cosas**** !e supone que tenemos acceso al encriptadorMdesencriptador, y tambin tenemos el te=to que no sabemos como poder leer, ya que fue encriptado**** +ntes de decir como lo haramos, tomen en cuenta un reto que les hago, yo encriptar una

pequeKa frase en mi hp&48, usando una clave secreta, y lo pondr aqu*** $ntonces, si logras desencriptar la frase, te sentirs %)" bien, pues lo habrs logrado sin que yo te dijera como*** " hay varias formas de hacerlo***** $L '$#3 $!#+ 5$D53**** $l criptograma a desencriptar es@ 8H"(_SA6"5%(5WL)W!5W3_^F8 camino* Guien lo logre solo, va por el buen

+hora, digamos una de las fciles formas para romper nuestro querido primer encriptador*** Lo que yo hara para reventar el criptograma que nos dan, sera, primero, tomar el caracter 8+8, del cual se que su cdigo ascii es el .-* Luego, mediante el encriptador, encripto la cadena que contiene solo la 8+8 o sea, la cadena sera 8+8 Luego de encriptarla, voy a recibr otro caracter, del cual debo sacar su cdigo ascii mediante el comando 6)%* $ste nCmero ascii lo disminuyo en .-, que es el cdigo de la 8+8, y obtengo el nCmero secreto* Jacil eh**aaa 'eferencia @ +qu dar algCnos nCmero ascii de algunos caracteres importantes@ 8+8 &: .8Y8 &: ZX 8a8 &: Z` 808 &: B,, 8X8 &: 48 8B8 &: 4Z 8Z8 &: -` 8 8 &: N, >espacio en blanco? La lista completa de los ,-- caracteres

ascii de la hp&48 y sus correspondientes nCmeros los puede ver en su propia calculadora, en la aplicacin que trae incluida, llamada D5+'!* ;ueno, de esto, vemos que el caracter ms alto de los que normalmente conforman un te=to es la 808, la cual tiene el valor B,,* #eniendo ahora en cuenta que el nCmero de caracteres es ,--, el valor m=imo que deberamos sumar a nuestros caracteres sera >,--&B,,?VBNN* (ero teniendo en cuenta que algunos pocos caracteres mayores que el B,, tambin se utili0an, lo mejor sera dejar el numero a un m=imo de -X* Don la seguridad de siempre poder volver a desencriptar* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ !e recomienda revisar las partes B y , del manual, en donde se habl un poco sobre programas que modifican te=tos* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRR ;ien, pero hasta ahora, no hemos hecho nada prctico, ya que si un tipo viera nuestro te=to encriptado, lo Cnico que tendra que hacer para desencriptarlo sera usar el desencriptador* $ntonces, vamos a hacer un verdadero humilde encriptador, el cual depender de una clave para poder desencriptar el te=to* $sta clave ser un nCmero entre B y -X el cual se introducir al ejecutar el programa, o sea, el programa le pedir una clave antes de encriptar el te=to, clave con la cual ser posibre, mediante el desencriptador, poder desencriptar el criptograma* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ Driptograma V #e=to 1espus de ser encriptado* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRR +hora haremos nuestro primer encriptador**** 99 8$6D'2(#+13' B*X8 %! ;3< 826#'31)YD+ $L 6)%$'3 DL+A$ >B& 88 26()# 3;H&: &: clave 99 1)( !2Y$ B !_+(

J3' + 1)( + 1)( !); 6)% clave L D5' + !_+( '$(L 6$<# :: :: " su correspondiente desencriptador****** 99 81$!$6D'2(#+13' B*X8 %! ;3< 826#'31)YD+ $L 6)%$'3 DL+A$ >B& 88 26()# 3;H&: &: clave 99 1)( !2Y$ B !_+( J3' + 1)( + 1)( !); 6)% clave & D5' + !_+( '$(L 6$<# :: :: $spero que se haya entendido* Lo que hacemos es pedir una clave, de esta manera, es usando esa clave que encriptamos el te=to* Gue bien ahhh, FFF ahora nadie podr conocer nuestros te=tos secretos*** aaa, +ntes de quedar baboseando frente a algo tan simple, dime, E acaso esta cosa es invencibleFFF, por !)()$!#3 G)$ 63, de hecho, este algoritmo de encriptacin fcil de reventar* 6o se qu hacer ahora, se supone que debo decirles algCna forma de quebrar el encriptador, pero por otro lado, se los estoy poniendo muy fcil,******mmmmmmmmm****** a ver,***** bueno, lo dar, pero traten de ra0onarlo un rato antes, piensen que podran hacer para reventar un criptograma**** 3tro reto @ reviente el criptograma siguiente**** 8"'g#! !gG$_g5%H% %(8 ;ueno, veamos una forma simple de romper el algoritmo de encriptacin que usamos ahora**** Lo que se me ocurre de inmediato, es guardar el criptograma en una variable para trabajar varias veces con l* " luego usar el desencriptador,*** (ero se supone que no conocemos la clave aaaaa, como lo desencriptaremos aaaaaaa FFFFF FEFEFEFEFEFEF haga trabajar ese cerebro aaaaa, hay solo -X nCmeros que pueden ser la clave, simplemente voy provando con cada nCmero del B al -X* @&??????

-X?8

-X?8

" en caso de que este nCmero fuera mayor, ya sabemos que el tope para que no hayan problemas es BNX* 1e otra manera, el encriptador no servira, ya que los te=tos no se podran desencriptar, ya que uno se pasara del nCmero ,--, el cual es el Cltimo caracter ascii, y por ejemplo, si un caracter se transformara en el caracter N-X, este nCmero rebasa por Z- al ,--* La calculadora lo que hace en estos casos, es darle al nuevo caracter el valor Z-* (ero luego, si se quisiera desencriptar, se le restara nuevamente la clave, la cual es mayor que Z-, y con esto, se producira un caracter negativo, todos los cuales son para la hp&48 el caracter nulo, o sea, el criptograma no se podra recuperar* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor@ $sto es tan apasionante, por la mierda aaaaa me encanta la criptografa aaaaaa A2va ( ( aaaa viva '!+ aaaaa viva 1$! aaaaa RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRR ;ien, ya hemos visto dos formas de encriptar te=tos en la hp&48 y su correspondiente forma de reventar* !igamos con el captulo**** +hora nos daremos un salto, y veremos una forma mucho ms dificil de reventar* +hora lo que haremos ser un encriptador, el cual nos pida una clave, que podra ser por ejemplo un nCmero de - cifras, el cual se utili0ara para cifrar el te=to, pero no de la forma que estn pensando sino as**** !upongamos que el te=to fuere @ 853L+ + #313!8 $ntonces ahora, !)(36 +%3! que los cdigos ascii de cada caracter son @ 858 838 8L8 8+8 8 8 8+8 8 8 8#8 838 818 838 8!8 `, `Z `. .- N, .- N, 84 `Z .8 `Z 8N $ntonces, ahora suponiendo que la clave

fuera -4N,B, lo que vamos a hacer con la clave y el te=to se ilustra a continuacin*** 858 838 8L8 8+8 8 8 8+8 8 8 8#8 838 818 838 8!8 `, `Z `. .- N, .- N, 84 `Z .8 `Z 8N - 4 N , B - 4 N , B - 4 3 sea, la clave la vamos poniendo debajo de cada nCmero ascii para luego hacer que FFFF !umarlos*** Don lo que nos queda @ 858 838 8L8 8+8 8 8 8+8 8 8 8#8 838 818 838 8!8 `, `Z `. .- N, .- N, 84 `Z .8 `Z 8N - 4 N , B - 4 N , B - 4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& `` 8N `Z .` NN `X N. 8` 8B .Z 84 8` $ntonces, ahora lo que hacemos, es formar el criptograma, a partir de estos nCmeros**** Don lo que nos queda*** 858 838 8L8 8+8 8 8 8+8 8 8 8#8 838 818 838 8!8 `, `Z `. .- N, .- N, 84 `Z .8 `Z 8N - 4 N , B - 4 N , B - 4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& `` 8N `Z .` NN `X N. 8` 8B .Z 84 8` 8%8 8!8 838 8D8 8a8 8J8 8g8 8_8 8G8 8$8 8#8 8_8 " por fn, el criptograma es @ 8%!3DaJg_G$#_8 +hora, este mtodo de encriptar, es mucho ms poderoso de lo que lo fueron los dos primeros, analicemos algCnas cosas*** (rimero debemos saber, que para reventar un te=to, solo tenemos el criptograma, ya que la clave es desconocida* " combinado esto, con un encriptador que permita elegir claves de cualquier longitud**** 6os da '+6 poder de encripcin* Donsideremos el te=to original @ 853L+ + #313!8

y el criptograma @ 8%!3DaJg_G$#_8 Aeamos algunas cosillas**** #oma en cuenta, por ejemplo, que en el te=to original, la letra 3 se repite N veces, pero si te fijas en el criptograma, sus equivalentes en las tres ubicacin serian ! G y #,***************** las tres distintas aaaa 2nteresante noFFFF*** ;ueno, ahora basta decir que para reventar esto hay que trabajar mucho ms, yo no soy capa0 de decirles como hacerlo, pero se que tiene que ver con tcnicas estadisticas y paciencia aaaa@** 1igamos para su cultura general, que este metodo de encripcin es 'idculo comparado con los que se usan en firmas digitales y encripcion actual**** $l Cltimo mtodo que comentaremos, es asignarle a cada letra del abecedario otro signo, y para encriptar, cambiar cada caracter del te=to original por su equivalente***** (ara romper este mtodo hay varias formas*** algunas muy fciles*** 'ecuerdo que una ve0 que estaba en #emuco&Dhile junto a mi novia, ella me escribio un criptograma con este mtodo, el cual sala en su agenda con los smbolos correspondientes a cada caracter del abecedario* $l mensaje que me escriba, estaba compuesto ms o menos por 4 lneas* " todos los signos del abecedario cambiados*** Domo no me quiso decir lo que significaba, me propuse la tarea de reventar su mtodo, jajajaja, me rio, por que en ese tiempo, yo aCn ni siquiera tena interes en la criptografa y me plantie el reto de descifrar>reventar? el mensaje***** 1emor como B y BM, horas en descifrar todo* Lo que hice fu buscar palabras comunes del castellano, estas fueron 8por8 8que8 8de8 busqu trios y duetos de letras que se repitieran en el te=to, y de poco a poco, lo logr* 1espus, mucho 1espus, hace solo como , meses supe que esta era la forma de la cual se reventaban este tipo de criptogramas* Lo

que a m me falt saber fueron las letras ms comunes del lenguaje espaKol, o sea, la 8e8, la 8a8 y la 8l8* ;ueno, con esto termino este pequeKo captulo, el cual se sali un poco de lo puramente referente a programacin, pero consider que estos conocimientos son muy vlidos**** (iense como aplicar la criptografa para defender sus programas de ataques de poto& crac/ers* $n este momento son las B8@N8, mi hijo se toma una mamadera de jugo, y me mira, y se rie* + l est dedicado este trabajo* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ $n caso de que le haya gustado el tema de la criptografa, le recomiendo ir a mi pgina sobre el tema, la cual esta dentro de la seccion 8seguridad informtica8, en http@MM]]]*geocities*comM=jN-u-= %i pgina de criptografa es muy humilde, y le puede dejar claros los conceptos bsicos, pero en ella hay una lista de lin/s con informacin %)" avan0ada y tcnica* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR

J26 1$L D+(2#)L3 4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

CAPITULO . (SSSS LIBRERIAS TTTT(


1espus de leer y estudiar este captulo, usted sabr todo sobre como transformar sus programas en libreras, las cuales son muy Ctiles, ya que se pueden usar indeterminados mdulos en nuestros programas, pero sin embargo,

mostrarle al usuario, solo los que se necesitan, y la ventaja de eso tambin es que una librera puede contener muchos programas y mdulos, pero para la hp&48 es un objeto Cnico, el cual no puede ser reventado sin herramientas especiales* Drear libreras no es para nada un trabajo pesado, comparado con las ventajas que representa para nosotros los desarrolladores, ya que solo hay que conocer unos formalismos, y utili0ar herramientas que nos hacen muy fcil el trabajo, si las sabemos ocupar*** Haja, digo si las sabemos ocupar, por que si no las ocupamos bien nos tratarn muy mal**** %e refiero por supuesto a una de estas herramientas, la librera 5+DI* La librera 5+DI es la que utili0aremos en este capitulo pra poder armar libreras, y esta puede bajarla de mi ]eb* +qu aprenderemos a usarla para crear nuestras libreras* 3tros usos no nos importarn en el curso de este captulo* +hora me voy a descan0ar un rato* !e me acab la inspiracin* @&? 5ola de nuevo, estoy de vuelta para que comencemos a crear nuestras propias libreras y as impresionar a media universidad 8&Q ;ueno, primero que nada, les dir lo que yo hago cuando deseo desarrollar un programa en la hp&48* Lo primero que hago, y que es muy importante si se quiere utili0ar la librera 5+DI es crearse un directorio de trabajo, en el cual solo tendremos las variables y mdulos que pertenecen al trabajo* 3 sea, un directorio para trabajar tranquilos, sin algunas molestas confusiones con otras variables o programas* #ambin se debe tener muy en cuenta cuando est todo listo para armar la librera, borrar todas las variables del sistema, tales como ((+'>aparece cuando graficamos algo, o utili0amos (2D#)'$?* Domen0emos* +l hacer un programa, medianamente grande, se necesita de varios mdulos>programacin estructurada?, los cuales entre todos, hacen el trabajo* $n mis propias

creaciones, cas siempre, hay algunos mdulos que contienen programas, grficos, te=tos, crditos, etc* $ntonces, al terminar el programa, vemos un monton de variables, de las cuales la mayora de las veces para ocupar el programa se necesita ejecutar solo algunas, y son estas las que llaman a las dems para que hagan su trabajo* 5ablemos un poco sobre la teora de las libreras en la hp&48* (rimero que nada, la definicin*** )na librera, es un conjunto de objetos, que se agrupan como uno solo e inseparable, el cual nos brinda mucha comodidad para transportar los programas* (rogramas que muchas veces pueden constar de hasta -X variables>mdulos? o ms* 1e esta manera, sera muy incmodo tener que entregar -X variables o ms a cada persona que quisiera tener nuestro programa* $ntonces las libreras nos solucionan esto* +dems, la ventaja es que el cdigo de la programacin no es visible a trave0 de la hp&48* + menos que se cuente con herramientas con las que la gente comCn no cuenta* (ara entender la idea, pensemos en una librera como si su directorio de trabajo>&en el cual se encontraban las variables que conforman su trabajo&?, lo transformara en un solo objeto, con un nombre, y en el cual, se tiene acceso a !3L3 1$#$'%26+1+! A+'2+;L$!* $n nuestro caso, se supone que debemos dar acceso solo a lo que el usuario necesita* (ongamos por ejemplo que usted tiene un programa que consta de los siguientes mdulos @ 262D23 &: Don este mdulo comien0a la ejecucin* '+JD &: 1igamos que este contiene solo un grfico, el cual es ocupado por el programa* )#2L &: $s un sub&programa ocupado por el 262D23 D+LD)L3 &: $ste es otro sub&programa ocupado por 262D23 $ntonces, si nos damos cuenta, el usuario solo debera tener acceso a la variable>mdulo? 262D23*

3tra caracteristica muy a tener en cuenta en la creacin de nuestras libreras, es que cada librera, contiene un nCmero, que la caracter0a, y que supuestamente debe ser )62D3* ;ueno, en realidad lo importante es que en una hp&48 si se encuentran instaladas dos libreras con el mismo nCmero, puede causar concecuencias desastro0as>reset?* +hora, que ya conocemos un poco ms las libreras, vamos a ver, utili0ando la librera 5+DI como crearlas* ;ien* (rimero que nada, veamos los requisitos que nos pide la 5+DI para poder armar una librera* (rimero que nada, un directorio diferente a 53%$, en el cual se encuentren todas las variables o mdulos que conforman el programa* )na variable que se deve llamar g'3%21 en la cual debemos tener el nCmero de identificacin de la variable, pero de la forma e numero* $se nCmero debe ser de 4 cifras* (or ejemplo, si el nCmero de identificacin de mi variable fuera B,N4, entonces, debo crear en el directorio de trabajo, una variable llamada g'3%21 cuyo contenido se simplemente @ e B,N4d !i se estuviera en modo he=adecimal la calculadora, entonces, el e B,N4d nos aparecera como e 41,h $ntonces, para evitar confuciones, antes de crear esta variable, ponga la calculadora en modo decimal, esto dandole el comando 1$D* "a tenemos una de las cuatro variables requeridas por 5+DI para ensamblar nuestra librera* !egundo @ 6ecesitamos crear una variable llamada g#2#L$ en la cual deber ir primero que nada, el nombre de nuestra librera, y luego algunas palabras tales como su nombre, o su e&mail, etc***

La variable g#2#L$ debe contener )6+ D+1$6+ 1$ #$<#3, o sea, un ejemplo vlido sera @ 8#$#'2!, 1$!+''3LL+13 (3' H$)< J'+6D+2!$ H$)<[J'*$)#L$*+5<8 $so sera algo vlido* 3jal no sea muy larga esta cadena* !i usted ha tenido oportunidad de visuali0ar una librera en la pila, recordar que tienen esta forma @ N@ ,@ B@ Library B,N4@ #$#'2!, 1$!+''3LL+13

(3'******

$ntonces, nos podemos dar cuenta tambin que lo que ponemos en la variable g#2#L$, es lo que aparece luego de 8Library B,N4@ 8 ;ueno, ya hemos anali0ado dos de las variables que necesita la 5+DI para crear una librera* La tercera variable requerida, se llama gA2!2;L$, la cual debe contener simplemente una lista* (ero esta lista es muy especial y Ctil, ya que en ella debemos poner los nombres de las variables que sern visibles al usuario* 3 sea, en nuestro anterior ejemplo, la variable gA2!2;L$ debera haber contenido @ O 262D23 Q $ntonces, cuando el usuario acceda a la librera, lo Cnico que ver ser la variable 262D23 para ocuparla* Las otras han quedado ocultas para siempre* " $!#+ $! L+ '+6 %+'+A2LL+ 1$ L+! L2;'$'2+!* $spero que se halla entendido* +hora vamos a la Cltima y ms dificil variable que necesita la librera 5+DI* $sta variable tan importante, lleva por nombre gD36J2 , y para crearla, se necesitan algunas otras pequeKas pericias* ;ueno, primero que nada, veamos la

visuali0acin que tiene esta variable en la pila @ ,@ B@ 9B,N4d: $=ternal (rimero que nada, no nos asustemos* (odemos darnos cuenta de que son dos palabras separadas por un espacio, pero como F se supone que segCn lo que hemos aprendido hasta ahora, esto no es posible, o sea, ra0onando, debera quedar @ N@ ,@ 9B,N4d: B@ $=ternal (ero as no es, ya que ahora tenemos un tro0o de cdigo que 63 pertenece a lo que nosotros hemos aprendido* $ste mis amigos, es un simple cdigo compilado, del lenguaje !"!#$%&'(L* $l cual permite que pasen estas cosas raras, como espacios en un solo objeto, sin comillas ni nada* +hora, este no es un curso de !"!#$%, as que lo Cnico que veremos ser como lograr armar nuestro necesitado @ B@ 9B,N4d: $=ternal (rimero que nada, aclaremos una cosa, la palabra $=ternal, no tiene ninguna relacin con simplemente escribir en la pila, $=ternal, nono no no no no seKor, nada que ver, esa palabra, es un cdigo de lenguaje !"! que ya ha sido compilado* " es )nica, o sea, si tienen por ah algCn otro $=ternal, no les sirve, ya que ese cdigo puede significar otra cosa muy distinta* $sto debido a que en la hp&48 los cdigos compilados de lenguaje !"!#$%, todos tienen esa apariencia* $ntonces, ese presiso $=ternal deberemos buscarlo en lugares donde sea el que nosotros necesitamos* (ero antes de eso, aprendamos a escribir un nCmero de la forma 9,N4-d:* #ome su hp&48 y trate de lograr esto @ ,@ B@ 9B,N4d:

!e encontrar con algunas dificultades, ya que no es tan fcil de hecho, en ninguna parte del manual de usuario aparece como lograrlo* (ara poder formar un nCmero de esa forma tenemos dos opciones, una, ocupando la librera 5+DI, y apretando un simple botn* $sta es la forma fcil, y que cualquiera hara* $sto se hace de la siguiente manera ***** (onemos el nCmero que queremos transformar en la pila, en su forma ms comCn, o sea, sin e* (or ejemplo, si quisieramos transformar el nCmero B,N4, lo pondramos en la pila de la siguiente forma muy obvia* ,@ B@ B,N4 !implemente eso, y a continuacin, abrimos la librera 5+DI, y buscamos la funcion llamada &:9: ;ueno, amigos mios, lamentablemente me acabo de dar cuenta de una verdad que podra doler**** $n realidad yo ya lo saba, pero no de esta manera*** Lo que pasa es que por ah andan dando vueltas varias versiones de la librera 5+DI, y la que yo os ofre0co en mi pgina no tiene la funcin &:9: lamentable este hecho, pero as es*** $n todo caso, hay otra versin por ah que si la tiene, y es muy comCn, pero apenas encuentre esa librera la pongo en la pgina, y les aviso a todos por e&mail, siempre que me hayan escrito, ya que todos los e&mails de gente que me ha saludado o hecho consultas, tengo sus e&mails, para informarles sobre actuali0acines, o cosas como esta* ;ueno, ahora que ya saben como hacer eso con la librera 5+DI, ahora yo les enseKar la manera que ocupan los que no necesitan de programas para todo* *** jajja @&? ;ueno, en realidad esta forma es bastante simple, pero no tanto como ocupar la 5+DI* (rimero, debemos poner el nCmero que

queremos transformar en la pila, pero de una manera muy especial @ ,@ B@ @l@ B,N4 +s, con los mismos signos* Luego apretar la tecla $A+L y ya est* ,@ B@ 9B,N4d:

s!a< :!m%s t! mina"% !l t a3a4%# El 6 %9 ama CON>IGS $ !a"% 6% mi< l% 6u!"!n "!s$a 9a "i !$tam!nt! "! la si9ui!nt! "i !$$iJn 1 :tt61YYGGG#9!%$iti!s#$%mYB4*.u.BY"%GnY$%nFi 9s#Xi6 - "!3! t!n! s! muH !n $u!nta =u! 6a a usa l% s! "!3! t!n! instala"a la li3 ! Ka HACO< $ual=ui! ;! siJn# +hora veremos la forma sucia y lenta de obtener ese preciado $=ternal* La segunda mitad es un poco ms complicada de obtener* 'ecordemos que necesitamos la palabra $=ternal, pero no cualquier $=ternal, sin uno muy especial* (ara lograr esto, debemos e=traer el archivo gD36J2 de otra librera usando la misma 5+DI* (rimero, ponemos una librera cualquiera en la pila, de la siguiente forma @ ,@ B@ Library ---- @ %atematicas por !ebastian 'ivas Luego de eso, usando la librera 5+DI, utili0amos el comando 3;&: $ntonces, nos encontraremos con que en la hp&48 ha aparecido un nuevo directorio, el cual contiene la librera desensamblada* $stando ah vamos a buscar el archivo gD36J2 y sacamos su contenido* (36 + +#$6D236, 12H$ !+D+' !) D36#$6213, 63 $H$D)#+'L3, !2 )!#$1 L3 $H$D)#+ $! !) '$!(36!+;2L21+1 (3' !) D+LD)L+13'+* $spero que se sepa como sacar rpidamente el contenido , en caso de que no se sepa, djeme decirle que no tiene nada que hacer en este manual, vaya a lavarse el poto, este es un manual avan0ado , vaya al manual de usuario* (ero de todas formas, una forma fcil de hacerlo es escribir en la pila lo siguiente @

+hora ya tenemos la mitad del archivo gD36J2 , que es el Cltimo que nos falta para poder crear la librera* La s!9un"a mita" !s 3astant! mUs "iFi$il "! %3t!n! < 6! % "!3i"% a !st%< H% "!sa %ll! un 6 %9 ama llama"% CON>IGS< !l $ual n%s :a$! t%"% !st! t a3a4% su$i%< % s!a< n%s%t %s 6%n!m%s !l n8m! % "! nu!st a li3 ! Ka !n la 6ila "! la si9ui!nt! F% ma1 )1 '1 ')*4 - lu!9% sim6l!m!nt! a6 !tam%s !l CON>IGS "! mi 6 %9 ama< H !l !sulta"% !s 1 )1 '1 P')*4"R EBt! nal D!s6uVs "! !st%< sim6l!m!nt! 9ua "am%s !st% !n la ;a ia3l! WCON>IG H Ha !stam%s list%s 6a a a ma la li3 ! Ka# Si ;a a usa !st! mVt%"%< 6u!"! salta s! l% =u! 3i!n! a $%ntinua$iJn H D!s6uVs "! t!n! list% !l "i !$t% i% $%n t%"as sus ;a ia3l!s H tam3i!n $%n las $uat % !=u! i"as 6% la li3 ! Ka HACO< sim6l!m!nt! !n la li3 ! Ka HACO us! !l $%man"% D-RLIB Est! $%man"% s! "!3! "a sin nin98n %34!t% !n la 6ila< Ha =u! !l sim6l!m!nt! s%n a ma la li3 ! Ka si!m6 ! H $uan"% s! $um6la $%n las $%n"i$i%n!s =u! :!m%s analiXa"% !n !st! "%$um!nt% s%3 ! la $ !a$iJn "! li3 ! Kas# En !s! m%m!nt%< lu!9% "! :a3! utiliXa"% !l $%man"% D-RLIB< a6a !$! U !n la 6ila su li3 ! Ka a ma"a H lista 6a a s! "ist i3ui"a< %

,@ B@ O gD36J2 Q " luego aplicar el comando 'DL 1espus de esto, nos debe quedar en la pila algo como esto @ ,@ B@ 9<<<<d: $=ternal $n donde <<<< es el nCmero de identificacin de la librera que hemos desensamblado* (36 + +#$6D236 + L3 !2 )2$6#$ @ $6 D+!3 1$ G)$ $L D36#$6213 1$ L+ A+'2+;L$ gD36J2 1$ $!+ L2;'$'2+ 63 J)$'+ (+'$D213 + L3 G)$ +G)\ !$ %)$!#'+, L3 %$H3' $! G)$ !+L + 1$ +52 " ;3''$ $L D36#$6213 1$ $!$ 12'$D#3'23, "+ G)$ !2 62J2D+ G)$ $!$ gD36J2 63 63! !2'A$, " L3 %+! ('3;+;L$ $! G)$ !2 !2 + H) +613 D36 $L, '$!$#$$ !) ('3(2+ D+LD)L+13'+* $6 $!$ D+!3, L3 G)$ !$ 1$;$ 5+D$', $! +;'2' 3#'+ L2;'$'2+ $6 ;)!D+ 1$ )6 gD36J2 G)$ 63! !2'A+* +hora supongamos que ya tenemos lo que necesitamos, o sea, ,@ B@ 9<<<<d: $=ternal +hora salgamos del directorio de la librera desensamblada, y vayamos a nuestro directorio de trabajo para comen0ar a tratar este contenido> 9<<<<d: $=ternal ?* +ntes que nada, recuerdo que luego de haber e=traido con e=ito el gD36J2 de la librera, podemos simplemente borrar el directorio que contiene las variables de dicha librera* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ (ara borrar

completamente un directorio, llamado por ejemplo 14444 , y que no est vaco, se debe ocupar el comando ( 12', estando el nombre del directorio en la pila encerrado entre O llaves Q >esto debera saberse a estas alturas del curso* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRR Listo, ahora que ya estamos en nuestro directorio de trabajo con las palabras mgicas en la pila, nos preparamos para comen0ar a transformar esto @ 9<<<<d: $=ternal es esto @ 9B,N4d: $=ternal Lo primero que debemos hacer es asegurarnos de que el 9<<<<d: $=ternal est en el primer nivel de la pila, para poder trabajar con l* o sea **** ,@ B@ 9<<<<d: $=ternal ;ueno, ahora, vamos a ir siguiendo los siguientes pasos, uno por uno, y aqu les ir mostrando los efectos que deberan ir viendo a medida que se van dando los pasos* 'ecordemos antes de comen0ar, que debemos tener a mano, el 9B,N4d: que ya enseK como crearlo* Lo mejor sera tenerlo guardado en una variable por mientras, despus de que hayamos cumplido nuestro propsito de armar el 9B,N4d: $=ternal, debemos borrar esa variable* #odo lo siguiente, debe comen0ar con que usted tiene esto en la pila @ ,@ B@ 9<<<<d: $=ternal P(rimero @ +bra la 5+DI y d el comando 3;&:

4@ N@ 9<<<<d: ,@ $=ternal B@ , eso* $se es el efecto que se produce al hacer

*1 )1 '1 P')*4"R EBt! nal L2!#3 aaaaaaaaaaa +hora, eso lo guardamos con el nombre que ustedes recordarn***** gD36J2 Luego, si es que el nCmero 9B,N4d: lo habamos guardado en una variable temporal, borramos esa variable* AHORA< ABRA LA HACO< - DE EL COMANDO D-RLIB 5a creado su primera librera* #enga muy en cuenta este cosejo que le doy, las libreras que usted cree, pongales nCmeros entre B,XX y -XXX* (ara mayor seguridad* " recuerde siempre que en una misma hp&48 no deben haber dos libreras con el mismo nCmero de identificacin* J26 1$L D+(2#)L3 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

P!egundo @ 1'3( N@ ,@ 9<<<<d: B@ $=ternal P#ercero @ !_+( N@ ,@ $=ternal B@ 9<<<<d: PDuarto @ 1'3( ,@ B@ $=ternal PGuinto @ 'ecupere su nCmero de librera, en este caso 9B,N4d: N@ ,@ $=ternal B@ 9B,N4d: P!e=to @ !_+( N@ ,@ 9B,N4d: B@ $=ternal P!eptimo @ 2ngrese el nCmero , 4@ N@ 9B,N4d: ,@ $=ternal B@ , P3ctavo y Cltimo aaa @ +bra la 5+DI y aplique el comando &:('

CAPITULO 0 (AL >ILO DE LA MUERTE< LIBEVAL - S-SEVAL< LOS COMANDOS DEL IN>IERNO#(

cGue titulo para este captulo eha* ;ueno, en este Cltimo captulo de esta tercera parte del manual de programacin en lenguaje )ser&'pl para la calculadora hp&48, enseKaremos 8algunos8 usos de dos comandos muy especiales* $stos dos comandos especiales se llaman L2;$A+L y !"!$A+L*

el ZZ*ZZf de los casos termina en @ (rimero que nada, tenga en cuenta que en los pro=imos das, le aseguro, que si se mete con ellos de forma irresponsable, resetear su hp&48 varias veces* $sto es devido a que estos dos comandos, son los comandos del infierno, es el lmite en el cual cru0an sus caminos los lenguajes )ser&'pl y !ystem&'pl* + trave0 de ellos, y ms del !"!$A+L, tenemos acceso a funciones que nunca habiamos imaginado* 3 sea, por ejemplo, funciones del !"!#$%&'(L* RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRR 6ota del autor @ #rate de buscar estos comandos en los menus de %$%3'" DL$+' $sta es una de las ra0ones por las cuales el lenguaje !"!#$% es como unas ,X veces ms rpido que el user* 6uestro querido )ser nos protege, el !ystem no* ;ien, y ahora, lo que hacen los comandos L2;$A+L y !"!$A+L no es lo mismo, lo que hace L2;$A+L, o mejor dicho, el uso de l que anali0aremos aqu, ser para tener acceso mediante programacin a lugares en los que no se puede acceder* " el !"!$A+L, este que es el ms poderoso de todos los comandos de la hp&48 le daremos algunos usos diversos* LIBEVAL 5aga un programa que lo que haga sea introducirlo en el escritor de matrices* E (uede F E 5ay algCn comando que nos permita entrar en el menC para graficar funciones F L2;$A+L* (ara estas cosas es que sirve el comando

la hp&48* $s imposible, ya que no

aparecen* Epor queF RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRR 5ablemos de algunas cosillas* $n el lenguaje )ser&'pl, o sea, el que estamos usando, cada ve0 que nos equivocamos en algo, simplemente el programa se detiene y se nos comunica nuestro error con un pitido o un mensaje* $sto es debido a que el lenguaje )ser& 'pl, hace comprobaciones de cada comando, o sea, nos protege de situaciones dolorosas* #omemos por ejemplo, tratar de reali0ar una animacin, sin tener todos los parmetros necesarios en la pila* $n ese caso, se nos dir mediante un mensaje nuestro error* $n cambio, el !ystem&'pl no reali0a ningCn tipo de comprobacin, en este lenguaje, es el programador o desarrollador el encargado de que sus programas no contengan errores* (or ejemplo si se hace una operacin que no esta permitida, el !ystem&'pl la procesar igual, y esto

(or ejemplo, yo lo utili0o en mi programa llamado +6#2&+L $;'+ (ara poder acceder al escritor de matrices* " esto es simplemente lo que diremos acerca del L2;$A+L* !us usos quedan a tu imaginacin* +ntes de dar una lista de nCmeros para L2;$A+L, veamos la sinta=is del comando* Lo que L2;$A+L necesita para funcionar es un nCmero en la pila de la forma @ ,@ B@ e numero 3 sea, con e (ero recuerde que es su responsabilidad si resetea su hp&48 con nCmeros que no

corresponden o la informacin que aqu se entrega* $n todo caso, siempre es bueno probar emociones fuertes @&? +qu entrego una lista con algunos importantes usos de L2A$A+L, junto con el nCmero que corresponda, para que los uses en tus creaciones* Juncin L2;$A+L %enC de !olve polynomial e ;4X,Dh %enC de sistema de ecuaciones e ;4XNNh La ventana de D%1 e ;,XXXh $ntrada a Dhars e ;,XXBh %enC de %313! e ;4BDBh %enC D533!$ de los Jlags >%odos? e ;4BDJh $ntrada directa a %$%3'" e ;4B1`h $ntrada directa a !3LA$ e ;4XXXh %enC de !olve $quation e ;4XXBh %enC de !olve difeq $quation e ;4XB`h %enC de #A% e ;4XN8h %enC de (L3# e ;4X4-h %enC de !"%;3L2D e ;4BBNh %enC de 2ntegrales e ;4BB4h %enC de diferenciales e ;4B,,h %enC de !#+# e ;4B`-h %enC de !26 L$&A+' !#+12!#2D e ;4B`.h %enC de Jrecuencias e ;4B`1h %enC de entrada de datos >J2# 1+#+? e ;4B`Jh %enC de !)%+'" !#+12!#2D! e ;4B8Jh %enC de 2M3 e ;4BZ,h %enC de !end to 5(&48 e ;4BZNh

%enC de 2mpresin e ;4BZ`h %enC de transferencia >#'+6!J$'? e ;4B+8h %enC de recepcin de 5(&5( e ;-XJJh %enC de #+"L3' e ;4B,;h %enC de 2!3L+#$ A+' e ;4B,1h %enC de ecuacin Duadratica e ;4BNXh %enC de manipulacin de e=presiones e ;4BNBh %enC de la +plicacin #2%$ e ;4BN`h $ntrada de las alarmas e ;4BN8h !et time and 1ate e ;4B-;h Datalogo de alarmas e ;4B.$h !i deseas una lista completa, escribeme a milun[starmedia*com S-SEVAL +hora estamos en terreno realmente minado* $ste es el comando ms poderoso del que disponemos en el lenguaje )ser&'pl para la hp&48* Lo que hace, es simplemente darnos acceso a funciones y comandos del lenguaje !ystem&'pl (ero dejo en claro de que este no es un curso de !ystem&'pl, sino de )ser, por lo que yo aqu no enseKar ningCn comando !ystem* La sinta=is del comando y su funcionamiento, es parecido al de L2;$A+L, o sea, se necesita un nCmero con e para poder funcionar, pero dependiendo de cada comando de !ystem, requerir sus propios argumentos para funcionar, o para tratar o manipular* Los que podran ser nCmeros, nCmeros complejos, Dadenas, 1ibujos>grobs?, etc, o estos mismos combinados* $ntonces, cuando uno no le da al !"!$A+L lo que l necesita, el se enoja y la mayora de las veces nos destruye la memoria*

!i deseas tener informacin acerca del lenguaje !"!$A+L, puedes dirigirte a mi pgina y bajar el manual oficial del !"!#$%* http@MM]]]*geocities*comM=jN-u-= http@MM]]]*geocities*comM=jN-u-=M=hp48*html (ara no parecer tan hermtico con este comando, dar un ejemplo@ $sto es para que usted compruebe el (31$' del !"!$A+L* !i usted aplica !"!$A+L con el nCmero e Zd en la pila, resetea su calculadora inmediatamente, sin preguntas* !implemente **** %emory Dlear* $se es un ejemplo* +hora, en caso de que usted, haya quedado enamorado del comando !"!$A+L, en mi pgina, en la seccin 5erramientas, puede encontrar una lista completa con los comandos de !"!#$%&'(L y su descripcin y su nCmero de !"!$A+L* $st en ingls @&? http@MM]]]*geocities*comM=jN-u-= +qu hay una pequeKita lista @ NX`Z4 N+N,8 N+N$D N+N8+ N+44$ N+BJD X-J4, 4BJ.N-N+; 4X1,4X1NZ N++X+ 44DNB 44J$` BNB41 BNBNNZ-NB BNX+D 4$N4` A$'!#'26 %a/e!tdLabel %a/e1irLabel %a/e;o=Label %a/e2nvLabel 1isp%enu*B +';+ $ _aitJorIey !"%;: 21! Loc/+lpha )nloc/+lpha B+M Loc/+ 1o6e]%atri= 1o3ld%atri= #3+12!( #3 12!( Dlr1+B2s!tat '$DL+2%12!( #)'6%$6)36

X-;BX-;$Z N+B$8 NZ;+1

g: 21 21: 1isp%enu 1isp!tac/

Los nCmeros, como se podrn dar cuenta por las letras, estn en he=adecimal* 1e estos, yo no puedo darles informacin, ya que yo programo y enseKo )ser, pero creo que algunos que les podran ser Ctiles seran@ 4X1,Loc/+lpha && 6os pone en modo $scribir 4X1NZ )nloc/+lpha && !ale del modo $scribir 4BJ._aitJorIey && $spera la pulsacin de una tecla X-J4, +';+ $ && 'ecoleccin de basura Los dems realmente no recuerdo para qu sirven* (ero en caso de que te haya interesado demasiado esto, ya sabes donde puedes ir* J26 1$L D+(2#)L3 . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

D+(2#)L3 ` 8$L 12'$D#3'23 3D)L#38 $n la hp&48 e=iste un directorio oculto, cuyo nombre es WW* #rata de hacer esto @ ,@ B@ WW

$s imposible, bueno, a menos que cono0cas un comando muy poderoso llamado****** FFEFEFEFEF@@@@@ si** !"!$A+L* ;2en, en este directorio oculto, se encuentra informacin acerca de la asignacin de teclas y alarmas*

)sted puede pensar E " que tiene que ver esto con programacinF La respuesta, es que como yo quise dar todos mis conocimientos en este manual, les dir el uso que yo a veces, en determinados programas le doy al directorio oculto* (ara mi es Ctil el directorio oculto en aplicaciones en las cuales hay algCna informacion que debe ser creada por nuestros programas, por ejemplo una agenda de telfonos* $ntonces, sera ms cmodo para el usuario, que cada ve0 que necesitara usar su agenda, se fuera al programa que hemos creado, pero l no necesitara tener acceso a la fuente de datos* 3 sea, a la variable en donde vamos guardando la informacin* 1e esta manera, en casos como estos es muy Ctil utili0ar el directorio oculto* deseen* +hora, ustedes le pueden dar el uso que

+hora anali0aremos otro divertido uso del directorio oculto* $n realidad hablaremos de cmo esconder cualquier directorio de la vista del usuario comCn* (ara esto, debemos entrar en un sub& directorio cualquiera, y guardar cualquier cosa, un nCmero, te=to, etc, con el nombre WW* Aer como desaparecen las variables que haba ah* +hora, para tener acceso a esas variables secretas, usted debe teclear mediante el teclado sus nombres*

!e debe tener en cuenta no alterar el contenido de las variables que se encuentran por defecto en el directorio oculto* "a que estas son ocupadas por el sistema y su modificacin podra significar un corrompimiento de la memoria>memory clear?* Los nombres de las variables del sistema que se encuentran en el directorio oculto son @ +larms )serIeys y )serIeys*D'D

oculto F B-```h

+hora, lo ms importante, E como acceder al directorio Don el siguiente nCmero de !"!$A+L @ e 3 en decimal @ e 8`Z,`d " luego de hacer !"!$A+L nos aparecer ,@ B@

esto @

dd

$ntonces, estando en el directorio 53%$ hacemos $A+L y ya est* +hora, para salir del directorio oculto, se hace igual que con cualquier otro directorio @ )(12'*