Funciones Departamento de Electrónica Fundación San Valero Un array es un conjunto de variables del mismo tipo que tienen el mismo nombre y se diferencian en el índice. /* Declaramos 24 variables, una para cada hora del dia */ int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; int temp17, temp18, temp19, temp20, temp21, temp22, temp23, temp0; int media; /* Ahora tenemos que dar el valor de cada una */ printf( "Introduzca las temperaturas desde las 0 hasta las 23 separadas por un espacio: " ); scanf( "%i %i %i... %i", &temp0, &temp1, &temp2,... &temp23 ); media = ( temp0 + temp1 + temp2 + temp3 + temp4 +... + temp23 ) / 24; printf( "\nla temperatura media es %i\n", media ); Es un programa muy largo. Aquí es donde se describe la potencia de Arrays 1
Mismo ejemplo utilizando matrices: int temp[24]; /* Con esto ya tenemos declaradas las 24 variables */ float media; int hora; /* Ahora tenemos que dar el valor de cada una */ for( hora=0; hora<24; hora++ ) printf( "Temperatura de las %i: ", hora ); scanf( "%i", &temp[hora] ); media += temp[hora]; media = media / 24; printf( "\nla temperatura media es %f\n", media ); Como ves es un programa más rápido de escribir (y es menos aburrido hacerlo), y más cómodo para el usuario que el anterior. Si nos equivocamos al escribir el tamaño (ponemos 25 en vez de 24) cometeremos un error y puede que no nos demos cuenta. Por eso es mejor usar una constante con nombre, por ejemplo ELEMENTOS. #define ELEMENTOS 24 int temp[elementos]; /* Con esto ya tenemos declaradas las 24 variables */ media; int hora; /* Ahora tenemos que dar el valor de cada una */ for( hora=0; hora<elementos; hora++) printf( "Temperatura de las %i: ", hora ); scanf( "%i", &temp[hora] ); media += temp[hora]; media = media / ELEMENTOS; printf( "\nla temperatura media es %f\n", media ); float 2
Un array en una serie de datos del mismo tipo. A la hora de definirlo es necesario especificar no sólo el tipo de dato a almacenar, sino el número a almacenar. Definición e inicialización de un array: tipo_dato nombre_array[número de datos] = primer elemento, segundo elemento,...; tipo_dato nombre_array[] = primer elemento, segundo elemento,...; Llamada a un elemento de un array: x[i], donde i es el índice. Para el primer elemento i = 0 y para el último i =numero de datos-1. intx[3]=1,2,3; printf( x = %d, y = %d, z = %d, x[0], x[1], x[2]); Los arrays y los punteros están muy relacionados, ya que el nombre de un array es también un puntero que apunta al primer elemento del array. Es decir, si tenemos definido un array x de tres elementos x==&x[0],x+1==&x[1],x+2==&x[2],*x==x[0],*(x+1)==x[1]y *(x+2) ==x[2]. El uso de punteros sobre arrays es más mucho eficiente. La llamada a una función que trabaja sobre un array se realiza pasandole como argumento el nombre del array, es decir, le pasamos un puntero. La función usa este puntero para realizar los cambios sobre el array original. 3
Definición de una estructura: struct nombre_estructura tipo nombre_variable_1; tipo nombre_variable_2;... tipo nombre_variable_n; ; struct nombre_estructura nombre_variable_estructura; struct nombre_estructura tipo nombre_variable_1; tipo nombre_variable_2;... tipo nombre_variable_n; nombre_variable_estructura_1, nombre_variable_estructura_ 2,...; Ejemplos: structficha char nombre[20]; char apellidos [60]; int edad; ; struct ficha PrimeraFicha; structficha char nombre[20]; char apellidos [60]; int edad; PrimeraFicha; 4
La forma de referenciar a un elemento de la estructura es: PrimeraFicha.nombre[0]; PrimeraFicha.edad; Es posible definir arrays de estructuras. Para ello debe estar definido en primer lugar la estructura y luego definir una variable array de dicho tipo. Ejemplo: struct ficha Fichas[100]; En este caso la referencia se realiza de la siguiente forma: Fichas[0].edad; Al igual que en los arrays no podemos meter más de 20 elementos en la cadena. Vamos a ver un ejemplo para mostrar el nombre del usuario en pantalla: char nombre[20]; printf( "Introduzca su nombre (20 letras máximo): " ); scanf( "%s", nombre ); printf( "\nel nombre que ha escrito es: %s\n", nombre ); 5
Para usar estas funciones hay que añadir la directiva: strlen Esta función nos devuelve el número de caracteres que tiene la cadena (sin contar el '\0'). char texto[ ]= Javier"; int longitud; longitud = strlen(texto); printf( "La cadena \"%s\" tiene %i caracteres.\n", texto, longitud ); strcpy *cadena2); char *strcpy(char *cadena1, const char Copia el contenido de cadena2 en cadena1. cadena2 puede ser una variable o una cadena directa (por ejemplo "hola"). Debemos tener cuidado de que la cadena destino (cadena1) tenga espacio suficiente para albergar a la cadena origen (cadena2). 6
strcat char *strcat(char *cadena1, const char *cadena2); Copia la cadena2 al final de la cadena1. char nombre_completo[50]; char nombre[]= Javier"; char apellido[]= Garcia"; strcpy( nombre_completo, nombre ); strcat( nombre_completo, " " ); strcat( nombre_completo, apellido ); printf( "El nombre completo es: %s.\n", nombre_completo ); sprintf int sprintf(char *destino, const char *format,...); Funciona de manera similar a printf, pero en vez de mostrar el texto en la pantalla lo guarda en una variable (destino). El valor que devuelve (int) es el número de caracteres guardados en la variable destino. Con sprintf podemos repetir el ejemplo de strcat de manera más sencilla: char nombre_completo[50]; char nombre[]= Anselmo"; char apellido[]= Chila"; sprintf( nombre_completo, "%s %s", nombre, apellido ); printf( "El nombre completo es: %s.\n", nombre_completo ); 7
strcmp int strcmp(const char *cadena1, const char *cadena2); Compara cadena1 y cadena2. Si son iguales devuelve 0. Un número negativo si cadena1 va antes que cadena2 y un número positivo si es al revés: cadena1 == cadena2 -> 0 cadena1 > cadena2 -> número negativo cadena1 < cadena2 -> número positivo char nombre1[]= Javier"; char nombre2[]="pedro"; printf( "%i", strcmp(nombre1,nombre2)); 8