Sei sulla pagina 1di 4

Este material, de distribución gratuita, no contiene necesariamente las modificaciones que se hayan incorporado

durante la realización de las evaluaciones.


PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ
ESTUDIOS GENERALES CIENCIAS

LENGUAJE DE PROGRAMACIÓN
3er. Examen
(2do. Período del 2013)
Duración: 3 Horas.
INSTRUCCIONES:
EL ALUMNO NO PUEDE UTILIZAR NI PORTAR MATERIAL DE CONSULTA. TODAS LAS RESPUESTAS DEBEN SER
COLOCADAS EN EL CUADERNILLO, NO COLOCARLAS EN LA HOJA DE PREGUNTAS.

PARTE ELECTIVA (4 puntos):


El objetivo de esta sección es evaluar su nivel de comprensión de un programa escrito en lenguaje C. La calificación
se otorga en base al resultado que usted obtiene. No se tomará en cuenta para la calificación la descripción de los
pasos que realiza el programa. Cada pregunta tiene un puntaje máximo de 2 puntos. Resolver solamente 2 de las
preguntas presentadas. En caso se resuelvan todas las preguntas, no se considerará aquella que tenga la más alta
calificación. Para todos los casos considerar que se han incluido las librerías necesarias.

PREGUNTA 1: (2 puntos)
Indicar qué muestra la computadora al ejecutar la siguiente porción de programa:
int main() {
char x= '\x41';
char x2 = x + 4;
char letras[] = {'J',x2,'T',x,x2+4,'M',x2,'\0'};
*(&x+1) = 0;
char *px2= malloc(2);
*px2 = x2+4; *(px2+1) = 0;
char* p = letras;
char* a[]= {p, " T", px2,"LS", &x};
char j,**q;
q=&a[0];
for(j=0;j<5;j++,q++)
printf("%s",*q);
return 0;
}
PREGUNTA 2: (2 puntos)
Indicar qué muestra la computadora al ejecutar la siguiente porción de programa:
int main() {
int x=65;
char pala[4] = {'B','I','C',x-65};
int* a[3]={&x,"\x41", pala+1};
int j,**q;
q=&a[2];
for(j=3;j>0;--j,q--)
printf("%s\n",*q);
return 0;
}

PREGUNTA 3: (2 puntos)
Implemente en C:
(1 pto.) La función MultMat, que devuelve el resultado de la multiplicación de dos matrices a y b cuadradas de tamaño
N, de acuerdo con la siguiente sintaxis:
double* MultMat(double *a, double *b, int N)
Donde a es la primera matriz, b es la segunda matriz y N es el tamaño de cada matriz.
Página 1 de 4 CONTINÚA
Este material, de distribución gratuita, no contiene necesariamente las modificaciones que se hayan incorporado
durante la realización de las evaluaciones.
(1 pto.) Una función UpperCase que retorne una cadena de texto que es la conversión a mayúscula de la cadena de
texto ingresada en su parámetro, tenga en cuenta que sólo debe convertir a mayúscula las letras del alfabeto, los otros
caracteres se mantienen iguales:
char* UpperCase(char *texto)
Donde texto es la cadena que se desea convertir a mayúscula.

PARTE OBLIGATORIA (16 puntos):

PREGUNTA 4: (10 puntos)


El reciente fallecimiento de Paul Walker, actor principal en la saga de películas “Rápidos y Furiosos” ha causado gran
conmoción en los fanáticos de dichas películas. Por ello, la empresa MOVIEPUCP está realizando jornadas
maratónicas donde se reproducen las 6 películas de dicha saga, para que los fanáticos puedan recordar el espectacular
trabajo realizado por Paul Walker.
La empresa no maneja correctamente la información de dichas películas por lo que se ha contratado a Ud. para que los
ayude a manejar dicha información por medio de alguna estructura en C y le pueda elaborar un programa con un menú
de opciones que les permita administrar dicha información.
Como un primer análisis realizado por Ud. se definió que la mejor estructura para manejar dicha información es listas
enlazadas y para ello define lo siguiente.

