Anda di halaman 1dari 10

19/11/2012

Informtica Grado en Ingeniera de la Energa Curso 2011/2012 Examen Final: Convocatoria 2.

Ejercicio 1 (5p)
En un fichero se almacena una imagen representada en tonos de gris en el siguiente formato:
4 4 230 123 30 80 12 12 12 12 43 43 43 43 123 0 255 1

donde los dos primeros nmeros indican la resolucin de la imagen (nmero de filas y columnas) y, a continuacin, g ( ) , se indican los valores de los pxeles de la imagen (valores enteros entre 0 y 255). Escribe un programa en C estructurado en las siguientes funciones:
Informtica

19/11/2012

Ejercicio 1 (5p)
a) (0,75 puntos) lee_imagen: lee un fichero en el formato descrito y lee_imagen
almacena los pxeles de la imagen en una matriz de enteros. Se asumir que el tamao mximo de una imagen es de 1024 768. La ruta y nombre del fichero se introducen por el teclado. La funcin devolver (por referencia) el nmero de filas y columnas de la matriz (valores ledos del fichero). Adems, si se produce un error al abrir el fichero se devolver (con return) -1 0 en caso contrario. (1,75 puntos) contrastexfila recibe la matriz de enteros que contiene los contrastexfila: pxeles de la imagen, el nmero de filas y de columnas de la imagen, y un vector de enteros que la funcin completar con las diferencias entre los valores mximos y mnimos de cada fila (contrastes). El vector contendr en la posicin i el contraste de la fila i de la matriz. Segn el ejemplo mostrado, el vector resultado sera: {200,0,0,255}. (1,75 puntos) repara_imagen: recibe la matriz de enteros que contiene repara_imagen los pxeles de la imagen, el nmero de filas y de columnas de la imagen, y el vector de enteros calculado en la funcin anterior y modifica la matriz de la anterior, siguiente forma: para todas las filas de la matriz cuyo contraste sea 0 (lnea defectuosa) se sustituyen todos los valores de esa fila por el valor medio de los pxeles de la fila anterior. Se considerar que la fila 0 nunca es defectuosa. La funcin devolver (con return) el nmero de filas defectuosas. (0,75 puntos) main: completa el main siguiendo las indicaciones de los main comentarios.

b)

c)

d)

Informtica

Ejercicio 1 (5p)
#include <stdio.h> #include <stdlib.h> #define MAXF 1024 #define MAXC 768 #define MAXCAD 100 /* E Escribe l f ib la funcin l i lee_imagen */ i /* Escribe la funcin contrastexfila */ /* Escribe la funcin repara_imagen */ /* Funcin main */ int main(){ /* Declaracin de variables */ /* Leer imagen de fichero -> Funcin lee_imagen */ /* Si hay error -> terminar programa */ /* Creamos el vector dinmico de tamao igual al nmero de filas */ /* Si hay error -> Finalizar programa */ /* C l l Calculamos el contraste por fil -> f l t t fila > funcin contrastexfila */ i t t fil /* Reparamos las lneas de la imagen defectuosas -> funcin repara_imagen */ /* Mostramos por pantalla el nmero de lneas reparadas */ /* Liberamos la memora del vector dinmico */ /* Fin del programa */ system("PAUSE"); return 0; }
Informtica

19/11/2012

Solucin Ejercicio 1 #include <stdio.h> #include <stdlib.h> #define MAXF 1024 #define MAXC 768 #define MAXCAD 100

Informtica

Solucin Ejercicio 1 (0,75 puntos) lee_imagen


Lee un fichero en el formato descrito y almacena los pxeles de la imagen en una matriz de enteros. Se asumir que el tamao mximo de una imagen es de 1024 768. La ruta y nombre del fichero se introducen por el teclado. teclado La funcin devolver (por referencia) el nmero de filas y columnas de la matriz (valores ledos del fichero). Adems, si se produce un error al abrir el fichero se devolver (con return) -1 0 en caso contrario.
Informtica

19/11/2012

Solucin Ejercicio 1
int lee_imagen(int m[][MAXC], int *nf, int *nc) { FILE *df; char nomfich[MAXCAD]; int nfil,ncol,i,j; printf("Introduce l ruta y nombre d l fi h i tf("I t d la t b del fichero\n"); \ ") gets(nomfich); if ((df = fopen(nomfich,"r")) == NULL) { printf("Error abriendo fichero %s\n",nomfich); return -1; } fscanf(df,"%d%d",&nfil,&ncol); for(i=0;i<nfil;i++) for(j=0;j<ncol;j++) f (j 0 j< l j++) fscanf(df,"%d",&m[i][j]); *nf=nfil; *nc=ncol; fclose(df); return 0; }
Informtica

Solucin Ejercicio 1 (1,75 puntos) contrastexfila


Recibe la matriz de enteros que contiene los pxeles de la imagen, el nmero de filas y de columnas de la imagen, y un vector de enteros que la funcin completar con las diferencias entre los valores mximos y mnimos de cada fila (contrastes contrastes). El vector contendr en la posicin i el contraste de la fila i de la matriz. Segn el ejemplo mostrado, el vector resultado sera: {200,0,0,255}.

Informtica

19/11/2012

