Curso de C
Por Nacho Cabanes, versión 0.90 pre4

1. Toma de contacto con C

Dentro de los lenguajes de programación, C es un lenguaje que tiene un cierto “prestigio”. Esto se debe fundamentalmente a dos razones:

 

 

En su contra, el lenguaje C tiene que es más difícil de aprender que otros y que puede resultar difícil de leer (por lo que ciertos errores pueden tardar más en encontrarse).

Los pasos que seguiremos para crear un programa en C serán:

  1. Escribir el programa en lenguaje C (fichero fuente), con cualquier editor de textos.
  2. Compilarlo con nuestro compilador. Esto creará un “fichero objeto”, ya convertido a un lenguaje que el ordenador es capaz de entender.
  3. Enlazarlo con otros ficheros del compilador, unas bibliotecas auxiliares que incluirán en nuestro programa aquellas posibilidades que hayamos empleado nosotros pero que realmente no sean parte del lenguaje C básico, sino ampliaciones de algún tipo. Esto dará lugar al fichero ejecutable, que ya podremos usar desde MsDos o el sistema operativo que estemos manejando, en nuestro ordenador o en cualquier otro, aunque ese otro ordenador no tenga el compilador que nosotros hemos utilizado.

La mayoría de los compiladores actuales permiten dar todos estos pasos desde un único entorno, en el que escribimos nuestros programas, los compilamos, y los depuramos en caso de que exista algún fallo.

En el siguiente apartado veremos un ejemplo de uno de estos entornos, dónde localizarlo y cómo instalarlo.

1.1 Escribir un texto en C

Vamos con un primer ejemplo de programa en C, posiblemente el más sencillo de los que “hacen algo útil”. Se trata de escribir un texto en pantalla. La apariencia de este programa la vimos en el tema anterior. Vamos a verlo ahora con más detalle:

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

Esto escribe “Hola” en la pantalla. Pero hay mucho que comentar:

Y la cosa no acaba aquí. Aún queda más miga de la que parece en este programa, pero cuando ya vayamos practicando un poco, iremos concretando más alguna que otra cosa de las que aquí han quedado poco detalladas.

Ejercicio propuesto: Crea un programa en C que te salude por tu nombre (ej: “Hola, Nacho”).

Sólo un par de cosas más antes de seguir adelante:

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

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

(esta es la forma que yo emplearé en este texto cuando estemos trabajando con fuentes de mayor tamaño, para que ocupe un poco menos de espacio).

 

1.1.1. Cómo probar este programa en Linux

Los sistemas operativos de la familia Unix, como Linux, suelen incluir un compilador de C, de modo que será fácil probar nuestros programas. Supondremos que se trata de una versión de Linux de los últimos años, que tenga entorno gráfico. Podríamos usar el editor del texto del entorno gráfico, teclear el fuente y guardarlo en nuestra carpeta personal, por ejemplo con el nombre ejemplo001.c (lo que sí es importante es que termine en “.c”):

(en esta imagen se trata de Mandrake Linux 9.1, con el entorno Gnome y el editor básico que incorpora, GEdit).

Después abriríamos una ventana de terminal y teclearíamos la siguiente orden para compilar nuestro fuente:

cc ejemplo001.c –o miprograma

Donde:

Y para probar el programa teclearíamos

./miprograma

Con lo que debería aparecer escrito “Hola” en la pantalla.

(Nota: Las versiones más recientes de Linux tienen entornos integrados, desde los que podemos teclear y probar nuestro programa, con más comodidad, como en el caso de la herramienta que vamos a comentar para Windows. Dos de los entornos más extendidos son KDevelop y Anjuta).


1.1.2. Cómo probar este programa en Windows

La familia de sistemas Windows no incluye ningún compilador de C, de modo que tendremos que localizar uno e instalarlo. Existen muchos gratuitos que se pueden descargar de Internet, y que incluyen un editor y otras herramientas auxiliares. Es el caso de Dev-C++, por ejemplo, que tiene su página oficial en www.bloodshed.net. La instalación es poco más que hacer doble clic en el fichero descargado, y hacer clic varias veces en el botón “Siguiente”:

En el caso de Dev-C++, podemos incluso trabajar con el entorno en español:

 

Para crear nuestro programa, en el menú "Archivo" escogemos "Nuevo  / Código fuente", y nos aparece un editor vacío en el que ya podemos empezar a teclear. Si queremos nuestro programa en funcionamiento, entraríamos al menú “Ejecutar” y usaríamos la opción “Compilar y ejecutar”:

(si todavía no hemos guardado los cambios en nuestro fuente, nos pediría antes que lo hiciéramos).

 

Puede ocurrir que se muestre el resultado en pantalla, pero la ventana desaparezca tan rápido que no tengamos tiempo de leerlo. Si es nuestro caso, tenemos dos opciones:

#include <stdio.h>
 
main() 
{
  printf("Hola");
  getchar();
}

1.2. Mostrar números enteros en pantalla

Cuando queremos escribir un texto “tal cual”, como en el ejemplo anterior, lo encerramos entre comillas. Pero no siempre querremos escribir textos prefijados. En muchos casos, se tratará de algo que habrá que calcular. El caso más sencillo es el de una operación matemática. En principio, podríamos pensar en intentar algo así:

printf(3+4);

En muchos lenguajes de programación esto es perfectamente válido, pero no en C. La función “printf” nos obliga a que lo que escribamos en primer lugar sea un texto, indicado entre comillas. Eso que le indicamos entre comillas es realmente un código de formato. Dentro de ese código de formato podemos tener caracteres especiales, con los que le indicamos dónde y cómo queremos que aparezca un número (u otras cosas). Esto lo veremos con detalle un poco más adelante, pero de momento podemos anticipar que “%d” sirve para decir “quiero que aquí aparezca un número entero”. ¿Qué número? El que le indicamos a continuación, separado por una coma:

printf("El resultado es %d", 3+4);

Este ejemplo mostraría en pantalla un número entero (%d) que sea el resultado de suma 3 y 4.

Podemos escribir entre las comillas más detalles sobre lo que estamos haciendo:

printf("El resultado es %d", suma);

Ejercicio propuesto: crea un programa que diga el resultado de sumar 118 y 56.

 

1.3. Operaciones aritméticas básicas

Está claro que el símbolo de la suma será un +, y podemos esperar cual será el de la resta, pero alguna de las operaciones matemáticas habituales tiene símbolos menos intuitivos. Veamos cuales son los más importantes:

Operador

Operación

+

Suma

-

Resta, negación

*

Multiplicación

/

División

%

Resto de la división (“módulo”)

 

Ejercicio propuesto: Hacer un programa que calcule el producto de los números 12 y 13.

 

1.3.1. Orden de prioridad de los operadores

Sencillo:

Ejercicio propuesto: Calcular (a mano y después comprobar desde C) el resultado de estas operaciones:

 

1.3.2. Introducción a los problemas de desbordamiento

El espacio del que disponemos para almacenar los números es limitado. Si el resultado de una operación es un número “demasiado grande”, obtendremos un resultado erróneo. Por eso en los primeros ejemplos usaremos números pequeños. Más adelante veremos a qué se debe realmente este problema y cómo evitarlo.

 

1.4. Introducción a las variables: int

Las variables son algo que no contiene un valor predeterminado, un espacio de memoria al que nosotros asignamos un nombre y en el que podremos almacenar datos.

El primer ejemplo nos permitía escribir “Hola”. El segundo nos permitía sumar dos números que habíamos prefijado en nuestro programa. Pero esto tampoco es “lo habitual”, sino que esos números dependerán de valores que haya tecleado el usuario o de cálculos anteriores.

Por eso necesitaremos usar variables, en las que guardemos los datos con los que vamos a trabajar y también los resultados temporales. Vamos a ver como ejemplo lo que haríamos para sumar dos números enteros que fijásemos en el programa.

1.4.1. Definición de variables: números enteros

Para usar una cierta variable primero hay que declararla: indicar su nombre y el tipo de datos que querremos guardar.

El primer tipo de datos que usaremos serán números enteros (sin decimales), que se indican con “int” (abreviatura del inglés “integer”). Después de esta palabra se indica el nombre que tendrá la variable:

int primerNumero;

Esa orden reserva espacio para almacenar un número entero, que podrá tomar distintos valores, y al que nos referiremos con el nombre “primerNumero”.

1.4.2. Asignación de valores

Podemos darle un valor a esa variable durante el programa haciendo

primerNumero=234;

O también podemos darles un valor inicial (“inicializarlas”) antes de que empiece el programa, en el mismo momento en que las definimos:

int primerNumero=234;

O incluso podemos definir e inicializar más de una variable a la vez

int primerNumero=234, segundoNumero=567;

(esta línea reserva espacio para dos variables, que usaremos para almacenar números enteros; una de ellas se llama primerNumero y tiene como valor inicial 234 y la otra se llama segundoNumero y tiene como valor inicial 567).

Después ya podemos hacer operaciones con las variables, igual que las hacíamos con los números:

suma = primerNumero + segundoNumero;

 

1.4.3. Mostrar el valor de una variable en pantalla

Una vez que sabemos cómo mostrar un número en pantalla, es sencillo mostrar el valor de una variable. Para un número hacíamos cosas como

printf("El resultado es %d", 3+4);

pero si se trata de una variable es idéntico:

printf("El resultado es %d", suma);

Ya sabemos todo lo suficiente para crear nuestro programa que sume dos números usando variables:

#include <stdio.h>
 
main()
{
  int primerNumero;
  int segundoNumero;
  int suma;
 
  primerNumero = 234;
  segundoNumero = 567;
  suma = primerNumero + segundoNumero;
  printf("Su suma es %d", suma);
}
 

Repasemos lo que hace:

Nota: las variables las podemos declarar dentro del cuerpo del programa (main) o fuera de él. En programas tan sencillos no habrá diferencia. Más adelante veremos que en ciertos casos sí se comportarán de forma distinta según donde las hayamos declarado.

 

Podemos resumir un poco este fuente, si damos los valores a las variables al inicializarlas:

#include <stdio.h>
 
main()
{
  int primerNumero = 234;
  int segundoNumero = 567;
  int suma;
 
  suma = primerNumero + segundoNumero;
  printf("Su suma es %d", suma);
}
 

Ejercicio propuesto: Hacer un programa que calcule el producto de los números 121 y 132, usando variables.

1.5. Identificadores

Estos nombres de variable (lo que se conoce como “identificadores”) pueden estar formados por letras, números o el símbolo de subrayado (_) y deben comenzar por letra o subrayado. No deben tener espacios entre medias, y hay que recordar que las vocales acentuadas y la eñe son problemáticas, porque no son letras "estándar" en todos los idiomas. Algunos compiladores permiten otros símbolos, como el $, pero es aconsejable no usarlos, de modo que el programa sea más portable (funcione con facilidad en distintos sistemas).

Por eso, no son nombres de variable válidos:

Tampoco podremos usar como identificadores las palabras reservadas de C. Por ejemplo, la palabra "int" se refiere a que cierta variable guardará un número entero, así que esa palabra "int" no la podremos usar tampoco como nombre de variable (pero no vamos a incluir ahora una lista de palabras reservadas de C, ya nos iremos encontrando con ellas).

De momento, intentaremos usar nombres de variables que a nosotros nos resulten claros, y que no parezca que puedan ser alguna orden de C.

Hay que recordar que en C las mayúsculas y minúsculas se consideran diferentes, de modo que si intentamos hacer

PrimerNumero = 0; 
primernumero = 0;

o cualquier variación similar, el compilador protestará y nos dirá que no conoce esa variable, porque la habíamos declarado como

int primerNumero; 
 

El número de letras que puede tener un "identificador" (el nombre de una variable, por ejemplo) depende del compilador que usemos. Es frecuente que permitan cualquier longitud, pero que realmente sólo se fijen en unas cuantas letras (por ejemplo, en las primeras 8 o en las primeras 32). Eso quiere decir que puede que algún compilador considerase como iguales las variables NumeroParaAnalizar1 y NumeroParaAnalizar2, porque tienen las primeras 18 letras iguales. El C estándar (ANSI C) permite cualquier longitud, pero sólo considera las primeras 31.

1.6. Comentarios

Podemos escribir comentarios, que el compilador ignora, pero que pueden servir para aclararnos cosas a nosotros. Se escriben entre /* y */:

int suma; /* Porque guardaré el valor para usarlo más tarde */

Es conveniente escribir comentarios que aclaren la misión de las partes de nuestros programas que puedan resultar menos claras a simple vista. Incluso suele ser aconsejable que el programa comience con un comentario, que nos recuerde qué hace el programa sin que necesitemos mirarlo de arriba a abajo. Un ejemplo casi exagerado:

/* ---- Ejemplo en C: sumar dos numeros prefijados ---- */
 
#include <stdio.h>
 
main()
{
  int primerNumero = 234;
  int segundoNumero = 567;
  int suma;  /* Porque guardaré el valor para usarlo más tarde */
 
  /* Primero calculo la suma */
  suma = primerNumero + segundoNumero;
  /* Y después muestro su valor */
  printf("Su suma es %d", suma);
}
 

Un comentario puede empezar en una línea y terminar en otra distinta, así:

/* Esto
es un comentario que
ocupa más de una línea
*/

1.7. Datos por el usuario: scanf

Si queremos que sea el usuario de nuestro programa quien teclee los valores, necesitamos una nueva orden, llamada “scanf”. Su manejo recuerda al de “printf”, con una pequeña diferencia:

scanf("%d", &primerNumero);

Con ese “%d” indicamos que esperamos leer un número entero (igual que para “printf”) y con &primerNumero decimos que queremos que ese valor leído se guarde en la variable llamada “primerNumero”. La diferencia está en ese símbolo & que nos obliga scanf a poner antes del nombre de la variable. Más adelante veremos qué quiere decir ese símbolo y en qué otros casos se usa.

Un ejemplo de programa que sume dos números tecleados por el usuario sería:

/*-------------------------*/
/*  Ejemplo en C nº 5:     */
/*  c005.c                 */
/*                         */
/*  Leer valores para      */
/*  variables              */
/*                         */
/*  Curso de C,            */
/*    Nacho Cabanes        */
/*-------------------------*/
 
#include <stdio.h>
 
main()    /* Cuerpo del programa */
{
  int primerNumero, segundoNumero, suma;    /* Nuestras variables */
 
  printf("Introduce el primer numero ");
  scanf("%d", &primerNumero);
  printf("Introduce el segundo numero ");
  scanf("%d", &segundoNumero);
  suma = primerNumero + segundoNumero;
  printf("Su suma es %d", suma);
}
 

Ejercicios propuestos:

  1. Multiplicar dos números tecleados por usuario
  2. El usuario tecleará dos números (x e y), y el programa deberá calcular cual es el resultado de su división y el resto de esa división.
  3. El usuario tecleará dos números (a y b), y el programa mostrar el resultado de la operación (a+b)*(a-b) y el resultado de la operación a2-b2.

 

(Cuando hayas hecho los ejercicios, puedes comprobar tus respuestas con las soluciones propuestas).