typedef struct Taquilla {


char * pais; //Contiene el país de recaudación
float recaudación; //Contiene la recaudación obtenida en ese país
char * fechaEstreno; //Contiene la fecha de estreno de la película en ese país en formato DD/MM/AAAA
} Taquilla;

typedef struct Actores{


char * actor; // Contiene el nombre del actor. Por ejemplo: “Paul Walker”
char * personaje; //Contiene el nombre del personaje que da vida el actor detallado en el campo anterior
// Por ejemplo, para este caso sería: “Brian OConner”
} Actores;

typedef struct PeliculaRapidoyFurioso{


char * nombrePelicula; // Contiene el nombre de la película de la saga rápidos y furiosos
int duracion; // Contiene la duración de la película (en minutos)
Taquilla taquillaPaises[20]; //Contiene un arreglo de Taquillas donde se tiene la información de la
// recaudación obtenida en 20 países.
Actores * arregloActores[5]; // Contiene un puntero a un arreglo de Actores (ver estructura). Los actores
// Siempre son los 5 principales en esa película.
struct ElementoRapidoyFurioso * ptrSiguiente; //Contiene un puntero a la siguiente película
} Pelicula;

typedef struct ListaPeliculas {


Pelicula * primero; //Contiene un puntero a la primera película
Pelicula * ultimo; //Contiene un puntero a la última película
int cantidadPeliculas; //Contiene la cantidad de películas que hay en la lista
} ListaPeliculas;

Este programa, utilizando las estructuras arriba definidas, tendrá las siguientes funcionalidades:

a) (2 puntos) Una función que permita Agregar una Película al final de la lista, dentro de esta función se deberá solicitar al
usuario “TODOS” los datos completos de la película a agregar, esto incluye los actores y taquillas obtenidas. Recuerde
reservar la memoria necesaria para los punteros que utilice y esta función recibe como parámetro únicamente la lista de
películas.
b) (2 puntos) Una función que permita ver el Detalle de una Película en particular, para ello recibirá como parámetros la
lista de películas y una cadena con el nombre de una película y con este nombre buscará e imprimirá la información asociada

Página 2 de 4 CONTINÚA
Este material, de distribución gratuita, no contiene necesariamente las modificaciones que se hayan incorporado
durante la realización de las evaluaciones.
a la película, esto incluye los actores y las taquillas obtenidas en cada país. Asuma que todas las películas tienen nombres
distintos por lo que solo encontrará una película asociada a un nombre.
c) (3 puntos) Una función que permita Ordenar el arreglo de taquillas de una película en particular para ello recibirá
como parámetros la lista de películas, una cadena con el nombre de una película, el campo por el cual se ordenará (se
colocará 1 si es por país, 2 si es por recaudación y 3 si es por fecha de estreno) y la forma como se ordenará (se colocará 1 si
es Ascendente y 2 si es Descendente) y con el nombre buscará la película en la lista de películas y ordenará el arreglo de
taquillas de acuerdo al campo y forma de ordenamiento. Tenga en cuenta que no se pide ordenar la lista de películas, sino el
arreglo de taquillas asociados a una película. Un ejemplo de una invocación a esta función seria:
campo = 1;
forma = 2;
nombrepelícula = “Rapidos y Furiosos 6”;
Ordenar(lista,nombrepelícula,campo,forma)  Esto significa que se ordenará las taquillas de la película Rapidos y Furiosos 6
por país(campo=1) y de manera descendente (forma=2).
d) (1.5 puntos) Una función que permita liberar la memoria de la lista de películas utilizada. Esta función debe recibir
como parámetro la lista de películas y deberá limpiar la memoria ocupada por cada película, así como de los actores y
taquillas. Tenga mucho cuidado de no perder la referencia a los punteros al momento de liberar la memoria.
e) (1.5 puntos) Una función main que permita mostrar un menú de opciones que llame a las funciones anteriores. Tenga
en cuenta que debe tener una opción para salir del programa y que el programa se debe ejecutar hasta que se ingrese esta
opción de salida.
NOTA.- Para esta pregunta puede utilizar la librería string.h

