MIT OpenCourseWare


1.00 Introducción a la informática y a la resolución de problemas de ingeniería. Primavera 2002

Página principal
¿Qué es OCW?
Ayuda
Feedback
Preguntas frecuentes
Glosario
 
 
Página principal del curso
Programa
Calendario
  Material de clase
  Clases de repaso
  Trabajos
  Exámenes
Avisos
  Lecturas obligatorias
  Otras fuentes

   MIT

   
 

Boletín de problemas 5

Todos los cádigos y las imágenes se han elaborado con software Java™ .

Fecha de entrega: viernes 22 de marzo 2002

Problema 1: swing, interfaces y clases internas. [15%]

Como preparación para el problema 2 siguiente, tiene que escribir una aplicación Swing sencilla que utilice una clase interna anónima para controlar la aplicación.

  1. Cree una clase Pow2Frame que expanda JFrame
    1. Defina los miembros de la clase que necesitará:
  • Un botón "Double"

  • Un campo "Value"

  • Un panel que los contenga

    1. Un método main() de tres líneas, como en el material de clase
    2. Un constructor que:
  • Obtenga el contentPane

  • Cree el panel con los botones, etc. y los añada a la ventana

  • Cree la etiqueta, el campo de texto y el botón y los añada a su panel

  • Comprima el marco a un tamaño aceptable

    1. Dentro del constructor, debería crear una clase anónima interna:

                                                               i.  ActionListener, con un método actionPerformed() para el botón "Double". El método debería:

          • Leer el valor String actual del campo Value
          • Convertirlo en un entero (Véase, Integer.parseInt(String s))
          • Doblarlo
          • Convertirlo de nuevo en un String. (Véase, Integer.toString(int i))
          • Definir el campo Value con el nuevo String

No se preocupe por lo que suceda si el campo no contiene un entero válido.

Problema 2. Swing. [85%]

Tiene que escribir una interfaz gráfica de usuario para el sistema de planificación del servicio de autobús que codificó en el boletín de problemas 1. Hemos convertido el programa que realizó en la tarea 1 en una clase BusSystem con los campos y métodos pertinentes que usted puede utilizar para los cálculos de este ejercicio. Descárguelo de la página web del curso 1.00.

La interfaz gráfica de usuario debe tener un aspecto general similar a éste: 

Conviene que la interfaz de usuario pida a éste que introduzca los siguiente datos:

  • La variación en el tiempo de desplazamiento del autobús, mediante un campo de texto. (Emplee valores de 0 a 10 minutos como prueba)

  • La variación en las tarifas de aparcamiento del aeropuerto de Logan, mediante una lista desplegable con los valores 0.00, 2.00, 4.00, 6.00, 8.00 y 10.00. (Recuerde convertirlos de dólares a centavos antes de utilizarlos en el análisis).

  • El peso objetivo que se va a utilizar en el análisis, mediante un campo de texto. (Utilice los valores 1.0 a 4.0 como prueba)

La interfaz debe tener también un botón ‘Calculate’ para realizar los cálculos y mostrar el resultado, y un botón ‘Quit’ para salir del programa. La interfaz debe presentar un dibujo en el que se muestren:

  • Los límites exteriores (L2) del área de servicio, incluidos los cortes radiales

  • Los límites interiores (L1) del área de servicio

  • Las rutas, mostradas a escala (L1 +5), que salen desde el aeropuerto de Logan, y separadas por el ángulo adecuado, basadas en el resultado óptimo del análisis del espaciado de ruta

  • Un etiqueta String para el aeropuerto de Logan

  • El intervalo, el importe del billete y el número de rutas, como Strings

  • El número de usuarios, los ingresos y el coste, como Strings

Puede elegir libremente los colores, las fuentes, el tamaño, etc. No es necesario que tenga un aspecto elegante; con tal de que sea correcto, no importa que sea sencillo.

A continuación, le sugerimos un posible esquema del programa:

  1. Crear una clase BusFrame que expanda JFrame
    1. Defina los miembros de la clase que necesitará:
  • Botones, listas desplegables y campos de texto

  • Un panel que albergue los botones, las listas desplegables y los campos de texto

  • Una referencia a un objeto BusDrawing (escribirá la clase más adelante), que expanda JPanel y contenga el dibujo

  • Una referencia a un objeto BusSystem que haga los cálculos

  • Tamaño del marco (x, y)

    1. Un método main() de tres líneas, como en el material de clase
    2. Un constructor que:
  • Obtenga el contentPane

  • Cree el panel con los botones, etc. y los añada a la ventana

  • Cree el objeto BusSystem

  • Cree el objeto BusDrawing y lo añada a la ventana

  • Cree los campos de texto, las listas desplegables, las etiquetas y los botones y los añada a su panel

    1. Dentro del constructor, debería crear dos clases anónimas internas:

                                                               i.  ActionListener, con un método actionPerformed() para el botón de cálculo. El método debería:

  • Leer el valor actual de la lista desplegable y de los campos de texto

  • Invocar el método de cálculo en el objeto BusSystem. Seguramente tendrá que utilizar setParam() y optimize().

  • Invocar el método busLines() en el objeto BusDrawing, que genere un vector de las formas que se van a dibujar (véase más abajo)

  • Invocar el método repaint() del objeto BusDrawing (que no es necesario que escriba) para dibujarlo.

                                                             ii.   ActionListener, conun método actionPerformed() para el botón Quit.  El método debería llamar a System.exit(0).

  1. Crear una clase BusDrawing que expanda JPanel
    1. Defina los miembros de la clase que necesitará:
  • Vector de formas (arcos, líneas) para dibujar

  • Referencia al objeto BusSystem, del cual obtendrá el espaciado de ruta, etc. que necesitará para su dibujo

    1. Un constructor, que cree un Vector vacío y tome una referencia BusSystem como argumento
    2. Un método busLines() que:
  • Cree el límite exterior como en el objeto Arc2D.Double. Véase Javadoc; observe que el constructor de arcos interpreta los ángulos en grados. Imagine que el límite exterior va de 64 a 296 grados. Utilice el parámetro Arc2D.PIE para el tipo de arco.

  •  Cree el límite interior como otro objeto Arc2D.Double. También va de 64 a 296 grados. Imagine que su radio es siempre la mitad del límite exterior.

  • Cree el número correcto de rutas como objetos Line2D.Double. Utilice una regla simple para dibujarlas. Dibuje la primera ruta a 64 más el espaciado de ruta. Si el espaciado de ruta fuese 40 grados, por ejemplo, la primera ruta se dibujará a 104 grados. Continúe generando líneas mientras el ángulo sea menor de 296 grados.  Como el número de rutas no es un entero, una simple aproximación es suficiente.  Dibuje las líneas en la escala correcta. Tendrá que utilizar Math.sin() y Math.cos(); recuerde que sus argumentos están en radianes.

    1. Un método paintComponent(), que anule el método JPanel paintComponent().  Debería:
  • Invocar siempre la superclase paintComponent()

  • Obtener los 6 resultados y medidas de rendimiento del objeto BusSystem que necesita mostrar. Utilice el método drawString() para mostrarlos

  • Etiquetar el aeropuerto Logan en el centro del círculo

  • Ejecutar un bucle a través del Vector de formas generadas en busLines() e invocar el método draw() method en cada una. Elija los colores, el ancho de línea, etc. que quiera.

  1. Hemos vuelto a escribir la solución al boletín de problemas 1, para convertir ese programa en una clase BusSystem. Es un proceso rápido: lo que hicimos es:
    1. Convertir a todos los parámetros de entrada (costes, coeficientes, distancias, etc.) en miembros privados de la clase. Inicializar todos ellos a los mismos valores utilizados en el problema 1, excepto b, x, e y, cuyos valores variaremos tal como hicimos en el ejercicio 1. No necesitamos yMin, yMax oyIncr, porque no ejecutaremos bucles sobre valores de y.
    2. Hacer que todos los resultados (intervalo, precio del billete, etc.) y las medidas de rendimiento (número de usuarios, ingresos, etc.) sean miembros privados de la clase. No inicializarlos.
    3. No es necesario que hagamos miembros de la clase a las variables intermedias (A0, B0, etc.); pueden ser variables locales en el método optimize(), descrito más adelante.
    4. Crear un constructor que tome b, x e y como argumentos y defina las variables privadas apropiadas. También escribimos un método setParameters() que fijase estas 3 variables.
    5. Crear un método llamado optimize() que calcule todos los valores intermedios, valores óptimos y estadísticas de rendimiento para dicho valor de y. Para ello se utiliza el mismo código que ya escribimos para el ejercicio 1. Elimine el bucle sobre el peso objetivo y; esa lógica de control será gestionada por la clase que llame a nuestro método optimize().
    6. No necesitamos ninguna de las entradas de JOptionPane, etc. La interfaz gráfica de usuario que escriba en este trabajo se encargará de eso.
    7. Escriba un conjunto de métodos getXXX() para obtener los valores óptimos y las estadísticas de rendimiento. Se trata simplemente de métodos de una línea que devuelven la variable privada pertinente. Los necesitaremos para mostrar los resultados.
    8. Eso es todo. Casi no hemos escrito código nuevo. Esta clase no es tan general como nos gustaría, pero es suficiente para esta tarea. En un mundo perfecto, con esta clase se podrían definir todos los parámetros (a través de métodos define) así como obtenerlos (a través de métodos get), etc. Hacer todo esto es sencillo pero tedioso y no es necesario para este ejercicio.

     

    La clase BusFrame debería tener unas 100 líneas de código, y la clase BusDrawing es un poco más corta. Le facilitamos la clase BusSystem, que también tiene unas 100 líneas de código.

Fase de prueba:  haga pruebas con las variaciones temporales de 0 a 10 minutos, variaciones en la tarifa dle aparcamietno de 0$ a 10$, y en los objetivos de 1.0 a 4.0. Si sobrepasa estos límites, es posible que el modelo se salga de su campo de validez. Hemos simplificado el modelo para el ejercicio, por lo que no es especialmente sólido.

Entrega del trabajo

Requisitos

  • Problema 1: solamente por correo electrónico. No es necesario entregarlo en papel.
  • Problemas 2 y 3: copia en papel y copia electrónica de TODOS los códigos fuente (todos los archivos con la extensión .java).
  • Incluya en TODOS los archivos que presente su nombre, el nombre de usuario, la sección, el nombre del profesor ayudante, el número de trabajo y una relación de las personas con las que haya comentado el boletín de problemas. 
  • NO entregue copias electrónicas o en papel de código compilado (archivos .class).

Sanciones

  • Por pérdida de copia en papel: -10% de la puntuación del boletín de problemas.
  • Por pérdida de copia electrónica: -30% de la puntuación del boletín de problemas.
  • Por entrega fuera del plazo: -20% de la puntuación del boletín de problemas si es un día de retraso. Por más de un día de retraso = NO SE PUNTUARÁ

Massachusetts Institute of Technology © 2003 MIT | Información Jurídica | Privacidad
Todo uso del sitio de MIT OpenCourseWare y sus materiales de curso queda sujeto a las condiciones y términos de uso detallados
en la sección sobre Información Jurídica
Copyright © 2003 Portal Universia S.A. Todos los derechos reservados
(Avda. de Cantabria s/n - Edif. Arrecife, planta 00.28660 Boadilla del Monte) - Madrid. España.
Contacta con nosotros: Usuarios | Empresas-Instituciones-Medios comunicación
Código Ético | Aviso Legal | Política de confidencialidad | Quiénes somos: Sala de Prensa