Sie sind auf Seite 1von 19

Estructura de un programa en C

La mejor forma de aprender un lenguaje es programando con l. El programa ms sencillo que se puede escribir en C es el siguiente:
main() { }

Como podemos imaginar, este programa no hace nada, pero contiene la parte ms importante de cualquier programa C y adems, es el ms pequeo que se puede escribir y que se compila correctamente. En l se define la funcin main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una funcin C siempre va seguida de parntesis, tanto si tiene argumentos como si no. La definicin de la funcin est formada por un bloque de sentencias, que esta encerrado entre llaves {}. Un programa algo ms complicado, pero que hace algo, es el siguiente:
#include <stdio.h> main() { /* Este es mi primer programa en C*/ printf("Bienvenido a la programacin en lenguaje C\n"); return 0; }

Con l visualizamos el mensaje Bienvenido a la programacin en lenguaje C en el terminal. La primera lnea indica que se tengan en cuenta las funciones y tipos definidos en la biblioteca stdio (standard input/output). Estas definiciones se encuentran en el fichero de encabezado (header) stdio.h. En la funcin main se incluye una primera sentencia que llama a la funcin printf. sta toma como argumento (encerrado entre parntesis) una cadena de caracteres limitados por dobles comillas " " y la imprime en la salida habitual, que generalmente es el terminal en el que trabajamos. El smbolo \n indica un cambio de lnea. La segunda sentencia, return 0, termina el programa y devuelve un valor (cero) al sistema operativo (por lo general es cero si la ejecucin fue correcta y se usan valores distintos de cero para indicar diversos errores que pudieron ocurrir). Si bien no es obligatorio terminar el programa con un return, es conveniente indicarle a quien lo haya invocado, sea el Sistema Operativo o algn otro programa, si la finalizacin ha tenido xito o no. De

cualquier manera, en este caso, si sacamos esa sentencia el programa, ste funcionar exactamente igual, pero al ser compilado, el compilador nos advertir de la falta de retorno. La inclusin de comentarios en un programa es una saludable prctica, como lo reconocer cualquiera que haya tratado de leer un listado hecho por otro programador o por s mismo, varios meses atrs. Para el compilador, los comentarios son inexistentes, por lo que no generan lneas de cdigo, permitiendo abundar en ellos tanto como se desee. En el lenguaje C se toma como comentario todo carcter entre los smbolos: /* */. Cada sentencia de programa queda finalizada por el terminador ";", que indica al compilador el fin de la misma. Esto es necesario ya que sentencias complejas pueden llegar a tener ms de un rengln, y habr que avisar al compilador donde terminan. Es perfectamente lcito escribir cualquier sentencia abarcando los renglones que la misma necesite; por ejemplo podra ser:
printf("Bienvenido a la programacin en lenguaje C\n");

Un programa en C es simplemente un fichero de caracteres que contiene un conjunto de instrucciones que un programa especial, el compilador o traductor, se encarga de transformar en un cdigo que la computadora puede ejecutar (cdigo objeto). En general, un programa suele estar compuesto de tres partes:
y y y

el encabezamiento, que especifica las declaraciones globales de los datos y sus tipos, que vamos a manejar a lo largo del programa; la funcin principal, que se suele llamar main, y define la estructura del programa. las funciones o subrutinas auxiliares, que realizan las operaciones necesarias; son llamadas por la rutina principal, la funcin main. Se suelen colocar despus de esta funcin.

Encabezamiento main( ) { variables locales sentencias } f1( ) { variables locales sentencias } ... ... ... fn( ) {

variables locales sentencias }

Cuando la envergadura del programa es grande se suele fragmentar el programa en varias partes, incluyendo cada parte en un fichero separado. El lenguaje C define el mtodo que debemos seguir para separar las diferentes partes del programa. Normalmente colocaremos en cada fichero todas las subrutinas y funciones que se encarguen de una tarea del programa. Por tanto, un programa C puede estar formado por diferentes mdulos o fuentes. Es conveniente mantener los fuentes de un tamao no muy grande, para que la compilacin sea rpida. Tambin, al dividirse un programa en partes, se puede facilitar la legibilidad del programa y su estructuracin. Los diferentes fuentes son compilados de forma separada nicamente los fuentes que han sido modificados desde la ltima compilacin-, y despus enlazados o combinados entre ellos y con las bibliotecas necesarias para formar el programa en su versin ejecutable, mediante un programa denominado enlazador (linker). Los comandos necesarios para compilar, enlazar los diferentes mdulos y ejecutar un programa dependen del sistema operativo, y debemos dirigirnos a los manuales correspondientes para conocer la sintaxis exacta. Como forma ms comn podemos dar la siguiente: compilar: enlazar: ejecutar:
cc prog cc modulo1, modulo2 link prog, modulo1, modulo2 prog

