Você está na página 1de 10

rea de Ingeniera Telemtica Fundamentos de la Programacin

Primer Parcial (12-02-2005)

Apellidos: _____________________________________________ Nombre: _________________

Aclaraciones (aplicables a todo el examen)

No comience a responder el examen hasta que haya ledo completamente los enunciados. Puede responder a lpiz, bolgrafo o cualquier otro medio de escritura. Slo se recogern las hojas correspondientes a los enunciados. Por tanto debe responder cada una de las preguntas en los huecos dejados al efecto. Para evitar tachaduras, haga los borradores necesarios en hoja aparte, y rellene los huecos nicamente cuando est completamente seguro de lo que va a poner.

Las variables de tipo long int se utilizan para almacenar grandes cantidades, Por qu no utilizamos siempre este tipo de variables en lugar de variables tipo int?
Una variable de tipo long int consume ms memoria RAM que una variable, ms pequea, de tipo int. En pequeos programas hacer este tipo de cosas no supone un gran problema, pero conforme el programa es mayor deberamos ser ms cuidadosos con el consumo de memoria, intentando lograr una programacin eficiente.

Cuestiones (2 puntos)

Qu ocurre si asignamos un nmero decimal (con decimales) a una variable de tipo int (entera)? Ponga un ejemplo suponiendo que el nmero decimal es 3.14.
Podemos asignar un nmero con parte decimal a una variable de tipo int. El valor asignado tendr la parte decimal truncada. Por ejemplo, si asignamos el valor 3.14 a una variable de tipo int llamada pi, sta slo contendr la parte entera: 3, el .14 ser eliminado.

Qu ocurre si asignamos una cantidad a una variable cuyo tipo no es lo suficientemente grande para almacenarla? Ponga un ejemplo (Consejo: utilice tipos de rango muy pequeo).
Muchos compiladores permiten realizar este tipo de actos sin sealizarlos con un error. La cantidad almacenada es mal interpretada y as el resultado no es correcto. Por ejemplo, si asignamos la cantidad 128 a un signed char lo que verdaderamente estamos almacenando es la cantidad -128.

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

Qu ocurre si asignamos una cantidad negativa a una variable de tipo unsigned? Ponga un ejemplo.
Como la anterior respuesta indica, el compilador no sealizar este tipo de cosas con error. El compilador interpretar mal la asignacin, almacenando una cantidad incorrecta. Por ejemplo, si asignamos -1 a una variable de tipo unsigned int, suponiendo que sta tuviera 2 bytes de longitud, el compilador almacenara el valor 65535.

Sabemos que esta frase es falsa: el tipo de datos int ocupa siempre 4 octetos Por qu?
Porque los tipos de datos dependen tanto del compilador como de la arquitectura (tipo de mquina) donde el programa est siendo compilado. Por ejemplo, normalmente el tipo de datos int suele tener la misma cantidad de bytes que el tamao de palabra de la mquina donde est siendo utilizado. As, en arquitecturas de 16 bits el tipo de datos int dispondr de 2 octetos, en arquitecturas de 32 bits dispondr de 4 octetos, etc...

Cmo podemos saber el nmero de bytes que ocupan los diferentes tipos de datos? Explquelo y ponga un ejemplo (con slo una sentencia con el uso correcto es suficiente).

El lenguaje de programacin C dispone de un operador (palabra reservada) sizeof() que puede ser utilizado para obtener los diferentes tamaos, en bytes, de los tipos de datos. El siguiente programa es un claro ejemplo de esto (una sola sentencia printf es suficiente como ejemplo):
#include <stdio.h> int main(void) { printf( "\nUn char printf( "\nUn int printf( "\nUn double return 0; }

tiene %d bytes", sizeof( char )); tiene %d bytes", sizeof( int )); tiene %d bytes", sizeof( double ));

