CERTAMEN 3. IWI131. 2do Sem. 2006. D

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