Tabla de Contenidos

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

  1. Codifique un ejemplo que muestre la necesidad de declarar el operator< como const
  2. Escriba un programa para ambiente gráfico Windows/Linux que cree una ventana
  3. 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
  4. 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.
  5. ¿Qué formas existen de detener un thread.
  6. ¿Por qué la función BIND toma como parámetro una estructura que tiene una IP? ¿en qué casos sirve esa IP?
  7. Para implementar una lista genérica, se puede optar por el uso de templates o punteros. Enumere las ventajas de cada método.
  8. ¿Qué significa la palabra static cuando precede a una declaración de un método de una clase? Ejemplifique.
  9. ¿Puede un constructor de copia recibir su parámetro por valor? Justifique.
  10. Escriba un trozo de código ANSI C que muestre:
    1. Una declaración de una variabe carcter sin signo, global, no visible fuera del fuente, llamada X.
    2. Una definición de una función llamada MiFuncion que tome un arreglo de enteros largos con signo y devuelva un puntero a caracter.
    3. 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

Implementación con templates

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á.