Cmo lograra que su programa fuera lo ms independiente posible de los tipos de datos utilizados, es decir, que con un nico cambio en su cdigo fuente todo el programa quedara adaptado? Explquelo y ponga un ejemplo escribiendo la sentencia que modificara.
Cuando declaramos las distintas variables que contendrn los datos de nuestro programa solemos utilizar sentencias del siguiente tipo: int variable = valor; Si en una determinada plataforma int tiene 2 bytes y en otra tiene 4 bytes, est claro que las cantidades que se pueden almacenar en dicha variable son diferentes segn la plataforma. Esto se corrige haciendo uso de la palabra clave typedef. As, el programa que declaraba variables tipo int puede ser recodificado de la siguiente manera: typedef int entero; // asociacin int<--->entero entero variable = valor; Y slo habr que redefinir la asociacin int<--->entero para cambiar los tipos de todas las variables declaradas como entero. Adaptamos la asociacin segn arquitectura.

rea de Ingeniera Telemtica Fundamentos de la Programacin


Primer Parcial (12-02-2005)

Apellidos: _____________________________________________ Nombre: _________________

Problema 1 (4 puntos)
Se desea realizar un programa para procesar imgenes mdicas tridimensionales. Una imagen puede almacenarse en la memoria como una secuencia (tabla unidimensional) de estructuras llamadas pixels. Estos pixels son elementos de informacin con los campos de informacin: x, y, z y color, todos de tipo entero. Se pide: Codifique aqu la definicin del nuevo tipo de datos llamado PIXEL que tenga los campos anteriormente mencionados: typedef struct { int x; int y; int z; int color; } PIXEL ;

El nmero de elementos de la tabla donde se almacena una imagen depender del nmero de puntos de dicha imagen. Codifique la funcin crea_imagen que reserva memoria suficiente para almacenar una imagen de un tamao determinado pasado como parmetro por valor y devuelve la direccin de memoria donde se ha creado o NULL si no ha sido posible su creacin: PIXEL * crea_imagen (int numpixels) { PIXEL *imagen = NULL; imagen = (PIXEL *)malloc(numpixels*sizeof(PIXEL)); return (imagen); }

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

A continuacin se pide realizar una funcin llamada dis_euclidea que calcule la distancia1 entre dos puntos de la imagen pasados por valor. La funcin recibe por valor los dos puntos (pixels) y devuelve un double correspondiente a la distancia existente entre ellos. Para ello se puede utilizar la funcin sqrt (que devuelve la raz cuadrada de su argumento) de la librera math.h cuyo prototipo es : double sqrt (double x). /*calcula la distancia entre dos puntos*/ double dis_euclidea(PIXEL a, PIXEL b) { double x,y,z,res; x = (a.x b.x)*(a.x b.x); y = (a.y b.y)*(a.y b.y); z = (a.z b.z)*(a.z b.z); res = sqrt(x+y+z); return (res); }

Realice una funcin que, dentro de una imagen de tamao numpix, devuelva el color del pixel cuyas coordenadas son x,y,z. La funcin debe devolver -1 si no encuentra el pixel. /*devuelve el color del pixel seleccionado*/ int colorpixel(PIXEL imagen[],int numpix, int x,int y,int z) { int col = -1; int i = 0; for (i = 0; i<numpix && col == -1; i++) if(imagen[i].x == x && imagen[i].y==y && imagen[i].z == z) col = imagen[i].color; } return (col);

1 La distancia entre los puntos A(ax,ay,az) y B(bx,by,bz) es:

ax bx

ay by

az bz

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

