Dpto. Ing. de Sistemas y Automática. Universidad de Sevilla. Fundamentos de Informática. Examen convocatoria de Junio. 1er curso Ing. Industrial. 27 de Junio de 2008. APELLIDOS: NOMBRE: D.N.I.: Escriba las respuestas únicamente en los recuadros indicados. Utilice la parte de atrás como borrador. Puede emplear el lápiz. Compruebe que tiene todas las hojas. Entregue todas las hojas con su nombre, apellidos y DNI. CUESTIÓN 1 (2 puntos) En un fichero binario disponemos de una matriz de enteros. El fichero comienza con dos datos enteros que son el número de filas y el número de columnas de la matriz, y a continuación aparecen todos los elementos de la matriz linealizada por filas (Puede suponer que la matriz tiene dimensiones máximas 300x300). El contenido de la matriz consiste en valores enteros 0 y 1, de modo que puede interpretarse como una imagen donde el valor 1 corresponde al color negro y el 0 al blanco (ver figura). La matriz, interpretada como una imagen, contiene una línea vertical y otra horizontal (segmentos) que se cortan entre sí en un punto. Se pretende diseñar un programa que, partiendo de la información del fichero binario, calcule las coordenadas del corte de los dos segmentos. Tenga en cuenta que no se conoce la longitud de los segmentos, ni su colocación. Se pide: Programe la función busca_corte que recibe como parámetros el nombre del fichero que contiene la matriz, y muestre por pantalla las coordenadas del corte de los segmentos con el siguiente formato ejemplo: Corte de segmentos en x= 25, y= 46 void busca_cortes(char *nombre_fich) { FILE *pf; int fil,col,cruce,i,j,x,y; int *m; pf=fopen(nombre_fich,"rb"); // Lectura de dimensiones matriz fread(&fil,1,sizeof(int),pf); fread(&col,1,sizeof(int),pf); if((m=(int *)malloc(fil*col*sizeof(int)))==NULL) // Reserva dinámica para matriz {printf("Error Reserva Memoria\n");exit(0);} fread(m,fil*col,sizeof(int),pf); // Lectura matriz linealizada por filas fclose(pf); // Algoritmo de localización de cortes : // Recorremos por filas for(cruce=1,i=0;i<fil && cruce;i++) for(j=0;j<col;j++) if(*(m+i*col+j)==1) {x=j; cruce=0; break;} // Recorremos por columnas for(cruce=1,j=0;j<col && cruce;j++) for(i=0;i<fil;i++) if(*(m+i*col+j)==1) {y=i; cruce=0; break;} printf("Corte en x=%d, y=%d\n",x,y); } 1/2 Dpto. Ing. de Sistemas y Automática. Universidad de Sevilla. Fundamentos de Informática. Examen convocatoria de Junio. 1er curso Ing. Industrial. 27 de Junio de 2008. APELLIDOS: NOMBRE: D.N.I.: Escriba las respuestas únicamente en los recuadros indicados. Utilice la parte de atrás como borrador. Puede emplear el lápiz. Compruebe que tiene todas las hojas. Entregue todas las hojas con su nombre, apellidos y DNI. CUESTIÓN 2 (3 puntos) Se dispone de un fichero de texto que contiene la información suficiente para crear varias matrices cuadradas de números enteros. El primer elemento a leer corresponde al número de filas de la matriz cuadrada. A continuación se encuentran los diferentes números enteros que forman la matriz separados por espacios, y así sucesivamente hasta que no haya más pares de números que indiquen las filas y las columnas. struct matriz { Ej: La información dada en el fichero corresponde a la siguiente matriz int *pmat; ⎛ 1 2 3⎞ int nf; ⎜ ⎟ struct matriz * pSig; 3123456789 ⎜ 4 5 6⎟ }; 21001 ⎜7 8 9⎟ ⎝ ⎠ ⎛1 0⎞ ⎜ ⎟ ⎝0 1⎠ Figura 1: estructura tipo matriz Se pide: - Realice la función txt2lista que lea la información de cada matriz de un fichero de texto, llamado “matriz.txt”, y la escriba en una estructura de tipo matriz (véase fig.1). A continuación deberá insertar dicha estructura al final de una lista enlazada no ordenada. Inicialmente no existe la lista. La función deberá crearla y devolver la dirección de comienzo de la lista. - Nota: no hace falta que haga comprobaciones de fallo en la apertura de ficheros ni en la reserva dinámica de memoria. struct matriz * txt2lista(void) { struct matriz * psTop=NULL; struct matriz * ps=NULL; struct matriz * psNuevo=NULL; FILE * pftxt=NULL; int n,i; pftxt=fopen("matriz.txt","rt"); while(fscanf(pftxt,"%d",&n)==1) { psNuevo=(struct matriz *)malloc(sizeof(struct matriz)); psNuevo->pmat=(int *)malloc(n*n*sizeof(int)); psNuevo->nf=n; psNuevo->pSig=NULL; for(i=0;i<n*n;i++) fscanf(pftxt,"%d",&(psNuevo->pmat[i])); if(psTop==NULL) psTop=psNuevo; else ps->pSig=psNuevo; ps=psNuevo; } fclose(pftxt); return psTop; } 2/2