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 3 cuestiones, de los cuales habrá que realizar correctamente al menos 1 para aprobar la práctica. Procedimiento Cada cuestión consta de un enunciado y de una plantilla en lenguaje C. El alumno usará dicha plantilla para verificar el correcto funcionamiento de algoritmo que haya diseñado y su implementación en lenguaje C. En la plantilla se indica dónde debe el alumno insertar su código. Este mismo código deberá copiarse y enviarse a través del servidor de docencia teniendo especial cuidado de seleccionar correctamente la línea de inserción en función del ejercicio que esté resolviendo. Entrega de la práctica a través del servidor Los resultados de todas la práctica se entregará usando Goodle GMS. Para el correcto funcionamiento de las siguientes páginas su navegador debe permitir cookies y la ejecución de javascript. Goodle 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 de Goodle. Hay que copiar el código una vez se haya comprobado el correcto funcionamiento del programa. IMPORTANTE: • Cada ejercicio se debe resolver utilizando únicamente las variables definidas en el molde que se proporciona • Debe respetar la estructura que se le propone sin cambiar nombres de variables ni omitir ninguna línea de código. 1 Cuestión 710 Se desea diseñar un programa que sume dos matrices 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 dadas dos estructuras tipo struct matriz que contienen las dos matrices a sumar, devuelva en otra estructura tipo struct matriz, la suma de ambas, si es posible. En caso de no ser posible la suma, la función debe devolver un valor 0 en el campo fil y col de la matriz resultante, para indicar que no se ha podido realizar la suma. Prototipo struct matriz suma_mat(struct matriz, struct matriz); Programa de ejemplo #include <stdio.h> struct matriz { float A[100][100]; int fil; int col; }; struct matriz suma_mat(struct matriz, struct matriz); void escribe_matriz(struct matriz); main(void) { struct matriz A={{{1,2,3},{4,5,6}},2,3}; struct matriz B={{{3,2,1},{2,1,0}},2,3}; struct matriz R; R=suma_mat(A,B); if ((R.fil==0) && (R.col==0)) printf("\n No se pueden multiplicar"); else escribe_matriz(R); getch(); } 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 suma_mat(struct matriz a, struct matriz b) { /*INICIO codigo de alumno*/ /*FIN codigo de alumno*/ } 2 Cuestión 704 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]; int anio; struct tiempo duracion; }; struct tiempo { int hor; int min; int seg; }; El número de DVDs del videoclub se almacena en la variable entera numdvd. Ejemplo de lista: 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 busque en la lista todas las películas de un determinado año. La función recibe la dirección de inicio del vector de estructuras, el número de DVDs del videoclub, el año y la dirección de comienzo de un vector de enteros en los que almacenar los índices de las películas buscadas. Debe devolver el número de películas del videoclub del año indicado. Además, debe almacenar en las primeras componentes del vector de enteros los índices de estas películas dentro de la lista del videoclub. Prototipo int buscaanio(struct dvd* lista, int numdvd, int anio, int * pos); Programa de ejemplo #include <stdio.h> #include <stdlib.h> #include <string.h> struct tiempo { int hor; int min; int seg; }; struct dvd { char titulo[100]; char genero[100]; int anio; struct tiempo duracion; }; int buscaanio(struct dvd* lista, int numdvd, int anio, int * pos); 3 void main(void) { struct dvd lista[1000]; int numdvd; int numanio; int pos[1000]; int i,j; strcpy(lista[0].titulo,"Braveheart"); strcpy(lista[0].genero,"Drama historico"); lista[0].anio=1995; lista[0].duracion.hor=2; lista[0].duracion.min=37; lista[0].duracion.seg=0; strcpy(lista[1].titulo,"Forest Gump"); strcpy(lista[1].genero,"Drama"); lista[1].anio=1994; lista[1].duracion.hor=2; lista[1].duracion.min=2; lista[1].duracion.seg=0; strcpy(lista[2].titulo,"La lista de Schindler"); strcpy(lista[2].genero,"Drama y suspense"); lista[2].anio=1993; lista[2].duracion.hor=2; lista[2].duracion.min=55; lista[2].duracion.seg=0; numdvd = 3; numanio = buscaanio(lista,numdvd,1993,pos); printf("\nLista de DVDs del videoclub de 1993:\n"); for(j=0;j<numanio;j++) { i = pos[j]; printf("[%d] %-30s %-20s %-5d %dh%d'%d''\n",i,lista[i].titulo,lista[i].genero,lista[i].anio,lista[i].dura cion.hor,lista[i].duracion.min,lista[i].duracion.seg); } getch(); } 4 Ejercicio 717 Se desea diseñar un programa que divida dos polinomios. El tipo de estructura que almacena un polinomio viene dado por: struct polinomio { int grado; float coef[101]; } ; donde en la posición 0 del vector coef se almacena el coeficiente del término independiente, en la posición 1 el coeficiente del grado 1, y así sucesivamente. Diseñar una función que dadas dos estructuras tipo struct polinomio que contienen los dos polinomios a dividir, devuelva en otras dos estructuras tipo struct polinomio, el cociente y el resto de la división de ambos. Nota: Puede suponer que el polinomio divisor no tiene ningún coeficiente nulo. Nota: Ayúdese de funciones auxiliares que multipliquen y resten polinomios. Ejemplo: Prototipo void div_pol(struct polinomio p1, struct polinomio p2, struct polinomio * pcociente, struct polinomio * presto); Programa de ejemplo #include <stdio.h> struct polinomio { int grado; float coef[101]; } ; void div_pol(struct polinomio, struct polinomio, struct polinomio *, struct polinomio *); void escribe_pol(struct polinomio); 5 main(void) { struct polinomio A,B,C,R; int i; printf("Introduce grado del primer polinomio (<=100)\n"); scanf("%d",&(A.grado)); for(i=A.grado;i>=0;i--) { printf("\n Coeficiente x^%d: ",i); scanf("%f",&A.coef[i]); } printf("Introduce grado del segundo polinomio (<=100)\n"); scanf("%d",&(B.grado)); for(i=B.grado;i>=0;i--) { printf("\n Coeficiente x^%d: ",i); scanf("%f",&B.coef[i]); } div_pol(A,B,&C,&R); printf("\n Polinomio del cociente"); escribe_pol(C); printf("\n Polinomio del resto"); escribe_pol(R); getch(); } void escribe_pol (struct polinomio p) { int i; for(i=p.grado;i>=0;i--) printf("\nCoeficiente grado %d es %f",i, p.coef[i]); } void div_pol(struct polinomio a, struct polinomio b, struct polinomio *c, struct polinomio *r) { /*************INICIO CÓDIGO DE ALUMNO*****************/ /***************FIN CÓDIGO DE ALUMNO******************/ } 6