Finalmente, realice una funcin que calcule el mximo (el punto de mayor valor en su coordenada z) de una imagen pasada como parmetro (tabla de pxeles y su dimensin). La funcin devuelve un valor de tipo PIXEL cuya coordenada z es la mxima de la imagen pasada como parmetro. Si hay varios puntos mximos, devuelve cualquiera de ellos. /*busca el punto de mayor coordenada z*/ PIXEL maximo(PIXEL imagen[],int numpixel) { int max = imagen[0].z; int i = 0; int ptomx = 0; for (i = 1; i< numpixel ; i++) if(imagen[i].z > max) { max = imagen[i].z; ptomx = i; } return(imagen[ptomx]);

Como ayuda, se muestra un programa principal que maneja las funciones que se han pedido. (no es necesario rellenar nada en esta funcin principal).
#include<stdio.h> #include<math.h> #include<stdlib.h> /* aqui iria el tipo de usuario (PIXEL) que se ha pedido*/ /*declaracin de las funciones */ PIXEL * crea_imagen (int numpixels); double dis_euclidea(PIXEL a, PIXEL b); PIXEL maximo(PIXEL imagen[],int numpixel); int colorpixel(PIXEL imagen[],int numpix, int x,int y,int z); int main() { PIXEL *imag=NULL; PIXEL p; int i=0; int numpx=0; printf(introduzca el numero de pixels de la imagen); scanf(%d,&numpx); imag = (PIXEL *)creaimagen(numpx); if(imag != NULL){ /*ahora se supone que se rellena la tabla de puntos*/

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

printf(la distancia entre el primer y ultimo punto es\n); printf(%lf,dis_euclidea(imag[0],imag[numpx-1]); printf(el punto de mayor coord. z es \n); p = maximo(imag, numpx); printf(x=%d,y=%d,z=%d\n,p.x , p.y, p.z); printf(el color del punto (1,1,1) es); i= colorpixel(imag, numpx,1,1,1); printf(%d,i); free(imag); } return 0; }

rea de Ingeniera Telemtica Fundamentos de la Programacin


Primer Parcial (12-02-2005)

Apellidos: _____________________________________________ Nombre: _________________

Problema 2 (4 puntos)
Se desea informatizar el sistema de prstamo de una biblioteca. Actualmente, se dispone de una serie de fichas asociadas a cada uno de los libros de la biblioteca. Cada libro de la biblioteca tendr una nica ficha y cada una de las fichas contiene los siguientes datos: Cdigo numrico del libro (valor entero). Nombre del libro (mximo 30 caracteres). Tipo de libro. Existen varios tipos de libro segn la temtica: QUMICA, FSICA, MATEMTICAS, DIBUJO y PROGRAMACIN. Estado del libro, que puede ser ALQUILADO o DISPONIBLE. Para poder trabajar de forma conjunta con todas las fichas de la biblioteca se utilizar una tabla de fichas que llamaremos tabla de MAX elementos. En caso de que una ficha no est asociada a un libro deber tener un cdigo numrico del libro no vlido que llamaremos NOVALIDO. Puede suponer que a la hora de crear la tabla todas las fichas de la misma contienen el cdigo numrico NOVALIDO. Las constantes y tipos necesarias estn definidas en el fichero constantes.h:
#define MAX 100 typedef #define #define #define #define #define #define unsigned int NOVALIDO FISICA QUIMICA MATEMATICAS DIBUJO PROGRAMACION TIPOLIBRO; 0 1 2 3 4 5

typedef unsigned int ESTADOLIBRO; #define ALQUILADO 0 #define DISPONIBLE 1 struct ficha { int char TIPOLIBRO ESTADOLIBRO };

codigo; nombre[31]; tipo; estado;

Igualmente se dispondr de unas funciones bsicas que estn definidas en el fichero funciones.c (que no tendr que desarrollar) y declaradas en el fichero funciones.h:
// Funcin que inicializa una ficha: // plibro: puntero a la ficha que deseamos inicializar void inicializaLibro(struct ficha * plibro); // Funcin que cambia el estado de una ficha // plibro: puntero a la ficha que deseamos modificar // nuevoEstado: nuevo estado del libro. Debe ser ALQUILADO o DISPONIBLE int cambiarEstado(struct ficha * plibro, ESTADOLIBRO nuevoEstado);

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

