martes, 28 de junio de 2011

Ejercicios de programación orientada a objetos con C++







1.- Descarga el instalador de la librería Winbgim para Dev C++ y ejecútalo (asegúrate de que la versión de tu compilador es la 4.9.9.2). El compilador no debe estar abierto durante la instalación. Esta librería nos dará soporte para gráficos.

2.- Descarga el proyecto Figuras.dev y ábrelo en tu compilador.

3.- Revisa y prueba el código de ejemplo que aparecen en el archivo main.cpp para hacerte una idea sobre el funcionamiento de la clase Ventana para manejar el entorno gráfico y de las distintas clases que representan figuras geométricas.

4.- Crea una clase Cuadrado para representar dicha figura geométrica. ¿Dónde la colocarías en la jerarquía de herencia de las figuras? Dibuja en pantalla un cuadrado azul relleno de rojo de coordenadas (100,100) para el vértice superior izquierdo y (200,200) para el vértice inferior derecho.

5.- Crea un constructor de la clase Cuadrado que en vez de tomar dos de sus vértices, tome la coordenada del centro y la longitud en pixels del lado.

6.- Crea un método moverHorizontal(int distancia) y otro moverVertical(int distancia) que permita mover cualquier tipo de figura en la pantalla a una cierta distancia en pixels desde la posición en la que se encuentra.

SOLUCIÓN: En este proyecto modificado, además de ver cómo resolver el problema del desplazamiento y del cuadrado, podrás aprender a arrastrar figuras concretas con el ratón mediante el reconocimiento automático de si el puntero está encima de una figura en particular al empezar a presionar el botón izquierdo.


7.- Crea una clase LineaPoligonal y otra LineaPoligonalCerrada. Ambas clases almacenarán las coordenadas de varios puntos consecutivos que gráficamente se unen mediante líneas rectas. La única diferencia entre ellas es que la LineaPoligonalCerrada une el primer punto con el último mediante una recta mientras que la LineaPoligonal no ofrece tal posibilidad; es abierta. Dibuja un par de estas líneas para probar su correcta implementación.


SOLUCIÓN

8.- Sobrecarga el operador de suma para que al sumar un número a un rectángulo aumente tanto su alto como su ancho en dicha cantidad.

9.- Ídem al punto anterior pero con el operador de multiplicación.

10.- Crea una función amiga que compare dos rectas. Dos rectas son iguales si tienen la misma longitud y la misma inclinación, aunque ocupen distintas posiciones.

11.- Crea una función area() que devuelva el área de las distintas figuras (el área de la recta será cero).

12.- Crea una función independiente que tome como entrada un vector de figuras de cualquier tipo y sume sus áreas.

13.- Habilita un atributo estático que contabilice el número total de figuras creadas durante la ejecución de un programa.

14.- Implementa un método que nos diga si un rectángulo está completamente dentro de otro.

15.- Utilizando figuras geométricas y el entorno gráfico desarrolla el popular juego del ahorcado con un grafismo similar al que se muestra a continuación. Cada letra no acertada de la palabra oculta hará que se dibuje un trazo hasta completar el dibujo del ahorcado (el jugador pierde) o hasta que el usuario acierte la palabra (el jugador gana). Visualiza en todo momento los intentos que quedan, las letras acertadas y su posición relativa en la palabra oculta.

SOLUCIÓN





Programación orientada a objetos con C++

View more documents from ismaelrubino

Manual básico de programación en C++

View more documents from mariconachacha

lunes, 20 de junio de 2011

Fundamentos de programación - Curso C++ Universidad de Navarra


Introducción al C++Introduccion.pdf
Sentencias de ControlSentencias.pdf
Tipos estructurados de datosTiposDeDatos.pdf
FuncionesFunciones.pdf
Algoritmos de Búsqueda y OrdenaciónAlgoritmos.pdf Diagramas Flujo
Programación Orientada a Objeto - IntroducciónPOO.pdf
Sobrecarga de OperadoresSobrecarga.pdf
Herencia y PolimorfismoHerencia.pdf
Entrada y Salida de datos a FicherosFicheros.pdf

PRÁCTICAS

Practica1.pdf
Practica2.pdf
Practica3.pdf
Practica4.pdf
Practica Calificada: Enunciado, Solución

viernes, 17 de junio de 2011

Teoría: programa demostrativo. Implementar el juego del MasterMind




