viernes, 17 de noviembre de 2017

Programación en C - 01 - Primeros pasos I

Surgido en sus inicios como un lenguaje de programación de sistemas operativos, C fue desarrollado como una herramienta para facilitar la codificación del sistema operativo UNIX. Simple, y a la vez muy potente, es considerado un lenguaje de bajo nivel, ya que nos permite acceder a instancias muy cercanas al hardware, prácticamente sin ninguna restricción. Vamos a experimentar los primeros pasos en la programación de ese lenguaje que, seguramente, nos resultara fascinante por su sencillez y capacidad.


Manos a la obra


Como la mejor manera de aprender a programar es programando, escribiremos nuestras primeras lineas de código, para obtener un mensaje en la pantalla de la computadora. Así, nos familiarizaremos con la dinámica de escritura de código. Pero antes de empezar a escribir, deberemos tener algún entorno de programación IDE.
Podemos usar cualquiera que nos guste, incluso el Block de Notas de Windows. Si éste es el caso, debemos recordar guardar el programa fuente en formato de texto con la extensión .c, para que luego el compilador pueda procesar el código.
Ejecutamos el editor y, sin preocuparnos mucho por entender el significado de cada una de las líneas de código, introducimos el programa que vemos a continuación, sin omitir nada de lo que esta escrito:

/* EJEMPLO 1.1 - Mi primer programa en C */

#include <stdio.h>
void main ()
{
    
printf ( "Hola mundo\n" );
}


Una vez ingresado el código, grabamos en una carpeta el archivo con el nombre hola.c, y ya estamos listos para compilar el programa. Vamos al menú Compile y seleccionamos Compile to OBJ, para generar el archivo objeto. Si todo va bien, el compilador nos indicará que la compilación ha tenido éxito y que el archivo hola.obj fue creado satisfactoriamente. Por último, solamente resta vincular el archivo objeto con las librerías del programa, para generar el archivo ejecutable. Vamos al menú Compile y seleccionamos Link EXE file. Finalmente, si no hay ningún inconveniente, el compilador nos indicara que la vinculación ha tenido éxito y que el archivo hola.exe fue creado satisfactoriamente.
Ahora, tenemos que comprobar el resultado de nuestro programa. Vamos al menú Run y seleccionamos Run. Una vez hecho esto, el programa se ejecutara y termina inmediatamente pues su única función es la de imprimir un mensaje en la pantalla del usuario. Tras la finalizacion del programa, el control se devuelve al entorno IDE. El mensaje se muestra en la pantalla del usuario, y para visualizarlo vamos al menú Run y elegimos User screen. Allí, se presenta nuestro mensaje:

Hola mundo

¿Que hace el programa?


Hemos conseguido realizar exitosa mente una aplicación en C cuya única tarea es la de mostrar un mensaje en pantalla, ¿pera qué es lo que hace que esto sea así?, ¿cómo sabe la aplicación que el mensaje lo debe mostrar en pantalla y no, por ejemplo, enviarlo a uno de los puertos de comunicación de la computadora?
Pues bien, analicemos es detalle cada una de las lineas de programa para entender su funcionamiento. Veamos la primera:

/* EJEMPLO 1.1 - Mi primer programa en C */ 

Como podemos observar, esta linea no forma parte del código, en el sentido de que no aporta instrucciones a la computadora para hacer algo, sino que simplemente esta allí para transmitir información a quien interprete el programa, que podemos ser nosotros o un tercero. Es, simplemente, un comentario. Los comentarios son muy útiles y, en general, debemos considerarlos como una buena practica, ya que nos evita tener que recordar que quisimos hacer con el código, posibilitan delinear la idea general del código que continua o, mejor aun, permiten a los otros programadores que deban trabajar con el entender cual fue nuestra lógica de programación a la hora de escribirlo. Observamos que el comentario esta encerrada entre los símbolos /* y */ . Usualmente, cuando el compilador se encuentra en el medio, descarta por completo cualquier cosa que este escrita entre ellos, sin importar cuantas lineas tenga (inclusive, si hay lineas de código no las tiene en cuenta), y continua buscando mas código real para procesar al final del comentario.
En la segunda linea escribimos:

#include <stdio.h> 


Aquí nos encontramos con la directiva pre-proceso #include, la cual no forma parte del código ejecutable, pero si es absolutamente indispensable para el correcto funcionamiento del programa. De hecho, si esta linea no estuviera, el compilador nos arrojaría un error. El símbolo # indica que es una directiva de pre-proceso y le esta diciendo al compilador que debe hacer algo antes de compilar el código fuente, en este caso, que tiene que incluir en nuestro programa el archivo stdio.h, que e la librería que contiene las declaraciones de las funciones de entrada/salida estándar. Este archivo se llama header o cabecera y se lo identifica con la extensión .h. De esta manera, cuando el compilador, en si proceso de codificación, vaya encontrando las funciones a las que el código fuente hace referencia, sabrá como interpretarlas y que hacer con ellas.