Funciones de entrada/salida ms importantes en C


Los ficheros estndar definidos en todo sistema C son: stdin (entrada estandar, asociado al teclado) stdout (salida estandar, asociado a la pantalla) stderr (error estandar, asociado a la pantalla) stdaux (auxiliar estandar) stdprn (impresora estandar)

putchar(char c) Funcin de salida de carcter. Imprime el carcter c por la salida estndar.

char getchar(void) Entrada estndar de carcter. Obtiene un carcter de la entrada estndar y este es el valor que devuelve la funcin.

int printf(const char *format, ...) Imprime por la salida estndar una secuencia de caracteres cuya estructura est definida en la string format. Se permite dar salida a cualquier tipo de dato predefinido. La string format tiene la estructura de una string normal pero admite adems caracteres de conversin (%) para indicar qu tipo de dato se ha de imprimir. La estructura de una cadena de formato es: %[flags][.width][.prec][F|N|h|l]type donde type es un caracter de conversin. El campo flag afecta al tipo de justificacin; width a la anchura utilizada para imprimir; .prec a la precisin a la hora de escribir nmeros en coma flotante. El ltimo campo opcional afecta a la interpretacin del argumento.

%c %d %e %f %g

Caracter Entero decimal Flotante se representa con exponente Flotante se representa sin exponente Menor entre %e y %f

%o Entero octal, sin el cero inicial %u Entero decimal sin signo %x Entero representado en hexa sin 0x %s Strings (cadenas) Figura 25 Caracteres de conversin
y

int scanf(const char *format, ...) Es el equivalente a printf para la entrada estndar de datos de forma estructurada. En la cadena de formato se pueden poner todos los caracteres de conversin (%) de la tabla anterior. Adems admite %[cadena], donde se acepta cualquier cadena formada por elementos pertenecientes a cadena, o si la cadena comienza con '^', los no pertenecientes.

FILE *fopen(const char *filename,const char *mode) Abre un fichero en alto nivel. filename es el nombre del fichero y mode indica el modo de apertura del fichero, en la Figura 26 se indican los valores posibles. Retorna un puntero al descriptor del fichero (FILE).

"r" Abrir un archivo existente solo para lectura "w" Abrir un archivo solo para escritura "a" Abrir un archivo para aadir. Si no existe se crea uno "r+" Abrir un archivo existente para lectura y escritura "w+" Abrir un archivo nuevo para lectura y escritura "a+" Abrir un archivo nuevo para leer y aadir Figura 26 Modos de apertura de un fichero
y

int fclose(FILE *fp) Cierra un fichero cuyo puntero al descriptor es fp.

int fprintf(FILE *fp,const char *format, ...) Escribe en el fichero descrito por fp datos con el formato indicado por format.

int fscanf(FILE *fp,const char *format, ...)

Lee del fichero descrito por fp. Tanto esta llamada como la anterior son las equivalentes de printf y scanf que operan sobre ficheros. #include <stdio.h> int main(void) { FILE *fp; char a; int b, c; fp = fopen("fichero.txt", "r+"); if (fp == NULL) { printf("ERROR"); exit(-1); } fscanf(fp, "%c %d, %d", &a, &b, &c); fclose(fp); return 0; } Figura 27 Lectura de datos de un fichero