Se pide: 1. Cree una funcin que imprima todos los datos de una sola ficha pasada como parmetro. En caso de que la ficha no est asociada a ningn libro, deber imprimir en pantalla el mensaje Ficha Vaca:
void imprimeLibro ( struct ficha libro ) { //Imprime lo campos del libro pasado como parametro. //Se imprime solo si el codigo es distinto de NOVALIDO if (libro.codigo!=NOVALIDO) { printf ("Nombre: %s\n", libro.nombre); printf ("Codigo: %d\n", libro.codigo); printf ("Tipo (1=FISICA, 2=QUIMICA, 3=MATEMATICAS, 4=DIBUJO, 5=PROGRAMACION) %d\n", libro.tipo); : printf ("Estado (0=ALQUILADO, 1=DISPONIBLE): %d\n", libro.estado); } else { printf ("Ficha Vacia\n"); } }

2. Como en cualquier otra biblioteca es necesario mantener unas estadsticas. Deber crear una funcin que cuente el nmero de libros alquilados de la tabla. El resultado deber se devuelto por la funcin. La funcin debe ser vlida independientemente del tamao de la tabla de fichas.
int cuentaAlquilados (struct ficha * bd, int tam) { //Funcion que calcula el numero de libros que estan alquilados //de la tabla pasada como parametro int i = 0; int count=0; //es necesario que se inicialice a cero for (i=0; i<tam; i++) { if ((bd[i].estado == ALQUILADO) && (bd[i].codigo == DISPONIBLE)) count ++; } return count; }

3. Queremos facilitar al usuario la gestin de la tabla. Para ello se crear un men con las diferentes opciones. Debe crear una funcin que muestre el men y capture la opcin elegida. La funcin debe devolver la opcin introducida por el usuario. En caso de que se introduzca una opcin no vlida debe mostrar nuevamente el men hasta que se introduzca una opcin correcta. Rellene los huecos en el siguiente cdigo:
int muestraMenu ( ) { int opcion; do { printf ("MENU:\n"); printf (" 1- Modificar una ficha\n"); printf (" 2- Mostrar el contenido de una ficha\n"); printf (" 3- Mostrar el numero de libros alquilados\n"); printf (" 4- Alquiler de un libro\n"); printf (" 5- Devolucin de un libro\n"); printf (" 6- Salir\n"); printf (" Elija la opcion que desee: "); scanf ("%d", &opcion); } while ((opcion < 1) || (opcion>6)); return opcion; }

Fundamentos de la Programacin

Primer Parcial (12-02-2005)

4. Ya slo queda definir el fichero fuente de nuestro programa. La funcin main debe mostrar el men anterior y llamar a las funciones necesarias para llevar a cabo la funcin elegida. Se facilita una plantilla que deber rellenar. No es necesario que reescriba cdigo. Si necesita insertar el cdigo de otra pregunta (aun no habindola completado) slo debe indicar el nmero de pregunta en el lugar donde pondra dicho cdigo.
// Incluir funciones de librera necesarias #include <stdio.h> #include "funciones.h" #include "constantes.h"

// Declaracin de funciones necesarias void imprimeLibro (struct ficha libro); int cuentaAlquilados (struct ficha * bd, int tam); int muestraMenu( );

int main () { //Variables necesarias int aux; int opcion=0; //es necesario que se inicialice struct ficha tabla[MAX];

while( opcion != 6 ) { opcion = muestraMenu(); switch (opcion) { case 1: // Modificar una ficha (ejemplo hecho) scanf ( %d, &aux); inicializaLibro (tabla+aux); break; case 2: // Mostrar el contenido de una ficha scanf("%d", &aux); //capturamos el indice imprimeLibro (tabla[aux]); break;

case 3:

// Mostrar el nmero de libros alquilados

aux= cuentaAlquilados (tabla, TAM); printf ("El numero de libros alquilados es: %d\n", aux); break;

Fundamentos de la Programacin case 4: // Alquiler de un libro

Primer Parcial (12-02-2005)

scanf("%d", &aux); //capturamos el indice cambiarEstado (tabla + aux, ALQUILADO)) break;

case 5:

// Devolucin de un libro

scanf("%d", &aux); //capturamos el indice cambiarEstado (tabla + aux, ALQUILADO)) break;

case 6:

// Salir

break;

} } } //Definicin de funciones Pregunta 1 Pregunta 2 Pregunta 3

Você também pode gostar