Ing. Informática Programación I Bloque 5-I Bloque 5 Tipos de datos compuestos estáticos: arrays, strings y structs Parte I: Arrays Ing. Informática Programación I Hasta ahora... Tipos de datos simples: Caracteres: char Números: int, float, double (y modificadores) Problema: calcular la temperatura media anual a partir de los valores mensuales Y diarios? Bloque 5-I Ing. Informática Programación I Bloque 5-I Tipos de datos compuestos Permiten agrupar en una única variable varios elementos de tipos simples Arrays (arreglo, tabla): todos los elementos del mismo tipo (temperaturas) Unidimensionales: vectores Multidimensionales: matrices Strings: una cadena de varios caracteres Estructura: cada elemento puede ser de un tipo diferente En este tema: sólo datos estáticos (dinámicos en tema 7) Ing. Informática Programación I Bloque 5-I Arrays unidimensionales Ejemplo de las temperaturas por meses 0 1 2 3 4 5 6 7 8 9 10 11 12.8 13.7 14.9 15.5 16.0 17.1 19.3 20.1 19.0 17.2 15.4 13.1 Valor Declaración del array temperaturas Nº de mes float temperaturas[12]; En general De 0 al 11 tipo nombre[numero_de_elementos]; De 0 a numero_de_elementos-1 Ing. Informática Programación I Bloque 5-I Arrays unidimensionales Para acceder a una cierta posición: Por ejemplo: temperaturas[5] temperaturas[5] = 18.2; 0 1 2 3 4 5 6 7 8 9 10 11 12.8 13.7 14.9 15.5 16.0 18.2 19.3 20.1 19.0 17.2 15.4 13.1 Siempre se accede por posiciones excepto en la declaración inicial donde se puede asignar valores a todas las posiciones a la vez: int array[3] = {1, 2, 3}; Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 1: llenar un array #include <stdio.h> main() { float temperaturas[12]; int indice; Declaración de la variable temperaturas Normalmente necesitaremos una variable para recorrer el array, posición a posición (índice) indice=0; Normalmente necesitaremos un bucle que while (indice<12) recorra el array posición a posición (de 0 a 11) { printf(“Introduce la temperatura del mes %d\n", indice); scanf(“%f”, &temperaturas[indice]); indice++; } } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 1: llenar un array (2) #include <stdio.h> main() { float temperaturas[12]; int indice; El array va del 0 al 11 Al usuario le mostramos el resultado del 1 al 12 indice=0; while (indice<12) { printf(“Introduce la temperatura del mes %d\n", indice+1); scanf(“%f”, &temperaturas[indice]); indice++; } } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 1: llenar un array (3) #include <stdio.h> #define N 24 main() { float temperaturas[N]; int indice; Así es más fácil hacer cambios (por ejemplo guardar 24 meses, o una temperatura al día) indice=0; while (indice<N) { printf(“Introduce la temperatura del mes %d\n", indice+1); scanf(“%f”, &temperaturas[indice]); indice++; } } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 2: escribir el contenido de un array #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; /* aquí iría la parte de llenar el array */ for (indice=0; indice < N; indice++) printf("%f\n",temperaturas[indice]); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 3: calcular la temperatura media #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float suma; /* aquí iría la parte de llenar el array */ indice=0; suma=0; while (indice<N) { suma=suma+temperaturas[indice]; indice++; } suma=suma/N; //dividimos por el número de meses printf("La temperatura media es %f",suma); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 4: calcular la temperatura máxima #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float maxima; /* aquí iría la parte de llenar el array */ indice=0; maxima=0; while (indice<N) { if (maxima<temperaturas[indice]) maxima=temperaturas[indice]; indice++; } printf("La maxima anual es %f",maxima); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 4b: calcular la temperatura mínima #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float minima; /* aquí iría la parte de llenar el array */ indice=0; minima=0; while (indice<N) { if (minima>temperaturas[indice]) minima=temperaturas[indice]; indice++; } printf("La minima anual es %f", minima); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 4b: calcular la temperatura mínima (2) #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float minima; /* aquí iría la parte de llenar el array */ Si inicializamos minima a 0, indice=0; si todas las temperaturas son positivas, minima=0; el valor final es 0: ERROR! while (indice<N) { if (minima>temperaturas[indice]) minima=temperaturas[indice]; indice++; } printf("La minima anual es %f", minima); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 4b: calcular la temperatura mínima (3), 2 soluciones #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float minima; } #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice; float minima; /* aquí iría la parte de llenar el array */ /* aquí iría la parte de llenar el array */ indice=0; minima=1000; while (indice<N) { if (minima>temperaturas[indice]) minima=temperaturas[indice]; indice++; } printf("La minima anual es %f", minima); minima=temperaturas[0]; indice=1; while (indice<N) { if (minima>temperaturas[indice]) minima=temperaturas[indice]; indice++; } printf("La minima anual es %f", minima); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 4c: calcular la temperatura máxima y su mes #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice,mes; float maxima; La variable mes contiene el nº del mes con la temperatura máxima (del 0 al 11) /* aquí iría la parte de llenar el array */ maxima=temperaturas[0]; Le sumamos uno para que el usuario vea mes=0; el resultado del 1 al 12 indice=0; while (indice<N) { if (maxima<temperaturas[indice]) { maxima=temperaturas[indice]; mes=indice; } indice++; } printf("La maxima anual es %f, del mes %d",maxima,mes+1); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 5: buscar una temperatura concreta #include <stdio.h> #define N 12 La variable encontrado nos indica si ya main() hemos encontrado el valor buscado (1) o { no (0) float temperaturas[N]; int indice,encontrado; float valor_buscado; /* aquí iría la parte de llenar el array */ indice=0; encontrado=0; printf("Introdueix el valor que vols cercar: "); scanf("%f",&valor_buscado); while ( (indice<N) && (encontrado==0) ) { if (temperaturas[indice]==valor_buscado) encontrado=1; indice++; } if (encontrado==0) printf("El valor buscado no se ha encontrado"); else printf("El valor buscado se ha encontrado"); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 5: buscar una temperatura concreta (2) #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice,encontrado; float valor_buscado; /* aquí iría la parte de llenar el array */ indice=0; encontrado=0; printf("Introdueix el valor que vols cercar: "); scanf("%f",&valor_buscado); while ( (indice<N) && (encontrado==0) ) { if (temperaturas[indice]==valor_buscado) encontrado=1; indice-1+1 indice++; } if (encontrado==0) printf("El valor buscado no se ha encontrado"); else printf("El valor buscado está en el mes %d",indice); } Ing. Informática Programación I Bloque 5-I Arrays unidimensionales. Ejemplo 6: contar cuántas veces aparece un valor #include <stdio.h> #define N 12 main() { float temperaturas[N]; int indice,veces; float valor_buscado; /* aquí iría la parte de llenar el array */ indice=0; veces=0; printf("Introdueix el valor que vols cercar: "); scanf("%f",&valor_buscado); while (indice<N) { if (temperaturas[indice]==valor_buscado) veces++; indice++; } printf("El valor %f se a encontrado %d veces\n", valor_buscado,veces); } Ing. Informática Programación I Bloque 5-I Arrays multidimensionales (matrices) Permiten más de una dimensión Ejemplo: matriz 2x3 de enteros: int matriz[2][3]; matriz[0][1] = 2; matriz[1][2] = 3; 2 3 Ing. Informática Programación I Matrices. Ejemplo 1: imprimir matriz #include <stdio.h> main() { int m[3][4]; int i,j; Bloque 5-I Normalmente necesitaremos dos variables índice, una para las filas (i), otra para las columnas (j) /* aquí iría la parte de llenar la matriz */ Normalmente necesitaremos un doble bucle para recorrer la matriz posición a posición for (i=0;i<3;i++) for (j=0;j<4;j++) printf(" - %d - ",m[i][j]); } Resultado: por filas - M[0][0] - M[0][1] - M[0][2] - M[0][3] M[1][0] - M[1][1] - M[1][2] - M[1][3] M[2][0] - M[2][1] - M[2][2] - M[2][3] Ing. Informática Programación I Matrices. Ejemplo 1: imprimir matriz (2) #include <stdio.h> main() { int m[3][4]; int i,j; /* aquí iría la parte de llenar la matriz */ for (j=0;j<4;j++) for (i=0;i<3;i++) printf(" - %d - ",m[i][j]); } Resultado: por columnas - M[0][0] M[0][1] M[0][2] M[0][3] - M[1][0] M[1][1] M[1][2] M[1][3] - M[2][0] M[2][1] M[2][2] M[2][3] Bloque 5-I Ing. Informática Programación I Bloque 5-I Matrices. Ejemplo 2: sumar dos matrices #include <stdio.h> main() { int a[3][4],b[3][4],c[3][4]; int i,j; /* aquí iría la parte de llenar las matrices a y b */ for (i=0;i<3;i++) for (j=0;j<4;j++) c[i][j]=a[i][j]+b[i][j]; } Ing. Informática Programación I Bloque 5-I Matrices. Ejemplo 3: multiplicar dos matrices #include <stdio.h> #define M 2 #define N 3 #define P 4 main() { int a[M][P],b[P][N],c[M][N]; int i,j,k; /* aquí iría la parte de llenar las matrices a y b */ for (i=0;i<M;i++) for (j=0;j<N;j++) c[i][j]=0; //llenamos C con ceros for (i=0;i<M;i++) for (j=0;j<N;j++) for (k=0;k<P;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } Ing. Informática Programación I Bloque 5-I Matrices. Ejemplo 3: multiplicar dos matrices (2) #include <stdio.h> #define M 2 #define N 3 #define P 4 main() { int a[M][P],b[P][N],c[M][N]; int i,j,k; /* aquí iría la parte de llenar las matrices a y b */ for (i=0;i<M;i++) for (j=0;j<N;j++) { c[i][j]=0; //llenamos C con ceros for (k=0;k<P;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } Ing. Informática Programación I Matrices. Ejemplo: calcular la traspuesta de una matriz v1 #include <stdio.h> #define N 3 main() { int a[N][N],b[N][N]; int i,j; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N;i++) for (j=0;j<N;j++) b[i][j]=a[j][i]; } Bloque 5-I Ing. Informática Programación I Matrices. Ejemplo: calcular la traspuesta de una matriz v2 #include <stdio.h> #define N 3 main() { int a[N][N]; int i,j; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N;i++) for (j=0;j<N;j++) a[i][j]=a[j][i]; } Bloque 5-I Ing. Informática Programación I Matrices. Ejemplo: calcular la traspuesta de una matriz v2 #include <stdio.h> #define N 3 main() { int a[N][N]; int i,j; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N;i++) for (j=0;j<N;j++) a[i][j]=a[j][i]; } ERROR!! Bloque 5-I Ing. Informática Programación I Matrices. Ejemplo: calcular la traspuesta de una matriz v3 #include <stdio.h> #define N 3 main() { int a[N][N]; int i,j,aux; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N;i++) for (j=0;j<N;j++) { aux=a[i][j]; a[i][j]=a[j][i]; a[j][i]=aux; } } Bloque 5-I Ing. Informática Programación I Bloque 5-I Matrices. Ejemplo: calcular la traspuesta de una matriz v3 #include <stdio.h> #define N 3 main() { int a[N][N]; int i,j,aux; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N;i++) for (j=0;j<N;j++) { aux=a[i][j]; a[i][j]=a[j][i]; a[j][i]=aux; } } ERROR: la matriz queda igual que estaba!! Ing. Informática Programación I Matrices. Ejemplo: calcular la traspuesta de una matriz v4 #include <stdio.h> #define N 3 main() { int a[N][N]; int i,j,aux; /* aquí iría la parte de llenar la matriz a */ for (i=0;i<N-1;i++) for (j=i+1;j<N;j++) { aux=a[i][j]; a[i][j]=a[j][i]; a[j][i]=aux; } } CORRECTO!! Bloque 5-I