martes, 26 de julio de 2011

Prácticas C++: diccionario simple Español-Inglés




Diseña e implementa en C++, utilizando un enfoque orientado a objetos, un simple diccionario español-inglés en el que a cada palabra en español se le asocie un término en inglés.
  • El diccionario será almacenado en memoria secundaria de forma permanente mediante archivos de texto, uno para los términos en español y otro para los términos en inglés.
  • Desde el menú de consola será posible insertar una entrada, buscar la traducción de una palabra y eliminar un término. Asimismo será posible ver listadas todas las entradas del diccionario. Dicho listado seguirá un orden alfabético de menor a mayor.
  • Por simplicidad, supóngase que todos los términos se introducen en minúsculas.
  • Realiza un diseño previo teniendo como objetivo que el diccionario debe poder invertirse con cierta facilidad, es decir, que si has implementado la versión español-inglés resulte muy sencillo cambiarla a inglés-español o viceversa. Asimismo, ten en cuenta que es probable que en un futuro tengamos que extenderlo a otras versiones, por ejemplo, español-francés o que haya que mejorar las prestaciones (verbigracia, asociando más de una traducción a cada término)

SOLUCIÓN





lunes, 25 de julio de 2011

[Haz clic en la portada del libro para descargarlo]



Un curso de programación estructurada del lenguaje C que le permitirá reunir las bases para entender más adelante C++; va desde lo más sencillo a lo más complejo: presenta los elementos del lenguaje, la estructura de un programa, y aspectos avanzados como punteros, estructuras dinámicas, el preprocesador y algoritmos. Válido para plataformas Windows y Unix/Linux.

Indice

Cap 1 Fases de desarrollo de un programa.
Cap 2 Elementos del lenguaje C
Cap 3 Estructura de un programa
Cap 4 Entrada y salida estándar
Cap 5 Sentencias de control
Cap 6 Tipos de estructura de datos.
Cap 7 Punteros
Cap 8 Funciones
Cap 9 Funciones estándares de E/Es
Cap 10 El procesador de C
Cap 11 Estructuras dinámicas de datos.
Cap 12 Algoritmos.

miércoles, 20 de julio de 2011

Prácticas C++: estudio comparativo de varios métodos de ordenación.





SOLUCIÓN (Incluye simulador algorítmico de la Universidad de San Francisco, con interfaz Java, para visualizar paso a paso los algoritmos de ordenación vistos en clase, además de otros algoritmos sobre otras estructuras de datos ya tratados como Dijkstra, Prim y Kruskal)

[Haz clic sobre la siguiente imagen si deseas descargar el simulador algorítmico de forma independiente al código fuente de la práctica]


Ejemplo de paso de una función como argumento a otra función en C++

View more documents from mejiaff

miércoles, 13 de julio de 2011

Algoritmos de Prim y de Kruskal.






Esquema del algoritmo de Kruskal usando particiones:


Simulador del algoritmo de Prim

Simulador del algoritmo de Kruskal


EJERCICIO: Implementa en C++ los algoritmos de Prim y Kruskal partiendo del mismo grafo de ejemplo del post anterior ("Un tal Prim asfaltando caminos") para verificar que la salida es correcta. Muestra el grafo de partida, el árbol de recubrimiento mínimo obtenido y el coste total de las aristas de dicha solución. Apóyate en los tipos abstractos de datos "Grafo" y, para el algoritmo de Kruskal también "Particion", basados en el paradigma orientado a objetos.



SOLUCIÓN (Prim y Kruskal)

Un tal Prim asfaltando caminos.

Seguramente todos de pequeños jugasteis a aquello de unir varios puntos sin levantar el lápiz del papel para formar una figura. Lo curioso es que ese juego tan inocente, con una pequeña variación, tiene una aplicación muy similar en la vida real que nos permite ahorrar mucho dinero. Imaginaos que hubiera una vieja red de carreteras donde cada una conecta dos pueblos. El ayuntamiento, ante las quejas de sus vecinos por el mal estado de las mismas, está dispuesto a dotar presupuesto suficiente para asfaltarlas de nuevo, de tal manera que todos los pueblos se puedan seguir comunicando mediante los nuevos viales, independientemente de que queden multitud de viejos caminos sin asfaltar. Las únicas condiciones impuestas son que el gasto ha de ser el mínimo posible y que se pueda viajar entre dos pueblos cualesquiera sin necesidad de circular por trazados bacheados. Entonces, llega el ingeniero de turno y realiza un estudio del coste estimado para asfaltar cada vieja carretera. Sólo queda saber elegir cuáles se asfaltarán y cuáles no para comunicar todos los pueblos con el mínimo gasto posible. ¿Quién dijo que era fácil ser alcalde de un ayuntamiento!

