You are on page 1of 4

Taller 1 – Mis primeros pasos en C++

Algoritmos y Estructuras de Datos I – 2do cuatrimestre 2005

Ejercicio 0. Conociendo a dev-cpp


Hacer un repaso de cómo crear proyectos en dev-cpp.

i) Crear un proyecto de consola de C++. Destinar siempre una carpeta para cada proyecto.
ii) Guardar todos los archivos y cerrar el dev-cpp (para forzar a que guarde los archivos).
iii) Ir al directorio y describir los archivos generados.
.c/.cpp/.h Archivos propios del lenguage C/C++.
.dev Archivo general de proyecto, desde éste pueden abrirlo con dev-cpp.
.layout Basura del dev-cpp.

iv) Abrir el proyecto


v) Compilarlo, y ver qué archivos se generaron luego de la compilación.
.exe Ejecutable que tiene la aplicación que estamos desarrollando, es el “único” archivo
necesario si queremos distribuir la aplicación. “único” salvo por otro archivos con código
compilado (fuera del alcance de la materia).
.o Archivos objeto. Tienen código compilado. En el proceso de compilación se usan para
crear el .exe. Hasta Orga2 va a ser mágico.

Ejercicio 1. Analizar iteraciones de un ciclo


Como primer tarea deberán escribir, compilar y probar el código. Luego usando el debug,
deben responder las preguntas que se hacen al final del ejercicio.
problema division(a : Z, b : Z) = res : Z{
requiere a > 0 ∧ b > 0;
asegura res == a div b;
}

int d i v i s i o n ( int a , int b )


{
//el algoritmo es ir restando a ’a’ el número ’b’
//tantas veces como entre.
int rv= 0 ;
while ( a >= b )
//en rv se almacena cuántas veces se restó ’b’ a ’pre(a)’.
{
a= a − b ;
rv= rv + 1 ;
}
return rv ;
}

i) ¿Cuántas veces se itera en el ciclo? ¿Qué valores tienen a, b y rv en cada iteración?


a) division(18, 7);

1
ii) ¿Qué pasa cuando no se cumple la precondición? ¿Qué valores tienen a, b y rv en cada
iteración?
a) division(18, -7);
b) division(-18, 7);
c) division(-18, -7);
[Objetivo:] Primer programa, escribir todo en un archivo. Hacer ejemplo de ingreso
de datos del usuario. Explicar que por ahora siempre los problemas los resuelve una
función que no hace IO. En los libros se suele ver mucho interacción de I/O. Los casos
de prueba pueden venir por teclado, archivo, etc. Esto se va a ver más adelante.
[Objetivo:] Primer debug. Hay que analizar cantidad de iteraciones que hace un ciclo
y ver cómo van cambiando las variables a lo largo de cada iteración.

Ejercicio 2. Arreglar un programa


La situación es la siguiente: tienen que entregar un proyecto en el cual esté el código de una
función que calcule el factorial de un número dado. Por suerte están en grupo con una persona
que ya realizó todo el trabajo, excepto por el hecho de que no funciona correctamente.
El proyecto ejfactorial está formado por los siguientes archivos:
main.cpp Código del punto de entrada (main). Pide el ingreso de un número por teclado e
imprime por teclado el factorial del mismo. Este archivo parece estar bien.
milibreria.h Archivo de cabecera que contiene la declaración de la función y la especificación de
la misma. Claramente aquı́ no hay ningún error.
milibreria.cpp Código de la función definida en el .h correspondiente. Hay una descripción de
la relación que cumplen las variables a lo largo de las iteraciones del ciclo.
i) Probar el código para algunas instancias: 0, 1, 4, 5.
ii) Debuguear el código, con las instancias probadas para averiguar qué es lo que pasa.
iii) Corregir el código del archivo milibreria.cpp
iv) Repetir los pasos anteriores hasta que estén seguros que funciona.
Por si no lo recuerdan: 0! = 1, 1! = 1, 4! = 24, 5! = 120
El código que dejó su compañero es el siguiente:
int f a c t o r i a l ( int n ) {
int rv ;
int i ;

rv= 1 ;
i= 0 ;

while ( i < n )
//después de cada iteración en rv queda el valor de prod([1..i])
{
rv= rv ∗ i ;
i= i + 1 ;
}

return rv ;
}

2
[Objetivo:] Mostrar cómo se usan los .h. Que aprendan a moverse por los diversos
archivo de un proyecto. En los .h hay algunas lı́neas raras. Explicar a qué se debe: qué
hace el include, mostrar que hay varios .o en el directorio (uno por cada .cpp).

Ejercicio 3. Calcular un término de fibonacci

int c o n s t r u i r F i b o n a c c i ( int v a l o r ) {
int a r r e g l o [ 1 0 0 ] ;

int i = 0 ;

while ( i <= 1 0 0 ) {
a r r e g l o [ i ]= a r r e g l o [ i −1] + a r r e g l o [ i − 2 ] ;
i ++;
}

return ( a r r e g l o [ i ] ) ;
}

i) Corregir el código (en el proyecto ejfibo) para obtener el n-ésimo término de la serie de
fibonacci.
ii) Explicar brevemente por qué no funciona el código dado por la cétedra.
iii) Explicar por qué se obtiene un resultado correcto (después de haberlo corregido) sin haber
inicializado el arreglo con ceros.

[Objetivo:] Mostrar cómo se utilizan los arreglos y cómo se recorren correctamente. La


idea es calcular la serie de fibonacci en forma iterativa.

Ejercicio 4. Recorrido raro de un vector


Dado el siguiente programa (en el proyecto ejadivina) y su especificación (parcial), se pide
responder las siguientes preguntas usando el debug.
problema adivinaAdivinador(a : [Z], n : Z){
modifica a;
requiere |a| == n;
asegura |a| == n ∧ . . . (no se gasten en escribir, pero traten de explicarlo);
}

void a d i v i n a A d i v i n a d o r ( int a [ ] , int n )


{
int d= n−1;
int i= 0 ;

while ( d != 0 )
{
a [ i ]= a [ i ] ∗ d ;
i= i + d ;
d= − ( d − sgn ( d ) ) ;
}

3
a [ i ]= a [ i ] ∗ d ;
}

//int sgn(int x);


// retorna el signo de x
int sgn ( int x )
{
int rv ;

i f ( x < 0){
rv= −1;
}
i f ( x == 0 ) {
rv= 0 ;
}
i f ( x > 0){
rv= 1 ;
}
return rv ;
}

i) Hacer un programa principal para pedir un arreglo por teclado, ejecutar la función, e imprimir
el contenido final del mismo.
ii) ¿Qué es lo que hace?
iii) ¿En qué orden recorre el arreglo?

[Objetivo:] Hacer un debug para ver cómo se accede y modifican las posiciones de un
arreglo. Ver cuando conviene meterse en una función auxiliar y cuando no. En int
sgn(int x); no conviene.