prácticas de programación 1

42
Pr´ acticas de Programaci´on 1 Grado en Ingenier´ ıa Inform´ atica Miguel ´ Angel Latre y Javier Mart´ ınez ´ Area de Lenguajes y Sistemas Inform´ aticos Departamento de Inform´atica e Ingenier´ ıa de Sistemas Curso 2017-18

Upload: phungnhi

Post on 06-Jan-2017

221 views

Category:

Documents


0 download

TRANSCRIPT

Practicas de Programacion 1

Grado en Ingenierıa Informatica

Miguel Angel Latre y Javier Martınez

Area de Lenguajes y Sistemas InformaticosDepartamento de Informatica e Ingenierıa de Sistemas

Curso 2017-18

Presentacion

Las practicas de la asignatura Programacion 1 no deben imaginarse como una sucesion desesiones en laboratorio a las que el alumno debe acudir a que le cuenten cosas. Nada mas lejosde la realidad; el alumno debe acudir a cada sesion de practicas de laboratorio con el trabajoprouesto para la practica muy avanzado, deseablemente ya terminado, y aprovechar la sesionpara aclarar dudas y para que el profesor supervise su trabajo y le indique, en su caso, comomejorarlo.

Las practicas de Programacion 1 comprenden un conjunto de trabajos practicos deprogramacion que cada alumno debe realizar con bastante autonomıa a lo largo del cuatrimestrepara alcanzar los resultados de aprendizaje que se describen en la guıa docente de la asignatura(http://titulaciones.unizar.es/asignaturas/30204).

La informacion de este manual esta organizada en seis capıtulos. Cada capıtulo esta asociadoa una practica.

Cada capıtulo comienza con una breve descripcion de los objetivos que se persiguenrealizando la practica.

Continua con un apartado dedicado a la presentacion de elementos tecnologicos dellenguaje de programacion C++ y de herramientas que facilitan el trabajo del programador.Este apartado hay que leerlo, comprenderlo y, lo mas importante, lo que allı se describehay que saber aplicarlo y utilizarlo a partir de ese momento.

Finaliza el capıtulo con la descripcion de los trabajos de programacion que cada alumnodebe desarrollar y se dan pautas sobre como hacerlos. Como se ha dicho anteriormente, eltrabajo asociado a una practica no se circunscribe a la sesion de dos horas de laboratorioasociadas a ella. El trabajo debe iniciarse una o dos semanas antes, para poder concluirlodurante la sesion en laboratorio asociada a la practica y que pueda ser supervisado por unprofesor, recibiendo las indicaciones y sugerencia que permitan, en su caso, mejorarlo.

Cada alumno debe tener claro que el trabajo de practicas es un trabajo que lecorresponde realizar a el mismo, como una parte fundamental del estudio yaprendizaje de la asignatura. El profesor le puede ayudar, pero esta ayuda es inutil siel no ha trabajo previamente lo suficiente.

Este manual es una guıa inicial a las practicas de la asignatura. Cada alumnodebera acostumbrase a acudir frecuentemente y consultar las siguientes fuentes deinformacion, a las que se puede acceder a traves de pagina web de la asignatura,http://webdiis.unizar.es/asignaturas/PROG1/:

En la seccion de Documentacion C++ se presentan los enlaces a las paginas web conla documentacion de las bibliotecas predefinidas en C++.

1

En la seccion de Materiales Docentes Comunes se facilitara codigo y datos para eldesarrollo de algunos de los trabajos propuestos en estas practicas. Este material podra serdescargado y copiado.

La siguiente tabla muestra el calendario previsto de sesiones practicas de Programacion1 correspondiente al curso 2017-18. Estas sesiones tienen lugar en el laboratorio L0.04

situado en la planta baja del edificio Ada Byron del Campus Rıo Ebro de la Universidad

de Zaragoza.

Calendario de sesiones practicas de PROGRAMACION 1. Curso 2017-18

Sesiones Lunes A Martes A Lunes B Martes B

1a L-25-SEP M-26-SEP L-02-OCT M-03-OCT

2a L-16-OCT M-17-OCT L-23-OCT M-24-OCT

3a L-06-NOV M-31-OCT L-13-NOV M-07-NOV

4a L-20-NOV M-14-NOV L-27-NOV M-21-NOV

5a L-4-DIC M-28-NOV L-11-DIC M-21-DIC

6a L-18-DIC M-19-DIC L-08-ENE M-09-ENE

En las practicas de Programacion 1 se desea evitar que el alumno se dedique a explorar elextenso territorio que ofrece un lenguaje como C++ y acabe perdido en el. Hemos optado porqueel alumno solo utilize una parte reducida de lo que el lenguaje C++ ofrece y, eso sı, lo haga bien,dominando y comprendiendo en todo momento la tecnologıa que utiliza y el significado de loque programa. La parte del lenguaje C++ que esta permitido utilizar coincide esencialmente conlos elementos presentados y utilizados en el curso de Programacion 1.

A programar se aprende programando. De ahı la importancia de que cada alumnoempieze a programar desde el primer dıa del curso. Programar es comprender el problemade tratamiento de informacion a resolver. Programar es analizar ese problema, dedicandole eltiempo que sea necesario, hasta decidir como abordar su resolucion. Programar es escribir enuna hoja de papel el algoritmo a aplicar para resolverlo. Programar es trasladar ese algoritmoa codigo C++, editarlo, compilarlo y ejecutarlo. Programar es someter nuestros programas aun completo juego de pruebas hasta que tengamos la conviccion de que nuestro codigo no soloesta libre de burdos errores, sino que su comportamiento satisface todas las especificacionesplanteadas en el problema de partida.

Todas estas tareas que acabamos de senalar son parte del trabajo de un programador y surealizacion en estas practicas es responsabilidad personal de cada alumno.

Zaragoza, septiembre de 2017

Miguel Angel Latre y Javier MartınezDepartamento de Informatica e Ingenierıa de Sistemas

de la Universidad de Zaragoza

2

Practica 1: Como desarrollarprogramas escritos en C++

1.1. Objetivos de la practica

La primera practica de la asignatura persigue los siguientes objetivos:

Aprender a utilizar los puestos de trabajo disponibles en los laboratorios de programacion.

Aprender a utilizar un IDE (Integrated Development Environment o Entorno de DesarrolloIntegrado) para el desarrollo y puesta a punto de programas C++.

Estudiar el comportamiento de algunos programas C++ elementales, las instruccionesutilizadas en ellos y programar en ellos algunas pequenas modificaciones.

Es esencial que todos los alumnos que cursan por primera vez la asignatura asistan ycompleten el trabajo propuesto en esta practica, ya que lo que se aprende en ella debera serutilizado a partir de ese momento de forma continuada.

Los alumnos que no hayan formalizado aun su matrıcula en la asignatura tambien debenrealizar la practica. Si a un alumno le resultara imposible realizar la practica con su grupo depracticas, debera realizarla con cualquiera de los restantes grupos, sin importar si se trata deun grupo de manana o de tarde.

El desarrollo de la sesion correspondiente a esta practica tiene dos partes diferenciadas.

1. En la primera parte cada alumno debera atender las explicaciones del profesor sobre losprimeros apartados de este guion y seguir sus instrucciones.

2. En la segunda parte cada alumno debera desarrollar individualmente el trabajo propuestoen el apartado 1.3 Trabajo a desarrollar en esta practica. Para ello conviene que, antes deacudir al laboratorio a participar en la sesion de practicas, haya leıdo atentamente el guioncompleto de la practica, haya comenzado a preparar el trabajo descrito en el apartado 1.3y haya estudiado el contenido del apartado 1.2.4 Manipuladores para dar formato a losdatos de salida.

El trabajo asociado a esta practica concluye nada mas acabar la primera sesion de practicasen laboratorio ya que al dıa siguiente hay que empezar a trabajar la practica siguiente.

3

1.2. Tecnologıa y herramientas

1.2.1. Los puestos de trabajo

Cada uno de los puestos de trabajo de los laboratorios de programacion consta de uncomputador personal conectado a la red de comunicaciones de la Universidad de Zaragoza.

Si el computador esta apagado y lo ponemos en funcionamiento, nos permite seleccionarel sistema operativo con el que deseamos trabajar. En diferentes asignaturas utilizaremosnormalmente uno de los sistemas operativos siguientes:

CENT OS. Sistema operativo derivado del Linux RHEL (Red Hat Enterprise Linux ).Para trabajar con el hay que disponer de una cuenta de usuario. Cada alumno dispone deuna cuenta de usuario abierta por el administrador del sistema, una vez ha formalizadosu matrıcula en los estudios. Una vez cargado el CENT OS, el usuario debe identificarsemediante su nombre de usuario (username) y su contrasena (password). Por ejemplo:

username: a333444

password: miClave856

Tras la escritura del nombre de usuario y, antes de escribir la contasena, se tiene laposibilidad de seleccionar el idioma.

Windows XP. Para trabajar con el se recomienda hacerlo a traves de su propia cuenta deusuario. Una vez cargado el sistema, el usuario debe cerrar la sesion de invitado que se abreautomaticamente,y proceder a identificarse mediante su nombre de usuario (username) ysu contrasena (password) y debe seleccionar el dominio DIISLAB. Por ejemplo:

usuario: a333444

contrase~na: miClave856

conectarese a: DIISLAB

El nombre de usuario y la contrasena para acceder a los dos sistemas operativos anterioresson comunicados a cada alumno de nuevo ingreso en los estudios mediante un mensaje electronicoa su cuenta de correo en la Universidad. El nombre de usuario y, sobre todo, la contrasena deacceso a nuestra cuenta es personal y debe mantenerse en secreto para evitar un mal usode nuestra cuenta por terceros, del cual serıamos corresponsables.

1.2.2. Una sesion de trabajo con el sistema operativo CENT OS

En las practicas de Programacion 1 trabajaremos con el sistema operativo CENT OS .

Tras acceder a nuestra cuenta y, tras un tiempo de espera prudencial, aparecen en pantalla dosiconos, Equipo y Carpeta personal de axxxxxx (donde xxxxxx es el numero de identificaciondel alumno o NIA), por ejemplo Carpeta personal de a333444, y tres menus deplegables ensu parte superior (Aplicaciones, Lugares y Sistema).

Nos interesa especialmente la carpeta que tiene el nombre de nuestra cuenta, en el ejemplo queestamos presentando Carpeta personal de a333444, ya que en ella podremos crear nuevascarpetas, borrarlas cuando queramos y almacenar en ellas ficheros.

4

Conviene saber que estas carpetas no se encuentran almacenadas en un disco local delcomputador personal de nuestro terminal sino en un cluster de computadores unix denominadohendrix, integrado por los computadores hendrix01 y hendrix02, conectados a la redinformatica de la Universidad de Zaragoza. De este modo, nuestras carpetas y ficheros podranser accedidos desde cualquier otro puesto de trabajo de los que dispone el Departamento deInformatica e Ingenierıa de Sistemas (DIIS ) y se conservaran allı hasta que decidamos borrarlos.

El cluster hendrix realiza funciones de servidor de los ficheros de muchos centenares deestudiantes. Dado que su capacidad de almacenamiento es finita, cada usuario tiene limitadala cantidad de informacion a almacenar. Ello significa que cada usuario debe hacer una gestionadecuada de lo que se almacena, debiendo eliminar sistematicamente aquellos ficheros que nosean necesarios para trabajar en el futuro.

Desde el menu desplagable Aplicaciones son accesibles diversos programas de aplicacionque podemos ejecutar. En las practicas de esta asignatura solo vamos a tener que ejecutar dosaplicaciones:

El navegador Mozilla Firefox para consultar diversas paginas web, especialmente lassiguientes:

• La web http://webdiis.unizar.es/asignaturas/PROG1/ de la asignaturaProgramacion 1.

• La web http://www.cplusplus.com/ con amplia y diversa documentacion sobreel lenguaje C++.

• Desde la pagina anterior se puede acceder al manual de referencia de la bibliotecaestandar C++ en la direccion http://www.cplusplus.com/reference/.

El entorno de desarrollo integrado CodeLite (mas informacion de este entorno enhttp://codelite.org/ ).

Cuando hayamos concluido nuestra sesion de trabajo deberemos cerrar las ventanas abiertasy salir de nuestra cuenta de trabajo en el sistema operativo CENT OS . Hay que evitar dejarlaabierta para impedir que alguien pueda hacer un uso indebido de ella. Para ello debemosseleccionar la orden Sistema/Cerrar la sesion de a333444 situada en el menu desplegablede la parte superior derecha de la pantalla.

1.2.3. CodeLite: un entorno de desarrollo integrado

Un entorno de desarrollo integrado (en ingles integrated development environment o IDE )es un programa informatico que integra un conjunto de herramientas que facilitan el diseno, lapuesta a punto y el mantenimiento de programas. Dichas herramientas posibilitan la realizacionde las siguientes tareas:

Gestionar nuestros proyectos de programacion.

Editar los ficheros fuente con el codigo de nuestros programas.

Compilar el codigo de nuestros programas.

Informar de errores en el codigo de nuestros programas.

Depurar nuestros programas hasta que su comportamiento sea el deseado.

5

Ejecutar nuestros programas cuantas veces sea preciso.

A partir de este momento vamos a utilizar este entorno para desarrollar programas escritosen C++.

Area de trabajo o workspace

Al ejecutar la aplicacion CodeLite, el entorno de programacion presenta una ventana debienvenida posibilitando la apertura de un area de trabajo o workspace.

Si no disponemos aun de ningun area de trabajo o workspace podemos crear una nueva yubicarla dentro de una carpeta o directorio. Para ello procedemos, en primer lugar, a crear lacarpeta programacion1 en la que ubicaremos las sucesivas areas de trabajo que iremos creandoen las practicas de la asignatura.

Desde el entorno CodeLite se pueden crear nuevas areas de trabajo ejecutando la ordenWorkspace/New Workspace, que puede ser seleccionada desde el menu desplegable situadoen la parte superior de la ventana. Al ejecutarla se abre una nueva ventana que permiteseleccionar la carpeta en la que ubicar la nueva area de trabajo (en la carpeta programacion1 )y el nombre de la nueva area de trabajo, en este caso, practica1.

6

De esta forma se ha creado el area de trabajo practica1, ubicada en la carpetaprogramacion1 .

En un area de trabajo se pueden desarrollar varios programas. Cada uno de ellos requiere ladefinicion de un proyecto, tal como se explica en el siguiente apartado.

Proyectos de un area de trabajo

Para definir un nuevo proyecto basta ejecutar la orden Workspace/New Project,especificando el tipo de proyecto. En este caso, un programa C++ que interacciona con el operadora traves de consola.

A continuacion debemos definir el nombre del nuevo proyecto.

7

Finalmente, debemos seleccionar el compilador y el depurador a utilizar, en su caso, aldesarrollar y poner a punto este proyecto.

Al crear el proyecto Bienvenida, en el area de trabajo practica1, se crea una nueva carpeta conese nombre, dentro de la carpeta practica1. En la carpeta programacion1\practica1, tras habercreado el proyecto Bienvenida, se encontrarıan las carpetas correspondientes a los proyectos quehubieremos creado hasta el momento en el area de trabajo, ası como un fichero descriptivo delarea, el fichero practica1.workspace.

8

Por su parte, en la carpeta programacion1\practica1\Bienvenida se almacenan los ficheros queconstituyen su codigo, ası como un fichero descriptivo del proyecto, el fichero Bienvenida.project.El contenido de esta carpeta se muestra a continuacion.

Debe evitarse nombrar las areas de trabajo y los proyectos que sean creados desde CodeLitecon nombres que incluyan caracteres con tilde o caracteres especiales como la n, la c, etc. yaque ello impedira el correcto acceso del entorno a las carpetas asociadas a ellos.

Puesta a punto de un programa C++ en el IDE CodeLite

Para desarrollar un programa C++ en CodeLite hay que seguir los siguientes pasos:

Paso 1. Editar el codigo fuente de los ficheros que integran el programa. En el ejemploque estamos considerando, cambiaremos el nombre del fichero main.cpp por el nombrebienvenida.cc y lo editaremos copiando el codigo del primer programa presentado en elcapıtulo 1 del texto de Programacion 1.

9

Paso 2. Compilar el codigo fuente de los ficheros que integran el programa ejecutandola orden Build/Build Project. En el caso de que el compilador senale la existenciade errores, estos deberan ser corregidos antes de proseguir. Los errores son advertidosmediante mensajes en pantalla que informan del error.

Paso 3. Ejecutar el programa compilado seleccionando la orden Build/Run o pulsandola pequena fecha de color naranja orientada hacia la derecha, situada en la parte superiorderecha de la ventana. Se creara una ventana, similar a la que se presenta a continuacion,que muestra el resultado de ejecutar el programa.

10

1.2.4. Manipuladores para dar formato a los datos de salida

La utilizacion de manipuladores va a ser necesaria en los primeros programas que se disenenen las practicas de esta asignatura.

Un manipulador C++ es una funcion que se aplica al flujo de datos dirigido hacia la pantalladel operador, o hacia otro dispositivo o fichero de salida, para dar formato a los datos que sepresenten por ella.

En la primera leccion de la asignatura se ha hecho uso de diversos manipuladores en losprogramas C++ que se han presentado. Conviene hacer una lectura atenta de ella antes de abordarel trabajo propuesto en esta practica.

Un resumen de algunos de los manipuladores de uso mas comun se presenta a continuacion:

Manipuladores definidos en la biblioteca <iostream>, concretamente en la biblioteca<ios> declarada en ella:

• endl: vacıa el buffer asociado a la pantalla presentando su contenido por pantalla yfinaliza la lınea en curso.

• flush: vacıa el buffer asociado a la pantalla presentando su contenido por pantallasin finalizar la lınea en curso.

• dec: convierte los datos numericos a base decimal (base 10).

• oct convierte los datos numericos a base octal (base 8).

• hex: convierte los datos numericos a base hexadecimal (base 16).

• left: presenta los datos de forma que los caracteres que no sean de relleno se alineana la izquierda del campo.

• right: presenta los datos de forma que los caracteres que no sean de relleno se alineana la derecha del campo.

• internal: presenta los datos numericos de forma que el signo y los caracteresindicativos de la base estan alineados a la izquierda del campo y las cifras significativasa la derecha.

• showpos: se muestra el signo (+) en los valores positivos.

• scientific: establece un modo de trabajo de forma que los datos reales son presentadosen notacion cientıfica de coma flotante (ej. 1.7234e+01).

• fixed: presenta los datos reales en notacion normal de coma flotante (ej. 17.234).

• boolalpha: establece un modo de trabajo de forma que los datos logicos o booleanosson extraidos de un flujo o anadidos a un flujo como una secuencia de caracteres(true o false).

11

• noboolalpha: establece un modo de trabajo de forma que los datos logicos obooleanos son extraidos de un flujo o anadidos a un flujo como valores enteros: 1en caso de valores logicos true o 0 en caso de valores logicos false.

Manipuladores definidos en la biblioteca <iomanip>

• setw(int n): establece la anchura mınima de campo de los datos a presentar porpantalla, es decir el numero mınimo de caracteres n a presentar completando el dato,en su caso, con el caracter de relleno definido en ese momento (ej. setw(10)).

• setfill(char ch): establece ch como caracter de relleno (ej. setfill(’*’)).

• setprecision(int p): establece el numero de cifras significativas de los datosnumericos o, en su caso, el numero de cifras decimales; su valor por defecto es 6(ej. setprecision(2)).

Un manipulador solo afecta al dispositivo de entrada o de salida (cin, cout, etc.) al que seaplica. El efecto de los manipuladores permanece en el dispositivo de entrada o de salidacorrespondiente hasta que se aplica otro manipulador que lo modifica, a excepcion delmanipulador setw(int n) que hay que invocarlo antes de cada dato al que se le quieredefinir un ancho de campo.

Mas informacion y algunos ejemplos ilustrativos sobre los manipiladores disponibles en lasbibliotecas predefinas en C++ se puede consultar en www.cplusplus.com/reference

1.3. Trabajo a desarrollar en esta practica

Se propone que cada alumno realice las tareas que se describen en los apartados siguientes.

Alguno de los fragmentos de codigo que se mencionan a continuacion pueden serdescargados desde la seccion de Materiales docentes comunes de la web de esta asignatura:http://webdiis.unizar.es/asignaturas/PROG1/ a traves del enlace CODIGO C++ YDATOS.

1.3.1. Definir la estructura de un area de trabajo para el desarrollo deprogramas C++

Crear una estructura organizativa para trabajar con el IDE CodeLite. Para ello se deberanejecutar las siguientes tareas.

Tarea 1. Crear un area de trabajo o workspace. Para ello cada alumno debe dar lossiguientes pasos:

• Debe crear una carpeta de nombre programacion1 en la que ubicar los proyectosa desarrollar en cada una de las practicas de la asignatura, siempre que no la hayacreado previamente.

• Debe crear una primera area de trabajo (workspace) denominada practica1 queestara ubicada en la carpeta programacion1, siempre que no la haya creadopreviamente. En esta area se ubicaran y desarrollaran todos los programascorrespondientes a la primera practica.

12

• Debe crear un primer proyecto el area de trabajo practica1, el proyecto Bienvenida,con el programa comentado en los apartados anteriores. Debe compilar su codigo y, sino se han producido errores, ejecutarlo. Mientras se observen fallos en su compilaciono en su ejecucion, debe tratar de corregirlos hasta que el comportamiento del programasea el deseado.

Tarea 2. Debe crear dos nuevos proyectos dentro del area de trabajo practica1, losproyectos Circunferencias y Circulo, para el desarrollo de los dos programas restantesdescritos en el capıtulo 1 del texto de la asignatura. Debera compilar y, cuando no hayaerrores de compilacion, ejecutar ambos programas hasta tener la conviccion de que suscomportamientos son los esperados.

Tarea 3. Debe crear un nuevo proyecto, al que debe denominar Formatear, dentro delarea de trabajo practica1. El codigo inicial del programa a desarrollar en el se muestra acontinuacion.

#include <iostream>#include <iomanip>#include <cmath>

using namespace std;

/∗∗ Pre: desde<=hasta∗ Post: Presenta por pantalla una tabla con una lınea por cada uno de los valores∗ del intervalo [desde,hasta ]. En cada lınea se muestra un valor, su cuadrado∗ y su cubo∗/

void mostrarPotencias (int desde, int hasta) {cout << ”x” << ”xˆ2” << ”xˆ3” << endl;for (int x = desde; x <= hasta; x = x + 1) {

cout << x << x∗x << x∗x∗x << endl;}

}

/∗∗ Pre: desde<=hasta∗ Post: Presenta por pantalla una tabla con una lınea por cada uno de los valores∗ de los angulos, expresados en grados: desde, desde + 5, desde + 10, etc,. que∗ sean inferiores o iguales a hasta. En cada lınea se muestra el valor del angulo∗ en grados y en radianes y los valores de sus funciones seno y coseno.∗/

void mostrarAngulos (int desde, int hasta) {const double PI = 3.1415926;cout << ”grados” << ”radianes” << ”seno” << ”coseno” << endl;for (double x = desde; x <= hasta; x = x + 5.0) {

double radianes = PI ∗ x / 180.0;cout << x << radianes << sin(radianes) << cos(radianes) << endl;

}}

/∗∗ Pre: −−−∗ Post: Presenta por pantalla una tabla de potencias (en cada lınea un valor,∗ su cuadrado y su cubo) y una tabla de angulos (en cada lınea un angulo∗ en grados, en radianes,su seno y su coseno)∗/

13

int main() {// Presenta la tabla de potencias de los enteros comprendidos entre 5 y 15mostrarPotencias(5,15);// Presenta una tabla con los angulos comprendidos entre 0 y 180 grados,// su valor en radianes y los valores de sus funciones seno y cosenomostrarAngulos(0,180);// Concluye normalmentereturn 0;

}

Este programa adolece de un grave defecto: la presentacion de resultados por pantalla espenosa.

El trabajo a realizar por cada alumno es modificar el diseno de las funcionesmostrarPotencias(desde,hasta) y mostrarAngulos(desde,hasta) para que, al serinvocadas, presenten de forma digna y legible sus resultados.

Se recomienda intentar diferentes presentaciones jugando con varios elementos: la anchurade las columnas de la tabla, la alineacion a izquierda o derecha de los datos de cada lınea,el numero de decimales de los numero reales, etc.

Para ello se ha de hacer uso de algunas de las funciones de formato o manipuladoresque fueron citados en un apartado anterior.

El objetivo de esta tarea es practicar y aprender a presentar resultados despues de conocerque manipuladores hay disponibles en C++ y cual es el efecto de cada uno de ellos. Serecomienda consultar la documentacion sobre ellos disponible en el manual de referenciade la bibloteca predefinida en C++, accesible desde la pagina web de la asignatura.

Las tareas anteriores pueden intentarse antes de acudir al laboratorio a la sesioncorrespondiente a esta practica. Durante la sesion podra completarse y, en su caso, mejorarse eltrabajo previo realizado.

Cada alumno debe haber completado las tareas definidas en esta primera sesion de practicasen la propia sesion o, en caso necesario, uno o dos dıas despues, como maximo, ya que debecomenzar cuanto antes a desarrollar el trabajo asociado a la segunda practica.

Como resultado de esta primera practica, cada alumno dispondra en su cuenta hendrix-sshde una carpeta denominada programacion1 dentro de la cual se localizaran los siguientesproyectos de pragramacion en C++ con la estructura y denominaciones que se detallan acontinuacion:

1. Area de trabajo practica1 con los siguientes proyectos:

Proyecto C++ Bienvenida

Proyecto C++ Circunferencias

Proyecto C++ Circulo

Proyecto C++ Formatear

14

Practica 2: Diseno y puesta a puntode programas elementales escritos enC++

2.1. Objetivos de la practica

El objetivo de la practica es doble.

En la primera parte de la sesion de laboratorio correspondiente a esta practica cadaalumno va a aprender a utilizar la herramienta de depuracion GDB (o GNU Debugger)integrada en el entorno CodeLite.

En la segunda parte de la sesion cada alumno debe acabar de poner a punto seisprogramas C++ que resuelven sencillos programas que, en esencia, se limitan a transformarla informacion suministrada por el operador modificando su presentacion.

Cada alumno debe haber desarrollado estos programas antes de acudir a la sesion depracticas. El codigo de cada uno de ellos lo puede traer escrito en papel, almacenado en undispositivo tipo pendrive o de un modo alternativo, por ejemplo, accediendo por interneta un mensaje que tenga adjuntos los ficheros con dichos codigos.

En esta segunda parte de la sesion cada alumno podra consultar al profesor las dudas quele hayan surgido y el profesor podra supervisar y hacer un segumiento del trabajo realizadopor cada alumno.

Los seis programas planteados en esta practica deben estar desarrollado y accesibles en lacuenta hendrix de cada alumno antes de finalizar la semana en la que cada alumno tienesu sesion de practicas.

2.2. Tecnologıa y herramientas

Los programas con los que se va a trabajar en esta practica se desarrollaran en una nueva areade trabajo o workspace, denominada practica2, que se ubicara en la carpeta programacion1.

Se creara en el area de trabajo practica2 un primer proyecto denominadoTablasMultiplicar en el cual se desarrollara el programa presentado en el capıtulo 4 del textode la asignatura. Dicho programa presenta por pantalla las tablas de multiplicar que seleccionael operador.

Al codigo de este programa se puede acceder desde la seccion de Materiales Docentes Comunesde la web de la asignatura a traves del enlace CODIGO C++ Y DATOS.

15

Utilizando este programa aprenderemos a crear aplicaciones ejecutables y a utilizar laherramienta GDB de depuracion del proyecto GNU (o GNU debugger) que el IDE CodeLitefacilita integrada en el.

2.2.1. Compilar para generar una aplicacion ejecutable o para depurar elprograma

Para cada uno de los proyectos definidos en el area de trabajo activa es posible seleccionarel modo de trabajo Release (si se desea generar exclusivamente un programa ejecutable) o elmodo de trabajo Debug (si se desea que el codigo ejecutable generado permita la depuraciondel programa). Para hacer esta seleccion debemos acceder al menu Build/ConfigurationManager de CodeLite .

Creacion de una aplicacion ejecutable

Si tenemos la certeza de que el programa desarollado esta libre de errores y nuestro unicoobjetivo es compilar el programa para obtener una aplicacion o programa ejecutable bastaproceder como sigue:

1. Seleccionar la configuracion Release para el proyecto en desarrollo tras seleccionar elmenu Build/Configuration Manager. En nuestro caso lo haremos para el proyectoTablasMultiplicar.

2. Compilar el proyecto TablasMultiplicar ejecutando la orden Build/Build Projecto pulsando la tecla F7. La aplicacion o programa ejecutable TablasMultiplicar sealmacenara en la carpeta Release situada dentro de la carpeta propia del area detrabajo practica2. Si la carpeta Release no existıa previamente, sera creada de un modoautomatico.

3. Para ejecutar la aplicacion o programa ejecutable TablasMultiplicar basta hacer dobleclick en el icono asociado al fichero de la aplicacion.

4. El programa tambien se puede ejecutar desde el entormo CodeLite ejecutando la ordenBuild/Run, pulsando la combinacion de teclas Control+F5 o pulsando el icono querepresenta una pequena flecha de color naranja orientada hacia la derecha.

Depuracion de un programa. Uso del depurador GDB (GNU debugger)

Si nuestro objetivo es depurar un programa para eliminar posibles errores y verificar suadecuado comportamiento deberemos proceder como sigue:

1. Seleccionar la configuracion Debug para el proyecto en desarrollo tras seleccionar elmenu Build/Configuration Manager. En nuestro caso lo haremos para el proyectoTablasMultiplicar.

2. Compilar el proyecto TablasMultiplicar ejecutando la orden Build/Build Project opulsando la tecla F7. La aplicacion o programa ejecutable, con el codigo para la depuraciondel programa TablasMultiplicar, se almacenara en la carpeta Debug situada en lacarpeta propia del area de trabajo practica2. Si la carpeta Debug no existıa previamente,sera creada de un modo automatico.

16

3. Estamos en condiciones de ejecutar el programa utilizando el depurador GDB. Para ellodisponemos de las siguiente ordenes que seran explicadas y aprendidas en la sesion depracticas. Estas ordenes pueden ser ejecutadas desde el menu GDB, pulsando una tecla ouna combinacion de teclas, o haciendo click en alguno de los ocho iconos situados en laparte derecha de la lınea de iconos situado inmediatamente debajo de los menus.

Orden Start/Continue Debugger para arrancar y reanudar el proceso dedepuracion. En un programa se pueden insertar puntos de parada (breakpoints). Ental caso la ejecucion del programa se detendra al alcanzar el siguiente punto de parada(breakpoint). Al producirse la detencion se puede observar el punto de ejecucion,senalado mediante una flecha verde a la izquierda del codigo, y los valores que tomanlos datos visibles, que son mostrados en una ventana auxiliar.

Orden Pause Debugger para hacer una pausa en el proceso de depuracion, cuandoello fuera necesario.

Orden Restart Debugger para reiniciar el proceso de depuracion.

Orden Stop Debugger para finalizar el proceso de depuracion.

Orden Next y Orden Next Instruction para ejecutar paso a paso el programa.

Mas informacion sobre el depurador GDB (GDB debugger) puede consularse enhttp://codelite.org/LiteEditor/Documentation#toc6

En la primera parte de la sesion de esta practica se aprendera a utilizar esta herramienta dedepuracion. El profesor ira dando instrucciones para guiar el proceso de depuracion del programa.

2.3. Trabajo a desarrollar en esta practica

Los problemas que aquı se proponen requieren transformar informacion proporcionada porel operador del programa en una informacion equivalente con diferente formato. La informaciontratada en cada problema es de diferente naturaleza: una fecha del calendario, una cantidad dedinero expresada en una determinada moneda (euro, dolar, etc.), un angulo de un polıgono, laduracion de un periodo de tiempo, etc.

Cada problema exige la puesta a punto de un programa completo en el cual se leen losdatos que proporciona el operador y se calculan y presentan por pantalla los resultados quecorrespondan.

Los programas que resuelven estos seis problemas se desarrollaran en el area de trabajopractica2, creada anterioremente. En ella se definiran seis nuevos proyectos, uno por cadauno de los programas a desarrollar: Fecha, CambioMoneda, Cajero, Tiempo, Romano yTrigonometria.

17

Este trabajo de desarrollo de programas debe ir acompanado por la realizacion de un conjuntode pruebas en busqueda de posibles errores, tal como se describe mas adelante. Esta estrategiase aplicara a todos los trabajos de programacion que se lleven a cabo en esta asignatura.

Los programas a desarrollar, con la descripcion de su comportamiento, y el nombre de suscorrespondientes proyectos se detallan a continuacion.

2.3.1. Proyecto Fecha. Programa de cambio de formato de una fecha

Debe desarrollarse un programa C++ que interaccione con el operador mostrando el siguientecomportamiento:

Escriba una fecha con formato de 8 cifras [aaaammdd]: 14921012

La fecha escrita es 12/10/1492

La fecha escrita por el operador con formato aaaammdd, que se ha subrayado para mayorclaridad, es reescrita por el programa con formato dd/mm/aaaa.

Un segundo ejemplo para ilustrar el comportamiento deseado del programa:

Escriba una fecha con formato de 8 cifras [aaaammdd]: 20140706

La fecha escrita es 06/07/2014

2.3.2. Proyecto CambioMoneda. Programa de cambio de moneda

El programa interactivo que debe ser desarrollado pide al operador que escriba una cantidadde dinero expresada en euros y procede a informarle de su desglose en euros y centimos y tambiende su equivalente en pesetas.

Escriba una cantidad de dinero en euros: 43.653

Son 43 euros y 65 centimos que equivalen a 7263 pesetas

18

Observese que el programa redondea la cantidad de centimos al centimo mas proximo y quela cantidad de pesetas equivalentes es tambien redondeada.

Escriba una cantidad de dinero en euros: 43.6583

Son 43 euros y 66 centimos que equivalen a 7264 pesetas

2.3.3. Proyecto Cajero. Programa sobre el funcionamiento de un cajeroautomatico

El programa interactivo a desarrollar presenta el siguiente comportamiento:

Cantidad a retirar en euros [positiva y multiplo de 10]: 280

Billetes Euros

======== =====

1 10

1 20

5 50

El programa informa al operador del numero de billetes que le devolvera un cajero al retirarla cantidad de dinero por el especificada. Conviene advertir que el cajero dispone unicamente debilletes de diez, de veinte y de cincuenta euros y que siempre minimizara el numero de billetesa entregar.

2.3.4. Proyecto Tiempo. Programa sobre la medida del tiempo

El programa interactivo a desarrollar pide al operador que exprese en segundos el valor deltiempo de duracion de un determininado evento para, a continuacion, informar por pantalla dela equivalencia de ese tiempo en dıas, horas, minutos y segundos.

Duracion en segundos: 615242.83

Este tiempo equivale a 7 dıas 2 horas 54 minutos y 3 segundos

Un segundo ejemplo que muestra los resultados que presenta el programa.

Duracion en segundos: 11412

Este tiempo equivale a 0 dıas 3 horas 10 minutos y 12 segundos

El resultado presenta la cantidad de segundos redondeada al segundo mas proximo.

2.3.5. Proyecto Romano. Programa sobre escritura de numeros romanos

El programa interactivo a desarrollar presenta el siguiente comportamiento:

Escriba un entero entre 1 y 10: 8

8 = VIII

19

El programa pregunta al operador por un numero entero del intervalo [1,10] y le informa porpantalla de su equivalencia como numero romano.

A continuacion se muestra el dialogo entre programa y operador correspondiente a una nuevaejecucion del programa.

Escriba un entero entre 1 y 10: 4

4 = IV

2.3.6. Proyecto Trigonometria. Programa sobre angulos y funcionestrigonometricas

El programa interactivo a desarrollar pide al operador que defina un angulo en grados, minutosy segundos sexagesimales y le informa por pantalla, a continuacion, del valor del angulo enradianes, ası como del valor de los valores de su seno, coseno y tangente. El programa desarrolladodebe presentar los resultado respetando al maximo el formato mostrado en los siguientes ejemplos(los angulos en radianes se expresan con tres cifras decimales y los valores de las funcionestrigonometricas seno, coseno y tangente con cuatro decimales).

Escriba el valor de un angulo (grados, minutos y segundos): 60 0 0

Valor del angulo en radianes: 1.047 radianes

sen 1.047 = 0.8660

cos 1.047 = 0.5000

tg 1.047 = 1.7321

Un segundo ejemplo que muestra los resultados que presenta el programa.

Escriba el valor de un angulo (grados, minutos y segundos): 112 9 45

Valor del angulo en radianes: 1.958 radianes

sen 1.958 = 0.9261

cos 1.958 = -0.3772

tg 1.958 = -2.4550

2.3.7. Realizacion sistematica de pruebas

El trabajo de desarrollo de un programa no concluye hasta que se han realizado todas laspruebas necesarias para validar su buen comportamiento. Por tanto, los programas desarrolladosen esta practica no pueden considerarse terminados hasta que no se hayan realizado una cantidady variedad de pruebas del funcionamiento de los mismos suficiente para tener la conviccion de subuen comportamiento. El objeto de dichas pruebas es localizar errores y fallos de funcionamientopara corregir, a continuacion, sus causas en el codigo fuente.

En los siguientes parrafos se dan algunas pautas para la realizacion de pruebas sobre cadauno de los programas a desarrollar en esta practica 2. Recuerda que el objetivo de hacer pruebases encontrar defectos en los programas realizados, por lo que no deben darse directamente porbuenas las respuestas que tus programas den cuando los estes probando con casos triviales.El programa debe funcionar correctamente tambien en los casos no triviales, en los casosmas comprometidos. Para ello debes identificar esos casos, calcular ’a mano’ los resultadosesperables, y comparar estos con los que proporciona el programa al ser ejecutado.

20

El proyecto Fecha, ademas de probarlo con los datos del ejemplo del enunciado, convieneprobarlo con una fecha cuyo dıa este comprendido entre 1 y 9 y con otra fecha cuyo meseste comprendido entre enero y septiembre. Conviene probarlo tambien con fechas que no seandel calendario, por ejemplo, con la fecha inexistente 20009975. En tal caso no nos debe preocuparcual es el resultado escrito por pantalla, sino que simplemente el programa termine normalmente.

El proyecto CambioMoneda, conviene ser probado con los ejemplos del enunciado y con lassiguientes cantidades de euros: 0.00, 0.99 y 1.00. Cada uno debe calcular antes, a mano o conuna calculadora, los resultados que el programa deberıa dar con las cantidades de 0.99 y 1.00euros y no dar directamente por buenos los que el programa proporcione.

El proyecto Cajero, conviene probarlo ademas de con el ejemplo del enunciado, con otroadicional que cada cual determine y con los valores mınimo y maximo que se pueden sacar deun cajero automatico: 10 y 600 euros, respectivamente.

El proyecto Tiempo, se debiera probar, como mınimo, con los dos ejemplos del enunciado ycon el valor de duracion 0.

El proyecto Romano, se puede probar con todos los valores comprendidos entre 1 y 10. Si seprueba con valores tales como el 0, numeros negativos o superiores a 10, el resultado mostradopor pantalla no importa, lo unico que interesa es que el programa termine normalmente.

El proyecto Trigonometria, se debiera probar, como mınimo, ademas de con los ejemplosdel enunciado, con 0o 0’ 0", 90o 0’ 0" y con 359o 59’ 59".

2.3.8. Resultados del trabajo desarrollado en las dos primeras practicas

Como resultado de las dos primeras practicas, cada alumno dispondra en su cuenta hendrix-ssh de una carpeta denominada programacion1 dentro de la cual se podran encontrar lossiguientes elementos con la estructura y denominaciones que se detallan a continuacion:

1. Area de trabajo practica1 con los siguientes proyectos:

Proyectos C++ Bienvenida, Circunferencias, Circulo y Formatear

2. Area de trabajo practica2 con los siguientes proyectos:

Proyecto C++ TablasMultiplicar

Proyecto C++ Fecha

Proyecto C++ CambioMoneda

Proyecto C++ Cajero

Proyecto C++ Tiempo

Proyecto C++ Romano

Proyecto C++ Trigonometria

21

Practica 3: Diseno modular deprogramas escritos en C++ quetrabajan con datos numericos

3.1. Objetivos de la practica

Los objetivos de la practica son los siguientes.

Aprender a poner a punto programas modulares en C++, desarrollando modulos debiblioteca, por un lado, y programas C++ que hacen uso de ellos, por otro.

Iniciar el desarrollo de algunos modulos de biblioteca con funciones que facilitanoperaciones que trabajan, esencialmente, con datos naturales y enteros.

Programar algunas funciones que resuelven problemas de tratamiento de datos numericosnaturales y enteros.

Al igual que en la practica anterior, lo deseable es que cada alumno acuda a la sesion asociadaa la practica con el trabajo ya hecho y aproveche la sesion de practicas para resolver dudas,completar aquellas tareas en la que hayan surgido dificultades no superadas y para que el profesorsupervise el trabajo realizado.

3.2. Tecnologıa y herramientas

Los proyectos de programacion a desarrollar en esta practica se localizaran en dos nuevasareas de trabajo (workspaces) que han de ser creadas:

Area de trabajo biblioteca, que se ubicara en la carpeta programacion1 y que alojara unproyecto denominados Enteros en el que se desarrollaran los modulos de bibliotecacalculos, fechas y propiedades, con sus ficheros de interfaz y de implementacion, cuyodiseno se inicia en esta practica y que, en su caso, se completara en practicas o trabajosposteriores.

Area de trabajo practica3, ubicada tambien en la carpeta programacion1, que alojara losproyectos asociados a los tres programas ejecutables a desarrollar en esta practica.

22

3.2.1. Puesta a punto de un programa modular

Estructura modular del programa

Todo programa C++ consta de un modulo principal que incluye la funcion main(. . . ). Unprograma C++ puede presentar una estructura modular si, ademas de un modulo principal,consta de uno o mas modulos de biblioteca adicionales.

Se va a poner a punto un programa interactivo y dirigido por menu de estructura modular,muy semejante al presentado en la leccion 7 de la asignatura. El programa consta de un moduloprincipal y de un modulo de biblioteca, el modulo propiedades. Los tres ficheros, el quecontiene el codigo del modulo principal y los correspondientes a los ficheros de interfaz y deimplementacion del modulo de biblioteca, se puede copiar accediendo a su codigo a traves de laseccion de Materiales docentes comunes de la web de esta asignatura.

Fichero verificarPropiedades.cc con el codigo del modulo principal del programa.

Fichero de interfaz, propiedades.h, del modulo propiedades.

Fichero de implementacion, propiedades.cc, del modulo propiedades.

Los recursos definidos en la interfaz del modulo de biblioteca propiedades han de ser visiblesdesde el modulo principal. Para lograrlo, en el codigo del modulo principal se ha de escribir unadirectiva #include, que inserta en el codigo a compilar el codigo del fichero de interfaz delmodulo propiedades. Y para evitar incluir mas de una vez el codigo de la interfaz de estemodulo y evitar ası errores de compilacion, se hara uso en el propio fichero de interfaz de lasdirectivas #define y #ifndef macro . . . #endif. Los detalles sobre el uso de las tres directivascitadas se explican a continuacion.

En el codigo del modulo principal, localizado en el fichero verificarPropiedades.cc, seha de incluir una directiva #include seguida del nombre del fichero de interfaz del modulo.

#include ”../../biblioteca/Enteros/propiedades.h”

Esta directiva hace que el preprocesador C++ trate el contenido del fichero de interfazpropiedades.h como si estuviera escrito en el fichero verificarPropiedades.cc, en elpunto donde se ha situado la directiva.

Con ello se logra visibilidad de los elementos declarados en el fichero de interfaz del modulode biblioteca propiedades a partir de ese punto del modulo principal del programa.

Conviene insistir que el fichero a incluir es el de interfaz del modulo y no el deimplementacion.

Pudiera darse el caso, en un programa que conste de varios modulos, que un mismo ficherode interfaz estuviera repetido en mas de una directiva #include. Ello provocarıa errores decompilacion al estar replicadas las declaraciones de los elementos declarados en la interfazde dicho modulo. Para evitar ese error, se hace uso en el fichero de interfaz del modulo dedos nuevas directivas dirigidas al precompilador de C++.

• La directiva #define cuyo efecto es definir una macro. Ası, por ejemplo, la siguientedirectiva escrita al comienzo del fichero de interfaz del modulo propiedades definela macro PROPIEDADES H. El nombre de esta macro es independiente del codigo delprogarma y solo es relevante para el precompilador de C++.

23

#define PROPIEDADES H

• Una directiva #ifndef macro . . . #endif que indica al compilador que el codigosituado entre su comienzo, #ifndef macro, y su final ,#endif, solo debe ser tenidoen cuenta si macro no ha sido definida previamente.

De esta forma se logra que el contendido del fichero de interfaz de un modulo seaincluido una sola vez por el preprocesador de C++ en el codigo del programa acompilar, independientemente de en cuantas clausulas #include figure el nombrede dicho fichero de interfaz.

Definicion de dos proyectos

Se van a definir dos proyectos.

Proyecto Enteros. Este proyecto se va a crear en el area de trabajo biblioteca. En else van a incluir los ficheros de interfaz y de implementecion del modulo propiedades, esdecir, los ficheros propiedades.h y propiedades.cc.

La forma mas simple de anadir nuevos ficheros a un proyecto es seleccionar la carpetasrc mostrada por el entorno CodeLite y, pulsando el boton derecho del raton, ejecutarla orden Add A New File. Se abre una nueva ventana en la que deberemos escribir elnombre del nuevo fichero.

Proyecto Demo. Este segundo proyecto se va a crear en el area de trabajo practica3. En else ha de incluir el fichero verificarPropiedades.cc con el modulo principal del programaa desarrollar. Desde este modulo principal se hace uso de recursos definidos en el modulopropiedades. Por esta razon los ficheros propiedades.h y propiedades.cc del proyectoEnteros deben ser visibles tambien desde este proyecto.

No debemos duplicar estos ficheros, sino declarar que van a ser utilizados tambien en estenuevo proyecto. Para ello seleccionamos la carpeta src del proyecto Demo mostrada porel entorno CodeLite y, pulsando el boton derecho del raton, ejecutamos la orden Addan Existing File. Se abre una nueva ventana que nos permite seleccionar los ficherosde interfaz e implementacion del modulo propiedades, del proyecto Enteros del area detrabajo biblioteca.

Una vez realizadas estas tareas podemos proceder a compilar el codigo de los diferentesmodulos del proyecto Demo y a ejecutar el programa resultante, comprobando su correctocomportamiento.

3.3. Trabajo a desarrollar en esta practica

El trabajo que cada alumno debe realizar a lo largo de las dos semanas previas a la sesionde laboratorio correspondiente a la practica 3a consta de cuatro tareas que se describen acontinuacion.

1. Primera tarea. Definir el modulo de biblioteca calculos, dentro del proyecto Enteros

en el area de trabajo biblioteca. Este modulo facilita a otros modulos cuatro funcionespara realizar calculos con enteros: factorial(n), fibonacci(n), mcd(a,b) y mcm(a,b).

24

Los ficheros de interfaz y de implementacion de calculos, es decir, los ficheros calculos.hy calculos.cc, se pueden copiar desde la web de la asignatura. Solo falta escribir en elfichero de implementacion el codigo de las funciones fibonacci(n) y mcm(a,b). Estecodigo debe ser disenado por cada alumno. La especificacion de estas dos funciones sepresenta a continuacion.

/∗∗ Pre: La sucesion de Fibonacci es una sucesion infinita de numeros∗ naturales que comienza con el 0 y el 1 y cuyos restantes terminos∗ son iguales a la suma de los dos que le preceden. Estos son los∗ primeros terminos de esta sucesion infinita :∗ 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ...∗ y el valor de n es mayor que cero∗ Post: Devuelve el n−esimo termino de la sucesion de Fibonnaci∗/

int fibonacci (int n);

/∗∗ Pre: a!=0 o b!=0∗ Post: Devuelve el mımimo comun multiplo de [a] y [b]∗/

int mcm (int a, int b);

2. Segunda tarea. Definir el modulo de biblioteca fechas, dentro del proyectoEnteros del area de trabajo biblioteca. Este modulo facilita a otros moduloscuatro funciones para trabajar con fechas del calendario: componer(dia,mes,anyo,f),descomponer(f,dia,mes,anyo), esAnterior(f1,f2) y diaSiguiente(f).

Los ficheros de interfaz y de implementacion del modulo fechas, los ficheros fechas.h yfechas.cc, se pueden copiar desde la web de la asignatura. Falta escribir en el fichero deimplementacion el codigo de las cuatro funciones. Este codigo debe ser disenado por cadaalumno. La especificacion de estas funciones se presenta a continuacion.

/∗∗ Pre: El trıo de datos (dia,mes,anyo) define una fecha valida del calendario,∗ la fecha dia/mes/anyo∗ Post: El valor de f es un entero que, al ser escrito en base 10, tiene la∗ forma aaaammdd que representa la fecha dia/mes/anyo donde los dıgitos∗ aaaa representan el ano, los dıgitos mm el mes y los digitos dd el dıa∗/

void componer (int dia, int mes, int anyo, int& f);

/∗∗ Pre: El valor de f escrito en base 10 tiene la forma aaaammdd donde los∗ dıgitos aaaa representan el ano, los dıgitos mm el mes y los digitos∗ dd el dıa de una fecha∗ Post: Los valores de dia, mes y anyo son iguales al dıa, al mes y al ano∗ de la fecha f∗/

void descomponer (int f, int& dia, int& mes, int& anyo);

/∗∗ Pre: Los valores de f1 y f2 escritos en base 10 tiene la forma aaaammdd∗ donde los dıgitos aaaa representan el ano, los dıgitos mm el mes y∗ los digitos dd el dıa de una fecha del calendario∗ Post: Devuelve true si y solo si la fecha f1 es anterior a la fecha f2

25

∗/bool esAnterior (int f1 , int f2 );

/∗∗ Pre: El valor de f escrito en base 10 tiene la forma aaaammdd donde los∗ dıgitos aaaa representan el ano, los dıgitos mm el mes y los digitos∗ dd el dıa de una fecha∗ Post: Devuelve la fecha correspondiente al dia siguiente de la fecha f ,∗ representada con el mismo formato que la fecha f∗/

int diaSiguiente (int f );

3. Tercera tarea. Desarrollar en el area de trabajo practica3 un segundo proyectodenominado PruebaCalculos, cuya estructura y funcionamiento sea similar a la delproyecto Demo, que sirva, en este caso, para comprobar el buen comportamiento de lascuatro funciones definidas en el modulo calculos. Cada alumno tiene libertad para disenarun programa interactivo dirigido por menu que sirva para ordenar la realizacion del tipocalculos facilitados por las cuatro funciones del modulo calculos.

4. Cuarta tarea. Desarollar en el area de trabajo practica3 un tercer proyecto denominadoPruebaFechas cuya estructura y funcionamiento sea similar a la de los proyectos Demo

y PruebaCalculos, que sirva para comprobar el buen comportamiento de las funcionesdefinidas en el modulo fechas. Cada alumno tiene libertad para disenar un programainteractivo dirigido por menu que sirva para ordenar la realizacion del tipo calculos confechas facilitados por las funciones del modulo fechas.

3.3.1. Resultados del trabajo desarrollado en las tres primeras practicas

Como resultado de las tres primeras practicas, cada alumno dispondra en su cuenta hendrix-ssh de una carpeta denominada programacion1 dentro de la cual se podran encontrar lossiguientes elementos con la estructura y denominaciones que se detallan a continuacion:

1. Area de trabajo biblioteca con un unico proyecto por el momento:

Proyecto C++ Enteros con los siguientes modulos de biblioteca calculos, fechas ypropiedades.

2. Area de trabajo practica1 con los siguientes proyectos C++: Bienvenida,Circunferencias, Circulo y Formatear

3. Area de trabajo practica2 con los siguientes proyectos C++: TablasMultiplicar, Fecha,CambioMoneda, Cajero, Tiempo, Romano y Trigonometria

4. Area de trabajo practica3 con los siguientes proyectos:

Proyecto C++ Demo

Proyecto C++ PruebaCalculos

Proyecto C++ PruebaFechas

26

Practica 4: Diseno modular deprogramas C++ que precisantrabajar con tablas de datos

4.1. Objetivos de la practica

Los diferentes lenguajes de programacion presentan uno o mas tipos de datos predefinidospara trabajar con informacion numerica entera. En C++ hay predefinidos, entre otros, los tiposshort, int o long. En cualquiera de ellos la magnitud de los datos enteros que son capaces derepresentar esta limitada. Si en la implementacion del lenguaje se opta por representar los enteroscon 32 bits, lo cual sucede en muchas implementaciones, solo se podran representar los enterosdel intervalo [−2. 147. 483. 648, 2. 147. 483. 647] o, los naturales del intervalo [0, 4. 294. 967. 295],es decir, enteros o naturales con un maximo de 10 dıgitos.

En esta practica se va a romper la barrera de los 10 dıgitos y de va a trabajar con numerosnaturales que puedan tener decenas o, incluso, centenares de dıgitos.

Cada alumno debe desarrollar, en primer lugar, un modulo de biblioteca denominadonatGrandes que facilite una coleccion de funciones para trabajar con numeros naturales cuyamagnitud pueda ser tan grande como se desee.

Posteriormente debera desarrollar, poner a punto y probar tres programas de aplicacion quetrabajan con naturales cuyo valor puede desbordar muy ampliamente la magnitud de los tiposde datos enteros predefinidos en C++.

Un primer objetivo de esta practica es profundidar en el diseno modular de programas.

Un segundo objetivo es el ejercicio en el diseno de algoritmos que trabajan con estructurasindexadas de datos. La forma de representar grandes numeros naturales propuesta exige eltrabajo con cadenas de caracteres, es decir, con estructuras indexadas (vectores) de datos detipo char.

4.2. Tecnologıa y herramientas

4.2.1. Representacion de numeros naturales mediante cadenas de caracteres

Se propone la representacion de un numero natural, por ejemplo el 27043573, mediante unacadena de caracteres, nat. Tras el dıgito correspondiente a las unidades, la cadena almacena uncaracter cuyo codigo numerico es el 0, que representa el final de la cadena.

27

nat ’2’ ’7’ ’0’ ’4’ ’3’ ’5’ ’7’ ’3’ ’\0’ . . .0 1 2 3 . . . . . . n-1 n-1 n . . .

Una cadena de caracteres es un vector cuyos elementos son datos de tipo char. Conviene teneren cuenta que en la biblioteca predefinida cstring se encuentran definidas algunas funciones quepueden resultar muy utiles al programar alguna de las funciones a desarrollar en esta practica.

4.2.2. Utilidad de la funcion predefinida ignore(numCaracteres,deliminador)

La funcion predefinida ignore(numCaracteres,deliminador) es muy util en el diseno deprogramas interactivos. Facilita que se de por leıda una secuencia de caracteres del flujo deentrada, cuando ello interese. Se recomienta consultar los detalles sobre esta funcion en ladocumentacion sobre las bibliotecas estandar predefinidas en C++.

He aquı una primera aplicacion de la funcion ignore(...) tras leer la respuesta del operador.La funcion leerEntero() devuelve un entero escrito por el operador tras haber completado lalectura de todos los caracteres de la lınea escrita por el operador.

/∗∗ Pre: −−−∗ Post: Lee un entero, desprecia el resto de la lınea que se esta∗ leyendo y devuelve el valor entero leıdo∗/

int leerEntero () {const int MAX LONG LINEA = 128;const char FIN DE LINEA = ’\n’;// Lee un entero escrito por el operador y lo asigna a <respuesta>int respuesta;cin >> respuesta;// Desprecia los restantes caracteres que pudieran haber sido escritos por el operador// en la misma lınea que el entero que acaba de ser leıdocin . ignore(MAX LONG LINEA, FIN DE LINEA);// Devuelve el valor entero leıdoreturn respuesta;

}

He aquı una variante de una funcion de lectura interactiva de un dato entero facilitado por eloperador. La funcion leerEntero(pregunta) se diferencia de la anterior en que desde la propiafuncion se plantea una pregunta antes de leer la respuesta del operador junto con los restantescaracteres de la propia lınea escrita por el operador.

/∗∗ Pre: −−−∗ Post: Plantea <pregunta>, lee un entero, desprecia el resto de la lınea que se esta∗ leyendo y, finalmente, devuelve el valor entero leıdo∗/

int leerEntero (const char pregunta[]) {const int MAX LONG LINEA = 128;const char FIN DE LINEA = ’\n’;// Plantea <pregunta>cout << pregunta << flush;// Lee un entero escrito por el operador y lo asigna a <respuesta>int respuesta;cin >> respuesta;

28

// Desprecia los restantes caracteres que pudieran haber sido escritos por el operador// en la misma lınea que el entero que acaba de ser leıdocin . ignore(MAX LONG LINEA, FIN DE LINEA);// Devuelve el valor entero leıdoreturn respuesta;

}

4.3. Trabajo a desarrollar en esta practica

El trabajo que cada alumno debe realizar a lo largo de las dos semanas previas a la sesion delaboratorio correspondiente a la practica 4a consta de las tareas que se describen a continuacion.

1. Definir el modulo de biblioteca natGrandes, dentro del proyecto NumerosGrandes en elarea de trabajo biblioteca. Este modulo facilita a otros modulos las siguientes funcionespara trabajar con numeros naturales sin limitacion en cuanto a su magnitud:

convertir(n, sec), valor(sec) y sumar(a,b,suma).

El fichero de interfaz del modulo natGrandes es el siguiente.

#ifndef NATURALES GRANDES H

#define NATURALES GRANDES H

/∗∗ Fichero natGrandes.h de interfaz del modulo natGrandes∗/

/∗∗ Pre: n >= 0∗ Post: sec almacena una cadena de caracteres, la secuencia de dıgitos de <n>∗ seguida por el caracter NUL, cuyo codigo ASCII es el ’\0’.∗ Sea nDIG el numero de dıgitos de <n>. El caracter sec[nDIG−1] representa∗ las unidades de <n>, el caracter sec[nDIG−2] las decenas de <n> y ası∗ sucesivamente, y finalmente, el caracter sec [0] representa el dıgito∗ mas significativo de <n>.∗/

void convertir (const int n, char sec []);

/∗∗ Pre: <sec> almacena una secuencia de caracteres que corresponden a los dıgitos∗ de un numero natural comprendido en el intervalo de valores representables∗ por el tipo <int>, seguida por el caracter NUL, cuyo codigo ASCII es el ’\0’.∗ Post: Devuelve el valor numerico del natural almacenado en <sec>∗/

int valor (const char sec[]);

/∗∗ Pre: [a] y [b] almacenan sendas cadenas de caracteres con la secuencias∗ de dıgitos de dos numeros naturales. Sea nA el numero de dıgitos de a∗ y nB el numero de dıgitos de b. Los caracteres a[nA−1] y b[nB−1]∗ representan las unidades, los caracteres a[nA−2] y b[nB−2] las decenas y∗ ası sucesivamente y, finalmente, los caracteres a[0] y b[0] representan∗ los dıgitos mas significativos de a y b, respectivamente.∗ Post: [suma] almacena la secuencia de dıgitos de la suma de los naturales

29

∗ representados por [a] y [b ]. Sea nS el numero de dıgitos de suma.∗ El caracter suma[nS−1] representa las unidades de la suma, el caracter∗ suma[nS−2] representa las decenas y ası sucesivamente y, finalmente,∗ el caracter suma[0] representa el dıgito mas significativo de la suma.∗/

void sumar (const char a[], const char b[], char suma[]);

#endif

2. Disenar un programa interactivo que, al ser ejecutado, itere el siguiente dialogo con eloperador hasta que este responda con un 0 o un negativo. En cada iteracion, pide aloperador que determine las posiciones del primer termino (desde) y del ultimo termino(hasta) de la sucesion de Fibonacci que ha de presentar a continuacion. El programa hade ser capaz de ser capaz de calcular terminos de la sucesion de Fibonacci de hasta 1000dıgitos.

Terminos desde y hasta (0 o negativo para acabar): 10 20

10. 34

11. 55

...

19. 2584

20. 4181

Terminos desde y hasta (0 o negativo para acabar): 40 60

40. 63245986

41. 102334155

...

59. 591286729879

60. 956722026041

Terminos desde y hasta (0 o negativo para acabar): 0

Desarollar este programa en el area de trabajo practica4 en un proyecto denominadoFibonacci.

3. Disenar un programa interactivo que, al ser ejecutado, itera el siguiente tipo de dialogocon el operador hasta que este responde con un 0 o un negativo. En cada iteracion, pide aloperador que determine un numero de dıgitos y, si es positivo, el programa le informa delvalor y posicion del primer termino de la sucesion de Fibonacci con ese numero de dıgitos.El programa ha de ser capaz de ser capaz de calcular terminos de la sucesion de Fibonaccide hasta 1000 dıgitos.

Numero de digitos (0 o negativo para acabar): 3

144 es el termino 13 de la sucesion de Fibonacci

y es el primero con 3 digitos

Numero de digitos (0 o negativo para acabar): 20

12200160415121876738 es el termino 94 de la sucesion de Fibonacci

y es el primero con 20 digitos

Numero de digitos (0 o negativo para acabar): 0

Desarollar este programa en el area de trabajo practica4 en un segundo proyectodenominado PrimerTermino.

30

4. Disenar un programa interactivo que, al ser ejecutado, itera el siguiente dialogo con eloperador hasta que este responde con un negativo. En cada iteracion el programa pide aloperador que determine el valor de un numero natural y le informa del valor del factorial dedicho natural. El programa ha de ser capaz de calcular factoriales con hasta 1000 dıgitos.

Escriba un natural (o un negativo para terminar): 5

5! = 120

Escriba un natural (o un negativo para terminar): 12

12! = 479001600

Escriba un natural (o un negativo para terminar): 20

20! = 2432902000176640000

Escriba un natural (o un negativo para terminar): ...

...

Escriba un natural (o un negativo para terminar): -10

Desarollar este programa en el area de trabajo practica4 en un tercer proyectodenominado Factoriales.

4.3.1. Resultados del trabajo desarrollado en las cuatro primeras practicas

Como resultado de las cuatro primeras practicas, cada alumno dispondra en su cuentahendrix-ssh de una carpeta denominada programacion1 dentro de la cual se podran encontrarlos siguientes elementos con la estructura y denominaciones que se detallan a continuacion:

1. Area de trabajo biblioteca con dos proyectos:

Proyecto C++ Enteros con los siguientes modulos C++ de biblioteca: calculos, fechasy propiedades.

Proyecto C++ NumerosGrandes con el modulo de biblioteca natGrandes

2. Area de trabajo practica1 con los siguientes proyectos:

Proyectos C++ Bienvenida, Circunferencias, Circulo y Formatear

3. Area de trabajo practica2 con los siguientes proyectos:

Proyectos C++ TablasMultiplicar, Fecha, CambioMoneda, Cajero, Tiempo,Romano y Trigonometria

4. Area de trabajo practica3 con los siguientes proyectos:

Proyectos C++ Demo, PruebaCalculos y PruebaFechas

5. Area de trabajo practica4 con los siguientes proyectos:

Proyecto C++ Fibonacci

Proyecto C++ PrimerTermino

Proyecto C++ Factoriales

31

Practica 5: Diseno y puesta a puntode un modulo C++ de funciones quetrabajan con ficheros

5.1. Objetivos de la practica

En esta practica se va a trabajar con ficheros. Se va a analizar su informacion y se van a crearnuevos ficheros.

Se plantea el desarrollo de tres problemas. Para resolverlos sera necesario programaralgoritmos de recorrido, de busqueda y de ordenacion, entre otros.

5.2. Tecnologıa y herramientas

Se va a trabajar con ficheros de texto que almacenan una secuencia de nombres propios depersonas utilizados en diversos paises. Estos nombres son todos ellos simples y constan de unasecuencia de caracteres del alfabeto ingles, es decir, exclusivamente de caracteres comprendidosentre la A y la Z o entre la a y la z. Por lo tanto, en ningun nombre hay caracteres con tildes,ni letras usadas en otros idiomas como la n, la N, la c, la C, la ß, la Œ, la Ø, etc.

Cada nombre propio figura escrito en el fichero entre comillas. Dos nombres propiosconsecutivos estaran en el fichero separados por una coma. Ası, por ejemplo, el fichero de nombresnombresPropios.txt presenta el siguiente contenido:

"MARY","PATRICIA","LINDA","BARBARA",...,"DORSEY","DARELL","BRODERICK","ALONSO"

Todos los ficheros de nombres con los se trabaje en esta practica se ubicaran en la carpetanombres, situada dentro de la carpeta datos, situada, a su vez, en la carpeta programacion1

en la que se ubican las diferentes areas de trabajo definidas en las practicas en esta asignatura.

5.3. Trabajo a desarrollar en esta practica

Cada alumno ha de analizar, disenar y poner a punto tres programas. Cada uno de ellos sedesarrollara en un proyecto diferente dentro de un area de trabajo denominada practica5,situada dentro de la carpeta programacion1. Los proyectos, que se denominaran Editar,Localizar y Valorar, se describen a continuacion.

32

5.3.1. Proyecto Editar. Programa de edicion de un fichero de nombres

Se propone desarrollar un primer programa que permita crear un fichero de nombres, editandolos nombres almacenados en otro fichero de nombres. La edicion consistira en asegurar que cadanombre comience con una letra mayuscula, mientras que sus restantes letras seran minusculas.

Supongamos que un fichero de nombres presenta el siguiente contenido:

"MARY","PATRICIA","linda","BARbara",...,"DORsey","daRELL","BRODERICK","alonso"

El fichero de nombres que creara el programa a desarrollar presentara el siguiente contenido:

"Mary","Patricia","Linda","Barbara",...,"Dorsey","Darrel","Broderick","Alonso"

Se debe disenar un programa interactivo escrito en C++ que mantenga un dialogo con eloperador analogo al que se muestra a continuacion. El operador facilita el nombre de un primerfichero que almacena una secuencia de nombres propios y el del nuevo fichero cuyo contendidosera la misma secuencia de nombres, tras ser editados del modo descrito anteriormente. Elprogama concluye informando del numero de nombres del nuevo fichero, que coincidira con elnumero de nombres del fichero original.

Ambos ficheros se ubicaran en la carpeta programacion1\datos\nombres.

Fichero de nombres propios (en la carpeta de datos): N01.txt

Fichero a crear (en la carpeta de datos): N01_edt.txt

Se ha creado el fichero N01_edt.txt en la carpeta de datos

con 5163 nombres propios

5.3.2. Proyecto Localizar. Programa de localizacion de nombres en un ficherode nombres

Se propone desarrollar un segundo programa que permita localizar los nombres almacenadosen el fichero nombresPropios.txt e informe, en su caso, de su posicion en el fichero.

Se debe disenar un programa interactivo escrito en C++ que mantenga un dialogo con eloperador analogo al que se muestra a continuacion. Observerse que si un nombre no figura en elfichero de nombres, como es el caso del nombre JEREMIAS, el programa debe informar de ello.

Observerse tambien que debe resultar indiferente que el operador utilice mayusculas,minusculas o una combiacion cualquiera de ambas al definir el nombre a localizar.

La ejecucion de este programa no debe modificar el contenido del ficheronombresPropios.txt.

Escriba un nombre (pulse la tecla de RETORNO para acabar): isabel

El nombre ISABEL esta situado en la posicion 313 del fichero

Escriba un nombre (pulse la tecla de RETORNO para acabar): Jeremias

El nombre JEREMIAS no se encuentra en el fichero

33

Escriba un nombre (pulse la tecla de RETORNO para acabar): JOHN

El nombre JOHN esta situado en la posicion 819 del fichero

Escriba un nombre (pulse la tecla de RETORNO para acabar): Mary

El nombre MARY esta situado en la posicion 1 del fichero

Escriba un nombre (pulse la tecla de RETORNO para acabar): MaRiA

El nombre MARIA esta situado en la posicion 7 del fichero

Escriba un nombre (pulse la tecla de RETORNO para acabar):

5.3.3. Proyecto Valorar. Programa de valoracion de nombres de un ficherode nombres

Se propone desarrollar un tercer programa que permita valorar los nombres almacenados enel fichero nombresPropios.txt en base a los siguientes criterios:

La valoracion de cada nombre propio es el producto A×B de dos factores numericos A yB.

El factor A se obtiene sumando las posiciones en el alfabeto ingles de cada una de lasletras que lo componen. Por ejemplo, el factor A del nombre ISABEL es igual a 48 ya que9 + 19 + 1 + 2 + 5 + 12 = 48

El factor B de un nombre es igual a la posicion que ocuparıa en un listado ordenadoalbabeticamente de todos los nombres propios del fichero. En tal caso el factor B delnombre ISABEL es igual a 2072:

0001 AARON

0002 ABBEY

0003 ABBIE

0004 ABBY

. . .

2070 ISA

2071 ISAAC

2072 ISABEL

2073 ISABELL

. . .

Por lo tanto la valoracion del nombre ISABEL sera igual a 99456 ya que A×B = 48×2072 =99456

Se debe disenar un programa interactivo escrito en C++ que mantenga un dialogo con eloperador analogo al que se muestra a continuacion. Observerse que si un nombre no figura enel fichero de nombres, como es el caso del nombre PEPE, su valoracion es 0.

Observerse tambien que debe resultar indiferente que el operador utilice mayusculas,minusculas o una combiacion cualquiera de ambas al definir el nombre a valorar.

La ejecucion de este programa no debe modificar el contenido del ficheronombresPropios.txt.

34

Escriba un nombre (pulse la tecla de RETORNO para acabar): ISABEL

La valoracion de ISABEL es de 99456

Escriba un nombre (pulse la tecla de RETORNO para acabar): ELISABETH

La valoracion de ELISABETH es de 115749

Escriba un nombre (pulse la tecla de RETORNO para acabar): jose

La valoracion de JOSE es de 116718

Escriba un nombre (pulse la tecla de RETORNO para acabar): JoseH

La valoracion de JOSEPH es de 174324

Escriba un nombre (pulse la tecla de RETORNO para acabar): PEPE

La valoracion de PEPE es de 0

Escriba un nombre (pulse la tecla de RETORNO para acabar): TONY

La valoracion de TONY es de 355718

Escriba un nombre (pulse la tecla de RETORNO para acabar): ANTHONY

La valoracion de ANTHONY es de 25705

Escriba un nombre (pulse la tecla de RETORNO para acabar):

5.3.4. Resultados del trabajo desarrollado en las cinco primeras practicas

Como resultado de las cinco primeras practicas, cada alumno dispondra en su cuentahendrix-ssh de una carpeta denominada programacion1 dentro de la cual se podran encontrarlos siguientes elementos con la estructura y denominaciones que se detallan a continuacion:

1. Area de trabajo biblioteca con dos proyectos:

Proyecto C++ Enteros con los siguientes modulos de biblioteca: calculos, fechas ypropiedades.

Proyecto C++ NumerosGrandes con el modulo de biblioteca natGrandes.

2. Area de trabajo practica1 con los siguientes proyectos C++: Bienvenida,Circunferencias, Circulo y Formatear.

3. Area de trabajo practica2 con los siguientes proyectos C++: TablasMultiplicar, Fecha,CambioMoneda, Cajero, Tiempo, Romano y Trigonometria.

4. Area de trabajo practica3 con los siguientes proyectos C++ Demo, PruebaCalculos yPruebaFechas.

5. Area de trabajo practica4 con los siguientes proyectos C++: Fibonacci, PrimerTerminoy Factoriales.

6. Area de trabajo practica5 con los siguientes proyectos:

Proyecto C++ Editar

Proyecto C++ Localizar

Proyecto C++ Valorar

35

Practica 6: Definicion de nuevostipos de datos e implementacion deuna coleccion de funciones basicaspara trabajar con ellos

6.1. Objetivos de la practica

El objetivo de esta practica es aprender a desarrollar programas C++ en los que interesatrabajar con nuevos tipos de datos definidos por el propio programador.

En esta practica se definiran los tipos de datos Persona y ListaPersonas. Un dato de tipoPersona gestiona informacion parcial de una persona, concretamente su fecha de nacimiento ysu sexo (hombre o mujer). Un dato de tipo ListaPersona gestiona la informacion de un grupoo coleccion de cero o mas personas.

En esta practica se debe decidir como representar ambos tipos de datos y, a continuacion,programar una coleccion de funciones basicas para trabajar con datos de cada uno de ambostipos.

Un programa que trabaje con datos de tipo Persona y de tipo ListaPersonas tendra unaestructura modular. Dentro de ella, uno de los modulos, que denominaremos persona, ofrecera alos restantes modulos del programa el tipo Persona y una coleccion de funciones basicas paratrabajar con datos de este tipo. A su vez, un segundo modulo, denominado listaPersona,ofrecera a los restantes modulos del programa el tipo ListaPersonas y una coleccion de funcionesbasicas para trabajar con datos de este tipo.

Se dejara libertad a cada alumno para que desarrolle, como mınimo, dos programas ejecutablesque trabajen con datos de tipo Persona y ListaPersonas.

Al igual que en las restantes practicas, a la sesion de laboratorio asociada a esta practica hayque acudir con el trabajo que se describe a continuacion ya hecho y aprovecharla con un dobleobjetivo:

Consultar al profesor allı presente las dudas surgidas y las dificultades que hayan impedidoresolver satisfactoriamente los problemas planteados y, con su ayuda, tratar de aclarar ideasy avanzar en la resolucion de los problemas surgidos.

Presentar al profesor el trabajo realizado para que este lo pueda revisar, advertir de posibleserrores y defectos y dar indicaciones sobre como mejorarlo y, en su caso, corregirlo.

36

6.2. Tecnologıa y herramientas

6.2.1. Proyecto TipoPersona. Definicion del tipo Persona

La definicion del tipo de dato Persona se localizara en un modulo denominado persona,dentro de un proyecto denominado TipoPersona en el area de trabajo biblioteca situada enla carpeta programacion1.

El codigo del fichero de interfaz del modulo persona tendra la estructura que se muestra acontinuacion. El tipo Persona se definira con una estructura de registro con los campos que elprogramador estime convenientes. Las funciones que el modulo persona pone a disposicion deotros modulos para trabajar con datos de tipo Persona son exclusivamente las tres funcionesespecificadas a continuacion: definirPersona(d,m,a,esMujer), nacido(p) y esMujer(p).

Al desarrollar el codigo de los modulos que trabajen con datos de tipo Persona solo sedebera hacer uso, por razones metodologicas, de la invocacion de las tres funciones citadas ynunca se intentara acceder a los detalles internos de la representacion del dato, es decir, no sedebera trabajar directamente con los campos que se definan en cada dato de tipo Persona.

Esto se puede forzar tecnicamente mediante la declaracion de los campos que se definan encada registro de tipo Persona en una zona de acceso restringido, establecida mediante la palabrareservada private:. Los campos con acceso restringido solo podran ser accedidos por aquellasfunciones que hayan sido declaradas ’friend’ dentro de la propia definicion del registro, enuna zona que sea visible desde el exterior, es decir, que venga precedida por una declaracionpublic:, tal como se ilustra a continuacion.

/∗∗ Fichero de interfaz persona.h del modulo persona∗/

#ifndef PERSONA H

#define PERSONA H

/∗∗ Definicion del tipo de dato Persona∗/

struct Persona {private:

// aquı cada alumno debe definir los campos del registro que permitan// representar la fecha de nacimiento (dia/mes/ano) y el sexo (hombre// o mujer) de una persona

public:friend Persona definirPersona (int d, int m, int a, bool esMujer);friend int nacido (Persona p);friend bool esMujer (Persona p);

};

...

37

...

/∗∗ Pre: d >= 1 y d <= 31, m >= 1 y m <= 12 y a > 0∗ Post: Devuelve un dato de tipo Persona que corresponde a una persona∗ nacida el d/m/a y cuyo sexo viene definido por el valor de∗ [esMujer] (true −> es una mujer, false −> es un hombre)∗/

Persona definirPersona (int d, int m, int a, bool esMujer);

/∗∗ Pre: −−−∗ Post: Devuelve la fecha de nacimiento de [p] como un entero que, al ser escrito∗ en base 10, tiene la forma aaaammdd, donde aaaa: ano, mm: mes y dd: dia∗/

int nacido (Persona p);

/∗∗ Pre: −−−∗ Post: Devuelve true si la persona [p] es mujer y false si es hombre∗/

bool esMujer (Persona p);

#endif

6.2.2. Proyecto ListaPersonas. Definicion del tipo ListaPersonas

El tipo de dato ListaPersonas se definira en un modulo denominado listaPersonas, dentrode un proyecto denominado ListaPersonas en el area de trabajo biblioteca situada en lacarpeta programacion1.

El codigo del fichero de interfaz del modulo listaPersonas tendra la estructura que semuestra a continuacion. El tipo ListaPersonas se definira con una estructura de registro con loscampos que el programador estime convenientes. Las funciones que el modulo listaPersonas

pone a disposicion de otros modulos para trabajar con datos de tipo ListaPersonas sonexclusivamente las seis funciones especificadas a continuacion: nuevaLista(), numPersonas(L),consultar(L,i), anyadir(L,p), retirar(L), y eliminar(L,i).

Al desarrollar el codigo de los modulos que trabajen con datos de tipo ListaPersonas sepodran invocar las seis funciones citadas y, por razones metodologicas, nunca se debera haceruso del conocimiento que se pueda tener sobre la representacion concreta de los datos de tipoListaPersonas, es decir, sobre los campos que definan su estructura interna.

/∗∗ Fichero de interfaz listaPersonas.h del modulo listaPersonas∗/

#ifndef LISTA PERSONAS H

#define LISTA PERSONAS H

...

38

...

#include ”../TipoPersona/persona.h”

const int DIM = 200; // Capacidad maxima de las listas de personas a definir

/∗∗ Representa una lista de datos de tipo Persona con capacidad∗ maxima de almacenamiento igual a DIM∗/

struct ListaPersonas {private:

// La estructura interna de este tipo debe ser definida por cada alumno.// Debe permitir representar un grupo o coleccion integrado entre 0 y DIM// datos de tipo Persona

public:friend ListaPersonas nuevaLista ();friend int numPersonas (const ListaPersonas L);friend Persona consultar (const ListaPersonas L, const int i);friend void anyadir (ListaPersonas& L, const Persona p);friend Persona retirar (ListaPersonas& L);friend void insertar (ListaPersonas& L, const Persona p, const int i);friend void eliminar (ListaPersonas& L, const int i);

};

/∗∗ Pre: −−−∗ Post: Devuelve una lista que no almacena ninguna persona, es decir,∗ devuelve la lista <>∗/

ListaPersonas nuevaLista ();

/∗∗ Pre: La lista L almacena K personas, es decir, L = < p 1, p 2, ..., p K >∗ Post: Devuelve el numero K de personas almacenadas en la lista L∗/

int numPersonas (const ListaPersonas L);

/∗∗ Pre: La lista L almacena K personas, es decir, L = < p 1, p 2, ..., p K >∗ y i >= 1 y i <= K∗ Post: Devuelve p i, es decir , la persona ubicada en la posicion i∗ de la lista L∗/

Persona consultar (const ListaPersonas L, const int i);

...

39

...

/∗∗ Pre: La lista L almacena K personas, es decir, L = < p 1, p 2, ..., p K >∗ y K < DIM∗ Post: La lista L almacena K+1 personas ya que a las K personas que∗ almacenaba inicialmente se ha incorporado p como ultimo elemento de la∗ lista , es decir , ahora L = < p 1, p 2, ..., p K, p >∗/

void anyadir (ListaPersonas& L, const Persona p);

/∗∗ Pre: La lista L almacena K personas, es decir, L = < p 1, p 2, ..., p K >∗ y K > 0∗ Post: Devuelve la persona que ocupaba el primer lugar de la lista L, es∗ decir , p 1, y modifica la lista L eliminando de ella la persona p 1,∗ es decir , ahora L = < p 2, ..., p K >∗/

Persona retirar (ListaPersonas& L);

/∗∗ Pre: La lista L, siendo L = < p 1, p2, ..., p i−1, p i ,..., p K >, almacena K∗ personas, con K < DIM, i >= 1 e i <= K∗ Post: La lista L almacena K+1 personas ya que a las K personas que almacenaba∗ inicialmente se ha incorporado [p] como i−esimo elemento de la lista, es decir ,∗ ahora L = < p 1, p2, ..., p i−1, p, p i , ..., p K >∗/

void insertar (ListaPersonas& L, const Persona p, const int i);

/∗∗ Pre: La lista L, siendo, L = < p 1, p2, ..., p i−1, p i, p i+1, ..., p K >,∗ almacena K personas, K > 0, i >= 1 e i < = K∗ Post: Modifica la lista L eliminando de ella la persona p i, es decir ahora solo∗ almacena K−1 personas, siendo L = < p 1, p2, ..., p i−1, p i+1, ..., p K >∗/

void eliminar (ListaPersonas& L, const int i);

#endif

6.2.3. Proyectos Prueba01 y Prueba02

Cada alumno es responsable de poner a punto dos programas de prueba que permitan verificarel buen comportamiento de los recursos programados en los modulos de biblioteca persona ylistaPersonas. Si lo desea puede desarrollar algun programa de prueba adicional.

El primero de los programas de prueba se desarrollara en un proyecto denominado Prueba01

dentro del area de trabajo practica6 situada en la carpeta programacion1. El segundoprograma de prueba se desarrollara en un proyecto denominado Prueba02 dentro del area detrabajo practica6 situada en la carpeta programacion1.

Cada uno de estos programas tendra una arquitectura modular integrada por tres niveles:

Primer nivel o nivel superior de abstraccion. En este nivel se situa el modulo principal decada uno de los programas de prueba cuyo diseno se apoya en los dos niveles que siguen.

40

Segundo nivel de abstraccion. En este nivel intermedio se situa el modulo listaPersonas:En la definicion del tipo ListaPersonas y del codigo de las funciones del modulo se ha dehacer uso de recursos definidos en el nivel que sigue.

Tercer nivel o nivel inferior de abstraccion. En este nivel se situa el modulo Persona.

Recordemos que es esencial, desde un punto de vista metodologico, que el codigo desarrolladoal programar cualquiera de los modulos descritos no deba tener que ser modificado si en algunode los modulos de menor nivel de abstraccion se decide cambiar la definicion interna de alguno delos tipos de datos, es decir, la definicion del tipo Persona en el modulo persona o la definiciondel tipo ListaPersonas en el modulo ListaPersonas.

6.2.4. Resultados del trabajo desarrollado en las seis practicas de laasignatura

Como resultado de las seis practicas de la asignatura, cada alumno dispondra en su cuentahendrix-ssh de una carpeta denominada programacion1 dentro de la cual se podran encontrarlos siguientes elementos con la estructura y denominaciones que se detallan a continuacion:

1. Area de trabajo biblioteca con cuatro proyectos:

Proyecto C++ Enteros con los siguientes modulos de biblioteca calculos, fechas ypropiedades.

Proyecto C++ NumerosGrandes con el modulo de biblioteca natGrandes.

Proyecto C++ TipoPersona con el modulo de biblioteca persona.

Proyecto C++ ListaPersonas con el modulo de biblioteca listaPersonas.

2. Area de trabajo practica1 con los siguientes proyectos C++: Bienvenida,Circunferencias, Circulo y Formatear.

3. Area de trabajo practica2 con los siguientes proyectos C++: TablasMultiplicar, Fecha,CambioMoneda, Cajero, Tiempo, Romano y Trigonometria.

4. Area de trabajo practica3 con los siguientes proyectos C++: Demo, PruebaCalculos yPruebaFechas.

5. Area de trabajo practica4 con los siguientes proyectos C++: Fibonacci, PrimerTerminoy Factoriales.

6. Area de trabajo practica5 con los siguientes proyectos C++: Editar, Localizar y Valorar.

7. Area de trabajo practica6 con los siguientes proyectos C++: Prueba01 y Prueba02.

41