Pauta Catedra R 2009-2 - Escuela de Ingeniería Informática

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