25 enero 2009

Comparando C, C++ y Java

Ya que ando en eso de la historia de los lenguajes de programación (ver mi post anterior con imágenes sobre esta historia), me topé con este sitio web que se encarga de hacer una comparación entre C, C++ y Java.
Aunque hay ejemplos de código y toda la onda, creo que incluso los que son recién iniciados en las artes oscuras y claras de la programación lo pueden entender sin demasiado problemas.
Ojalá les sea útil.  ¡Saludos!

Historia de la programación

Vagando errabundo por el internet me encontré con esta imagen que resume el desarrollo de los lenguajes de programación.  Se me hizo muy interesante en lo particular y como muchos me han preguntado sobre la importancia de los lenguajes, de dónde surgieron, etc., decidí compartirles la imagen.  Si haces clic sobre la imagen, te va a llevar a otra página donde lo puedes descargar (es que está muy grande):
ComputerLanguagesChart
Una editorial hizo otra imagen con una línea cronológica del desarrollo de los lenguajes de programación.  No me gustó tanto como la imagen anterior, pero lo puedes conseguir aquí si te interesa.
Ojalá te sea útil estos recursos para despejar dudas acerca de como y cuando surgieron los lenguajes de programación y qué lenguajes tuvieron influencia sobre otros.  ¡Saludos!

19 enero 2009

Tipos de datos y variables

