Portada » Informática » Lenguaje C Esencial: Características, Estructura de Programas y Depuración
Los ordenadores están compuestos por elementos físicos (hardware) y lógicos (software), que trabajan conjuntamente condicionando su funcionamiento.
En este tema nos centraremos en el software, para ello definiremos previamente el concepto de algoritmo.
Un algoritmo, desde el punto de vista informático, es un texto que describe el conjunto de operaciones que un ordenador debe ejecutar para resolver un problema.
En este sentido, Vázquez (2012) señala que: «tanto el lenguaje de programación como la computadora son los medios para obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso correspondiente».
Para ejecutar un algoritmo, es necesario representarlo en forma de programa, compuesto por instrucciones escritas en un lenguaje de programación.
Es un conjunto de palabras o símbolos que siguen unas reglas predefinidas.
Existen muchos lenguajes de programación. En este tema exploraremos el lenguaje C, que por su versatilidad, claridad, documentación existente y facilidad de uso se recomienda para iniciarse en el campo de la programación.
Fue inventado en los laboratorios Bell en 1972 por Dennis Ritchie, y utilizado en el sistema operativo UNIX. Es un lenguaje de alto nivel de propósito general, capaz de abordar cualquier tarea de programación. Se considera una alternativa al lenguaje ensamblador, ya que permite accesos y operaciones que por lo general no son posibles con lenguajes de alto nivel.
Entre sus características podemos destacar:
Estas y otras características han convertido al lenguaje C y a sus descendientes (C++, C#, Java, etc.) en referencia de numerosos campos educativos.
Comentaremos a continuación los elementos más relevantes de un programa creado en C.
Sus aspectos generales son:
;
)./*
y */
, pudiendo ocupar varias líneas.//
, y solo pueden ocupar una línea.Es cualquier palabra no reservada que comienza por una letra o por un guion bajo ‘_
‘, pudiendo contener en su interior letras, números y subrayados.
Establecen una zona de almacenamiento de datos cuyo valor puede variar (variables) o permanecer invariante (constantes) durante la ejecución del programa. Se identifican por un nombre, sujeto a las reglas de los identificadores comentadas anteriormente.
#define
o el modificador const
de la siguiente forma:
#define <nombre-constante> valor;
const <nombre-constante> valor;
(modificador) <tipo-de-dato> <nombre-variable>;
Según su uso, las variables se clasifican en:
«El tipo de dato asociado a una variable limita el conjunto de datos que puede almacenar, así como las operaciones aplicables sobre esa variable» (Corona y Ancona, 2011).
Atendiendo a su tipo, podemos establecer dos categorías:
Existen los siguientes tipos de datos básicos:
Figura 1. Tabla de datos en C.
Además, existen cuatro modificadores de tipo, que se aplican sobre los anteriores, permitiendo alterar el tipo de datos sobre el que actúan. Estos son: long
, short
, signed
y unsigned
.
Por lo tanto, podemos declarar variables como:
unsigned char a;
long double b;
short int i;
Se construyen a partir de tipos fundamentales. Entre otros, definiremos:
float *p; // Puntero que apunta a una variable real.
int a[10]; // Array que puede almacenar hasta diez valores enteros.
struct punto {
int x, y;
};
Son símbolos que indican cómo son manipulados los datos. Se pueden clasificar en varios grupos:
Realizados sobre dos operandos enteros o reales (+
, -
, *
, /
) y %
(módulo o resto de una división entera).
Obtienen el resultado 1 (verdadero) o 0 (falso). Tipos:
&&
(And): El resultado es 1 solo si ambos operandos son distintos de 0.||
(Or): El resultado es 0 si ambos operandos son 0.!
(Not): El resultado es 0 si el operando tiene un valor distinto de 0.Se comparan entre dos operandos: <
(menor), >
(mayor), <=
(menor o igual), >=
(mayor o igual), ==
(igual), !=
(distinto). Su resultado es 1 si se cumple la relación.
Son fundamentales en todo lenguaje estructurado, permitiendo cambiar el flujo del programa. Tipos:
if
Ejecuta una acción en función de la decisión tomada.
if (condición) {
sentencias;
}
También se puede anidar con los bloques else if
y else
, que son opcionales (si no se cumple if
se evalúan los else if
y si no se cumplen, se entra en else
).
switch
Permite ejecutar una de varias acciones, dependiendo del valor de una expresión:
switch (expresión) {
case const1: // constante entera o carácter
sentencia_1; // sentencia simple o compuesta
break; // finaliza el bloque (también sirve para bucles).
case const2:
sentencia_2;
break;
default: // opción por defecto (entra si no se cumplen los demás casos).
sentencia_N;
}
while
Ejecuta un conjunto de sentencias, cero o más veces, dependiendo del valor de una expresión.
while (expresión) {
sentencias;
}
do-while
Similar a la anterior, solo que la primera vez siempre se ejecuta, se cumpla o no la expresión:
do {
sentencias;
} while (expresión);
for
Ejecuta una sentencia simple o compuesta un número de veces conocido:
for (inicialización; condición; incremento) {
sentencias;
}
Una vez definidos los elementos generales de un programa en C, exploraremos su estructura para ver dónde se localizará cada uno de ellos.
Un programa en C consta de un código fuente, guardado con la extensión «.c», con la siguiente estructura:
/* Descripción del programa */ |
Cabecera |
#include <librerías.h> #define Constantes valor |
Directivas del preprocesador |
Prototipos de funciones Variables |
Declaraciones globales |
main(){ Declaraciones locales. Sentencias. Llamadas a funciones. } |
|
Función1(…){ …. } Funcion 2(…){ … } |
Implementación de funciones |
Figura 2. Estructura típica de un programa en C.
Donde:
Antes de comentar las librerías, necesitamos conocer qué es y cómo se crea una función. Así que, ¿qué entendemos por función?
Es un subprograma compuesto por sentencias que realizan una tarea específica. Puede ser llamada desde un punto del programa, utilizando su identificador y los parámetros que necesite.
Una función se crea de la siguiente forma:
Tipo_resultado nombre_función ([parámetros_formales]) {
declaración de variables locales;
sentencias;
return(valor_a_retornar);
}
Donde:
El lenguaje C dispone de una librería o biblioteca que ANSI incorpora para todos los compiladores, cuyo acceso se hace mediante la siguiente directiva:
#include <nombre-librería.h>
Los desarrolladores de software, por lo tanto, pueden implementar sus propias funciones o hacer uso de estas librerías. Así, Deitel y Deitel (2004) señalan que «utilizar funciones de la biblioteca estándar de ANSI, en lugar de escribir sus propias funciones, puede mejorar el rendimiento del programa, debido a que estas funciones están escritas cuidadosamente para una ejecución eficiente».
Esta biblioteca incluye multitud de ficheros centrados en tareas específicas (depuración, funciones matemáticas, entrada y salida, etc.).
Para poder ejecutar nuestro programa, precisaremos de herramientas que nos generen el fichero ejecutable mediante el proceso de compilación.
Es fundamental para el desarrollo del software, ya que permite transformar los ficheros fuente en código ejecutable por la máquina.
Al compilar un programa en C se traduce a código máquina (previo preprocesado de macros e inclusión de ficheros), que una vez ensamblado genera los códigos objeto. A continuación, se enlazan (o linkean) con las funciones de la biblioteca que necesite, obteniendo el programa ejecutable por el ordenador. Todo este proceso lo realiza un programa llamado compilador.
Figura 3. Proceso de compilación de un programa en C.
Las directivas del preprocesador permiten que los programas fuente sean fáciles de cambiar y compilar en situaciones diferentes. Una directiva comienza con el símbolo #
, indicando la acción específica a ejecutar. Se aplican desde su punto de definición hasta el final del programa fuente.
Algunas instrucciones del preprocesador son:
#define
: Sustitución de símbolos.#if
: Directiva condicional.#include
: Comentado anteriormente.Los entornos integrados de desarrollo (en adelante, IDE) son aplicaciones que integran las herramientas necesarias para la codificación, depuración y pruebas de programas. Permiten desarrollar programas de un modo más fácil y eficiente, agrupando las siguientes utilidades:
Los IDE convencionales para desarrollar programas en C son: Turbo C, Dev C++, Microsoft Visual C++, Eclipse y Netbeans.
De acuerdo con lo expuesto, podemos resaltar la importancia del lenguaje C, ya que ofrece ventajas frente a otros lenguajes, además de constituir la base de otros más actuales.
Por otro lado, el adecuado diseño de cualquier software es fundamental para que un programa se adecúe a los objetivos que se pretenden conseguir.
En este sentido, un software óptimo es una pieza clave en el desarrollo y progreso de la sociedad, ya que los ordenadores y, por ende, el software, están presentes en muchos ámbitos de la vida diaria (educativo, administrativo, empresarial, etc.).
El contenido del presente tema está desarrollado legislativamente en los ciclos formativos de grado superior (CFGS) de la familia profesional Informática y Comunicaciones: Desarrollo de Aplicaciones Multiplataforma (DAM) y Desarrollo de Aplicaciones Web (DAW), en concreto en las siguientes normas:
Dentro del sistema educativo, y teniendo en cuenta las Órdenes comentadas en el apartado anterior, estos contenidos son aplicados en el aula en los siguientes módulos profesionales: