31 mayo 2011

Listas Simplemente Ligadas

Las listas simplemente ligadas son una estructura de datos que nos permite almacenar cualquier cantidad de datos.  La ventaja principal es que la memoria que ocupa es solamente la necesaria a diferencia de un arreglo que puede desperdiciar memoria que no está en uso (como la memoria que se desperdicia con los arreglos: generalmente declaras un arreglo del tamaño máximo que se podría llegar a usar aunque muchas veces no se llena).
La lista simplemente ligada puede ser usada para crear estructuras de datos más complejos.  Consiste en una secuencia de nodos, donde cada nodo contiene información y un apuntador al nodo que sigue.  El último nodo apunta a un valor nulo (NULL) lo cual indica que es el final de la lista.  De esta manera se puede recorrer la lista de forma secuencial siempre y cuando tengas un apuntador al primer elemento de la lista, como se ve la siguiente imagen (tomada del blog de xrom):
lista
O, si quieres, puedes conceptualizarlo como un tren de vagones donde el tienes un apuntador a la locomotora y el apuntador al siguiente que hay en cada nodo es el mecanismo con el que se engancha al vagón que le sigue (Imagen cortesía de Medieducativos):
t106-tren-cuatro-vagones
En este post me voy a enfocar en 3 cosas: agregar un nuevo nodo a la lista (al final), mostrar todos los nodos (recorrerlo) y eliminar un nodo de la lista.  Antes de entrar a estos temas, hay que ver como se declara la estructura y la forma en que se usa.  En este ejemplo, estoy haciendo una lista que guarda algunos datos de videojuegos.  Aquí está la declaración de la estructura y una variable global que apunta al primer nodo de la lista:
LSL-01
La función principal del programa (main) no tiene mayor ciencia.  Básicamente solo muestra un menú y pide una opción.  En base a la opción deseada manda llamar funciones para dar de alta, consultar todos o eliminar alguno.   Una nota antes de seguir: este programa lo hice usando el compilador Dev-C++ varsión 4.9.9.2.  Este es el código (haz clic sobre la imagen para verlo más grande):
LSL-02
Voy a comenzar hablando de la función que da de alta un nodo al final de la lista.  Primero declaro dos apuntadores a struct nodo: Temp y Temp2.  Uso la función malloc para apartar RAM para almacenar la estructura de forma dinámica.  Si necesitas saber más sobre el malloc, al final de este post hay ligas a páginas que son referencias para que despejes dudas sobre su sintaxis y función.  Pero a grandes rasgos, el malloc sirve para asignarle memoria y devolver un apuntador hacia el espacio reservado.  Una vez apartada la memoria, lleno el nuevo nodo con los datos (que son los parámetros nom, plat y pre) y al campo Sig le asigno el valor de NULL porque va a ser el último de la lista.  Al final debo reorganizar los apuntadores: el apuntador Sig del elemento anterior debe apuntar a este nuevo nodo.  El código que lo realiza es el siguiente:
LSL-03
Una vez resuelto el problema de dar de alta nodos, voy a explicar la forma en que se puede recorrer la lista y mostrar los elementos.  Esto lo hice en la función llamada MuestraTodo.  Declaro un apuntador llamado Temp (para no perder la costumbre, jeje) con el que voy a recorrer la lista.  Uso la variable i para mostrar el número de nodo en el que voy.  Al principio igualo Temp a Inicio  para comenzar el recorrido.  Y mientras no llego al final (o sea, Temp es diferente de NULL), muestro lo que contiene el nodo.  Fíjate como se accesa un elemento por medio de un apuntador ya que difiere de la forma en que se hace cuando no usas apuntador.  En lugar del punto (.), se usa una especie de flecha compuesta por el guión y el signo mayor que (->).  Aquí está el código:
LSL-04
Ahora lo  único que falta es mostrar la función que elimina un nodo de la lista.  Esto es relativamente sencillo y creo que el código se explica por si solo (le puse un montón de comentarios).  Básicamente es igual que la función MuestraTodo solo que esta vez, en lugar de mostrar el elemento, veo si es igual al que busco.  En caso que sea igual, veo si es el primero de la lista.  Si es el primero, solo cambio el valor de Inicio para que apunte al siguiente, y en caso contrario, modifico el apuntador Sig del elemento anterior (convenientemente apuntado por Anterior) para que apunte al que sigue.  Una vez arreglado los apuntadores, libero la memoria usando la instrucción free.  Al final viene más ayuda sobre free, pero básicamente libera la memoria que es apuntada por un apuntador (valga la redundancia).  Al final devuelve un 1 si lo encontró y lo pudo borrar y un 0 si no lo encuentra.  Este es el código de la función Eliminalo:
LSL-05
Estas son ligas donde puedes encontrar más información sobre malloc y free (y algunas otras funciones que te pueden resultar muy útiles).  ¡Hasta la próxima!

