RolUSM:___________ Nombre:_____________________________________ Paralelo:________ NOTA CERTAMEN 3. IWI­131. 2do Sem. 2006. Duración: 90 minutos. PREGUNTA 1. (30 pts.) Considere el siguiente programa: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. #include <stdio.h> #define PLANETAS 8 struct planeta { char nombre[15]; double masa; double diametro; }; int main(void){ struct planeta p[PLANETAS], P1; FILE *archivoR, *archivoW; int i; char z; archivoR = fopen("lee.txt","r"); archivoW = fopen("escribe.txt", "w"); for(i = 0; i < PLANETAS; i++) fread(&p[i], sizeof(struct planeta), 1, archivoR); /* AQUI VAN LAS INSTRUCCIONES DE LAS PREGUNTAS VAN AQUI */ fclose(archivoR); fclose(archivoW); return 0; } I. En relación a las definiciones del programa, indique si son correctas o incorrectas las siguientes expresio­ nes. Si es correcta, indique que hace, de lo contrario, justifique. Cada expresión es independiente una de otra. C/I Explicación Expresión I No es posible escribir en un archivo que fue a) fwrite(&p[5], sizeof(p[5]), 1, archivoR); abierto como lectura. b) fwrite(&p[8], sizeof(p[8]), 1, archivoW); c) fclose(archivoR); I No existe el elemento p[8] en el arreglo. I No es posible insertar una estructura en el miembro masa., C La estructura se insertará en el archivo archivoW. I Planeta es el nombre de la estructura, no es una variable. C Mostrará el diametro del planeta si la masa es distinta de 0. archivoR = fopen(“lee.txt”, “r”); fread(&p[1].masa, sizeof(p[1]),1, archivoR); d) fwrite(&p[3], sizeof(P1), 1, archivoW); e) scanf(“%s”, planeta.nombre); f) if(p[5].masa) printf(“%lf”, p[5].diametro); (1 Pto. respuesta, 2 ptos.Explicación = 18 ptos) Realizar las siguientes implementaciones: a) En la línea 12 efectúe la siguiente mejora: Si lee.txt no se abrió correctamente terminar el programa, de lo contrario seguir con el curso normal. if( (archivoR = fopen(“lee.txt”, “r”) ) == NULL ) return 0; (3 puntos) b) Imagine que no está seguro de la cantidad de planetas que hay en el archivo (considere que como máximo pueden haber 8 planetas). Reemplace las líneas 15 y 16 por un segmento de código que utilice la función feof . i = 0; while( !feof(archivoR) ){ fread(&p[i++], sizeof(struct planeta), 1, archivoR); } (3 puntos) c) En la línea 11 declare una variable P2 (de tipo estructura planeta) e inicialicela con nombre jupiter, diametro 142.984 km y masa 1.9*1027 kg. (nota: debe ser en una sola instrucción). struct P2 = {“Jupiter”, 142984, 1.9e27} (3 pun- tos) d) En la línea 18, considerando que el volumen de un planeta es 4/3*pi*(diametro/2)3 , muestre por pantalla el nombre de los planentas cuya densidad sea mayor o igual a 1. (densidad = Masa / volumen, considere pi como 3.14) for( i = 0; i < PLANETAS; i++ ){ if( ( p[i].masa / ((double)(4/24) * 3.14 * p[i].diametro * p[i].diametro * p[i].diametro )) >= 1 ) printf(“%s”, p[i].nombre);} (3 pun- tos) Tercer Certamen de Programación – 15 de Noviembre de 2006 1 RolUSM:___________ Nombre:_____________________________________ Paralelo:________ PREGUNTA 2 (30 pts). Se tienen registros de datos atmosféricos colectados por una estación meteorológica duran­ te los 365 días del año. Cada registro contiene: temperatura máxima, temperatura mínima, humedad máxi­ Puntos P2 ma y humedad mínima (tmax, tmin, hmax, hmin). Se pide que usted escriba un programa tomando en cuenta lo siguiente: a) definir adecuadamente constantes, tipos y variables para crear un arreglo de 365 elementos. Cada ele­ mento es una estructura que contiene los datos de un día b) construir una función para leer desde teclado los datos de los 365 días c) construir una función para escribir por pantalla la diferencia entre temperatura máxima y mínima, para cada día del año d) construir una función para escribir por pantalla el promedio de humedad para cada día del año #include<stdio.h> #define dias 365 //letra a 10 puntos struct datos{ float tmax, tmin, hmax, hmin; }; struct datos estacion[dias]; //definicion de funciones void leer(); void escribir(); void promedio(); int main(void){ leer(); escribir(); promedio(); return(0); } // letra b 10 puntos void leer(void) { int i; for(i = 0; i < dias ; i++) { printf("Ingrese la temperatura maxima scanf("%f", &estacion[i].tmax); printf("Ingrese la temperatura minima scanf("%f", &estacion[i].tmin); printf("Ingrese la humedad maxima del scanf("%f", &estacion[i].hmax); printf("Ingrese la humedad minima del scanf("%f", &estacion[i].hmin); } } del dia %d\n", i+1); del dia %d\n", i+1); dia %d\n", i+1); dia %d\n", i+1); //letra c 5 puntos void escribir(void){ int i; for( i = 0 ; i < dias ; i++) { printf("La diferencia de temperatura para el dia %d es: %f\n",i+1,estacion[i].tmax-estacion[i].tmin); } } //letra d 5 puntos void promedio(void) { int i; for( i = 0 ; i < dias ; i++) printf("El promedio de humedad para el dia %d es %f\n", i+1, (estacion[i].hmax+estacion[i].hmin)/2); } Tercer Certamen de Programación – 15 de Noviembre de 2006 2 RolUSM:___________ Nombre:_____________________________________ Paralelo:________ PREGUNTA 3. (40 pts) Los barcos “barco1” y “barco2” están listos para ser cargados con containers. “bar­ Puntos P3 co1” y “barco2” pueden transportar 12000 y 13000 toneladas, y hasta 1000 y 1200 containers respectiva­ mente. “barco1” transporta containers de tipo A y barco2 de tipo B. Los datos de los containers a cargar, es­ tán en el archivo containers.dat, que contiene registros que tienen la siguiente estructura: struct container { int id; char tipo; double peso; }; /* identificador del container */ /* tipo de container, ‘A’ : se carga en barco1 , ‘B’ : se carga en barco2*/ /* peso en toneladas = peso del container + peso del contenido*/ Escriba un programa que haga lo siguiente: a partir de los registros del archivo containers.dat, genere los archivos bar­ co1.dat y barco2.dat, con los registros de los containers que irán en el barco1 y en el barco2, respectivamente. Tercer Certamen de Programación – 15 de Noviembre de 2006 3