Libreras o Bibliotecas en Lenguaje C


 assert.h Contiene una macro para el diagnstico dentro de los programas.  ctype.h Contiene varias funciones para comprobacin de tipos y transformacin de caracteres.  errno.h Contiene varias macros usadas para informar de errores.  limits.h Contienen varias macros que definen constantes para el tamao de tipo enteros.  float.h Contienen varias macros que definen constantes para el tamao de tipo flotante.  locale.h Contienen varias macros, funciones y tipos para unidades locales, como unidad monetaria, tiempo, dgitos, etc.  math.h Contiene una macro y varias funciones matemticas.  setjmp.h Contienen declaraciones que proporcionan una forma de evitar la secuencia normal de llamada y regreso de funciones.

 signal.h Contiene un tipo, dos funciones y varias macros para manejar condiciones excepcionales que aparecen durante la ejecucin, tal como una seal de interrupcin de una fuente externa o un error en la ejecucin.  stdarg.h Contiene un tipo y tres macros que proporcionan recursos para recorrer una lista de argumentos de funcin de tamao y tipo desconocido.  stddef.h Contiene varios tipos y macros que tambin estn definidas en otras libreras, como size_t.  stdio.h Contiene tipos, macros y funciones para la realizacin de tareas de E/S.  stdlib.h Contiene tipos, macros y funciones para la conversin numrica, generacin de nmeros aleatorios, bsquedas y ordenacin, gestin de memoria y tareas similares.  string.h Contiene tipos, macros y funciones para la manipulacin de cadenas de caracteres.  time.h Contiene tipos, macros y funciones para la la manipulacin de informacin sobre fechas y horas.

Identificadores de Entrada/Salida
Un identificador es el nombre que se le da a una variable, constante, funcin, etiqueta u otro objeto utilizado en C. Un identificador en C puede variar entre 1 y 32 caracteres. El primer carcter debe ser una letra o un subrayado ( _ ) seguido de una secuencia de caracteres siendo letras, numero o subrayados. Ejemplo de identificadores: correcto incorrecto Mexicali 3f32 cont pot*10 sueldo Fact! f_32 Num 3 Fila12s Dia..9 Tipos de datos: Existen 5 tipos de datos importantes en C: Tipo Descripcin Tamao en bytes Rango char carcter 1 byte 0 al 255 int Nmeros enteros 2 bytes -32768 al 32767 float Nmeros Reales 4 bytes 3.4E-38 al 3.4E+38 double Nmeros Reales 8 bytes 1.7E-308 al 1.7E+308

void Nulo 0 bytes sin valores Ejemplos de datos que se guardan en las variables: char : 'a', 'B', '7', '*', '/n'; int: 89, 0, -78 float: 1.67, 9.0, -89.67E-9; double: 789.97E300, 1.5 Existen igualmente algunos modificadores que en unin con los tipos de datos bsicos aumentan la cantidad de ellos, estos son: signed, unsigned, long y short. Tipo Rango Tamao en bytes unsigned char 0 al 255 1 signed char -128 al 127 1 unsigned int 0 a l 65535 2 signed int -32768 al 32767 2 short int -32768 al 32767 2 unsigned short int 0 a l 65535 2 signed short int -32768 al 32767 2 long int -2147483648 al 2147483647 4 unsigned long int 0 al 4294967295 4 signed long int -2147483648 al 2147483647 4 long double 1.7E-308 al 1.7E+308 8

Lenguaje de Programacin C
Qu es C?
C es un lenguaje de programacin diseado por Dennis Ritchie, de los Laboratorios Bell, y se instal en un PDP-11 en 1972; se dise para ser el lenguaje de los Sistemas Operativos UNIX1. A su vez, UNIX es un Sistema Operativo desarrollado por Ken Thompson, quin utiliz el lenguaje ensamblador y un lenguaje llamado B para producir las versiones originales de UNIX, en 1970. C se invent para superar las limitaciones de B. C es un lenguaje maduro de propsitos generales que se desarroll a partir de estas races; su definicin aparece en 1978 en el apndice ``C Reference Manual'' del libro The C Programming Language, de Brian W. Kernighan y Dennis M. Ritchie (Englewood Cliffs, Nueva Jersey, Prentice-Hall 1978), pero el estndar recomendable ms reciente apareci en junio de 1983, en el documento de los Laboratorios Bell titulado The C Programming Language-Reference Manual, escrito por Dennis M. Ritchie.

Partes principales de un programa en C.


Todos los programas en C siguen una misma estructura bsica:
A. Directivas de procesador 1. Inclusiones 2. Macros B. Declaraciones globales 1. Funciones 2. Variables C. main( ) D. Funciones creadas por el usuario