PREGUNTA 5: (6 puntos)
La empresa MOVIEPUCP desea ofrecer su aplicación a dispositivos móviles, por ello que ahora se necesita gestionar
la información de cada película de la saga como una cadena de caracteres (secuencia de char), donde cada elemento de
una película está separado por comas, y le ha pedido a usted que desarrolle un programa en C que permita gestionar la
información de las películas de la saga. Por ello se tiene un arreglo global de 6 punteros al inicio de cada película de la
saga. Según su criterio, defina el contenido máximo de caracteres de cada película, tenga en cuenta que cada carácter
ocupa un byte.
Similar al caso expuesto con anterioridad, el contenido de una película de la saga está conformado por el nombre de la
película, su duración en minutos, cantidad de países a evaluar su taquilla, país, recaudación y fecha de estreno por
cada país, cantidad de actores, nombre y personaje por cada actor, todo lo anterior separados por comas y finaliza con
el carácter fin de cadena ‘\0’, tenga en cuenta que como máximo la cantidad de países a evaluar es 20 y la cantidad
máxima de actores es 5.
Un ejemplo de los datos de una película de la saga es:
“Rápidos y Furiosos 1, 110, 2, EEUU, 1000000, 05/07/2002, Peru, 100000, 10/10/2002, 2, Vin Diesel, Toreto, Paul
Walker, Brian OConner\0”, donde la película Rápidos y Furiosos 1 tiene una duración de 110 minutos, se ha estrenado
en 2 países, el primer país es EEUU con una recaudación de 1 millón de dólares y la fecha de estreno fue el
05/07/2002, el segundo país es Perú, con una recaudación de 100,000 dólares y su fecha de estreno fue el 10/10/2012,
la cantidad de actores es 2, el nombre del primer actor es “Vin Diesel”, su personaje es “Toreto” y el nombre del
segundo actor es “Paul Walker” y su personaje es “Brian OConner”.
Para claridad del programa, definiremos el tipo Pelicula como puntero a la secuencias de char. Y se tendrá variables
globales que indiquen el número de películas de la saga, y el número de bytes usados en total por todas las películas de
la saga, en cada instante dado. Es decir:
typedef char * Pelicula; // Tipo para puntero a una película
Pelicula movies[6]; // Secuencia de punteros a películas
int numeroPeliculas=0; // Numero de películas en memoria
long bytesUsados=0; // Bytes utilizados por las películas

Se le pide implementar las siguientes funciones:


a) (1.5 puntos) int IngresaPelicula(Pelicula nuevaPeli, long bytes)

Página 3 de 4 CONTINÚA
Este material, de distribución gratuita, no contiene necesariamente las modificaciones que se hayan incorporado
durante la realización de las evaluaciones.
Deberá determinar si hay memoria suficiente para una nueva película con longitud recibida en el parámetro bytes. Si
no hubiese suficiente memoria, retorna 0.
Si hay memoria suficiente, solicita un espacio de memoria en donde almacenar la nueva película, y copia byte por byte
toda la secuencia desde el buffer temporal nuevaPeli hasta el área de memoria en donde quedará grabada la
información de la película. Luego actualiza la tabla de punteros a las películas, incrementa numeroPeliculas y
bytesUsados, y retorna 1.
b) (1.5 puntos) void BorraPelicula(int numPeli)
Debido a que por error se puede haber ingresado los datos de una película de manera incorrecta, se deberá poder
eliminar la película que está en la posición numPeli (si existe) de la tabla de punteros a las películas. Deberá desplazar
los siguientes valores en dicha tabla, reducir el número de bytes usados y el número de películas en total, y liberar la
memoria que usaba dicha película.
c) (3.0 puntos) void OrdenarPorFechaEstreno(void)
Deberá reordenar la tabla de punteros a las películas por orden de fecha de estreno. En otras palabras, la tabla de
punteros a las películas terminará conteniendo los mismos punteros a cada película, pero en un distinto orden de
acuerdo con el criterio ascendente de la fecha de estreno. Esta función no modifica ninguna otra variable.

Notas:
• Asuma la inclusión de las librerías necesarias en todos sus programas.
• En cualquier pregunta puede usar la definición de alguna función definida en otra pregunta.

San Miguel, 11 de diciembre de 2013

Página 4 de 4

Potrebbero piacerti anche