img_163
Para todo buen programador (véase imagen a la izquierda, jeje), es indispensable saber hacer algoritmos.  Sin embargo, para hacer algoritmos para la computadora, es indispensable guardar información.  No se puede trabajar con datos, si no puedes ponerlos en algún lado, ¿cierto?
Dejando estas obviedades a un lado, vamos viendo lo que son los tipos de datos, cómo se dividen, qué tipos hay, etc. para luego hablar de variables, las cuales son una especie de encarnación de los tipos de datos en un programa.  Ahí vamos…
Pero antes de hablar de tipos de datos, ¿qué es un dato?  Un dato, según la RAE (Real Academia Española) es el antecedente necesario para llegar al conocimiento exacto de algo o para deducir las consecuencias legítimas de un hecho.  He allí la importancia del manejo de datos, la justificación misma por la que las computadoras son indispensables para la humanidad entera (parece exagerado esta afirmación pero, ¿qué pasaría si apagáramos las todas las computadoras del país media hora?  ¿Quién se haría cargo de manejar toda esa información?).  Por otro lado, también aclara que en la informática, un dato es la información dispuesta de manera adecuada para su tratamiento por un ordenador.  Esta definición es exactamente lo que andamos buscando, o por lo menos para los fines de este artículo.
Para la computadora, todo lo que almacenes es un número binario, o sea, puros unos y ceros.  Absolutamente todo.  Es por esta razón que hay que decirle a la computadora cómo queremos que trate a ese número, porque hay información de todo tipo: números, letras, valores booleanos (verdadero o falso), fecha, hora, etc.  Por ejemplo, la computadora podrá guardar el un byte en su memoria que almacene el siguiente número binario: 10000010.  Si lo interpretamos como un número entero, equivaldría al 130 pero si lo interpretamos como una sola letra correspondería al “é” (gracias al código ASCII).
Los datos se pueden dividir en ordinales y escalares (o no-ordinales como dicen algunos autores).  Los datos ordinales son aquellos que almacenan datos que se pueden contar, o sea que se puede establecer una relación uno a uno entre sus elementos y el conjunto de números naturales, como lo son los enteros, lógicos o booleanos y los caracteres o letras.  Los datos escalares o no-ordinales son aquellos que no se pueden contar y se pueden resumir que son los números reales o sea, números que contienen un punto decimal.
Un tipo de dato básicamente en un conjunto de valores que un dato puede tomar durante un programa.  Básicamente hay dos tipos de datos: los numéricos y los de caracteres (letras).
Como decía antes, una variable es algo así como la encarnación de un tipo de dato en un programa.  Formalmente podríamos decir que una variable es un campo de memoria que almacena información, la cual puede cambiar en cualquier momento.  En álgebra lo usan para definir cosas de las que todavía desconoces su valor y en la computación lo usamos para guardar datos, por lo que cada variable tiene un tipo de dato definido.
Haz de cuenta que las variables son como los contenedores (como Tupperware) que tienen en su casa: cada bote contiene un solo tipo de cosa, ya sea café, sal, azúcar, etc.  El tipo de contenido (café, azúcar, etc.) es el tipo de dato y tendrías un error terrible si al bote de azúcar lo llenas con sal.  Probablemente en tu alacena el bote donde pones la sal es idéntico al que usas para la pimienta, pero lo que difiere es la forma en que lo usas, el contexto en el cual usas el contenido de cada bote, al igual que las variables, las cuales son espacios en memoria que contienen dígitos binarios y la única diferencia entre una y otra es la forma en que se usa el número que está almacenado.  Para hacer cualquier cosa en la cocina, necesitas de varios botes de tu alacena con los diferentes ingredientes que vas a usar en tu receta/algoritmo porque guardan cosas/datos indispensables para la solución.
A continuación voy a poner una tabla con los tipos de datos principales (o por lo menos los más usados).  Escribiré el tipo de dato, el número de bytes que ocupa en la memoria y el rango de valores que acepta.  Aunque los nombres de los tipos son en lenguaje C o C++, estos tipos de datos existen en todos los lenguajes de programación.
Tipo
Tamaño (bytes)
Valor mínimo
Valor máximo
char
1
-
-
int
2
-32768
32767
unsigned int
2
0
65536
long int
4
-2^91
2^91 - 1
float
4
-3.2 x 10^38
3.2 x 10^38
double
8
-1.7 x 10^308
1.7 x 10^308
Ok.  Creo que más o menos agarramos la onda de lo que tratan las variables, pero ¿cómo nos referimos a ellas?  Fácil.  Haríamos lo mismo que para hablarle a cualquier amigo: por su nombre.  El único problema radica en decidir qué nombre ponerle.
Las variables, al igual que las personas, pueden tener el nombre que sea.  Sin embargo, no todo nombre es adecuado.  En álgebra, estamos acostumbrados a usar nombres como x, y o z, sin embargo son muy pocas las variables usadas en las funciones matemáticas, a diferencia de un programa para la computadora que puede manejar miles de datos al mismo tiempo.  Es por eso que se debería poner un nombre que tenga que ver con el dato que quiero guardar.  Por ejemplo, en lugar de ponerle juanito_perez a una variable donde almaceno la cantidad que voy a descontar del subtotal del pedido de un cliente, sería mejor ponerle un nombre como descuento.
Hay un estándar que nos ayuda a nombrar variables una nomenclatura húngara que consiste en unos lineamientos que sirven para nombrar variables de tal manera que al solo ver la variable, nos demos cuenta de qué tipo de dato se trata.  Para usar esta nomenclatura inicias los nombre de todas las variables con tres letras que indican el tipo de dato, seguido del nombre de la variable que comienza con una letra mayúscula.  Por ejemplo, si el porcentaje de descuento del que hablaba en el párrafo anterior es de tipo entero, el nombre de variable que sugiere esta nomenclatura sería intDescuento.
Antes de poder usar una variable, hay que declararla (hay lenguajes que no te obligan a hacerlo de forma explícita porque si no lo haces, el lenguaje le asigna un tipo de forma automática).  Al declarar una variable el programa reserva unos cuantos bytes de la memoria RAM y recuerda que a esos bytes los va a conocer como esa variable y va a tratar el dato que está allí de determinado forma (según el tipo de datos).
Cada lenguaje de programación tiene su propia manera de declarar variables.  Por ejemplo, en C y C++ la sintaxis sería esta:
tipo nombre;
Por ejemplo:
int X;
También se pueden declarar muchas variables del mismo tipo en una sola línea, como se ve aquí:
double dblTotal,dblPrecio,dblCambio;
E incluso le puedo asignar un valor a la variable para inicializarla con algún valor (nota: las constantes que son caracteres van entre apóstrofes.  Si no las hubiera puesto en el siguiente ejemplo, estaría tratando de asignarle a chrLetra el valor almacenado en la variable S):
char chrLetra=’S’;
Aquí le paro.  Luego podremos hablar sobre como usar variables en otros lenguajes, pero de todos modos es muy similar.  ¡Hasta la próxima!

17 enero 2009

Crea tu control de videojuego tipo Wii, ¡gratis!


Bueno, casi gratis.  En el blog de Educación Tecnológica, un blog que me gusta revisar de vez en diario (¡gracias por el RSS que me facilita la vida!) me enteré de Camspace, un software gratuito que te deja usar tu webcam y cualquier objeto que se te ocurra para controlar tus videojuegos, casi como lo harías con el Wii, pero gratis.
Solo es cuestión de echar a volar la imaginación.  A mi se me ocurren usos con gente que tiene dificultad con los controles “normales” de una compu (teclado, mouse), como es mi hija de 2 años.  Otros ejemplos los puedes encontrar aquí encontrarás una página donde están haciendo aplicaciones muy padres.
Todavía no lo pruebo, pero parece fascinante.  Aquí les dejo el video para que se emocionen igual que yo, jeje.  Si lo prueba, dejen aquí un comentario con sus experiencias.  ¡Hasta la próxima!