Solucin Ejercicio 1
void contrastexfila(int img[][MAXC], int dif[], int nf, int nc) { int i,j,max,min; for(i=0;i<nf;i++) f (i 0 i f i ) { max=img[i][0]; min=img[i][0]; for(j=1;j<nc;j++) { if (img[i][j] > max) max=img[i][j]; a g[ ][j]; if (img[i][j] < min) min=img[i][j]; } dif[i]=max-min; } }
Informtica

Solucin Ejercicio 1 (1,75 puntos) repara_imagen


Recibe la matriz de enteros que contiene los pxeles de la imagen, el nmero de filas y de columnas de la imagen, y el vector de enteros calculado en la funcin anterior. Modifica la matriz de la siguiente forma: Para todas las filas de la matriz cuyo contraste sea 0 (lnea defectuosa) se sustituyen todos los valores ( ) y de esa fila por el valor medio de los pxeles de la fila anterior. Se considerar que la fila 0 nunca es defectuosa. La funcin devolver (con return) el nmero de filas defectuosas.
Informtica

19/11/2012

Solucin Ejercicio 1
int repara_imagen(int img[][MAXC], int dif[], int nf, int nc) { int i,j,s,pixmed,nl=0; for(i=1;i<nf;i++) if (dif[i] == 0) { s=0; for(j=0;j<nc;j++) s+=img[i-1][j]; p pixmed=s/nc; ed s/ c; for(j=0;j<nc;j++) img[i][j] = pixmed; nl++; } return nl; }
Informtica

Solucin Ejercicio 1 (0.75 puntos) main

Completa el main para que se realicen las


acciones indicadas.

Informtica

19/11/2012

Solucin Ejercicio 1
int main() { int img[MAXF][MAXC], nf, nc, *dif, err, nl, i; err=lee_imagen(img,&nf,&nc); if (err == -1) return -1; dif = (int *) malloc(nf*sizeof(int)); if (dif == NULL) return -1; contrastexfila(img,dif,nf,nc); nl=repara_imagen(img,dif,nf,nc); printf("Se han reparado %d lneas\n",nl); free(dif); return 0; }
Informtica

Ejercicio 2 (2p)
Escribe una funcin que recibe un vector de caracteres que contiene una lista de destinatarios de correo separados por el carcter ; y completa una matriz de caracteres con un destinatario por fila (sin incluir el ;). La funcin deber retornar el nmero de destinatarios. Como mximo cada direccin de correo no podr superar los 40 caracteres.
Informtica

19/11/2012

Ejercicio 2 (2.5p)
Ejemplo: Ejemplo si el vector con la lista de destinatarios fuese:

Informtica

Solucin Ejercicio 2
int separa(char destinatarios[], char correos[][40]) { int i=0, j=0, k, n; n=strlen(destinatarios); for (k=0;k<n+1;k++) { if (destinatarios[k]!=;) { correos[i][j]=destinatarios[k]; j++; } else { correos[i][j]=\0; i++; j=0; } } return i+1; }
Informtica

19/11/2012

Ejercicio 3 (3p)
En un restaurante se desea controlar los productos alimenticios que tienen almacenados. De cada uno de los productos se mantiene la siguiente informacin informacin: Nombre del producto (cadena de caracteres). Tipo (cadena de caracteres). Forma de conservacin (un carcter, que indica): C: indica que es una conserva. F i di F: indica que es un producto fresco. d t f S: indica que es una conserva que se almacena en fro. Da, mes y ao de compra (enteros).
Informtica

Ejercicio 3 (2.5p)
a) (0,5 puntos) Define la estructura de nombre
alimento que permita almacenar la informacin descrita de un alimento. b) (2,5 puntos) Escribe una funcin listado_alimentos:
A la que se le pase como parmetro: un vector de alimentos, el nmero de alimentos que contiene el vector y un ao. La funcin debe mostrar un listado por pantalla de todos los alimentos cuyo ao de compra coincide con el pasado como parmetro. El listado debe mostrar los alimentos ordenados alfabticamente por tipo. Si dos alimentos tienen el mismo tipo, se ordenan por forma de conservacin (tambin alfabticamente). Se recomienda ordenar todos los alimentos y posteriormente mostrar por pantalla slo los que cumplen las condiciones (ao igual al indicado).
Informtica

19/11/2012

Solucin Ejercicio 3-a #define TRUE 1 #define FALSE 0 struct alimento { char nombre[50], tipo[50], conservacion; int dia, mes, anyo; };
Informtica

Solucin Ejercicio 3-b


void listado_alimentos (struct alimento v[], int n, int anyo) { int i=1, j, ordenado=FALSE; struct alimento aux; while (ordenado==FALSE) { ordenado = TRUE; for (j=0; j<n-i; j++) if ( (strcmp(v[j].tipo,v[j+1].tipo)>0) || (strcmp(v[j].tipo,v[j+1].tipo)==0 && v[j].conservacion>v[j+1].conservacion) ) { aux = v[j]; v[j] = v[j+1]; v[j+1] = aux; ordenado = FALSE; } i++; } for (i=0; i<n; i++) if (v[i].anyo == anyo) printf("%s %s %c %02d/%02d/%d %d\n", v[i].nombre, v[i].tipo, v[i].conservacion, v[i].dia, v[i].mes, v[i].anyo); }
Informtica

10