Pontificia Universidad de Valparaíso Facultad de Ingeniería Escuela de Ingeniería Informática Fundamentos de Programación – ICI 142 Segundo Semestre 2009 martes 17 de noviembre de 2009 CATEDRA RECUPERATIVA Para la realización del presente certamen se dispondrá de 90 minutos. No se pueden utilizar libros ni apuntes. 1. (30 puntos) El objetivo del ejercicio es diseñar un programa que permita calcular el área total de un terreno llano utilizando el proceso de triangulación basado en el método de Herón. Un terreno se divide en triángulos de los cuales se miden dos lados y el ángulo que forman entre ellos. Con estos datos, es posible calcular el área de este triángulo y el área total del terreno viene dada por la suma del área de todos los triángulos en los que el terreno fue dividido. El proceso para calcular el área de un triángulo dados dos lados (l1 y l2) y el ángulo α que forman entre ellos es el siguiente: 1. Calcular la longitud del tercer lado: l3 = l12 + l22 − 2l1l2 cos α 2. Calcular el semiperímetro del triángulo: l +l +l s= 1 2 3 2 3. Calcular el área del triángulo: A = s( s − l1 )( s − l2 )( s − l3 ) Por ejemplo, sea el terreno de la figura siguiente, el área de cada triángulo y el área total del terreno serán las que se muestran en la siguiente tabla:: 5.6 m 72º 4.7 m 35º 37º T1 T3 7.1 m 8.9 m T2 T1 T2 T3 Total 19.9 m2 19 m2 11.4 m2 50.3 m2 Requerimientos: Se deben implementar la siguientes funciones: una función que leerá los datos que introducirá el usuario una función que calcula el área de UN triángulo y devuelve este valor una función que calcula e imprime el área total del terreno No está permitido el uso de variables globales. Se debe realizar las validaciones de entrada de datos necesarias. El número de triángulos no se conoce a priori, es decir, el programa debe preguntar al usuario cada vez que haya terminado de introducir los datos de un triángulo, si quiere introducir más. José Miguel Rubio León – Ing. Civil en Informática, P.U.C.V. Pontificia Universidad de Valparaíso Facultad de Ingeniería Escuela de Ingeniería Informática Fundamentos de Programación – ICI 142 Segundo Semestre 2009 martes 17 de noviembre de 2009 Notas: Para realizar los cálculos, se pueden utilizar las funciones definidas en la biblioteca math.h: La constante π está definida con el nombre M_PI. La función sqrt (valor) recibe un valor y devuelve el resultado de calcular la raíz cuadrada. La función pow (base, exponente) calcula base elevado a exponente. La función cos (angulo_radianes) calcula el coseno de un ángulo en radianes. /************************************* *#include <stdio.h> #include <math.h> #define N 10 struct triangulo { char nombre[20]; float lado1; float lado2; float angulo; }; float heron (struct triangulo t) { float lado3, area, semiper, inter, angulo; angulo = t.angulo*M_PI/180.0; inter = t.lado1*t.lado1 + t.lado2*t.lado2 2*t.lado1*t.lado2*cos(angulo); lado3= sqrt(inter); semiper = (t.lado1 + t.lado2 + lado3)/2; inter = semiper*(semiper-t.lado1)*(semiper-t.lado2)*(semiperlado3); area = sqrt(inter); return (area); } void area_total (struct triangulo t[], int num) { float area=0; int i; for (i=0; i<num; i++) { area = area + heron(t[i]); } printf ("Area=%f\n", area); } int leer_datos (struct triangulo t[]) { int i=0; float x; char resp; José Miguel Rubio León – Ing. Civil en Informática, P.U.C.V. Pontificia Universidad de Valparaíso Facultad de Ingeniería Escuela de Ingeniería Informática Fundamentos de Programación – ICI 142 Segundo Semestre 2009 martes 17 de noviembre de 2009 do { printf ("Nombre:"); fflush(stdin); gets (t[i].nombre); printf ("Lado 1:"); scanf ("%f", &x); t[i].lado1=x; printf ("Lado 2:"); scanf ("%f", &x); t[i].lado2=x; printf ("Angulo:"); scanf ("%f", &x); t[i].angulo=x; do { printf ("Mas triangulos? (s/n):"); fflush(stdin); scanf ("%c", &resp); } while (resp!='S' && resp!='s' && resp!='n' && resp!='N'); i++; } while (resp=='s' || resp=='S'); return i; } void main() { struct triangulo tri[N]; int num_tri; num_tri=leer_datos(tri); area_total(tri, num_tri); } 2. Desarrollar un programa que cargue en memoria una lista simplemente enlazada con información de los cursos de Informática que se realizan en la PUCV. La información de cada curso se compone de un título del curso, un código numérico entero de 3 cifras y el número de créditos. Se debe implementar el proceso de carga de datos en la lista y su eliminación y además, una vez cargados los datos en la lista, se debe permitir realizar consultas sucesivas del número de créditos de un curso a través de su código, las consultas pueden terminar al introducir un código 0. (30 puntos) /* Gestion de una lista enlazada de Cursos con titulo, codigo y creditos */ // Directivas del precompilador #include <conio.h> #include <stdio.h> #include <string.h> // Programa principal void main() { José Miguel Rubio León – Ing. Civil en Informática, P.U.C.V. Pontificia Universidad de Valparaíso Facultad de Ingeniería Escuela de Ingeniería Informática Fundamentos de Programación – ICI 142 Segundo Semestre 2009 martes 17 de noviembre de 2009 int i; // Estructura de los elementos de la lista typedef struct curso { char titulo[20]; int codigo; int creditos; struct curso *siguiente; }CURSO; CURSO *inicio; // Puntero al comienzo de la lista CURSO *actual; // Puntero al elemento actual CURSO *aux; // Puntero auxiliar char seguir; int xcodigo; // Inicializacion de la lista inicio = NULL; i=0; printf("\n\nDesea introducir datos de un curso...(s/n): "); scanf("%c",&seguir); // Bucle de creacion de los elementos de la lista while (seguir=='s' || seguir=='S') { system ("cls"); // Peticion de memoria dinámica para el nuevo curso actual = (CURSO *) malloc (sizeof(CURSO)); if(i==0) inicio=actual; else aux->siguiente=actual; // Lectura de los datos de un curso i++; fflush(stdin); printf("\n\nIntroduce el titulo del curso %2d: ", i); gets(actual->titulo); printf("\nIntroduce el codigo (3 cifras): "); scanf("%d", &actual->codigo); printf("\nIntroduce el número de creditos: "); scanf("%f", &actual->creditos); actual->siguiente=NULL; aux=actual; printf("\n\nDesea introducir datos de algun curso mas...(s/n): "); fflush(stdin); scanf("%c",&seguir); } // Consulta de creditos por el codigo del curso printf ("\n\n\nBusqueda de creditos de cursos por su codigo:\n\n\n"); José Miguel Rubio León – Ing. Civil en Informática, P.U.C.V. Pontificia Universidad de Valparaíso Facultad de Ingeniería Escuela de Ingeniería Informática Fundamentos de Programación – ICI 142 Segundo Semestre 2009 martes 17 de noviembre de 2009 // Lectura del primer codigo a consultar do { printf (“Introducir el codigo del curso ( 0 para terminar )...”); scanf (“%d”, &xcodigo); } while (xcodigo < 0 || xcodigo > 999); // Bucle de repeticion de consultas while ( xcodigo != 0) { // Busqueda de creditos del curso actual = inicio; while (actual->siguiente != NULL && actual->codigo != xcodigo) actual = actual->siguiente; if (actual->codigo == xcodigo) printf ("\nEl numero de creditos del curso es de %d creditos\n\n", actual->creditos); else printf ("\nEl curso no existe en la lista\n\n"); // Lectura del segundo y sucesivos codigos a consultar do { printf (“Introducir el codigo del curso ( 0 para terminar )...”); scanf (“%d”, &xcodigo); } while (xcodigo < 0 || xcodigo > 999); } // Eliminacion de los elementos de la lista actual=inicio; printf("\n\n*** Eliminando elementos de la lista ***\n\n"); i=0; while (actual!=NULL) { i++; aux=actual; actual=actual->siguiente; free(aux); printf("\n\nEliminado elemento %d...", i); getch(); } system ("cls"); printf("\n\n *** FIN DEL PROGRAMA ***\n\n"); } José Miguel Rubio León – Ing. Civil en Informática, P.U.C.V.