07 enero 2009

El algoritmo: ¿de qué se trata esta onda?

Seguramente has escuchado hablar de la palabra algoritmo, pero realmente ¿qué es?  O mejor dicho, ¿de qué se trata?  Y una vez que sabes que rollo, ¿cómo lo ejecuta la computadora?  Ante esta incógnita, voy a hablar un poco (o mejor dicho, escribir un poco) acerca de los secretos recónditos de un algoritmo.

La Real Academia de la Lengua (o RAE para los cuates), nos dice que un algoritmo es “Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema”.  Con esto creo que queda muy claro de qué trata el rollo.

Sin embargo, ¿qué chiste tiene escribir aquí lo que dice la RAE?  Voy a adentrarme un poco a las raíces para remontarnos en la historia chirolira acerca del origen de la palabra algoritmo.  Esta palabra viene del apodo de Mohammed Ibn Musa Abu Djefar, mejor conocido como Al-Khwarismi (en español: Aljuarismi), un sabio musulmán que escribió más o menos alrededor del año 830 un libro sobre las matemáticas, concretamente sobre el álgebra.

Como ya se definió antes, un algoritmo consta de los pasos para resolver algún problema, algo así como una receta de cocina: si sigo los pasos, llego a obtener un platillo interesante (y esperemos que sabroso también).

Vamos viendo como se “ejecutaría” un algoritmo de cocina (o sea, una receta).  En primer lugar tenemos una entrada que constaría de los ingredientes necesarios.  En segundo lugar tenemos todo el equipo (hardware) necesario para cocinar (como ollas, cubiertos, platos, etc.), los cuales formarían la unidad de procesamiento.  Aunque no se note, existe una parte en el cerebro del cocinero que controla el proceso, cosa conocida como la unidad de control.  Y al final se tiene el platillo terminado, o sea la salida.  Estos componentes se pueden observar en la siguiente imagen:

 
 Llevando nuestra receta a la computadora, tenemos que tomar en cuenta otro elemento importantísimo y vital: la memoria.  Aquí cambia poquito como se procesa información en comparación a nuestra receta culinaria.
  • La entrada consiste en todos los datos que se van a procesar, así como el programa que dice qué se va a hacer con estos datos.
  • La memoria almacena la entrada y los resultados de la unidad de procesamiento.
  • La unidad de control lee el programa y lo traduce en una serie de operaciones de máquina.
  • La unidad de procesamiento realiza todas las operaciones (sumas, multiplicaciones, etc.) sobre la información que recibe de la memoria.
  • La salida son los resultados de la unidad de procesamiento, almacenados en la memoria y transmitidos a un dispositivo de salida.

En un diagrama, lo veríamos así:

 
 Los algoritmos se pueden representar básicamente de dos maneras: de manera gráfica y con texto.  Hay 2 o 3 representaciones gráficas donde la más conocida es el diagrama de flujo.  Estos diagramas usan símbolos para representar acciones y son tan conocidos que también son usados fuera del ámbito computacional.  Otro diagrama menos conocido, y que no me gusta para nada, son los diagramas NS o de Nassi-Schneiderman que representa un algoritmo en un bloque cuadrado con varios rectángulos interiores.  En cuanto a representaciones basados en texto, está el pseudocódigo, la cual no es más que todos los pasos escritos uno tras otro.

Escribir los algoritmos es algo fundamental para el buen programador.  Muchos de mis alumnos creen que es una pérdida de tiempo sentarse a pensar una solución, sin embargo es muy importante y te ahorra mucho trabajo, porque el error de programación más difícil de corregir es el lógico, el que surge de un algoritmo que no resuelve el problema.  Los errores de sintáxis, o sea de cosas mal escritas (te falta un punto y coma o un espacio, escribiste mal el nombre de la instrucción, etc.) se corrigen rápido ya que el compilador te indica en qué línea te equivocaste.  Pero ante errores lógicos no hay nada que pueda hacer el compilador.

Aunque vivió muchísimos años antes de los rollos de las computadoras y los algoritmos, Sócrates dijo algo que aplica a los errores lógicos: decía que no hay peor mal que la ignorancia en acción.  Te reto a que no dejes que la ignorancia entre en acción y planifiques tus algoritmos.  No es necesario que tengas que hacer un diagrama de flujo para cada algoritmo que hagas, pero encuentra una herramienta que te sea útil para pensar tu solución.  Por ejemplo, yo trato de diagramar mis sistemas con una mezcla de diagramas de Warnier con código en C.  Eso me funciona, pero tu debes de encontrar tu propia forma de solucionar retos.

¡Hasta la próxima!

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...