top of page

Introducción

El Lenguaje de programación C se considera un lenguaje de nivel medio, porque aprovecha las características de los lenguajes de alto nivel y ensamblador, es decir, combina elementos del "lenguaje de alto nivel" con el funcionalismo del "lenguaje ensamblador"; y es uno o quizá el más importante lenguaje de alto nivel para aprender a programar, debido a características, tales  como: portabilidad, controlabilidad sobre hardware y software, flexibilidad, y su aparente inmunidad al paso del tiempo. Desde sus inicios en los años 70 del siglo pasado (RITCHIE, 1978), el lenguaje C es a veces considerado el padre de todos los lenguajes modernos ya que ha influenciado a los lenguajes más utilizados en la actualidad: Java, C++ y Python (Online, 2016). La curva de aprendizaje desde cero de estos lenguajes podría ser relativamente alta, pero luego de aprender el lenguaje C resulta más viable migrar a otros lenguajes como Objective C, C++, PHP, etc. Además, el lenguaje C es tan poderoso que forma la estructura que soporta los Sistemas Operativos más populares, específicamente, Windows, OSX, y Linux. Similarmente  se lo puede encontrar en aplicaciones para supercomputadoras, desktops, y sistemas embebidos. Su importancia es tal que el lenguaje C siempre ocupa los primeros lugares en listas de lenguajes para aprender o requeridos por empleadores, tal es el caso que IEEE Spectrum (CASS, 2016) coloca al lenguaje C en el primer lugar de los "Top Ten Languajes for 2016".

 

Actualmente, cuando la sociedad de la información es una realidad, existen innumerables fuentes para aprender el lenguaje C; ya sea en la web o formatos impresos. Sin embargo, luego de una exploración de estas fuentes, el programador principiante o avanzado puede identificar inconvenientes como los que se mencionan a continuación: existe extensa información teórica, muy sólida pero difícil de entender; hay pocos ejemplos demostrativos para reforzar inmediatamente dichos conceptos teóricos; faltan o son pocos los ejercicios resueltos y a menudo no se provee respuestas; y la complejidad del contenido es muy elevada o por el contrario muy baja. En este contexto, y a pesar de la extensa información disponible en la actualidad, resulta importante una fuente de aprendizaje de lenguaje C que mitigue las mencionas falencias y presente ventajas adicionales tanto para el programador como para el docente.

 

En este libro, "Lenguaje C - Teoría y Ejercicios, 3ra Edición", el autor presenta una solución altamente didáctica y actualizada para aprender este lenguaje, la cual está fundamentada en su amplia experiencia como docente de algunas universidades y programador en proyectos privados. Este libro es recomendado tanto para docentes como para estudiantes, y también para el auto-aprendizaje de entusiastas; por lo que el profesor puede usarlo como texto guía para desarrollar cursos desde nivel principiante, intermedio, hasta avanzado; y el estudiante fácilmente puede seleccionar el contenido y complejidad de acuerdo a su necesidad. Además, mediante su sitio web (GRANIZO, 2016) , el autor complementa el libro con invaluables ayudas didácticas, tales como: soluciones a los ejercicios resueltos en el libro, tutoriales actualizados para instalación y configuración de los ambientes de desarrollo; por ejemplo: IDE, compiladores, y programas de prueba. El autor ha sido profesor en Carreras de Ciencias de la Computación y sobre todo en Eléctrica y Electrónica, lo cual le confiere una considerable valor agregado ya que su visión al escribir este libro es global y considera tanto el alto nivel de computadoras personales como el bajo nivel de sistemas embebidos con microcontrolador. Muchos de los ejercicios y soluciones surgieron como ideas camino al aula o conclusiones después de observar cómo se motiva la mente del estudiante. Por otra parte, varios ejercicios se fundamentan en ejercicios propuestos de los autores GOTTFRIED y SCHILDT; los cuales fueron adaptados al enfoque de este libro y son presentados no solo como ejercicios propuestos sino también con sus respectivas soluciones. Las ideas y conceptos presentes en la tercera edición de este libro reflejan la visión y experiencia del autor, los cuales son complementados por un amplio estudio de la literatura existente, por ejemplo: (SCHILDT, 1994),  (GOTTFRIED, 1991) y (BECERRA, 1991);  durante los últimos 20 años, de donde se ha seleccionado y mejorado aspectos relevantes ya que pocos presentan una solución completa, como se explica en el párrafo anterior. 

 