Ejemplo de un programa:
1 /*BEGIN.C Este programa muestra las partes principales de un programa en C*/ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <conio.h> 5 6 #define FALSE 0 /*define al marco F igual a 0*/ 7 #define TRUE 1 /*define al marco T igual a 1*/ 8

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

int i=0; void put_msg(void); main () { int respuesta; clrscr(); printf("Quieres ver el mensaje?\n"); printf("introduce 0 para No, 1 para Si ==>); scanf("%d, &respuesta); if (respuesta == TRUE) put-msg(); else puts("Hasta luego."); } void put_msg (void) { clrscr(); for (i=0; i<=10; i++) printf("Prueba la cadena # %d.\n", i); }

Directivas de preprocesador:

Las directivas de preprocesamiento dirigen al compilador a desarrollar ciertas tareas antes de que el programa se empiece a compilar. Una de las directivas mas comunes es el #include, el cual le indica al compilador que incluya un archivo fuente de C, el header file, antes de que empiece a compilar. Otra directiva comun es la directiva #define el cual es una definicion de un macro.

Los headers files estan compuestos primordialmente de declaracion de funciones, declaracion de variables y de definiciones de macros. Estos pueden ser identificados facilmente por la extencion h en el hombre del archivo. los archivos de cabecera y para que sirven c/u
Declaraciones globales:

Una declaracion notifica las propiedades de una varibale o funcion. Las declaraciones globales le dicen al compilador sobre las funciones definidas por el usuario y acerca de las variables que son comunes en el archivo fuente. La declaracion de una funcion le indica al compilador que tipo de dato necesita la funcion y que tipo de dato regresara. Todas las declaraciones de funciones terminan con un punto y coma. Si deseas eliminar la declaracion de funciones al inicio del programa solo tienes que desarollar (definir) la funcion al inicio del programa antes de hacer cualquier llamado a una funcion. Una declaracion global de una variable hace que la variable sea disponible para el uso en todas las funciones del archivo fuente.

Declarar muchas variables globales puede causar problemas debido a que se te puede olvidar que cambiaste el valor de la variable en otra funcion, por lo que recomienda usarlas lo menos posible.
Funcion principal:

Todo programa debe de llevar la funcion main(). La ejecucion del programa incia y termina con la funcion main(). Si el programa es suficientemente pequeo puede ser escrito dentro de main(). Por lo general la funcion main() contiene llamados a funciones definidas por el usuario o que son encontradas dentro de las librerias.
Definicion de funciones:

Las funciones definidas por el usuario son un grupo de declaraciones que logran realizar las tareas del programa.

Tipos de Datos del lenguaje C


Char: Caracteres Int: Nmeros enteros Float: Nmeros en coma flotante (32 bits) Double: Nmeros en coma flotante de doble precisin (64 bits) Void: Tipo nulo Punteros: Direcciones de memoria Arrays:Como en Pascal Estructuras: Como los registros de Pascal. Uniones: Variables que pueden contener datos de distintos tipos.

Tipos de datos bsicos:

Tamao de la variable short (int por defecto) long (int por defecto) Signo (char, short, int, long) signed Unsigned Modo de almacenamiento register auto (por defecto) static extern

Modificadores:

Enumeraciones:
enum [<identificador>] { <nombre_constante> [= <valor>], ... } [lista de variables]; enum day {Sun,Mon,Tue,Wed,Thu,Fri,Sat} anyday;

Tipos definidos por el usuario


typedef <tipo><identificador>; typedef unsigned char byte; typedef struct { double real, imag; } complex;

Como se declaran las variables en C


Declaracin de variables:
<tipo><identificador> [= <init>] [, ...] ; Ejemplos: int x; int y = 4; int x = 1, y = 2; int *p; int **int_ptr; long double v; complex i; enum day hoy; char ch; unsigned char c1, c2; char *str; char str[] = "ATD1"; int vector[]; int vector[3]; int vector[3] = {1, 2, 3}; int matriz[3][4];

Estructura de un programa en C
La mejor forma de aprender un lenguaje es programando con l. El programa ms sencillo que se puede escribir en C es el siguiente:
main() { }