Este problema se puede resolver utilizando algoritmos voraces, es decir, algoritmos que seleccionan en cada momento uno de entre varios candidatos (“pueblos”) para optimizar una función objetivo (“el gasto en asfaltado”) sin retractarse de ninguna decisión tomada con anterioridad (“sin levantar el lápiz del papel”). En términos más formales, la red de carreteras es un grafo no dirigido y conexo y lo que pretendemos calcular es el llamado árbol de recubrimiento mínimo. Existen básicamente dos aproximaciones para resolver este problema: el algoritmo de Prim y el algoritmo de Kruskal. Hoy vamos a ver el algoritmo de Prim porque como ya dije es el que más se parece a ese inocente juego de hacer trazados sin levantar el lápiz del papel. Consiste en lo siguiente:
  1. Consideramos siempre dos conjuntos, el conjunto de vértices (“pueblos”) que forman parte del recubrimiento mínimo en construcción (“red de carreteras que se asfaltará”) y el de los vértices aún no considerados (“pueblos candidatos”).
  2. Inicialmente, el primer conjunto incluye un vértice arbitrario.
  3. A continuación, se consideran todas las aristas o carreteras (u,v) tales que u está en el primer conjunto y v en el segundo para seleccionar la de menor coste. Dicha arista se incorpora a la solución (“esa carretera será definitivamente asfaltada”). Obviamente, la arista escogida ya no será considerada de nuevo y el vértice v se elimina del conjunto de candidatos y se incluye en el de vértices pertenecientes al recubrimiento.
  4. El algoritmo acaba cuando ya no queden vértices candidatos.
  5. La mala noticia para el alcalde es que hay casos en que existe más de un recubrimiento mínimo para un mismo grafo y, dependiendo del vértice que se escoja al principio o de la arista que se tome en caso de haber varias con el mismo coste, obtendremos uno u otro. Eso quiere decir que determinados vecinos pueden reclamar soluciones alternativas con el mismo coste que les resulten más ventajosas. Por ejemplo, podrían preferir un trazado A frente a otro B, a pesar de costar lo mismo y ser igualmente óptimos, por el simple hecho de que A los mantiene más cerca del único pueblo con supermercado que el trazado B. Para este tipo de problemas, la algoritmia no nos sirve. ¡Lo siento, señor alcalde!

Aquí tenéis un traceado del algoritmo sobre un grafo de ejemplo por si os habéis perdido en algún punto de la explicación.


Referencias:

El grafo de ejemplo ha sido extraído del punto 11.4.1 de los apuntes de algorítmica de A. Marzal, M.J. Castro y P. Aibar. También podéis encontrar en su obra las soluciones a este y otros muchos problemas implementados en Python, con detallados análisis de su corrección y complejidad.

martes, 12 de julio de 2011

Algoritmo de Dijkstra. Caminos de coste mínimo.




Aplica el algoritmo de Dijkstra al siguiente grafo de ejemplo para que calcule los costes mínimos para ir del nodo origen (nodo cero) hasta el resto de nodos del grafo.

PROPUESTA: trata de mejorar el algoritmo parametrizándolo de manera que pueda servir para calcular los costes mínimos desde cualquier nodo tomado como origen. Asimismo, añade las estructuras de datos y funciones necesarias para visualizar, no solo el coste de los caminos mínimos, sino también los propios caminos, viendo todos los nodos intermedios por los que se va pasando con el coste asociado a cada arista.

SOLUCIÓN

lunes, 11 de julio de 2011

Ejercicio de simulación. Mundo de los Cirles y los Cuadles.