27 mayo 2011

Protégete de los virus que están en tu memoria USB

bitdefender-usb-immunizerHace rato leí en el blog de MakeUseOf acerca de un programa de BitDefender que protege tu computadora de los virus que se tratan de autoejecutar desde tu memoria USB.  Este funciona contra los virus que se extienden por medio del autorun.inf.  Éste es un archivo que se hizo con la finalidad de hacer más sencillo la ejecución de programas para usuarios novatos al especificar qué archivo se debía ejecutar al insertar un CDE a la computadora (generalmente un archivo que instala el programa).  Desgraciadamente los creadores de virus se han aprovechado de esto para poner código dañino que se ejecute al momento de insertar la memoria USB en la computadora.  Muchas veces no te das cuenta que ese archivo está allí porque lo dejan oculto.
BitDefender hizo un programa que crea un archivo autorun.inf que no se puede eliminar por un virus.  Así, si tu memoria se infecta, no puede ejecutar el código malicioso de forma automática.  También te da la opción de eliminar la ejecución de este tipo de archivos en tu computadora para que solo ejecute los que vienen en un CD o DVD, pero no de memoria USB.
Aunque no es la solución a todos los males virales, puede ayudar a detener la propagación.  El programa lo puedes descargar aquí.  ¡Saludos!

20 mayo 2011

Los Wikis: una introducción

¿Qué se te viene a la mente cuando escuchas la palabra Wiki?  Probablemente una de las primeras palabras que se te vienen a la mente es Wikipedia.  Y tienes algo de razón, porque Wikipedia es el wiki más grande hasta el momento (detalle chistoso, según algunos el segundo wiki más grande es acerca de World of Warcraft y lo puedes visitar aquí).
Voy a aprovechar la experiencia depositada en Wikipedia para que nos ayude a esclarecer lo que es un wiki.  Según ésta, un wiki es “un sitio web cuyas páginas pueden ser modificadas por múltiples voluntarios a través del navegador web.  Los usuarios pueden crear, modificar o borrar un mismo texto que comparten.” (esta definición la leí aquí).
Soy fan de los videos del CommonCraft Show (como mis alumnos lo pueden atestiguar) porque de forma muy sencilla explican diferentes cosas en su serie “in plain english”.  Encontré doblado el video Wikis in Plain English que te comparto aquí.  Muestra la forma en que un wiki resulta muy útil.  Espero que resulte esclarecedor.

Wikis in Plain English, doblado por Ludo.

Además de lo que se expuso en el video, es una forma excelente de resumir conocimientos acerca de cualquier tema.  Por ejemplo, un maestro podría dejar que sus queridos alumnos hicieran un wiki con el material que cubren durante el curso.
Ahora, ya sabes lo que es un wiki.  La siguiente pregunta sería, ¿y cómo creo uno?  Aunque hay varios sitios para crear wikis, uno de los más sencillos es wikispaces.com.  Para ilustrar el proceso, hice el siguiente video.  Espero que les sea de utilidad.

Mi video acerca de la creación de Wikis usando wikispaces.com

18 mayo 2011

Eventos de la Semana Cultural en la Univa

Estimados todos, los quiero hacer partícipes de un evento que estamos organizando para la XXVIII Semana Cultural en la prepa Univa.  Este es el cartel de la conferencia que voy a dar.
Ojalá nos veamos allí…
Cartel-Conferencia

09 mayo 2011

Impresiones con Visual Basic 2010