Enunciado: desarrolla empleando matrices el popular juego del MasterMind. El juego dispondrá de "fichas" de seis colores: verde, azul, rojo, marrón, naranja y amarillo. El jugador dispondrá de un máximo de ocho intentos para conseguir descubrir una combinación oculta de cuatro colores. Tras cada intento se mostrará el número de colores acertados, independientemente de la posición que ocupen, así como el número de colores que ocupan exactamente la misma posición que en la combinación oculta. El juego termina cuando, o bien el jugador acierta la secuencia oculta de colores o cuando agota sus ocho intentos.

SOLUCIÓN


Ejercicio propuesto: Extiende el programa anterior sustituyendo las matrices estáticas por matrices dinámicas de tal manera que el usuario pueda configurar, en tiempo de ejecución, el número de oportunidades disponible.


jueves, 16 de junio de 2011

Be a pointer, my friend!


Empty your memory,
with a free()…
like a pointer!

If you cast a pointer to a integer,
it becomes the integer,
if you cast a pointer to a struct,
it becomes the struct…

The pointer can crash…,
and can Overflow…

Be a pointer my friend…

***

Libera tu memoria,
con un free()...
como un puntero!

Si haces un cast a un puntero a un entero,
se convierte en el entero,
si haces un cast a un puntero a una estructura,
se convierte en la estructura...

El puntero puede romper...
o se puede desbordar...

Se un puntero, amigo mío...


Teoría: programa demostrativo. Resolver un laberinto.




Enunciado: Desarrolla un programa C++ en modo consola que sea capaz de encontrar el camino de salida en un laberinto de dimensiones n x m, solicitadas desde teclado. Los obstáculos o muros del laberinto serán generados de manera aleatoria y se le preguntará al usuario cuál es el número máximo que desea generar.

Especificaciones:

  • El laberinto estará representado por una matriz bidimensional en memoria dinámica.
  • La celda de partida es la (0,0) y la de salida del laberinto, la (n-1, m-1)
  • Si en el tablero generado no hay un camino hasta la celda de salida, el algoritmo debe detectarlo e informarnos de ello.
  • Elabora una medida heurística que permita resolver el problema en el menor número de pasos posible.

Información de interés:


SOLUCIÓN



martes, 14 de junio de 2011

Test de autoevaluación



Descarga el siguiente test de autoevaluación en formato .DOC y marca las respuestas que consideres correctas. Sólo hay una respuesta válida en cada pregunta y se pueden dejar preguntas en blanco. Las preguntas mal contestadas no descuentan. Si prefieres corregir tú mismo el test y ver la nota final puedes marcar tus respuestas en la siguiente web.


lunes, 13 de junio de 2011

Ejercicios con vectores y matrices

1. Escribir un programa que calcule la media de los elementos de un vector así como su varianza.

SOLUCIÓN

2.- Escribir un programa que calcule el producto escalar de dos vectores de enteros. Si v y w son los vectores y n su tamaño, el producto escalar se calcula como el sumatorio de V(i)*W(i)

SOLUCIÓN

3.- Escribir un programa que calcule el valor mínimo y máximo de un vector de enteros.

SOLUCIÓN

4.- Programa que imprime un cuadrado latino de orden n. El cuadrado latino de orden n es una matriz cuadrada en la que cada casilla está ocupada por uno de entre n símbolos de tal modo que cada uno de ellos aparece exactamente una vez en cada columna y en cada fila. Para simplificar el problema podemos ver el cuadrado latino de orden n como una matriz cuadrada en la que su primera fila contiene los n primeros números naturales y cada una de las siguientes n-1 filas contiene la rotación de la fila anterior un lugar a la derecha.

SOLUCIÓN

5.- Desarrolla una función que calcule la transpuesta de una matriz dada de orden nxm. Una matriz es transpuesta de otra si su elemento aij se corresponde con el elemento aji de la anterior.

SOLUCIÓN

6.- Escribe una función que imprima el contorno de una matriz de orden nxm, esto es, que visualice el borde de la misma dejando hueco el lugar de sus valores interiores.

SOLUCIÓN

7.- Escribe un programa que sume los valores de las dos diagonales de una matriz cuadrada de orden n.

SOLUCIÓN

8.- Escribe un programa que cree un cuadrado mágico de orden n. Un cuadrado mágico es una matriz cuadrada en la que todas sus filas, columnas y diagonales suman lo mismo.

NOTA: Utiliza el siguiente algoritmo voraz (sólo sirve para órdenes impares) y luego inténtalo con backtracking recursivo para cualquier orden, par o impar.

RESUMEN del algoritmo:

a) Se coloca el 1 en la posición central de la primera fila

b) Desde 2 hasta el resto de números del cuadrado mágico (n x n), se comprueba si el número colocado con anterioridad es múltiplo de n. Pueden suceder dos cosas:

b.1) Si es múltiplo de n, el número se coloca en la misma columna de la siguiente fila.

b.2) Si NO es múltiplo de n, el número se coloca en la celda de la fila anterior y columna posterior, con la peculiaridad de que la fila anterior a la primera es la última y la columna posterior a la última es la primera, o sea, la matriz es circular.
SOLUCIÓN VORAZ PARA ORDEN IMPAR

SOLUCIÓN BACKTRACKING PARA ORDEN CUALQUIERA

9.- Escribe una función que compruebe el valor o valores que más se repiten en un vector (moda). La función, exactamente, devolverá el número de modas que encuentre, esto es: si ningún valor se repite devolverá cero, si hay sólo una moda devolverá uno y si hay más de un valor con el mismo número de repeticiones nos dirá cuantos valores hay con la misma frecuencia. El valor o valores de la/s modas se almacenará en un vector a modo de parámetro de salida donde cada celda será un par (valor que se repite, frecuencia de repetición) Ejemplo:

{4, 6, 5, 8, 3} -> modas: 0; vector solución = {}

{4, 5, 1, 4, 4} -> modas: 1; vector solución = {(4,3)}

{3, 4, 3, 5, 4} -> modas: 2; vector solucion = {(3,2) , (4,2) }

SOLUCIÓN

10. El cuadrado de Vigenère es un método criptográfico para cifrar mensajes cuya clave es la tabla que se muestra tras este enunciado así como una palabra que se escribe tantas veces como sea preciso hasta cubrir la longitud del mensaje original y se trunca al final si fuese necesario. De esta forma, cada letra del mensaje cifrado se obtiene mediante la intersección de la columna cuya primera letra es la original con la fila cuya primera letra es la letra clave correspondiente. Con un ejemplo se comprenderá mejor: supongamos que la palabra clave es DIA, y que queremos codificar la palabra RAREZAS, entonces se tiene la siguiente situación:


R A R E Z A S
D I A D I A D


La letra clave correspondiente a la primera R es la letra D, entonces la letra que se genera mediante este cifrario es la letra U, ya que la intersección de la columna que empieza por la letra R con la fila que empieza con la letra D es la letra U. De esta forma la palabra codificada será:

UIRHHAV
Desencriptar un mensaje codificado por este cifrario es bastante fácil: se escribe debajo de la palabra codificada la palabra clave tantas veces como haga falta, como se hace para el proceso de codificación, y para encontrar cada letra original se busca la letra codificada en la fila de la correspondiente letra clave, miramos la letra inicial de la columna a la que pertenece y ésta determina la letra original.

Crea dos funciones C++ para codificar y decodificar mensajes con este procedimiento.

SOLUCIÓN

11.- La rejilla de Cardano es un método criptográfico renacentista. Consistía en una rejilla perforada de tal forma que al rotarla 90º hasta 3 veces, conseguía dejar al descubierto las distintas celdas de una tabla, sin que en ningún momento se solapen los cuadros perforados en la posición original y las siguientes giradas un cuarto de vuelta. Esta característica permite ir rellenando la rejilla y cuando se acaban los huecos perforados se gira 90º para seguir rellenando la tabla, así hasta un total de 3 giros. Si sobran huecos al final se dejan en blanco. Retirada la rejilla perforada nos queda el mensaje cifrado en una tabla. Para decodificarlo se superpone de nuevo la rejilla y se va girando 90º hacia el mismo lado que se hizo la codificación. En esta infogafría se muestra un claro ejemplo:

Crea dos funciones C++ para codificar y decodificar mediante este método usando la misma rejilla del ejemplo gráfico.

SOLUCIÓN

12.- Desarrolla un programa que permita imprimir matrices caracol. Las matrices caracol son matrices cuadradas de orden n que almacenan los n x n primeros números naturales, empezando en 1, en forma de espiral como se muestra en la salida de pantalla siguiente:

SOLUCIÓN

13.- Crea un programa que implemente en modo consola el popular juego Lights Out (¡Luces Fuera!). Este juego consiste en un tablero de dimensiones 5 x 5 en el que sus celdas son "bombillas" que pueden estar apagadas o encendidas. El usuario puede seleccionar una celda para cambiar su estado, de apagada a encendida o viceversa. Al mismo tiempo, también cambian de estado las celdas vecinas (las de encima, debajo, izquierda y derecha). El tablero inicial se generará de forma aleatoria. El objetivo del juego es conseguir que se apaguen todas las luces del tablero. Para entender el mecanismo del juego puedes visitar esta web donde podrás probar una versión gráfica en flash.