Desde la tercera línea de código en adelante, se declara una función:

void main () 
{ 
    
 printf ( "Hola mundo\n" ); 
}


En este caso, nombre de la función es main () y no es arbitrario y podría hacer distrito. La razón de estado de que todo programa Cee antier una función con este nombre y es el punto de partida, de donde el programa comienza su ejecución. La función esta precedida por la palabra reservada void, que indica el tipo de dato que retorna la función. Aquí, particularmente, void nos indica que la función no retorna valores a quien la llama (en este caso, el sistema operativo), pero hay veces en donde le vamos a tener que devolver datos al sistema operativo, por lo que la palabra reservada será diferente.
De la misma manera, vemos que la función contiene dos paréntesis que se abren y se cierra sin encerrar argumentos. Esto paréntesis encierran una definición de los tipo de dato que se van a pasar a la función, pero cuando están vacíos significa que ningún información en necesaria para su funcionamiento.
Finalmente, podemos observar que, seguido de la definición de la función, encontramos una estructura de código encerrado entre dos llaves {...} Que abren y cierran. Lo que encierra es el cuerpo de la función, que define categóricamente lo que ella está programada para hacer.
En este ejemplo, la función main () está programada para emitir un mensaje a través de la pantalla de la computadora, y de eso se encarga la función printf (), cuya definición está incluida la librería estándar stdio.h, que viene con el lenguaje C. La información encerrada entre los paréntesis que siguen inmediatamente la función se denomina argumento y definir el tipo de dato que se va a pasar a ella. En este caso, son del tipo string o cadena. Esta función en la que canalizan información que recibe como argumento accionario de memoria de la computadora encargada de mostrar dicha información en pantalla. No creemos aquí que la cadera detectó que se pasa a la función printf () termina en \n y no forma parte del resultado final que se obtiene en pantalla.
Para las cadenas de texto, existe, en C, una forma de indicar al compilador ciertos caracteres especiales llamado carácter el control, Los cuales son reemplazados durante la compilación, por su equivalente en el código ASCII. En el ejemplo, el carácter de control \n indica el compilador que debe incluir, en ese lugar de la cadena de texto, el código ASCII Correspondiente a Nueva Linea, formada por los caracteres de Avance de linea (Line Feed) y Retorno de Carro (Carriage Return).
Por último debemos notar algo muy importante, que es la presencia del punto y coma (;) al final de la sentencia printf(). Esta es la forma que tiene lenguaje para diferenciar entre final de una función y inicio de la siguiente.

Errores comunes


Durante la escritura un programa, es factible que cometamos errores. Cuando introducimos código que luego el compilador deberá producir e instrucciones para que una computadora lleve adelante, debemos atenernos a todas las estrictas reglas del lenguaje, de lo contrario, el resultado que obtendremos será un mensaje de error u otro totalmente inesperado.
Por ejemplo, si nos olvidamos de colocar un punto y coma entre dos sentencias printf (), el compilador interpretará la segunda sentencia como parte de la primera, y esto podrá ocasionar un mensaje de error. Generalmente, para el usuario que recién se iniciará el lenguaje, e inclusive para los programadores que llevan varios año de oficio, el olvido del punto y coma es un error bastante frecuente, por lo que debemos, desde un principio, tomar como buena práctica el hecho de colocarlos siempre final de cada línea de código que escribamos.
Usualmente, los errores de tipografía son más comunes de lo que podemos imaginar. En el mejor de los casos, serán detectados durante el proceso de compilación y/o vinculación y nos dará la oportunidad de revisar nuestro código y corregirlo. Puede darse el caso de que el olvido una coma donde se espera que vaya, o un punto y coma demás, donde no debería estar, produzca un código perfectamente ejecutable, pero sin dudas distinto del que nosotros esperamos o realizando tareas que no estaban dentro de nuestra lógica de programación.
Sin embargo, los problema descritos anteriormente son detectables a través de un análisis detallado de la sintaxis del código. Pero, por supuesto, estos inconvenientes no son los únicos que pueden ocasionar errores. Más grave aún puede resultar derecho a equivocarnos en la lógica del programa, en las instrucciones encargadas en la toma de decisiones. Esto suele ser particularmente probable en aquellos programas complicados, con mucha decisiones y/o comparaciones, las cuales pueden ser perfectamente correcta desde el punto de vista de la programación del lenguaje, pero incorrecta de la lógica. Es de suponer el resultado final será completamente distinto del que esperamos. En general estos problemas son los más difíciles de detectar, sobre todo si los pasos de programación no están suficientemente comentados.

No hay comentarios:

Publicar un comentario