PrinterPese a que vivimos en una era digital y todo (bueno, casi todo) se hace por internet y con la computadora, aún hay momentos en que el papel es necesario.  Hace tiempo escribí un post donde indicaba cómo imprimir usando Visual Basic 6, pero no había tenido la oportunidad de hacer lo mismo con el Visual Basic .net.  Y eso precisamente es lo que pienso hacer en esta ocasión: mostrar como usar los controles y cajas de diálogo para imprimir y la forma de imprimir tanto texto como imágenes.
Antes de continuar con rollo, código, ejemplos y demases, voy a describir brevemente los componentes que tiene Visual Basic 2010 para imprimir.
Control PrintDocument
Este control se debe agregar a cualquier proyecto en el que se quiera imprimir algo.  Haz de cuenta que es la hoja en blanco donde puedes dibujar diferentes objetos, escribir texto y colocar imágenes de mapa de bits.  Cuando acabes de dibujar, escribir, etc., se llama el método Print para que la impresora escupa la hoja.  Acepta todos los métodos de dibujo que usa el objeto Graphics (mismo del que di ejemplos aquí y aquí), es decir que si tienes que escribir texto, usas el método DrawString; si quieres dibujar un marco alrededor del texto, puedes usar DrawLine o DrawRectangle.  Aunque el control es invisible (no aparece en la ventana ni hay forma de ir viendo conforme se va dibujando), es muy útil.
Control PrintDialog
Este control hace aparecer la ventana default que te permite elegir y configurar la impresora que se desea emplear.  Si no se usa, la impresión se hace en la impresora que se tiene definida como default con las propiedades que trae por default (o sea con lo default de lo default Sonrisa).  Para que aparezca, se debe usar el método ShowDialog.
Control PageSetupDialog
Este control hace aparecer la ventana que te permite configurar el papel a usar: tamaño, orientación, márgenes, etc.  Se debe usar su método ShowDialog para que aparezca, igual que con el control PrintDialog.
Control PrintPreviewDialog
Este control hace aparecer una vista previa de lo que se va a imprimir.  Como mostraré más adelante, se debe vincular este control con lo el control PrintDocument para que todo lo que se va a imprimir, en lugar de ir a la impresora, aparezca en esta ventana.  También hay que tener cuidado: si no se tiene acceso a la impresora que está seleccionada (por ejemplo, una impresora de la red a la cual no tengo acceso en este momento o la que tengo conectada está apagada), no aparece la ventana y te marca error.  Es necesario recibir este error (con un Try…Catch) para que no termine abruptamente el programa solo porque no halla la impresora (cosa que no hago en este post, por cierto).
Ejemplo de su uso
Después de este rollo (que espero que haya sido breve), voy a ejemplificar el uso de estos controles en un programa que hice con mis queridísimos alumnos de 4TPO.  Es un ejemplo muy simple que solo muestra como se usan los controles.  Sin embargo, creo que con estas bases ya le pueden echar vuelo a la imaginación para aplicarlo en otros contextos.
Antes que nada, les muestro el diseño de la ventana principal.  Consta de 3 etiquetas, 3 cajas de texto (txtNombre, txtDir y txtRFC), un PictureBox (picCanoa) que sirve para mostrar como imprimir una imagen de mapa de bits, 7 botones cuyo código explicaré más adelante, 2 controles PrintDocument, un PrintDialog, un PageSetup y un PrintPreviewDialog.  Estos 5 últimos no aparecen en la ventana: cuando los agregas a la ventana aparecen en la parte inferior.
00Form1
Para que un PrintDocument funcione, es necesario editar su evento PrintPage.  Si le das doble clic al icono PrintDocument1, verás este código:
01PrintDocument1
Básicamente uso el parámetro e, que es “la hoja invisible” sobre la que voy a dibujar, para escribir 3 cadenas, un rectángulo y la imagen de la canoa.  Como mencioné con anterioridad, son las mismas funciones que se usan para dibujar gráficos sobre la ventana cosa que ya escribí en este post y en este también.
Una vez que tienes este evento listo, puedes mandar imprimir con la función Print.  Yo lo hago con el botón cuya etiqueta dice Imprimir y este es el código:
02btnImprimir
El PrintDocument2 muestra una idea para imprimir formatos.  Dibujé el esqueleto de un formato, lo guardé como PNG, lo importé a Visual Basic y lo puse en un PictureBox (llamado PictureBox1) en la ventana frmPicts.  Aquí está la ventana frmPicts y abajo el código que lo usa (primero el el botón que tiene la etiqueta Imprimir formato, btnImprime2, y luego PrintPage).
03frmPicts
04PrintDocument2
Configurar la impresora es muy simple usando el control PrintDialog.  Este es el código del botón con la etiqueta Configurar impresora.  Fíjate en la manera en que copio las propiedades puestas por el usuario en este cuadro de diálogo en los dos controles PrintDocument (en las 2 últimas instrucciones):
ConfigImpr
A la hora de ejecutarse, el control PrintDialog hace que aparezca esta ventana:
06PropImpresora
También es sencillo modificar la configuración de la página.  Este es el código del botón etiquetado Configurar página:
07btnConfPag
Antes del ShowDialog es necesario igualar sus propiedades a los que ya tiene un PrintDocument (en las dos instrucciones que siguen al comentario).  Al correr este evento, aparece esta ventana:
08ConfPag
Una vista previa (o presentación preeliminar) de lo que se va a imprimir suele ser bastante útil para muchos usuarios.  Hacer que aparezca es sencillísimo.  Lo único que hay que hacer es hacer que, en lugar de que el evento PrintPage de un PrintDocument lo mande a la impresora, se le envía a esta caja de diálogo.  Abajo pongo el código y luego la ventana que aparece que muestra la vista preeliminar:
09btnVistaPrev
10VistaPrevia
También es posible jugar con la configuración de la impresora.  Para leer algunas propiedades de las impresoras, hice el botón etiquetado Lista de impresoras que abre la ventana frmImpresoras desde donde se pueden ver la lista de impresoras instaladas y al seleccionar una de ellas, se ven algunas de sus propiedades.  Esta es la ventana frmImpresoras en la vista diseño:
11frmImpresoras
Tiene una lista donde voy a escribir la lista de impresoras (ListBox1), etiquetas que muestran los valores de las copias, si es duplex (si puede imprimir por ambas caras de la hoja), el número máximo de copias permitidas y si puede recibir documentos a color (lblCopias, lblDuplex, lblCopiasMax y lblColor, respectivamente).  También es necesario un PrintDocument para poder ver estas propiedades.  Pero antes que nada, veamos el código con que llena ListBox1:
12frmImpresoras
Nótese que estoy haciendo uso de la colección Printing.PrinterSettings.InstalledPrinters misma que contiene la lista de todas las impresoras instaladas en el equipo donde se está ejecutando.  Estoy usando la instrucción With para abreviar un poco y no escribir este rollo a cada rato.
No necesito escribir un evento PrintPage para el PrintDocument1 porque no voy a imprimir nada: solo lo necesito para poder mostrar las propiedades.  Por esta razón el otro código interesante es el que se ejecuta cuando ListBox1 cambia de elemento seleccionado:
13ListBox1
Este es un ejemplo de como se ve esta ventana con una impresora seleccionada:
14frmImpresoras
Espero que este documento te sea útil.  ¡Hasta la próxima!
P.D. La imagen que usé de la impresora verde fue hecho por OCAL.  De gran ayuda para elaborar este post fue el siguiente libro:

02 mayo 2011

Tutoriales de Photoshop: Mayo 2011

Hace tiempo que había comenzado a compartir los mejores tutoriales de Photoshop (bueno, los que yo me había encontrado y consideraba buenos), pero por alguna razón, después de julio del 2010 ya no le seguí (claro que recién había comenzado en mayo, los anteriores los hacía en un post diferente).
Aquí les dejo algunos tutoriales con los que me he topado que creo que son muy buenos.  ¡Que los disfruten!




minion
Personaje de la película “Mi villano favorito”
(PSDTuts)
Nota: este tutorial también hace uso de Ilustrador (pero como me encanta la película, no pude dejar de ponerlo)

gold_orange_porsche_medium2
Porsche de naranja (aplicar una textura a un objeto) 
(AlfoArt)





El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...