Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7. Laboratorios
Nicolas Thériault
operaciones especiales:
long long SumaP( long long a , long long b ) ;
long long RestaP( long long a , long long b ) ;
long long MultP( long long a , long long b) ;
long long InvP( long long a ) ;
Trabajar en equipos
Si debe leer un archivo (para trabajar los datos que contiene), debe pedir a los
usuarios de escribir su nombre dentro de la ejecución del programa
I Modelos (templates)
I Métodos/funciones virtuales
Algunas de las funcionalidades del C++ pueden afectar la eficiencia de los programas:
Modelos (templates)
I Requiere cuidado para asegurar que no tiene mucho costo
I Hacer el trabajo especifico al caso permite tomar ventaja de algunas propiedades
Métodos/funciones virtuales
I Afecta la eficiencia
Sencillo de leer.
Hay pocas manejas de hacer las cosas, por lo que es más sencillo entender el código
escrito por otros/otras.
Con archivos:
fprintf, fscanf (formato parecido, pero incluye el nombre del archivo)
Empezar con fopen, terminar con fclose
Tipo de variable del archivo: FILE (en mayusculas)
N. Thériault (USACH) Presentación 10 / 28
Punteros
Para conocer el puntero asociado a una variable, se pone & frente al nombre
puntoflotante = &abc;
tipo nombre[tamaño];
float puntosflotantes[7];
long enterosgrandes[n];
Como consecuencia, los arreglos dobles son poco prácticos para ser utilizados en
sub-funciones:
Riesgos de trabajo fuera del arreglo (simple o doble), que puede producir un
segmentation fault o corromper los valores de otras variables
Se deben enviar todos los tamaños de los arreglos como entradas de la función
Se debe calcular la posición como i × tamaño2 + j para todas las utilizaciones
Se puede considerar estructuras especiales para las filas también, que contienen el
tamaño y el puntero para el arreglo
I Puede facilitar operaciones de filas
Dos funciones no pueden tener el mismo nombre, aun si el tipo de variables cambia
int maximo int( int a , int b );
float maximo float( float a , float b );
El compilador puede permitir algunos ajustes de tipos, pero no es recomendable
I Ejemplo: si se manda un int de entrada cuando se pide un long
Sub-funciones e inlining
Funciones recursivas
Testeo de programas
Operadores lógicos:
I !P (negación lógica)
I P&&Q (P y Q)
I PkQ (P o Q)
Bucles for:
I Formato básico:
for ( inicialización ; condiciones ; incremento )
{
acciones;
}
Crear sub-funciones:
I Más sencillo de seguir el código
I Más sencillo para la verificación y el testeo
I El llamado a funciones aumenta un poco el tiempo de ejecución
Inlining manual:
I Las operaciones están detalladas a cada utilización
I Evita llamados a funciones (más eficiente) y “saltos” dentro del programa
I Aumenta en tamaño del código redactado
I Requiere cuidado con los nombres de variables, pero puede reutilizar las mismas
variables temporarias
Inlining automatico:
I Recomienda al compilador de hacer el reemplazo automáticamente
I Se agrega “inline” o “static inline” antes dedefinir/declarar la función
I Más seguro (evita errores de nombres de variables)
I Poco control sobre el aumento de tamaño del programa
Una función recursiva es una función que se llama a si misma (una o más veces).
Errores de escritura
Errores de signos
Problemas con el manejo de memorı́a dinámica
Conflictos con sub-funciones y/o funciones provenientes de otras librerı́as
Interpretación equivocada de de los indices, etc
Detalles no considerados en el pseudo-código
En algunos casos, la complejidad conceptual (dificultad de entender todos los detalles del
programa y tenerlos todos en mente al mismo tiempo), especialmente con programas
desarrollados en equipos de trabajo grandes, puede ser muy dificil de asegurar que todo
está bien con el programa.
Antes de testear una función recursiva de forma general, se recomiendo testear una
versión que hace a lo más un paso de recursión.
I Utilizar una versión de la función que parra después de aplicar el proceso de inducci’on
una sola vez
I Comparar con un algoritmo más básico (e.g. fuerza bruta)
I Puede ayudar a optimizar la función también (determinar cual es el caso base práctico)
I Evita entrar en bucles infinitos por errores en en proceso de los pasos
I Si hay un(os) error(es), es más sencillo identificar donde antes de que las recursiones
hagan una difusión del error
Utilizar clock para medir tiempo (tiempo cpu), no time (tiempo reloj).
Según la instalación de C, podrı́an haber otras funciones de medición del tiempo cpu
(más precisas), pero no siempre están disponibles. Solo utilizar clock.
Hay un nivel mı́nimo de precisión de la medición, no considerar debajo de µs.
Idealmente repetir con entradas (aleatorias) distintas, pero generar las entradas
aleatorias ANTES de empezar a medir el tiempo.
I Si el algoritmo requiere dos (o más) entradas, preparar un conjunto de valores para
cada una y ejecutar para las diferentes combinaciones (requiere menos tiempo y
memoria de preparación).
I Asegurar que las entradas preparadas no agotan el RAM.