Para favorecer el aprendizaje, la estructura de este libro es progresiva desde conceptos básicos hasta más avanzados. Algunos capítulos son dependientes de anteriores, sin embargo varios pueden abordarse sin requisitos previos. En los siguientes párrafos se presenta la estructura y resumen del contenido del libro por capítulos. De esta manera, el lector puede visualizar con anticipación los capítulos que solucionan sus necesidades:

 

El primer capítulo, INTRODUCCIÓN AL LENGUAJE C, contiene el origen y las ventajas del lenguaje C. También, se analiza al lenguaje C como lenguaje de nivel medio, como lenguaje de alto nivel y como lenguaje estructurado. Además, se establece la diferencia entre enlazar y compilar separadamente un programa. Por último, se establece la estructura de un programa en lenguaje C, lo que es una biblioteca, y cómo se realiza la compilación de un programa en lenguaje C.

 

El segundo capítulo, TIPOS DE DATOS, contiene las definiciones básicas y necesarias de los tipos de datos que definen un conjunto de valores que puede tener una variable, junto con un conjunto de operaciones que se pueden realizar sobre esa variable, siendo los tipos de datos más comunes los números enteros, los números reales y los caracteres. El lenguaje C tiene cinco tipos de datos básicos incorporados; aunque no se trata de un lenguaje fuertemente tipificado, porque se permiten casi todas las conversiones de tipos.

 

El tercer capítulo, ENTRADA/SALIDA POR CONSOLA, contiene la entrada y salida de datos que se realizan a través de funciones de biblioteca, siendo un sistema de Entrada/Salida (E/S) que ofrece un mecanismo flexible, a la vez que consistente, para transmitir datos entre dispositivos. Las funciones de E/S por consola son aquellas que controlan la entrada por teclado y la salida a través de pantalla (consola), y es la E/S estándar del sistema; aunque esta E/S puede ser dirigida a otros dispositivos. En lenguaje C existe E/S por consola y por archivo, que son conceptualmente diferentes, pero técnicamente el lenguaje C hace poca distinción entre la E/S por consola y la E/S por archivo.

 

El cuarto capítulo, SENTENCIAS DE CONTROL, contiene los tipos de sentencias de un programa en lenguaje C, que son las piezas con las que se construye un programa. Es decir, en lenguaje C una sentencia es una instrucción para que el computador realice una tarea determinada. Además, este capítulo contiene las "sentencias de control", cuyas formas básicas son decisión y repetición, que tienen la función de controlar el "flujo del programa" (flujo del programa es la secuencia que el computador sigue para ejecutarlo).

 

En el quinto capítulo, PUNTEROS, se define a los punteros que son variables que almacenan una dirección de memoria de otra variable, esta dirección es la posición interna de la variable en la memoria RAM del computador, es decir, son variables apuntando a otras. Para acceder a un dato se necesita a más de la dirección de memoria, el "tipo base del puntero" que define el tipo de variable a la que puede apuntar el puntero, especificándose a la vez el tamaño del dato; ya que el puntero solo apunta al primer byte del dato y técnicamente cualquier tipo de puntero puede apuntar a cualquier lugar de la memoria, pero toda la aritmética de punteros está hecha en relación a su tipo base. El tamaño de la variable puntero varía de acuerdo a la arquitectura de la memoria RAM del computador, en la actualidad se tiene de 16, 32 o 64 bits; por lo que, para facilitar el entendimiento del manejo de punteros, tanto en la teoría como en los ejemplos, se adaptó la versión de la arquitectura de 32 bits; de esta manera, todos los ejemplos de esta obra muestran direcciones que se almacenan en cuatro bytes (32 bits).

 

El sexto capítulo, FUNCIONES, contiene la definición de una función, que es un bloque de código de programa auto contenido diseñado para realizar una tarea determinada. La filosofía del diseño del lenguaje C está basada en el empleo de funciones, ya que un programa dividido en funciones es más modular y por tanto más fácil de leer, modificar o arreglar. La razón principal para usar funciones es para evitar tediosas repeticiones de programación; escribiendo una sola vez la función apropiada se la puede emplear cualquier número de veces en un determinado programa y en diferentes situaciones, únicamente llamándola por su nombre. Es decir, cuando una función es lo suficientemente general, se la puede emplear en diferentes programas, teniéndola a disposición en una librería. En general, se plantean las funciones como "cajas negras", definiéndolas mediante su entrada y su salida, es decir, mediante la información que hay que suministrarlas y el producto recibido de ellas, respectivamente.

 

El séptimo capítulo, MODOS DE ALMACENAMIENTO, contiene los "modos de almacenamiento" de una variable, que permiten determinar el alcance de una variable (dónde son reconocidas y en qué parte del programa se las pueden usar) y el tiempo que permanece la variable en la memoria del computador. El "modo de almacenamiento" queda a su vez determinado por el lugar donde se declara la variable y por su palabra clave. Entonces, una variable tiene a más de su tipo de dato, un "modo de almacenamiento".

 

En el octavo capítulo, ARREGLOS, se define a los arreglos que son colecciones de datos del mismo tipo que se referencian por un mismo nombre, cuyos datos, llamados "elementos", se distinguen entre sí con índices o direcciones de memoria. Los arreglos se clasifican por el número de índices de acceso a los elementos, por lo que pueden tener de una a varias dimensiones: unidimensionales, bidimensionales y multidimensionales. Además, existen arreglos de punteros y arreglos asignados dinámicamente.

 

El noveno capítulo, CADENAS DE CARACTERES, contiene la definición de una cadena en lenguaje C, que es un "arreglo" de tipo char que termina en un caracter nulo, '\0'. Además, se establece la utilización de cadenas dentro un programa y se estudian las funciones estándar de cadenas de caracteres más usadas. Por último, se realiza un estudio del uso de los argumentos de la "línea de comandos", para utilizarlos dentro de un programa.

 

En el décimo capítulo, ESTRUCTURAS, se definen estructuras, campos de bits, uniones y enumeraciones. Pues estos tipos de datos tienen uno de los usos más importantes en la creación de nuevos formatos de datos, porque resultan mucho más eficientes que utilizar arreglos o estructuras simples. Estos formatos son las pilas, colas, árboles, tablas y grafos; los mismos que se construyen a partir de estructuras encadenadas. Por último, se define la sentencia typedef, que permite asignar un nombre alternativo a un tipo de dato ya existente, con un nombre arbitrario otorgado por el usuario; es decir, realmente no se crea un nuevo tipo de dato.

 

El capítulo undécimo, ARCHIVOS, contiene las operaciones de E/S a archivos que tienen lugar a través de llamadas a las funciones de la biblioteca estándar. Esta biblioteca es llamada "sistema de E/S" y en lenguaje C son definidos tres tipos: el sistema de E/S definido por el estándar ANSI, el sistema de E/S tipo UNIX y el sistema de E/S de bajo nivel. En este capítulo solo se estudiará el sistema de E/S para compiladores en el Sistema Operativo Windows, que puede ser usado para leer y escribir cualquier tipo de datos, siendo estos datos transferidos en su representación binaria interna o en formato de texto normal.

 

El capítulo duodécimo, PREPROCESADOR, contiene las "directivas de preprocesador" que son sentencias dirigidas al compilador en el código fuente de un programa en lenguaje C, y no son realmente parte del lenguaje C, pero amplían el ámbito de entorno de programación.

 

Además, esta obra contiene los anexos: CÓDIGO ASCII PARA EL PC, PROTOTIPOS DE LAS FUNCIONES DE BIBLIOTECA DEL LENGUAJE C MÁS UTILIZADOS, E ÍNDICE DE PROGRAMAS. También se presentan en la dirección Web http://eagranizo.wix.com/librospublicados, los programas demostrativos que refuerzan lo presentado en la teoría, la instalación de un compilador de lenguaje C++ y la forma de realizar una aplicación en Windows.

 

Finalmente, para obtener el mayor beneficio de este libro, el autor cree importante recomendar y advertir al lector sobre algunos aspectos:

 

  1. En el código de los programas no se tildaron las palabras, porque al imprimir los códigos fuentes y los resultados de la ejecución de los mismos, muestran caracteres basura.

  2. Se recomienda crear una carpeta en la raíz del disco duro, dentro de la cual se crean carpetas de cada capítulo del libro, para almacenar las aplicaciones de los programas que se van desarrollando.

  3. Para que que un programa sea más legible, fácil lectura e interpretación, y mejora la fiabilidad y mantenibilidad; la programación se la realiza en forma modular o en bloques de código, mediante la tabulación de cada bloque.

  4. Para mejorar visibilidad entre una constante y una variable, se recomienda escribir las constantes en letras mayúsculas y las variables en minúsculas.

 

Dr. Byron Navas

bottom of page