Mejoras propuestas:

  • Adapta el TDA lista desarrollado en clase de teoría para poder ir registrando las celdas en las que el usuario va efectuando las "pulsaciones". De esa forma, podrás ofrecer una opción de deshacer uno o varios pasos para retomar un estado anterior del tablero.
  • Habilita una opción para que la computadora resuelva automáticamente el puzzle. Para resolverlo de forma sistemática debes llevar a cabo los siguientes pasos:

a) "Pulsa" de derecha a izquierda, en la segunda fila, todas las bombillas que encima (en la primera fila) tengan alguna luz encendida. Esto hará que se apaguen todas las luces de la primera fila.

b) "Pulsa" de derecha a izquierda, en la tercera fila, todas las bombillas que encima (en la segunda fila) tengan alguna luz encendida. Esto hará que se apaguen todas las luces de la segunda fila.

c) Repite este proceso de los pasos a) y b) pero con las filas cuarta y quinta.


d) Si en la última fila han quedado luces encendidas y, por lo tanto, no se ha resuelto el juego, hay que observar el patrón en código binario resultante (luz encendida - 1, luz apagada - 0). Ahora busca en la tabla de la izquierda dicho patrón. Pues bien, el patrón de activación asociado al mismo, en la tabla de la derecha, es el que hay que pulsar al principio del juego antes de empezar el proceso descrito en los pasos a) b) y c) para que en la última fila no queden luces encendidas y por lo tanto se resuelva el puzzle. La computadora podría hacer el ensayo sobre una copia del tablero para descubrir el patrón y luego llevar a cabo el proceso final de resolución en una sola pasada de arriba abajo.


17 -> 24
10 -> 18
28 -> 8
7 -> 2
22 -> 1
13 -> 16
27 -> 4

SOLUCIÓN


Esquema general del backtracking recursivo




Como ejemplo véase el ejercicio de generar todas la permutaciones de los primeros n números naturales.

miércoles, 1 de junio de 2011

Ejercicios con cadenas de caracteres y vectores numéricos.

1. Crea una función que tomando una cadena de texto como entrada coloque todas sus consonantes al principio y todas sus vocales al final de la misma, eliminando los blancos. Por ejemplo, pasándole la cadena "curso de programacion" una posible solución sería "rmcsrpdrgcnuoioaeoa". NOTA: como puede observarse, no importa el orden final en el que aparezcan las consonantes o las vocales entre sí (no tiene por qué coincidir con el posicionamiento original); basta con que se cumpla la condición de que las consonantes estén a la izquierda y las vocales a la derecha. Como contrapartida, NO PUEDES utilizar una segunda cadena auxiliar distinta de la original, sólo punteros y variables de tipos simples.

Solución

2.- Desarrolla una función que elimine los caracteres repetidos de una cadena de texto, incluidos los blancos. Por ejemplo, pasándole la cadena "curso de programacion" nos devolverá "curso depgamin"

Solución

3.- Implementa una función que tomando dos cadenas como entrada nos diga si la segunda es una subcadena de la primera y cuál es la primera posición a partir de la que esto ocurre. Así, pasando como argumentos "mi vecina tiene una bonita cocina" y "cina" devolverá 5 ya que en esa posición es donde se incluye el "cina" de "vecina". Aunque también está incluido en la palabra "cocina", esta inclusión es posterior, por lo que prevalece la primera. En caso de que la segunda cadena no fuese subcadena de la primera la función devolvería una posición inválida, por ejemplo, -1

Solución

4. Desarrolla una función que tomando como entrada una cadena de texto nos devuelva si es o no un palíndromo. Se denomina palíndromo a una palabra o frase que, ignorando los blancos, se lee igual de izquierda a derecha que de derecha a izquierda. Por ejemplo: "ligar es ser agil". Para simplificar le problema puedes suponer que se usan caracteres simples, es decir, sin tildes ni diéresis y todos en minúscula.


Solución

5.- Implementa una función que tomando como entrada una cadena de texto sea capaz de contabilizar el número de palabras. Ten en cuenta que entre dos palabras puede haber más de 1 blanco. También al principio y al final de la frase puede haber blancos redundantes. Por ejemplo, para la oración " puedo perdonarte por el daño que me has hecho pero, ¿como podré perdonarte por el mal que te has hecho a ti mismo? " devolvería el valor 23

Solución

6.- Crea una función que tome como entrada un número de D.N.I. y devuelva la letra correspondiente a dicho número. Para ello, debes dividir el número del D.N.I. entre 23 y seleccionar la letra correspondiente al resto obtenido en dicha división según la siguiente tabla de correspondencias:

Así, por ejemplo, al número 34.324.445 le corresponde la letra G ya que el resto resultante de dividir 34324445 entre 23 es 4.

Solución

7.- Según el historiador Cayo Suetonio el dictador perpetuus Julio César utilizaba un código cuando quería mantener en secreto un mensaje. Tomaba cada una de las 21 letras del albafeto latino (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, V) y las sustituía por otra letra situada n posiciones más a la derecha en el orden alfabético anterior. Así, si n=3, a la A le correspondería la D. Este simple código además de ser un código de sustitución es un código de rotación ya que para las últimas letras se vuelve a retomar el conteo por el principio. Esto es, de nuevo para n=3, a la S le correspondería la A. Ahondando en el ejemplo, para n=3 si el emperador afirmaba que "la suerte está echada" (ALEA IACTA EST) el mensaje cifrados sería DOHD LDFBD HAB.
Crea una función que codifique y otra que descodifique los mensajes cifrados con este sistema para un n positivo cualquiera.



Solución

8. Desarrolla un programa que permita a dos personas jugar al juego de sumar 15. Los jugadores juegan por turno y en cada turno el jugador debe seleccionar alguna de las casillas sin marcar del tablero.
Gana el primero que consiga sumar 15 sumando el valor de 3 de las casillas que ha marcado. Como ejemplo, veamos una partida:

Tenemos dos jugadores A y B. En cada turno, el jugador que le toca indica en qué casilla libre quiere jugar. Comienza el jugador A y decide marcar el 5; el jugador B, por su parte, marca el 3.

En la siguiente jugada el jugador A decide marcar el 2 y el B elige el 8 para evitar que A consiga 15 en la siguiente ronda.


Entonces A marca el número 4 para impedir que B sume 15 y al mismo tiempo consigue encarrilar la partida ya que suma 15 con 4+5+6 y con 2+4+9. Por lo que en la siguiente jugada, B sólo podrá seleccionar el 6 o el 9 para impedir una de las posibilidades pero entonces a A le bastará con seleccionar la otra para ganar.

B se decide a seleccionar el 6 para impedir que A sume 15 con 4+5+6

Pero como había previsto, A acaba ganando la partida al seleccionar el 9 y sumar 2+4+9=15

NOTA: el programa validará las entradas comprobando que el valor introducido corresponde a una casilla libre. Asimismo, avisará de quién ha sido el ganador cuando se llegue al final de una partida y se podrán jugar tantas partidas consecutivas como se desee. En cada partida debe iniciar el turno un jugador diferente. Por otra parte, llevará el recuento de cuántas partidas lleva ganadas cada jugador.

Solución

9.- Desarrolla un programa que lea un numero entero n positivo y muestre por pantalla las n! permutaciones sin repetición de los n primeros números naturales.

La solución consiste en generar ordenadamente las permutaciones. La primera que se ha de generar es la formada por los n números en el orden natural ascendente y la última que se obtiene es la formada por dichos números en orden inverso.

Primera: 1,2,3,...,n-1,n
Última: n, n-1, ..., 3,2,1

Diremos que una permutación Q es posterior a otra P si comparando sus números, uno a uno, de izquierda a derecha, se cumple que en el primer número diferente el número de Q es mayor que el de P. Así, para generar la permutación Q que sigue a una dada P se procede de la siguiente manera:

Sea la pemutación P=a1, a2, ..., an
a) Se busca de derecha a izquierda el primer número ai que sea menor que el que le sigue (ai< ai+1);
b) Se busca de derecha a izquierda el primer número aj que sea mayor que ai (aj>ai)
c) Se intercambian ambos números.
d) Se invierten los números que siguen a la posición i


Por ejemplo, si se están generando las permutaciones de 7 y sea P=5,6,3,7,4,2,1 entonces:

a) ai=3 (3<7)
b) aj=4 (4>3)
c) 5,6,4,7,3,2,1
d) 5,6,4,1,2,3,7

Por tanto la siguiente permutación Q=5,6,4,1,2,3,7


Solución

Solución alternativa usando backtracking recursivo