Práctica de Fundamentos de Programación Curso 2011 2012 Índice 1. Introducción 2 2. Especificación de requisitos 2 2.1.Opción1:Introducirlaspreferenciasdeunusuario... 3 2.2.Opción2:Listarlaspreferenciasdetodoslosusuarios... 4 2.3.Opción3:Calcularlafechaóptimaparalareunión... 4 3. Diseño 4 3.1.Móduloprincipal:Planificador... 5 3.2.Abstracciónfuncional:Calendario... 5 3.3.Tipoabstractodedatos:TipoPreferencia... 7 3.4.Tipoabstractodedatos:TipoListaDePreferencias... 8 3.5.Tipoabstractodedatos:TipoFechaElegida... 8 3.6.Tipoabstractodedatos:TipoListaDeFechasElegidas... 8 4. Material que el alumno deberá entregar al tutor 10 1
1. Introducción El objetivo de esta práctica es que el alumno ejercite todo lo estudiado en la asignatura Fundamentos de Programación, haciendo especial hincapié en el uso de la descomposición modular de programas como herramienta para resolver problemas complejos. Por ello, se aconseja que antes de tratar de resolver la prática, se lean detenidamente los capítulos 14 y 15 del libro de teoría [1], y el capítulo 9 del libro de prácticas [2]. Existen herramientas informáticas, como Doodle [3], que facilitan a grupos de personas ponerse de acuerdo sobre qué fecha es la más idónea para realizar una reunión. Cada usuario introduce sus preferencias en la herramienta y ésta identifica la fecha que ha sido elegida más veces. En esta práctica, el alumno implementará una versión simplificada de este tipo de programas, que se limitará a la gestión de una sola reunión. Este documento se estructura como sigue. La Sección 2 detalla el enunciado del problema que el alumno deberá resolver, es decir, QUÉ debe implementarse. La Sección 3 plantea el diseño que el alumno deberá seguir para resolver la práctica, es decir, CÓMO debe implementarse la solución. Por último, la Sección 4 describe el material que alumno deberá entregar al tutor. 2. Especificaciónderequisitos La Figura 1 muestra la pantalla de inicio del programa que el alumno debe desarrollar. Los usuarios pueden elegir las opciones 1 3 tantas veces como deseen. Es decir, a diferencia de las prácticas anteriores, este programa se ejecutará indefinidamente hasta que no se seleccione la opción 4. Tras la ejecución de cualquiera de las opciones 1, 2 ó 3 se volverá a imprimir la pantalla de inicio. PLANIFICADOR DE EVENTOS PARA REUNIONES 1. Introducir las preferencias de un usuario 2. Listar las preferencias de todos los usuarios 3. Calcular la fecha optima para la reunion 4. Salir Figura 1: Pantalla de inicio 2
2.1. Opción 1: Introducir las preferencias de un usuario La opción 1 permite que un usuario introduzca qué fecha prefiere para celebrar la reunión. Esta opción consta de los siguientes pasos: 1. El usuario introduce su nombre, que podrá tener como máximo 50 caracteres. 2. El usuario indica qué mes y año prefiere para celebrar la reunión. 3. El programa imprime en pantalla la hoja de calendario correspondiente siguiendo el formato especificado en el capítulo 8 del libro de prácticas [2]. 4. El usuario introduce el día de reunión. Nombre?Luis Mes (1..12)?2 Anno (2011..3000)?2012 FEBRERO 2012 =========================== LU MA MI JU VI SA DO ===========================.. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29.... Dia?5 Figura 2: Ejemplo de ejecución de la opción 1 El programa comprobará que el día, el mes y el año introducidos satisfacen los siguientes rangos: 2011 año 3000 1 mes 12 1 día número de días del mes Si el usuario viola alguno de los rangos, el programa imprimirá un mensaje de error descriptivo y volverá a imprimir la pantalla de inicio (Figura 1) sin almacenar la preferencia. Por ejemplo, en la Figura 2 el usuario ha escogido el mes 2 del año 2012; si hubiera seleccionado el día 30, se habría mostrado el siguiente mensaje: <<ERROR: El maximo numero de dias para ese mes es 29>> 3
2.2. Opción 2: Listar las preferencias de todos los usuarios La Figura 3 muestra el resultado de ejecutar la opción 2, que imprime un listado con todas las preferencias introducidas hasta el momento. 1. Como límite de almacenamiento, se prodrán introducir hasta un máximo de 50 preferencias en total. 2. Un usuario puede introducir tantas preferencias como desee. Por ejemplo, en la Figura 3, Nacho ha elegido hacer la reunión el 3-2-2012 ó el 6-2-2012. LISTADO DE PREFERENCIAS: Maria prefiere que la reunion sea el 6-2-2012 Luis prefiere que la reunion sea el 5-2-2012 Ana prefiere que la reunion sea el 7-2-2012 Antonio prefiere que la reunion sea el 5-2-2012 Marta prefiere que la reunion sea el 6-2-2012 Nacho prefiere que la reunion sea el 6-2-2012 Nacho prefiere que la reunion sea el 3-2-2012 Figura 3: Ejemplo de ejecución de la opción 2 2.3. Opción 3: Calcular la fecha óptima para la reunión La opción 3 ordena las fechas propuestas por los usuarios según el número de veces que han sido elegidas (de mayor a menor). Por ejemplo, la Figura 4 muestra el resultado de ejecutar la opción 3 con los datos listados en la Figura 3. En este caso, la fecha óptima de reunión sería el 6-2-2012. LISTADO DE FECHAS ELEGIDAS: 6-2-2012 ha sido elegida 3 veces 5-2-2012 ha sido elegida 2 veces 7-2-2012 ha sido elegida 1 veces 3-2-2012 ha sido elegida 1 veces Figura 4: Ejemplo de ejecución de la opción 3 3. Diseño La Figura 5 muestra el diagrama de estructura que el alumno debe seguir para realizar la práctica. El diseño consta de un módulo principal (Planificador) y 5 4
módulos auxiliares (Calendario, TipoPreferencia, TipoFechaElegida, TipoLista DePreferencias y TipoListaDeFechasElegidas). Aconsejamos que se siga una estrategia de integración ascendente [5]. Es decir, en lugar de esperar a tener escritos todos los módulos para compilar el programa, conviene que el alumno vaya creando sus propios programas principales parciales que le permitan verificar el funcionamiento de cada módulo auxiliar por separado. Así, se debería escribir un programa principal CalendarioPrincipal.cpp para verificar el módulo Calendario, un programa TipoPreferenciaPrincipal.cpp para verificar el módulo TipoPreferencia, etc. Figura 5: Diagrama de estructura 3.1. Módulo principal: Planificador La Figura 6 muestra el código del módulo principal Planificador.cpp. 3.2. Abstracción funcional: Calendario La figura 7 muestra el fichero de interfaz Calendario.h, que imprime en pantalla un calendario, tal y como se especifica en el capítulo 8 del libro de prácticas [2]. 5
1 #include <stdio.h> 2 #include "TipoListaDePreferencias.h" 3 #include "TipoListaDeFechasElegidas.h" 4 5 int main() { 6 int opcion; 7 TipoPreferencia preferencia; 8 TipoListaDePreferencias preferencias; 9 TipoListaDeFechasElegidas fechaselegidas; 10 11 preferencias.inicializarpreferencias(); 12 opcion = 0; 13 14 while (opcion!= 4) { 15 printf("\n\nplanificador DE EVENTOS PARA REUNIONES\n\n"); 16 printf("1. Introducir las preferencias de un usuario\n"); 17 printf("2. Listar las preferencias de todos los usuarios\n"); 18 printf("3. Calcular la fecha optima para la reunion\n"); 19 printf("4. Salir\n"); 20 scanf(" %d", &opcion); 21 if ( (opcion <1) (opcion >4) ) { 22 printf("\n<<error: opcion incorrecta>>\n"); 23 } 24 if (opcion == 1) { 25 preferencias.annadirpreferencia(preferencia); 26 } 27 if (opcion == 2) { 28 preferencias.imprimirpreferencias(); 29 } 30 if (opcion == 3) { 31 fechaselegidas.obtenerfechaselegidasapartirdelaspreferencias(preferencias); 32 fechaselegidas.ordenarfechaselegidas(); 33 fechaselegidas.imprimirfechaselegidas(); 34 } 35 } 36 } Figura 6: Planificador.cpp 6
1 /*************************************************** 2 * Interfaz del modulo: Calendario 3 * 4 * Este modulo define la abstraccion funcional ImprimirCalendario, 5 * capaz de imprimir en pantalla un calendario, tal y 6 * como se especifica en el capitulo 8 del libro: 7 * "Practicas de Programacion en C+-", de 8 * Jose A. Cerrada, Manuel Collado, Ismael Abad y Ruben Heradio. 9 * Editorial Centro de Estudios Ramon Areces 10 ***************************************************/ 11 12 #pragma once 13 14 const int Aini = 2011; /* anno minimo para proponer una reunion */ 15 const int Afin = 3000; /* anno maximo para proponer una reunion */ 16 17 /* ImprimirCalendario: 18 * - imprime el calendario correspondiente a Mes y Anno 19 * - devuelve el numero total de dias de Mes, que puede ser: 20 * * 28, 29, 30 o 31 si el mes y el anno son correctos 21 * * 0 si el mes o el anno son incorrectos 22 */ 23 int ImprimirCalendario(int Mes, int Anno); Figura 7: Calendario.h 3.3. Tipo abstracto de datos: TipoPreferencia El tipo abstracto TipoPreferencia incluirá los siguientes subprogramas, cuyo comportamiento se resume en la Figura 8: 1. La función PreguntarPreferenciaAlUsuario: a) Pregunta al usuario su preferencia. b) Imprime el calendario que corresponde al mes y año especificados. Para ello, utiliza la función ImprimirCalendario del módulo Calendario. c) Guarda el resultado en una variable TipoPreferencia. d) Devuelve false si el día, el mes o el año son incorrectos. En caso contrario, devuelve true. 2. El procedimiento ImprimirPreferencia imprime una preferencia con el formato: nombre prefiere que la reunion sea el día-mes-año 7
Figura 8: Comportamiento del módulo TipoPreferencia 3.4. Tipo abstracto de datos: TipoListaDePreferencias El tipo abstracto TipoListaDePreferencias almacena todas las preferencias de los usuarios. 3.5. Tipo abstracto de datos: TipoFechaElegida El tipo abstracto TipoFechaElegida almacena cuántas veces ha sido seleccionada una fecha. 3.6. Tipo abstracto de datos: TipoListaDeFechasElegidas El tipo abstracto TipoFechaElegidas almacena todas las fechas propuestas y el número de veces han sido elegidas. Dispondrá de los siguientes procedimientos, cuyo comportamiento se resume en la Figura 9: 1. ObtenerFechasElegidasAPartirDeLasPreferencias convierte una variable TipoListaDePreferencias en TipoListaDeFechasElegidas 2. OrdenarFechasElegidas ordena una variable TipoListaDeFechasElegidas de mayor a menor según el número de preferencias de cada fecha. Para implementar este procecimiento se recomienda adaptar el método de inserción directa explicado en el capítulo 12 del libro de teoría [1]. 8
Figura 9: Comportamiento del módulo TipoListaDeFechasElegidas 9
4. Material que el alumno deberá entregar al tutor El alumno deberá entregar: 1. El programa ejecutable Planificador.exe que implementa lo especificado en la Sección 2. 2. Los ficheros que implementan los módulos descritos en la Sección 3: a) Calendario.h y Calendario.cpp b) TipoPreferencia.h y TipoPreferencia.cpp c) TipoListaDePreferencias.h y TipoListaDePreferencias.cpp d) TipoFechaElegida.h y TipoFechaElegida.cpp e) TipoListaDeFechasElegidas.h y TipoListaDeFechasElegidas.cpp Referencias [1] José Antonio Cerrada Somolinos y Manuel Collado Machuca. Fundamentos de Programación. Editorial Universitaria Ramón Areces, 2010. [2] José Antonio Cerrada Somolinos, Manuel E. Collado Machuca, Ismael Abad Cardiel, Rubén Heradio Gil. Prácticas de Programación en C ±. Editorial Universitaria Ramón Areces, 2010. [3] Web oficial de Doodle: http://doodle.com/ [4] Web oficial de la asignatura Fundamentos de Programación con C±: [5] José Antonio Cerrada Somolinos et al. Introducción a la ingeniería del software. Editorial Universitaria Ramón Areces, 2000. 10