Crea la simulación de un mundo inventado formado por dos tipos de seres: los Cirles y los Cuadles, siguiendo las siguientes especificaciones:
  • Los Cirles tienen cuerpo circular mientras que los Cuadles son cuadrados.
  • Ambos tipos de seres son capaces de desplazarse de forma aleatoria y continua por toda la pantalla de la aplicación a velocidad constante, sin salirse totalmente de sus límites.
  • Los Cirles y los Cuadles se alimentan de una especie de rosquillas de colores que brotan de forma natural en su mundo, aportándoles energía extra, imprescindible para poder desplazarse. Siempre hay algo de alimento disponible y para poder comerlo su posición ha de solaparse a la del alimento.
  • Si alguno de estos seres agota toda su energía irremediablemente muere y desaparece.
  • Todos los seres nacen con una misma cantidad de energía máxima.
  • Cirles y Cuadles aumentan de tamaño a medida que comen hasta alcanzar un máximo.
  • Los Cirles y los Cuadles pueden tener hasta 15 colores diferentes y pueden mudar de color espontáneamente al comer alguna de las rosquillas disponibles.
  • Estos seres son capaces de reproducirse. Para que la reproducción sea posible han de aparearse con seres de la especie contraria, es decir, los Cirles no pueden reproducirse entre sí. Tampoco los Cuadles pueden multiplicarse por sí solos. Sólo es posible el apareamiento entre un Cirle y un Cuadle. Para que esto llegue a buen puerto han de solaparse físicamente y han de atraerse mutuamente (con una probabilidad del 50%).
  • El material genético de ambos seres está formado por un valor 1, 2, ó 3, con la única diferencia de que en los Cuadles este valor es negativo y en los Cirles positivo. Al aparearse dos seres se suma la carga genética del Cuadle con el valor del Cirle y el resultado se interpreta según el siguiente criterio:

    -Valor positivo -> se engendra un Cirle.
    -Valor negativo -> se engendra un Cuadle.
    -Valor cero -> puede ser Cirle o Cuadle al 50%. Las características de color y tamaño también reparten la probabilidad a partes iguales entre las que presentan ambos progenitores.
    -Valor absoluto 1 -> el hijo tiene el 50% de probabilidades de tener indistintamente el tamaño y el color de su progenitor Cirle que de su progenitor Cuadle.
    -Valor absoluto 2 -> el hijo, si es Cirle, tendrá el color de su progenitor Cirle y si es Cuadle, tendrá el color de su progenitor Cuadle, quedando la probabilidad del tamaño repartida al 50% entre ambos progenitores.
    -Valor absoluto 3 -> el hijo, si es Cirle, tendrá el color y el tamaño de su progenitor Cirle, y si es Cuadle, tendrá el tamaño y el color de su progenitor Cuadle.

  • La generación de seres será totalmente aleatoria y sin necesidad de apareamiento al iniciarse el mundo o si alguna de las especies se extingue.
  • No se permitirá la reproducción entre seres de la misma familia, excepto si alguna mutación al comer rosquillas permite que se rompa esta norma general, en cuyo caso, sí se podrá.
  • Cada uno de los seres puede aparearse con cualquier individuo de la otra especie, sin más excepción que la del punto anterior.
  • Habrá un número máximo de hijos para cada ser. Alcanzado el número máximo de hijos engendrados, sólo una mutación genética al comer rosquillas podrá alterar esta situación y permitir seguir engendrando más hijos.
  • Los Cuadles luchan entre sí, al igual que los Cirles. Las luchas tienen lugar cuando se solapan físicamente al enemigo. Gana la batalla el que posea más energía. Si ambos tienen el mismo nivel de energía sobreviven. Si no, el que dispone de menos energía muere.
  • Los miembros de la misma familia no se aniquilan entre sí, a no ser que una mutación al comer rosquillas altere esta norma.
  • Los cambios introducidos por las mutaciones que afectan a la reproducción, al color y la lucha entre familiares se producirán todas juntas al comer rosquillas con una probabilidad del 10%.
  • Los procesos de lucha entre iguales y reproducción entre seres de distinta especie se marcará con una señal sonora y algún indicador visual sobre la pantalla.
  • Se abandonará y destruirá el mundo de Cirles y Cuadles haciendo doble clic sobre la ventana de la aplicación.
SOLUCIÓN

lunes, 4 de julio de 2011

Caso práctico de captura de requisitos mediante Casos de Uso

Caso de estudio del Videoclub "La Esquina"

Ejemplo resuelto de Backtracking recursivo. Agencia matrimonial.

Una agencia matrimonial quiere garantizar a sus clientes el mejor servicio y proporcionar garantías de poder encontrar una pareja estable. Para ello dispone de dos matrices de números naturales: H[1..n][1..N] y M[1..N][1..N] tales que H[i][j] indica la preferencia de un hombre i por una mujer j y M[i][j] la preferencia de una mujer i por un hombre j, para i y j entre 1 y N. Establecida una asignación de N parejas, si existe algún hombre y alguna mujer que, sin estar emparejados entre sí, se prefieren mutuamente a sus respectivas parejas, entonces la asignación es inestable; si no se da tal caso la asignación es estable. Desarrollar un algoritmo que encuentre los emparejamientos estables.

SOLUCIÓN: Descargar código C++

Aprendiendo UML en 24 horas

[Haz clic en la portada del libro para descargarlo]


Contenido:

  • Introducción al UML
  • Orientación a objetos
  • Uso de la orientación a objetos
  • Uso de Relaciones
  • Agragación, compocisión, interfaces y realización
  • Introducción a los casos de uso
  • Diagramas de casos de Uso
  • Diagramas de estado
  • Diagramas de secuencias
  • Diagramas de colaboraciones
  • Diagramas de actividades
  • Diagramas de componentes
  • Diagramas de distribución
  • Nociones de los fundamentos del UMl
  • Adaptación del UML en un proceso de desarrollo