====== Examen Final - 75.42. Taller de programación I ====== **Cátedra:** Veiga\\ **Fecha:** 1er Cuatrimestre 2007\\ **Día:** 17/07/2007\\ **Tema:** 3 Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== - **Codifique** un ejemplo que muestre la **necesidad** de declarar el **operator<** como **const** - Escriba un programa para ambiente gráfico **Windows/Linux** que cree **una ventana** - Escriba una aplicación **ANSI C** que tome **dos nros. hexadecimales por línea de comandos e imprima su resta** (primero - segundo) **en base octal** - Escriba un programa **ANSI C** que modifique el archivo **enteros.bin** sobre sí mismo, **pasando los enteros de 32 bits** leídos de **little-endian** a **big-endian**. - ¿Qué formas existen de **detener** un **thread**. - ¿Por qué la función **BIND** toma como parámetro una estructura que tiene una **IP**? ¿en qué casos sirve esa **IP**? - Para implementar una **lista genérica**, se puede optar por el uso de **templates** o **punteros**. **Enumere** las ventajas de cada método. - ¿Qué significa la palabra **static** cuando precede a una **declaración de un método** de una clase? **Ejemplifique**. - ¿Puede un **constructor de copia** recibir su **parámetro por valor**? **Justifique**. - Escriba un trozo de código **ANSI C** que muestre: - Una **declaración** de una **variabe carcter sin signo, global, no visible fuera del fuente**, llamada **X**. - Una **definición** de una **función** llamada **MiFuncion** que tome **un arreglo de enteros largos con signo** y devuelva un **puntero a caracter**. - Una **definición** de un **arreglo de 10 punteros a entero**, llamado **Y**. ===== Resolución ===== ==== Punto I ==== void ImprimirMenor ( const Complejo& A, const Complejo& B) { if (A < B) std::cout << A; else std::cout << B; } Esta función (como cualquier otra que tome parametros const) no podria hacer uso de aquellos métodos no indicados como que no modifican la instancia. ==== Punto II ==== int main (int argc, char* argv[]) { GtkWindow* window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0; } ==== Punto III ==== Cabe aclarar que al momento de explicar este tema, Veiga dejo claro que no era necesario control alguno sobre los parametros. int main (int argc, char* argv[]) { char* primero = argv[1]; char* segundo = argv[2]; /* O armen una función que reste un par de valores hexadecimales */ char resultado = ( ( valor(primero[0]) - valor(segundo[0]) ) <<4 ) + ( valor(primero[1]) - valor(segundo[1]) ) ; print_octal (resultado); return 0; } char valor (char c) { if (c >= '0') && (c <= '9') return (c - '0'); switch (c) { case 'A': return 10; case 'B': return 11; case 'C': return 12; case 'D': return 13; case 'E': return 14; case 'F': return 15; default: break; } return 0; } void print_octal (char c) { do printf ("%c",(char)(c%8)+'0')); c/= 8; while (c > 0); printf ("\n"); } ==== Punto IV ==== Te aviso que la sintaxis no es 100% correcta pero deberia darte una idea de la solución. int main (int argc, char* argv[]) { char palabra[4]; FILE* fd = open ("enteros.bin"); if (fd < 0) return -1; while ( read(fd,&palabra,4) != EOF ) { seek (fd, ???, -4); write (fd, &palabra[3],1); write (fd, &palabra[2],1); write (fd, &palabra[1],1); write (fd, &palabra[0],1); } return 0; } ==== Punto V ==== Se puede detener un thread desde el mismo hilo de ejecución usando una función como ptrhead_exit, otra opción es terminar la ejecución de otro hilo desde la función pthread_kill enviando fla señal kill al descriptor correspondiente. Finalmente se puede detener la ejecución de un hilo a la espera de la finalización de otro con pthread_join. ==== Punto VI ==== ==== Punto VII ==== Implementación con punteros * El espacio que ocupa LA ESTRUCTURA crece linealmente con las inserciones de datos * Existe un sólo código compilado, sin importar la cantidad de tipos para los que se la use Implementación con templates * Es type-sage (Nadied podrá insertar elementos que no sean del tipo para el que fue instanciada). Esto evita casteos al acceder a un elemento. * Puede hacerse especialización para ciertos tipos, con fines de optimización * Sirve para cualquier tipo de datos, sin necesidad de casteos ni validaciones en runtime ==== Punto VIII ==== Al indicar un método como static se el mismo pasa a pertencer a la clase, y puede ser ejecutado sin la existencia de instancia alguna. class Clase A { static std::string& getNombreClase() const { return "Clase A"; }; } Esta clase A permite identificar su nombre (hay mejores mecanismos de RTTI), cosa util para por ejemplo la construcción dinamica de objetos. ==== Punto IX ==== No. Si el constructor de copia recibe su parametro por valor, una llamada al mismo se volveria recursiva, pues para cargar los datos de su parametro requeriria llamarse a si mismo. ==== Punto X ==== /* Una variable caracter sin signo, global, no visible fuera del fuente, llamada X. */ static unsigned char X; /* Definicion de una funcion llamada MiFuncion que tome un arreglo de enteros largos con signo y devuelva un puntero fa carácter. */ char* MiFuncion (long num[]) { return NULL;} ; /* Definición de un arreglo de 10 punteros a entero, llamado Y. */ int* Y[10]; ===== Discusión ===== Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá.