P 7

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 9

Metodología de la Programación / Informática

Práctica 7. Introducción al depurador de Dev-C++.


Programas con registros.
El objetivo de esta práctica es el conocimiento de la herramienta que proporciona
Dev-C++ para la corrección de errores de ejecución: el depurador o debugger. Al
final de esta práctica el alumno debe ser capaz de depurar un programa en C++.

1) Introducción al depurador de Dev-C++

Hemos comentado anteriormente los tipos de errores que podían


aparecer durante el desarrollo de un programa. Unos eran los errores léxicos y
sintácticos, los más sencillos de corregir, pues eran detectados por el propio
compilador.

Una vez compilado el programa (eliminados dichos errores) pueden seguir


apareciendo fallos durante la ejecución debido a la presencia de errores de
ejecución. Estos errores no pueden ser detectados automáticamente y para su
corrección se debe repasar mentalmente, instrucción por instrucción, la traza del
programa. De este modo podemos detectar el fallo, averiguando en qué
momento el comportamiento real del programa se separa del comportamiento
esperado.

A medida que vamos haciendo programas cada vez más grandes,


también es más difícil encontrar estos errores en el código fuente. Para
ayudarnos a detectarlos, los actuales entornos de programación y, entre ellos
Dev-C++, disponen de una herramienta conocida como depurador o
“Debugger”, que nos permitirá ir ejecutando poco a poco nuestro programa, y
ver la evolución de las variables durante la ejecución de éste, es decir, nos
facilita el seguimiento de la traza de ejecución del programa.

Veamos su funcionamiento depurando el siguiente programa, que


calcula el valor de un número combinatorio. Para ello, copia literalmente el
código que aparece a continuación:

/*Programa en C++ que calcula el valor de un número combinatorio a


partir de dos enteros (suponemos que ambos enteros son positivos y
que el primero es mayor o igual que el segundo) */

#include <iostream>
#include <cstdlib>

using namespace std;


int factorial (int);
int numeroCombinatorio (int , int );
int main()
{
int a,b,n;
cout<<"Introduzca el primer numero "<<endl;
cin>>a;

1
Metodología de la Programación / Informática

cout<<"Introduzca el segundo numero "<<endl;


cin>>b;
n=numeroCombinatorio(a,b);
cout<<"El combinatorio de "<<a<<" sobre "<<b<<" es: "<<n<<endl;
system("PAUSE");
return 0;
}

int factorial (int n)


{
int fac,i;
fac=1;
i=2;
while (i<n)
{
fac=fac*i;
i++;
}
return(fac);
}

int numeroCombinatorio (int n, int m)


{
int fn,fm,fnm;
fn=factorial(n);
fm=factorial(m);
fnm=factorial(n-m);
return (fn/(fm*fnm));
}

Este programa es sintácticamente correcto (si lo compilamos no


obtendremos errores), pero la ejecución no da la salida esperada, por ejemplo,
el número combinatorio 5 sobre 2 nos da de resultado 12, cuando debería ser
10.

introduzca el primer numero


5
introduzca el segundo numero
2
el numero combinatorio 5 sobre 2 es: 12

1.1) Cómo trabaja un Depurador

Básicamente un depurador permite el seguimiento de la traza de un programa al


facilitar:

• La ejecución paso a paso de las instrucciones del programa. Tras la


ejecución de una instrucción el entorno devuelve el control del ordenador al
programador que puede comprobar cómo se ha ejecutado la instrucción.
• La monitorización del valor de las variables del programa. Podemos ver
cómo cambia el valor de las variables tras la ejecución de cada instrucción.

1.2) El depurador de Dev-C++

El depurador de Dev C++ proporciona un conjunto de utilidades para la


corrección de errores, las más importantes son las siguientes:

2
Metodología de la Programación / Informática

Colocar un punto de parada

Un punto de parada (breakpoint) obliga a la detención de la ejecución del


programa cuando se alcanza dicho punto. Los puntos de parada son útiles en la
depuración, pues permiten al programador observar el estado del entorno del
programa (contenido de variables) en un momento concreto de la ejecución y no
sólo al final de la misma. Pero además, Dev-C++ exige colocar al menos un
punto de parada para poder utilizar el resto de herramientas del depurador.

Hay dos formas de activar un punto de parada. La más sencilla es pulsar


con el ratón en la zona del margen junto a la línea en la que queremos situar el
punto de parada. Otra forma es situar el cursor en la línea en que queremos
situar el punto de parada y usar el menú Depurar, opción Añadir/Quitar punto
de Ruptura.

Para activar/desactivar un “punto de parada”:

Menú Depurar; opción Añadir/Quitar punto de Ruptura

En cualquiera de los casos, se visualizará la línea con fondo rojo, y un


icono rojo con una especie de 'V' verde en su interior en la zona del margen:

Ejecutar un programa en modo de depuración

De nuevo hay varias formas de hacer esto. Una consiste en pulsar el


icono en la barra de herramientas. El mismo icono está en la parte inferior,
en la pestaña de "Depurar", al activar esta pestaña podemos acceder al icono de

3
Metodología de la Programación / Informática

"Depurar" , por último, también podemos hacerlo mediante el


menú "Depurar->Depurar", o pulsando la tecla [F8].

Para comenzar la depuración debemos seleccionar dentro del menú


Depurar la opción Depurar (F8). En la parte inferior de la ventana del
programa, dentro del Dev-C++ aparecerán unas pestañas que nos permitirán
guiar la ejecución del programa para detectar los errores:
En cualquier caso, el programa se ejecutará normalmente hasta alcanzar un
punto de parada. En ese momento el control vuelve al entorno de Dev-C++ y se
muestra la línea de ejecución actual con fondo azul:

Otra variante de punto de parada consiste en situar el cursor en la línea hasta la


que queremos que se ejecute el programa y pulsar "Ir al cursor"
. Esto trabaja igual que si hubiéramos situado un punto de
parada en esa línea, y lo borráramos una vez alcanzado. Pero cuidado, el resto
de los puntos de parada siguen activos, si se alcanza uno de ellos antes que la
posición del cursor, el programa parará en ese punto.

Ejecución paso a paso


Es la característica más importante de un depurador: el que se pueda
ejecutar una y sólo una instrucción del programa y que el entorno nos devuelva
el control para poder comprobar si los efectos de esa instrucción son los
deseados o no.

4
Metodología de la Programación / Informática

Una vez puesto el o los puntos de parada y dada la orden “Depurar”, la


ejecución se detiene en el primer punto de parada. A partir de aquí podemos
optar por ejecutar el programa hasta el siguiente punto de parada, pulsando
"Saltar paso", o reanudar la ejecución paso a paso ejecutando la siguiente
sentencia, mediante "Siguiente paso" o “Avanzar paso a paso”.

La diferencia entre "Siguiente paso" y "Avanzar paso a paso" es sutil


pero importante. Si la sentencia contiene una llamada a una función, "Siguiente
paso" la ejecutará como una sentencia única, y "Avanzar paso a paso"
transferirá la ejecución al interior de la función y ejecutará sus sentencias paso
a paso.

En el momento que entremos en este modo de ejecución aparecerá una barra


de color azul claro en la ventana del programa que nos indicará la instrucción
que se va ejecutar la próxima vez

Pulsando sucesivamente F7 iremos ejecutando instrucción por


instrucción. (NOTA: si hay dos o más instrucciones en una misma línea, el
depurador las ejecutará todas a la vez, pasando a la siguiente línea con
instrucción/es).

Si se desea suspender la ejecución paso a paso, se debe seleccionar


en el menú Depurar la opción Parar ejecución.

Inspeccionar variables: Los "watches"

Un "watch" en Dev-C++ es un representante de una variable que se


desea monitorizar. Muestra el valor de la variable a la que representa. Se debe
crear un "watch" para cada variable cuya evolución desee vigilar.

Para CREAR un "watch":

Menú Depurar; opción Añadir watch (F4)

Aparecerá un cuadro de diálogo en donde escribiremos el nombre de la


variable del "watch". En ese momento aparecerá en la columna de la izquierda

5
Metodología de la Programación / Informática

la variable observada junto con su valor. Podemos crear (o eliminar) un "watch"


en cualquier momento durante la ejecución del programa.

Ejercicio: Encuentra, con la ayuda del depurador, el error u errores


de ejecución que aparecían en el código del programa que os hemos
proporcionado.

6
Metodología de la Programación / Informática

2) Registros

Recordar que, un registro, es un tipo de dato estructurado que nos


permite trabajar con variables que almacenen varias informaciones. Éstas
informaciones pueden ser de diferente tipo y, a cada una de ellas, se les
denomina campo. La sintaxis para definir un tipo de dato registro es la
siguiente:

SEUDOCÓDIGO C++

<identificador_tipo>=registro struct <identificador_tipo>


<indent_campo1>: <tipo1> {
<indent_campo2>: <tipo2> <tipo1> <indent_campo1>;
... <tipo2> <indent_campo2>;
<indent_campon>: <tipon> ...
finregistro <tipon> <indent_campon>;
};

¿Dónde se definen los registros?

En seudocódigo los registros (al igual que el resto de tipos de datos no


predefinidos), se definen en la zona de declaraciones del algoritmo (aquí
definimos tipos, constantes y variables). En C++ los tipos de datos no
predefinidos se definen después de incluir los ficheros que necesita el
programa, y antes de escribir los prototipos de los subprogramas que utilice el
programa. Es decir, un programa sigue la siguiente estructura:

1) /* Inclusión de ficheros */
2) /*DEFINICIÓN DE TIPOS DE DATOS*/
3) /*Prototipos*/
4) /*Programa principal*/
5) /*Implementación subprogramas*/

Recordar que, las únicas operaciones que se pueden realizar sobre


registros completos son : la declaración, el paso como parámetros y la
asignación interna. El resto de operaciones es necesario realizarlas campo a
campo, es decir, accediendo de una en una a las informaciones almacenadas en
el registro. En C++ se accede a cada una de esas informaciones de la misma
forma que en seudocódigo (escribiendo el nombre de la variable de tipo registro
a la cual se desea acceder, el operador punto y el nombre del campo deseado).
Sintaxis: <ident_variable>.<ident_campo>

7
Metodología de la Programación / Informática

EJERCICIOS

1. Definir un tipo de dato llamado tFecha para almacenar una fecha (día, mes
y año). Construir un subprograma de lectura de un dato de tipo tFecha y un
subprograma que, dados dos datos de tipo tFecha devuelva un booleano
indicando si las dos fechas son o no iguales.

2. Cada uno de los productos que vende cierta tienda viene caracterizado por
un identificador (número entero), el precio por unidad de ese producto y el
número de unidades de producto de las que dispone la tienda.

a. Definir el tipo de dato tproducto para representar cada uno de los


productos.

b. Escribir un subprograma que dado un dato de tipo tproducto y el


número de unidades de éste que desea adquirir un cliente,
compruebe si es o no posible la venta y, en caso de serlo, calcule el
precio total de la venta y actualice la información del dato de tipo
tproducto tras esa venta.

3. Escribir una calculadora de quebrados. Para ello seguir los siguientes


pasos:

a. Definir el tipo de dato tquebrado mediante un registro para


representar un quebrado.

b. Escribir subprogramas de lectura y escritura de quebrados.

c. Escribir un subprograma para reducir quebrados (usando una función


de cálculo del m.c.d.). Nota: recordar que un algoritmo de cálculo del
m.c.d. es el siguiente:
m.c.d.(a, 0) = a
m.c.d.(a,b) = m.c.d.(b, resto(a/b))

d. Escribir los subprogramas para las operaciones con quebrados:


suma, resta, multiplicación y división.

8
Metodología de la Programación / Informática

e. El programa principal mostrará un menú de la siguiente forma:


preguntará por la operación a realizar, leerá los quebrados, operará
y mostrará el resultado, preguntando de nuevo por la operación a
realizar.

Ejemplo:

Operación a realizar:
1- Suma
2- Resta
3- Multiplicación
4- División
5- Salir
Elige opción: 1
Introduce primer operando: 3 4
Introduce segundo operando: 1 2

3 / 4+1 / 2 = 5 / 4

4. Se desea realizar un programa que lea una hora determinada de un día


(dada en horas, minutos y segundos) y una cantidad positiva de segundos,
y que calcule cuál es la hora resultante de sumar esos segundos a la hora
leída. Ejemplo: habiendo leído las 12:59´:45´´ y una cantidad de 40´´, la
hora resultante debe ser 13:00´:25´´. Para la realización del programa,
pensar en una solución en seudocódigo, siguiendo los siguientes pasos:

- Proponer la estructura de datos Tiempo, adecuada para almacenar


horas del día (horas, minutos y segundos).

- Proponer una acción para la lectura de variables de tipo Tiempo y


utilizarla en el programa principal para leer la hora.

- Diseñar el programa que utilice el tipo y acción anteriores.

También podría gustarte