solución del examen final de junio 2008

Anuncio
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
Descargar