Práctica 7c: Uso de estructuras en C. Objetivos En esta práctica el objetivo principal es el de poner en práctica los principios básicos del uso de estructuras y librerías de funciones en C. Evaluación La práctica consta de tres cuestiones, de los cuales habrá que realizar correctamente al menos una para aprobar la práctica. Procedimiento En cada cuestión se pide la definición de una función de la cual se proporciona el prototipo y una descripción de lo que debe realizar. Adicionalmente en algunas cuestiones se proporciona un programa de ejemplo con llamadas a esa función para poder comprobar el correcto funcionamiento de la misma. Entrega de la práctica a través del servidor Los resultados de todas la práctica se entregará usando el Servidor de Docencia. Para el correcto funcionamiento de las siguientes páginas su navegador debe permitir cookies y la ejecución de javascript. El servidor de docencia se encuentra situado en la siguiente dirección: http://bono.us.es/sdocencia/ La entrega de la práctica consiste en copiar el código desarrollador en cada cuestión en el cuadro de respuestas correspondiente del Servidor de Docencia. Hay que copiar el código una vez se haya comprobado el correcto funcionamiento del programa. IMPORTANTE: Cada ejercicio se debe resolver utilizando el prototipo de la función pedida. No está permitido el uso de lápices de memoria ni acceder a páginas web, en particular al correo electrónico. Está permitido crear y utilizar funciones auxiliares para resolver un ejercicio. Para poder entregar correctamente una cuestión que use funciones adicionales, hay que definir el prototipo de la función de forma local en la función que la utiliza y proporcionar su definición en la respuesta. 1
Cuestión 711 Se desea diseñar un programa que calcule la traspuesta de una matriz, cuyo número de filas y columnas tendrán un valor menor o igual que 100. Se definen los siguientes tipos de datos para realizar este programa: struct matriz float A[100][100]; int fil; int col; ; Diseñar una función que dada una estructura tipo struct matriz que contiene la matriz a la cual se quiere calcular su traspuesta, devuelva en otra estructura tipo struct matriz, la matriz resultante. Prototipo: struct matriz traspu_mat(struct matriz); #include <stdio.h> struct matriz float A[100][100]; int fil; int col; ; struct matriz traspu_mat(struct matriz); void escribe_matriz(struct matriz); main(void) struct matriz A=1,2,3,4,5,6,2,3; struct matriz R; R=traspu_mat(A); escribe_matriz(r); void escribe_matriz (struct matriz a) int i,j; for(i=0;i<a.fil;i++) printf("\n"); for(j=0;j<a.col;j++) printf("%f \t", a.a[i][j]); struct matriz traspu_mat(struct matriz a) /*************INICIO CÓDIGO DE ALUMNO*****************/ /***************FIN CÓDIGO DE ALUMNO******************/ 2
Cuestión 705 Programe una función que permita calcular la diferencia entre dos instantes de tiempo correspondientes a un mismo día. Cada instante de tiempo está expresado en horas, minutos y segundos, y se almacenan en estructuras tiempo. La diferencia se calculará entre el primer parámetro y el segundo con su signo correspondiente. struct tiempo ; Ejemplo: Si la función recibe como primer parámetro la estructura que codifica el instante 14 h 25 min 16 seg y como segundo parámetro la estructura que codifica la hora 6 h 20 min 46 seg, la función devolverá una estructura conteniendo 8 h 4 min 30 seg. Si por el contrario la función recibe como primer parámetro la estructura que codifica el instante 14 h 25 min 16 seg y como segundo parámetro la estructura que codifica la hora 14 h 30 min 46 seg, la función devolverá una estructura conteniendo 0 h - 5 min -30 seg. Prototipo struct tiempo dif(struct tiempo A, struct tiempo B); void main(void) struct tiempo A1=14,25,16, B1=6,20,46; struct tiempo A2=14,25,16, B2=14,30,46; struct tiempo A3=1,13,45, B3=8,37,03; struct tiempo A4=23,54,59, B4=6,25,8; struct tiempo R1,R2,R3,R4; R1=dif(A1,B1); R2=dif(A2,B2); R3=dif(A3,B3); R4=dif(A4,B4); seg\n",a1.hor,a1.min,a1.seg,b1.hor,b1.min,b1.seg,r1.hor,r1.min,r1.seg); seg\n",a2.hor,a2.min,a2.seg,b2.hor,b2.min,b2.seg,r2.hor,r2.min,r2.seg); seg\n",a3.hor,a3.min,a3.seg,b3.hor,b3.min,b3.seg,r3.hor,r3.min,r3.seg); seg\n",a4.hor,a4.min,a4.seg,b4.hor,b4.min,b4.seg,r4.hor,r4.min,r4.seg); 3
Cuestión 701 Se desea diseñar un programa para hacer una lista con todas las películas en DVD de un videoclub. Para almacenar toda la información de las películas (título, género, año y duración), se ha pensado en utilizar un vector de estructuras, en el que cada elemento tiene la información de una película. El número de películas del videoclub puede cambiar, pero nunca será mayor de 1000, por lo que se utilizará un vector de dimensión 1000. Se definen los siguientes tipos de datos para realizar este programa: struct dvd char titulo[100]; char genero[100]; struct tiempo duracion; ; struct tiempo ; El número de DVDs del videoclub se almacena en la variable entera numdvd. Ejemplo de lista ordenada (las más modernas al inicio): Braveheart, Drama histórico, 1995, 2h37 00 Forest Gump, Drama, 1994, 2h2 00 La lista de Schindler, Drama y suspense, 1993, 2h55 00 Diseñar una función que dada la información de una película la almacene en la lista de forma ordenada (las más modernas al inicio) según el año. La función recibe la dirección de inicio del vector de estructuras, el número de DVDs del videoclub y el título, género, año y duración de la película (en horas, minutos y segundos). Debe devolver el nuevo número de DVDs del videoclub. Si el videoclub ya tenía 1000 películas, la función debe devolver -1 para indicar que no se ha podido almacenar. La lista original se supone que está ordenada. Prototipo int nuevodvdorden(struct dvd* lista, int numdvd, char* titulo, char* genero, int anio, int hor, int min, int seg); #include <stdio.h> #include <stdlib.h> #include <string.h> struct tiempo ; struct dvd char titulo[100]; char genero[100]; struct tiempo duracion; ; int nuevodvdorden(struct dvd* lista, int numdvd, char* titulo, char* genero, int anio, int hor, int min, int seg); 4
void main(void) struct dvd lista[1000]; int numdvd = 0; char tit[100]; char gen[100]; int continua; int i; printf("nuevo dvd? 1 SI, 0 NO\n"); scanf("%d",&continua); while(continua) printf("introduzca titulo: "); scanf("%s",tit); printf("introduzca genero: "); scanf("%s",gen); printf("introduzca anio: "); scanf("%d",&anio); printf("introduzca horas: "); scanf("%d",&hor); printf("introduzca min: "); scanf("%d",&min); printf("introduzca seg: "); scanf("%d",&seg); numdvd = nuevodvdorden(lista,numdvd,tit,gen,anio,hor,min,seg); printf(" Nuevo dvd? 1 SI, 0 NO\n"); scanf("%d",&continua); printf("lista de DVDs del videoclub:\n"); for(i=0;i<numdvd;i++) printf("%-20s %-20s %-5d %dh%d'%d''\n",lista[i].titulo,lista[i].genero,lista[i].anio,lista[i].duraci on.hor,lista[i].duracion.min,lista[i].duracion.seg); Nota: Al usar scanf con el argumento %s para leer el título y el género, sólo se podran leer títulos y género que no contengan espacios. 5