Os introducimos a la programación en C, explicamos cómo compilar el código fuente de los programas en ANSI C en Microsoft Windows y GNU Linux. Os explicamos cómo realizar aplicaciones en ANSI C, ejemplos de código, sintaxis, estructuras de control, secuencias de escape, tipos de datos, operadores aritméticos y de asignación, variables, constantes, etc.
- Historia del lenguaje de programación C.
- Estructura de un programa C.
- Introducir comentarios entre el código en C.
- Secuencias de escape en C.
- Palabras clave (keywords) o palabras reservadas de C.
- Tipos de datos en ANSI C.
- Calificadores de tipos de datos en ANSI C.
- Variables en ANSI C.
- Constantes en C.
- Operadores aritméticos, de asignación, relacionales y lógicos en ANSI C.
- Entrada/salida, pedir datos y mostrar resultados por pantalla en ANSI C.
- Compilar programa C, linkar, generar ejecutable.
Historia del lenguaje de programación C
C
C es un lenguaje de programación creado en 1972 por Kenneth L. Thompson, Brian Kernighan y Dennis M. Ritchie en los Laboratorios Bell. C surgió como evolución del anterior lenguaje B, a su vez basado en BCPL.
C es un lenguaje orientado a la implementación de Sistemas Operativos. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones.
Se trata de un lenguaje débilmente tipificado de medio nivel pero con muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.
ANSI C, ISO C
A finales de la década de 1970, C empezó a sustituir a BASIC como lenguaje de programación de microcomputadores predominante. Durante la década de 1980 se empezó a usar en los IBM PC, lo que incrementó su popularidad significativamente. Al mismo tiempo, Bjarne Stroustrup empezó a trabajar con algunos compañeros de Bell Labs para añadir funcionalidades de programación orientada a objetos a C. El lenguaje que crearon, llamado C++, es hoy en día el lenguaje de programación de aplicaciones más común en el sistema operativo Microsoft Windows; mientras que C sigue siendo más popular en el entorno Unix. Otro lenguaje que se desarrolló en esa época, Objective C, también añadió características de programación orientada a objetos a C.
En 1983, el Instituto Nacional Estadounidense de Estándares organizó un comité, X3j11, para establecer una especificación estándar de C. Se completó el estándar en 1989 y se ratificó como el «Lenguaje de Programación C» ANSI X3.159-1989. Esta versión del lenguaje se conoce a menudo como ANSI C, o a veces como C89 (para distinguirla de C99).
En 1990, el estándar ANSI (con algunas modificaciones menores) fue adoptado por la Organización Internacional para la Estandarización (ISO) en el estándar ISO/IEC 9899:1990. Esta versión se conoce a veces como C90. No obstante, «C89» y «C90» se refieren en esencia al mismo lenguaje.
Uno de los objetivos del proceso de estandarización del ANSI C fue producir una extensión al C de Kernighan y Ritchie, incorporando muchas funcionalidades no oficiales. Sin embargo, el comité de estandarización incluyó también muchas funcionalidades nuevas, como prototipos de función, y un preprocesador mejorado
C++
C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.
Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales.
El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre «C con clases». En C++, la expresión «C++» significa «incremento de C» y se refiere a que C++ es una extensión de C.
Estructura de un programa ANSI C
Todo programa en C consta de una o más funciones, una de las cuales se llama main. El programa comienza en la función main, desde la cual es posible llamar a otras funciones. El resto de las funciones necesarias pueden declararse antes o después de la función main.
Cada función estará formada por la cabecera de la función, compuesta por el nombre de la misma y la lista de argumentos (si los hubiese), la declaración de las variables a utilizar y la secuencia de sentencias a ejecutar.
Un ejemplo genérico:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
includes variables y constantes globales main ( ) { variables locales bloque de sentencias del programa principal llamada a funcion1 llamada a funcion2 } funcion1 ( ) { variables locales bloque de sentencias } [tipo de dato] funcion2 ( ) { variables locales bloque de sentencias } |
Introducir comentarios entre el código en ANSI C
En la programación es conveniente añadir comentarios, cuando se estime necesario, para poder saber que función tiene cada parte del código. Estos comentarios serán útiles para otros programadores que deban utilizar el código generado.
Para insertar comentarios en un programa escrito en C se utilizarán los símbolos /* (para iniciar el comentario) y */ (para cerrar el comentario).
Un ejemplo de programa con comentarios:
1 |
/* Buscamos el elemento menor */<br>pos_men = menor(valores, i);<br>/* colocamos el valor en el lugar que le corresponde <br>para poder buscarlo posteriormente */<br>temp = valores[i]; |
Como se puede ver en el ejemplo, C permite que los comentarios ocupen varias líneas.
Lógicamente, los comentarios no serán tenidos en cuenta por el compilador.
Secuencias de escape en ANSI C
En el lenguaje de programación C, determinados caracteres no representados gráficamente se pueden representar mediante lo que se conoce como secuencia de escape.
A continuación os mostramos las secuencias de escape habituales en C y lo que significan:
- \n: insertará un salto de línea donde se coloque.
- \b: carácter de retroceso.
- \t: tabulación horizontal.
- \v: tabulación vertical.
- \\: mostrará una contra barra donde se coloque.
- \f: salto de página.
- \’: mostrará un apóstrofe donde se coloque.
- \»: mostrará comillas dobles donde se coloque.
- \0: fin de una cadena de caracteres.
Un ejemplo del uso de las secuencias de escape en C:
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> main () { printf ("Esta web se llama \"ProyectoA\""); printf ("\nPrueba de secuencias de escape en C"); printf ("\nMostrar una contrabarra: \\"); printf ("\nCaracter de retroceso\b"); printf ("\n\tLinea final"); } |
Palabras clave (keywords) o palabras reservadas de ANSI C
En C, como en cualquier otro lenguaje de programación, existen una serie de palabras clave (keywords) que el usuario no puede utiliza como identificados (nombres de variables, nombres de funciones, nombres de constantes, etc.). A continuación mostramos las palabras clave (reservadas) de ANSI C: auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while.
Tipos de datos en ANSI C
En ANSI C existen básicamente cuatro tipos de datos, aunque podremos definir nuestros propios tipos de datos a partir de estos cuatro. A continuación os los mostramos:
Tipo de datos C | Tamaño | Rango de valores |
char | 1 byte | -128 a 127 |
int | 2 bytes | -32768 a 32767 |
float | 4 bytes | 3’4 E-38 a 3’4 E+38 |
double | 8 bytes | 1’7 E-308 a 1’7 E+308 |
Calificadores de tipos de datos en ANSI C
Los calificadores para los tipos de datos permiten modificar el rango de valores de éstos. Estos calificadores:
- signed: indica que la variable llevará signo:
Tipo de datos C | Tamaño | Rango de valores |
signed char | 1 byte | -128 a 127 |
signed int | 2 bytes | -32768 a 32767 |
- unsigned: la variable no llevará signo (valor absoluto):
Tipo de datos C | Tamaño | Rango de valores |
unsigned char | 1 byte | 0 a 255 |
unsigned int | 2 bytes | 0 a 35535 |
- short: rango de valores en formato corto (limitado):
Tipo de datos C | Tamaño | Rango de valores |
short char | 1 byte | -128 a 127 |
short int | 2 bytes | -32768 a 32767 |
- long: Rango de valores en formato largo (ampliado):
Tipo de datos C | Tamaño | Rango de valores |
long int | 4 byte | –2.147.483.648 a 2.147.483.647 |
long double | 10 bytes | -3’36 E-4932 a 1’18 E+4932 |
Variables en ANSI C
Declaración de variables en C
Una variable es un tipo de dato, referenciado mediante un identificador (que es el nombre de la variable). Su contenido podrá ser modificado a lo largo del programa. Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar una variable, primero tiene que ser declarada:
[calificador] <tipo> <nombre>
En C las variables pueden ser inicializadas con un valor al ser declaradas:
[calificador] <tipo> <nombre> = <valor>
En C de pueden declarar varias variables del mismo tipo en una sola sentencia:
[calificador] <tipo> <nombre> = <valor>, <nombre2>, <nombre3>, <nombre4> = <valor>
Ejemplo de declaración de variables en C:
1 2 3 4 5 6 7 8 |
main () { int numero1 = 4, numero2, numero3; char frase[100]; double numeroGrande; printf("El valor de número1 es: %d", numero1); ... |
Tipos de variables según su ámbito en C
Las variables en ANSI C pueden ser de dos tipos según el lugar en que sean declaradas: globales o locales:
- Las variables globales se declaran antes de la cláusula main ( ). Este tipo de variables pueden ser utilizadas (ámbito) en cualquier parte del programa y se destruyen al finalizar éste.
- Las variables locales se declaran después de la cláusula main ( ), en la función en la que vayan a ser utilizadas. Su ámbito sólo será para la función donde hayan sido declaradas y se destruyen al finalizar dicha función.
Nombre de las variables en C
El identificador o nombre de la variable no puede ser una palabra clave y los caracteres que se pueden utilizar para el nombre son las letras de la «a» a la «z» (tanto en mayúsculas como en minúsculas). No son válidas las letras «ñ» ó «Ñ». Para el nombre de las variables están permitidos los números (salvo como primer carácter, un nombre de variable no puede empezar por un número). También se permite el símbolo de subrayado «_».
El nombre de una variable en C puede tener, como máximo, 31 caracteres.
Constantes en ANSI C
Las constantes mantienen su valor a lo largo de todo el programa, no son modificables como ocurre con las variables. Para indicar al compilador de C que se trata de una constante, usaremos la directiva #define, de la siguiente forma:
#define <identificador> <valor>
No se indica el punto y coma de final de sentencia, tampoco el tipo de dato ni el igual para la asignación.
Un ejemplo de utilización de constantes en ANSI C:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #define pi 3.1415 #define escribePantalla printf main () { int radio; escribePantalla ("Introduce el radio: "); scanf ("%d", &radio); escribePantalla ("El perímetro es: %f", 2 * pi * radio); } |
Librería estándar en C, inclusión de ficheros, include
El lenguaje de programación C permite utilizar funciones que no estén incluidas en el propio programa. Para ello se puede utilizar la directiva #include, que permite añadir librerías o funciones que se encuentran en otros ficheros a nuestro programa.
Los ficheros o librerías externos se podrán indicar o bien introduciendo su unidad y carpeta (ruta completa) y nombre de fichero, por ejemplo:
#include «funcion.h»
(en el ejemplo anterior, se deduce que «funcion.h» está en la misma ubicación que el fichero de la aplicación)
Otro ejemplo, con ruta completa:
#include «C:\C\funcion\funcion.h»
O bien indicando al compilador que se encuentran en la carpeta de librerías predeterminada, de la siguiente forma:
#include <stdio.h>
Operadores aritméticos, de asignación, relacionales y lógicos en ANSI C
Los operadores son signos especiales que indican determinadas operaciones a realizar con las variables o constantes sobre las que actúan en el programa.
Operadores aritméticos
Existen dos tipos de operadores aritméticos:
Los binarios:
- + (suma).
- – (resta).
- * (multiplicación).
- / (división).
- % (módulo o resto).
La sintaxis para los operadores aritméticos binarios:
<variable1> <operador> <variable2>
Y los unarios:
- ++ (incremento en 1, suma 1).
- – – (decremento en 1, resta 1).
- – (cambio de signo).
La sintaxis para los operadores aritméticos unarios:
<variable><operador>
<operador><variable>
Operadores de asignación
- = (asignación simple).
- += (suma).
- -= (resta).
- *= (multiplicación).
- /= (división).
- %= (módulo o resto).
Operadores relacionales
- > (mayor que).
- < (menor que).
- >= (mayor o igual que).
- <= (menor o igual que).
- == (igual que).
- != (distinto de).
Operadores lógicos
- && (AND, y lógico).
- || (OR, o lógico).
- ! (NOT, el valor contrario).
Programa de ejemplo de uso de operadores en lenguaje ANSI C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <stdio.h> int main() { int j, i = 97; printf("El alfabeto con las vocales en mayusculas es: \n"); while( i <= 122) { if ((i == 97) || (i == 101) || (i == 105) || (i == 111) || (i == 117)) { j = i; j = j - 32; printf ("%c \n", j); i++; } else { printf ("%c \n", i); i ++; } } return (0); } |
Entrada/salida, pedir datos y mostrar resultados por pantalla en ANSI C
Sentencia printf ( ) para mostrar resultados por pantalla
La función printf perteneciente a la librería stdio.h permite mostrar por pantalla valores numéricos, caracteres y cadenas de texto. La forma general de la sentencia printf es el siguiente:
printf (cadena_control, arg1, arg2, …);
En la cadena de control (cadena_control) indicaremos la forma en que se mostrarán los argumentos posteriores. printf permite introducir una cadena de texto sin necesidad de argumentos, o combinar ambas posibilidades, así como secuencias de escape.
En el caso de que utilicemos argumentos deberemos indicar en la cadena de control tantos modificadores como argumentos vayamos a presentar.
El modificador está compuesto por el carácter % seguido por un carácter de conversión, que indica de qué tipo de dato se trata.
Los modificadores más comunes son:
- %c: para mostrar un único carácter.
- %d: para mostrar un entero con signo, en base decimal.
- %u: para mostrar un entero sin signo, en base decimal.
- %o: para mostrar un entero en base octal.
- %x: para mostrar un entero en base hexadecimal.
- %e: para mostrar un número real en coma flotante, con exponente.
- %f: para mostrar un número real en coma flotante, sin exponente.
- %s: para mostrar una cadena de caracteres.
- %p: para mostrar un puntero o dirección de memoria.
El formato de los modificadores es el siguiente:
% [signo] [longitud] [.precisión] [l/L] conversión
- Signo: indicamos si el valor se ajustará a la izquierda, en cuyo caso utilizaremos el signo menos, o a la derecha (por defecto)
- Longitud: especifica la longitud máxima del valor que aparece por pantalla. Si la longitud es menor que el número de dígitos del valor, éste aparecerá ajustado a la izquierda.
- Precisión: indicamos el número máximo de decimales que tendrá el valor.
- l/L: utilizamos l cuando se trata de una variable de tipo long y L cuando es de tipo double.
Un ejemplo de programa en ANSI C que utiliza la función printf:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> main () { char cadena[] = "El valor de"; int a = 25986; long int b = 1976524; float c = 9.57645; printf("%s a es %9d\n", cadena, a); printf("%s b es %ld\n", cadena, b); printf("%s c es %.3f", cadena, c); } |
El programa print.c en ejecución:
Sentencia scanf ( ) para pedir datos al usuario en ANSI C
La función scanf de la librería stdio.h permite leer datos de la entrada estándar (que por defecto es el teclado). La forma general de scanf es la siguiente:
scanf (cadena_control, arg1, arg2, …);
En la cadena de control (cadena_control) indicaremos, por regla general, los modificadores que harán referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modificadores estarán formados por el carácter % seguido de un carácter de conversión. Los argumentos indicados serán, nuevamente, las variables.
La principal característica de la sentencia scanf es que necesita saber la posición de la memoria del ordenador en que se encuentra la variable para poder almacenar la información obtenida. Para indicarle esta posición utilizaremos el símbolo ampersand (&), que colocaremos delante del nombre de cada variable. Esto no será necesario en los arrays.
Un ejemplo de programa que utiliza la función scanf:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> main () { char nombre[10]; int edad; printf ("Introduce tu nombre: "); scanf ("%s", nombre); printf ("Introduce tu edad: "); scanf ("%d", &edad); printf ("Tu nombre es %s, tu edad es %d", nombre, edad); } |
El programa scanf.c en funcionamiento:
En el ejemplo anterior la lectura de la cadena de caracteres «nombre» se detiene en cuanto se encuentra un espacio en blanco, por lo que para leer una línea completa con varias palabras hay que utilizar otras técnicas diferentes.
En los formatos de la cadena de control de scanf () pueden introducirse corchetes […] que se utilizan, por ejemplo, de la siguiente forma:
scanf («% [AB \n\t]», cadena);
La sentencia anterior leerá sólo los caracteres que aparecen en el corchete AB \n\t. Cuando se encuentra un carácter distinto de estos se detiene la lectura y se devuelve el control al programa que llamó a scanf.
Si los corchetes contiene un carácter ^, se leerán todos los caracteres distintos de los caracteres que se encuentran dentro de los corchetes. Por ejemplo, la siguiente sentencia:
scanf (» %[^\n]», cadena);
leerá todos los caracteres (aunque haya espacios) hasta que encuentra el carácter nueva línea (\n). Por lo tanto esta sentencia puede utilizarse para leer frases completas (varias palabras separadas por espacios), hasta que se pulse INTRO.
Compilar programa C, linkar, generar ejecutable
La compilación de un programa C se realiza en varias fases:
- Preprocesado: consiste en modificar el código fuente en C según una serie de instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el trabajo del compilador. Por ejemplo, una de las acciones más importantes es la modificación de las inclusiones (#include) por las declaraciones reales existentes en el archivo indicado.
- Compilación: genera el código objeto a partir del código ya preprocesado.
- Enlazado: une los códigos objeto de los distintos módulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final.
Compilación de programas C en Microsoft Windows
Existen numerosos compiladores y entornos de desarrollo para C, algunos de ellos (gratuitos): Watcom, Dev-C++, MinGW GCC 5.1.6, Turbo C, etc.
Compilación con Borland Turbo C en Microsoft Windows
Para explicar cómo compilar el código C y generar el ejecutable (.exe) correspondiente en Windows utilizaremos Turbo C, por tratarse, quizás, del compilador más famoso en su época. Turbo C es un entorno de desarrollo integrado y un compilador desarrollado por Borland para programar en lenguaje C. Su primera versión fue lanzada en 1987, a la que siguieron las versiones 1.5 y 2.0, de 1989. Fue el compilador más popular para desarrollar en C en entornos MS-DOS. Se le considera el primer IDE para C disponible para dicha plataforma. Turbo C fue sustituido por Turbo C++ en 1990. Éste fue sustituido, a su vez, por el Borland C++, disponible también para Windows. Tras el Borland C++ llegó el C++Builder.
Para compilar el código fuente (source code) de C con Turbo C, en primer lugar lo descargaremos, bien desde la web de Codegear (Embarcadero Technologies) o bien desde esta web, en el enlace:
Descomprimiremos el fichero de la descarga: Turbo C 2.01.zip, copiaremos la carpeta «TC» de la descarga a la unidad C:, es conveniente no moverla a carpetas dentro de subcarpetas con nombres «largos», pues se trata de una aplicación diseñada para MS-DOS.
Conviene crear las aplicaciones (ficheros) C en la carpeta «TC» del compilador, de esta forma será más fácil compilarlas.
Por ejemplo, crearemos el fichero fibonacc.c dentro de la carpeta «C:\TC» con el contenido:
A continuación abriremos una ventana de MS-DOS, desde «Inicio» – «Ejecutar», escribiendo «cmd» y pulsando «Aceptar»:
Accederemos a la carpeta «TC», con el comando:
cd c:\tc
Y compilaremos el fichero con el código fuente C con el comando:
tcc fibonacc.c
(donde «fibonacc.c» es el nombre del fichero con el programa C)
tcc comprobará que no haya errores de sintaxis en el código, si no los hay generará el ejecutable de la aplicación, generará un fichero con el mismo nombre que el fichero de fuentes y con extensión .exe, en este caso «fibonacc.exe», que podremos ejecutar en nuestro equipo (o en cualquier otro):
Si hay algún error o warning (aviso) mostrará la línea en la que se ha producido y el error o aviso:
C:\TC>tcc fibonacc.c
Turbo C Version 2.01 Copyright (c) 1987, 1988 Borland International
fibonacc.c:
Error fibonacc.c 11: Statement missing ; in function main
Error fibonacc.c 11: Illegal character ‘\’ (0x5c) in function main
Error fibonacc.c 11: Unterminated string or character constant in function main
Warning fibonacc.c 11: Code has no effect in function main
Warning fibonacc.c 11: Possible use of ‘valor’ before definition in function main
Warning fibonacc.c 11: Possible use of ‘valor’ before definition in function main
Error fibonacc.c 11: Statement missing ; in function main
*** 4 errors in Compile ***
Mientras haya errores no se generará el ejecutable.
El ejecutable generado con tcc y el fuente .c:
Turbo C 2.01 también incluye un IDE gráfico para el desarrollo de programas C, desde el cual se pueden compilar las aplicaciones. Para ello hay que ejecutar el fichero «C:\TC\TC.EXE». Para compilar en busca de errores de sintaxis pulsaremos en el menú «Run» – «Run»:
Nos mostrará un mensaje con el resultado de la compilación del programa C:
Con el texto:
Main file: FIBONACC.C
Compiling: EDITOR -> FIBONACC.C
Lines compiled: 225
Warning: 3
Errors: 4
Available memory: 227K
Errors: Press any key
Si ha habido algún error de compilación al pulsar una techa nos los mostrará en el editor, tanto la línea de código donde se haya producido como el error de sintaxis:
Para generar el fichero ejecutable (.exe), tras corregir los errores de compilación, pulsaremos «Compile» – «Make EXE file»:
Compilación de programas C en GNU Linux
En GNU Linux también existen multitud de compiladores para C. En nuestro caso os explicaremos cómo instalar y compilar y generar un ejecutable con el compilador GCC (GNU Compiler Collection).
En primer lugar instalaremos GCC en GNU Linux, os mostramos cómo hacerlo en GNU Linux Ubuntu 9.04. Este sistema operativo no tiene modo gráfico por lo que al cargarse se abrirá una ventana de terminal directamente, si disponemos del modo gráfico abriremos una ventana de terminal y ejecutaremos el siguiente comandos GNU Linux:
su apt-get install gcc
A continuación accederemos a la carpeta donde tengamos el programa (fichero con los fuentes C) y ejecutaremos el siguiente comando para compilarlo (comprobar la sintaxis y generar el ejecutable):
gcc fibonacc.c
(donde «fibonacc.c» será el nombre del fichero C a compilar)
Si todo es correcto, GCC habrá generado un fichero ejecutable llamado «a.out»:
Para probar y ejecutar el fichero generado introduciremos el siguiente comando:
./a.out