Como podemos imaginar, este programa no hace nada, pero contiene la parte ms importante de cualquier programa C y adems, es el ms pequeo que se puede escribir y que se compila correctamente. En l se define la funcin main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una funcin C siempre va seguida de parntesis, tanto si tiene argumentos como si no. La definicin de la funcin est formada por un bloque de sentencias, que esta encerrado entre llaves {}. Un programa algo ms complicado, pero que hace algo, es el siguiente:
#include <stdio.h> main() { /* Este es mi primer programa en C*/ printf("Bienvenido a la programacin en lenguaje C\n"); return 0; }

Con l visualizamos el mensaje Bienvenido a la programacin en lenguaje C en el terminal.

Que es una expresin en C


y Expresiones y operadores

Los distintos operadores permiten formar expresiones tanto aritmticas como lgicas. Los operadores aritmticos y lgicos son:
+, ++, -*, /, % suma, resta incremento, decremento multiplicacin, divisin, mdulo

>>, << & | ^ ~ ! ==, != &&, || <, <= >, >=

rotacin de bits a la derecha, izquierda. AND booleano OR booleano EXOR booleano complemento a 1 complemento a 2, NOT lgico igualdad, desigualdad AND, OR lgico menor, menor o igual mayor, mayor o igual

En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas de asociatividad, que son las normales en la mayora de lenguajes. Se debe consultar el manual de referencia para obtener una explicacin detallada. Adems hay toda una serie de operadores aritmticos con asignacin, como pueden ser += y ^=. En la evaluacin de expresiones lgicas, los compiladores normalmente utilizan tcnicas de evaluacin rpida. Para decidir si una expresin lgica es cierta o falsa muchas veces no es necesario evaluarla completamente. Por ejemplo una expresin formada <exp1> || <exp2>, el compilador evala primero <exp1> y si es cierta, no evala <exp2>. Por ello se deben evitar construcciones en las que se modifiquen valores de datos en la propia expresin, pues su comportamiento puede depender de la implementacin del compilador o de la optimizacin utilizada en una compilacin o en otra. Estos son errores que se pueden cometer fcilmente en C ya que una asignacin es tambin una expresin. Debemos evitar: if (( x++ > 3 ) || ( x < y )) y escribir en su lugar: x++; if (( x > 3 ) || ( x < y )) Hay un tipo especial de expresin en C que se denomina expresin condicional y est representada por los operadores ? : . Su utilizacin es como sigue: <e> ? <x> : <y>. Se evala si e entonces x; si no, y. int mayor ( int a, int b ) { return ( a > b ) ? TRUE : FALSE; } waste_time () { float a, b = 0.0; ( b > 0.0 ) ? sin(M_PI / 8) : cos(M_PI / 4);}

Sentencias de Control en C

Estructura de control: seleccin if simple

Se trata de una estructura de control que permite redirigir un curso de accin segn la evaluacin de una condicin simple, sea falsa o verdadera. Por ejemplo: Escribir un programa en Java que compare dos nmeros e indique si cul es mayor, menor, mayor y/o igual, menor y/o igual, o si son iguales: String strComparacion = ""; .. if( numero1 == numero2 ) strComparacion += numero1 + " == " + numero2; if( numero1 > numero2 ) strComparacion += numero1 + " > " + numero2; if( numero1 < numero2 ) strComparacion += numero1 + " < " + numero2; if( numero1 >= numero2 ) strComparacion += numero1 + " >= " + numero2; if( numero1 <= numero2 ) strComparacion += numero1 + " <= " + numero2; System.out.println(strComparacion); y .If-Then-Else

Si la condicin es verdadera, se ejecuta el bloque de sentencias 1, de lo contrario, se ejecuta el bloque de sentencias 2. IF (Condicin) THEN (Bloque de sentencias 1) ELSE (Bloque de sentencias 2) END IF o Select-Case
y y y y

Se evala la expresin, dando como resultado un nmero. Luego, se recorren los "Case" dentro de la estructura buscando que el nmero coincida con uno de los valores. Es necesario que coincidan todos sus valores. Cuando se encuentra la primera coincidencia, se ejecuta el bloque de sentencias correspondiente y se sale de la estructura Select-Case.

Si no se encuentra ninguna coincidencia con ningn valor, se ejecuta el bloque de sentencias de la seccin "Case Else".

SELECT (Expresin) CASE Valor1 (Bloque de sentencias 1) CASE Valor2 (Bloque de sentencias 2) CASE Valor n (Bloque de sentencias n) CASE ELSE (Bloque de sentencias "Else") END SELECT y Do-While

Mientras la condicin sea verdadera, se ejecutarn las sentencias del bloque. DO WHILE (Condicin) (Bloque de sentencias) LOOP que tambin puede expresarse: WHILE (Condicin) (Bloque de sentencias) wen y Do-Until

Se ejecuta el bloque de sentencias, hasta que la condicin sea verdadera DO (Bloque de sentencias) LOOP UNTIL (Condicin) o For-Next
y y y

Primero, se evalan las expresiones 1 y 2, dando como resultado dos nmeros. La variable del bucle recorrer los valores desde el nmero dado por la expresin 1 hasta el nmero dado por la expresin 2. El bloque de sentencias se ejecutar en cada uno de los valores que tome la variable del bucle.

FOR (Variable) = (Expresin1) TO (Expresin2) STEP (Salto) (Bloque de sentencias) NEXT y Estructuras anidadas

Las estructuras de control bsicas pueden anidarse, es decir pueden ponerse una dentro de otra. y Estructura For-Next dentro de una estructura If-Then-Else

IF A > B THEN FOR X = 1 TO 5 (Bloque de sentencias 1) NEXT ELSE (Bloque de instrucciones 2) END IF y Estructura If-Then-Else dentro de estructura For-Next

FOR x = 10 TO 20 STEP 2 IF A = C THEN (Bloque de instrucciones) ELSE (Bloque de instrucciones) END IF NEXT

Estructura For-Next que est dentro de estructura Do-While

DO WHILE A > 0 FOR X = 1 TO 10 (Bloque de instrucciones) NEXT A=A-1 LOOP y Estructura Do-While que est dentro de estructura For-Next

FOR X = 1 TO 10

DO WHILE X < A (Bloque de instrucciones) LOOP NEXT y Estructura If-Then dentro de estructura For-Next dentro de estructura

Do-While DO WHILE A > 0 FOR X = 1 TO 10 IF A = C THEN (Bloque de instrucciones1) ELSE (Bloque de instrucciones2) END IF NEXT A=A-1 LOOP

Arreglos en C
Apuntadores Y arreglos:
Se definimos el arreglo de 10 enteros de la siguiente manera: int a[10]; podemos referenciar a[0] a[1] .. a[9]. Si adems definimos el apuntador a entero "pa" int *pa; y le asignamos la direccin del primer elemento del arreglo "a", pa=&pa[0]; o bien pa=a; entonces, el contenido de "a[i]" puede ser visto con *(pa+i) En apuntadores a arreglos de caracteres, las 2 siguientes declaraciones son equivalentes: char s[]; char *s; Aritmtica de direcciones. Son posibles las siguientes operaciones con apuntadores: - Sumar y restar un entero a un apuntador. - Restar y comparar 2 apuntadores. - Comparar un apuntador con NULL.

Apuntadores a caracteres y a funciones. En el siguiente ejemplo, la variable "mensaje" es SOLO UN APUNTADOR. char *message="now is the time"; No se debe comfundir el envo de un APUNTADOR a un arreglo de caracteres con el envo del ARREGLO de caracteres. Por ejemplo, en la siguiente funcin se envan los apuntadores a 2 arreglos de caracteres (cuya memoria fue asignada en otra parte del programa). strcpy(s,t) /* copia t a s, con apuntadores */ { while (*s++=*t++) ; }

Arreglos Multidimensionales:
En C, los arreglos de 2 dimensiones se implementan como arreglos unidimensionales. Donde cada elemento es, a su vez, un arreglo unidimensional. Por lo anterior, la sintaxis en C es day_tab[i][j]; /* [rengln] [columna] */ en lugar de: day_tab[i,j]; /* INCORRECTO */ Los arreglos de 2 dimensiones pueden ser inicializados como sigue: static int day_tab[2][13] = { {0,31,28,..,31}, {0,31,29,..,31}, }; Arreglo de apuntadores. Apuntadores a apuntadores. Inicializacin de arreglos de apuntadores: static char *name[]= { "mes ilegal", "enero", ... "diciembre", };