You are on page 1of 21

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

Algoritmos y Estructuras de Datos I


Objetivo: Conocimientos mnimos sobre estructuras de datos: Pilas y Colas. Ejercitarse en el uso de estructuras de datos sobre pilas y colas.

30 minutos
Teora: Explicacin terica breve de lo que es una estructura de datos Pila. Implementacin con la colaboracin de los alumnos de una Pila de enteros.

Preguntas: Diferencias de implementacin entre una pila de enteros, reales, objetos, etc? Como soluciona esto Java: Stack, genricos. Cmo se utiliza la clase Stack? Mirar (se resuelve en la siguiente clase).

30 minutos
Teora: Explicacin terica breve de lo que es una estructura de datos Cola. Implementacin con la colaboracin de los alumnos de una Cola de enteros. Es aplicable a una cola el concepto de genricos visto anteriormente? Existe alguna clase en java que implemente una cola? Se resolver en la prxima clase.

15 minutos
Ejercicio: Utilizando las estructuras de datos anteriores determinar si una palabra o frase es palndroma. Se le ocurre otra forma de determinar si una palabra o frase es palndroma sin utilizar estas estructuras de datos?

15 minutos
Ejercicio: Ejercicio para repaso de arrays. Por si hubiera algn problema con este concepto. Dibujo de un tablero de ajedrez en modo consola.

15 minutos
Ejercicio: Implementacin de los combos de movimiento en un videojuego. Utilizacin de Cola.

15 minutos
Ejercicio: Clculo de expresiones matemticas con parntesis. Utilizacin de una Pila.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

Trabajo en Casa
Ejercicios: Cmo se utiliza la clase Stack? Que se lo miren y se resuelve en la siguiente clase. Existe alguna clase en java que implemente una cola? Se deja a los alumnos que lo hagan para resolverlo en la prxima clase. Resolucin de los ejercicios que no de tiempo a terminar en clase. Escribir el contenido de una pila utilizando slo los mtodos pblicos de la clase Pila. Escribir el contenido de una Pila, empezando por la base, utilizando la clase Pila y dejndola como estaba originalmente. Pilas y Colas como ejemplo de planificador de tareas es un sistema operativo.

Conexin a Prcticas
Ejercicios: Estos conceptos se utilizarn en la sesin I de prcticas sobre algoritmos y estructuras de datos.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

1 Qu es una Pila
Una Pila (stack) es una estructura de datos en la que se permite almacenar informacin apilando los elementos, es decir, uno sobre otro. Un ejemplo tpico es un tubo de pastillas. Las pastillas en el tubo estn una encima de la otra. La estructura de datos Pila tiene unas caractersticas y un comportamiento que va a hacer que sea sencillo implementar la pila como una clase bajo programacin orientada a objetos. El comportamiento de una estructura de datos pila se caracteriza por seguir una poltica de insercin/obtencin de elementos LIFO (Last In First Out), es decir, el ltimo elemento en entrar en la pila es el primer elemento en salir1. Como caracterstica propia de una pila podemos decir que al extremo desde el cual se sacan e insertan elementos se le denomina cima. Para completar el comportamiento la estructura de datos Pila diremos que dispone de las siguientes operaciones importantes: 1. Apilar (push): Inserta un elemento en la cima. 2. Desapilar (pop): Obtiene el elemento de la cima. Siguiendo con el ejemplo del tubo de pastillas, la operacin apilar insertara una pastilla y la operacin desapilar obtendra la pastilla de la cima del tubo. Algunos ejemplos de utilizacin de estructuras de datos pilas los podemos encontrar en los siguientes contextos: 1. Evaluacin de expresiones en notacin postfija (notacin polaca inversa2). 2. Reconocedores sintcticos de lenguajes independientes de contexto. 3. Implementacin de recursividad. Aspecto que veremos la tercera sesin de algoritmos. 4. Sistemas operativos.

1 2

Toda variacin de este comportamiento har que nos encontremos ante una estructura de datos diferente a una pila. Haremos un ejercicio de este caso. 3

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

2 Pila de Enteros
A continuacin se muestra un ejemplo de implementacin de una pila de enteros que cumple con las caractersticas y comportamiento mencionados anteriormente. A esta pila de enteros se le ha aadido funcionalidad mediante los siguientes mtodos: 1. public boolean vacia(): Este mtodo es utilizado para saber si la pila est vaca de elementos. 2. public boolean llena(): Este mtodo comprueba si la pila est llena. 3. public int numElementos(): Comprobacin del nmero de elementos de la pila. 4. public void imprimir(): Mtodo utilizado simplemente como comprobacin para determinar si la pila est bien implementada. No es un mtodo propio del comportamiento de una pila. La clase es la siguiente:
/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Pila de Enteros. */ /** * Pila de enteros. */ class Pila { /** Mximo nmero de elementos a insertar en la pila*/ private int numElementos; /** Almacn de datos en el que se insertan los elementos **/ private int elementos[]; /** Referencia al ltimo elemento insertado. */ private int indice; /** Inicalizacin del estado del objeto */ Pila(int numElementos) { this.numElementos = numElementos; // En java el primer ndice de un array es 0. indice = -1; // Creamos el array elementos = new int [numElementos]; } /** Indica si la pila est vacia */ public boolean vacia() { return (indice == -1); } /** Indica si la pila est llena */ public boolean llena() { return (indice == numElementos-1); } /** Inserta un elemento en la pila. No hay control de errores. */ public void apilar(int elemento) { indice ++;

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
elementos[indice] = elemento; } /** Saca un elemento de la pila. No hay control de errores */ public int desapilar() { int elemento = elementos[indice]; indice--; return elemento; } /** Devuelve el nmero de elementos que tiene la pila */ public int numElementos() { return indice+1; } /** Imprime los elementos de la pila * Este mtodo es de comprobacin. No es un mtodo propio de la * clase Pila. */ public void imprimir() { for (int i=0; i<=indice; i++) System.out.print(elementos[i] + "-"); System.out.println(); } } // Pila

A continuacin veremos una clase que implementa una serie de mtodos para probar la clase pila de enteros. Ejercicio: Analiza esta clase e indique qu es lo que hace cada mtodo.

/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Diferentes ejercicios utilizando la clase pila de enteros. */ /* * Ejercicios varios. */ class EjerciciosPilas { /** Prueba de pila */ public void ejercicio1(int numElementos) { Pila miPila = new Pila(numElementos); System.out.println("Vacia pila: " + miPila.vacia()); miPila.apilar(5); miPila.apilar(4); miPila.apilar(3); miPila.apilar(2); miPila.apilar(1); System.out.println("Llena pila: " + miPila.llena()); System.out.println("Numero de elementos: " + miPila.numElementos()); miPila.imprimir(); } /** Llenamos de elementos la pila */ public void ejercicio2(int elementos [])

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
{ Pila miPila = new Pila(elementos.length); /** Cargamos con unos valores del array */ for (int i=0;i<elementos.length;i++) { miPila.apilar(elementos[i]); } miPila.imprimir(); } /** Los sacamos y los imprimimos */ public void ejercicio3(int elementos []) { Pila miPila = new Pila(elementos.length); int elementosFinal[] = new int[elementos.length]; int i,j; /** Cargamos con unos valores del array */ for (i=0;i<elementos.length;i++) { miPila.apilar(elementos[i]); } miPila.imprimir(); // Sacamos a un e imprimimos por pantalla. j = 0; for (i=0;i<elementos.length;i++) { elementosFinal[j] = miPila.desapilar(); j++; } // Imprimir . podra haber aprovechado el bucle anterior? for (i=0;i<elementosFinal.length;i++) { System.out.println("Elemento " + i + ": " + elementosFinal[i]); } } // Ejercicio 3 /** Los sacamos y los imprimimos y los volvemos a insertar*/ public void ejercicio4(int elementos []) { Pila miPila = new Pila(elementos.length); int elementosFinal[] = new int[elementos.length]; int i,j; /** Cargamos con unos valores del array */ for (i=0;i<elementos.length;i++) { miPila.apilar(elementos[i]); } miPila.imprimir(); // Sacamos a un e imprimimos por pantalla. j = 0; for (i=0;i<elementos.length;i++) { elementosFinal[j] = miPila.desapilar(); j++; } // Imprimir . podra haber aprovechado el bucle anterior? for (i=0;i<elementosFinal.length;i++) { System.out.println("Elemento " + i + ": " + elementosFinal[i]); miPila.apilar(elementosFinal[i]); } // Imprimir miPila.imprimir(); // Aparecen en orden inverso por el funcionamiento de la pila. } // Ejercicio 4 /** * main para probar los ejercicios. */ public static void main(String [] args) {

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
EjerciciosPilas ejercicios = new EjerciciosPilas(); int numElementos = 5; ejercicios.ejercicio1(numElementos); int elementos [] = {1,2,3,4,5}; ejercicios.ejercicio2(elementos); ejercicios.ejercicio3(elementos); ejercicios.ejercicio4(elementos); } } // EjerciciosPilas

Ejercicio: Si ahora tuviera que implementar una pila de reales, qu cdigo tendras que cambiar? y si la pila fuera de objetos clientes? Solucin: No hay que cambiar prcticamente nada, nicamente el tipo de datos manejado por la pila.

Ejercicio: Se te ocurre alguna manera de implementar una pila de cualquier tipo de objetos? Solucin: S, una pila cuyos elementos son objetos de la clase object, de la que heredan todos los objetos en java.

Ejercicio: Crees que lo que estamos haciendo es reinventar la rueda? Qu herramientas y mecanismos provee Java para implementar una pila de cualquier tipo de datos? Solucin: Efectivamente, la implementacin de las estructuras de datos pila est superada hace mucho tiempo por los entornos de programacin que proporcionan mecanismos para utilizarlas. Concretamente Java proporciona dos: 1) Clase stack, que ofrece la posibilidad de manejar una pila de cualquier tipo de objetos. 2) Genricos, desde la versin 1.5 de Java podemos utilizar genricos para poder implementar pilas de cualquier tipo de elementos sin tener la necesidad de utilizar cambios de tipo. Esta caracterstica no la veremos en este curso.

Ejercicio: Buscar en la documentacin del API de Java la clase stack e implementar una pila de objetos Integer.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

3 Cola de Enteros
La estructura de datos Cola ( ueue) es otra estructura de datos bsica que permite almacenar q elementos, estableciendo un orden de llegada y por lo tanto de salida para estos elementos. En la vida real estamos habituados a observar el comportamiento de una cola, por ejemplo, cuando esperamos a pagar en la caja de un supermercado. El mismo comportamiento que seguimos al pagar en la cola del supermercado es el que ofreceremos para nuestra estructura de datos, que implementaremos como una clase. El comportamiento de una estructura de datos cola se caracteriza por seguir una poltica de insercin/obtencin de elementos FIFO (First In First Out), es decir, el primero en entrar es el primero en salir. Las operaciones bsicas que se pueden realizar con esta estructura de datos son: 1. Encolar (enqueue): Inserta un elemento en la cola. 2. Desencolar (dequeue): Elimina el elemento en la cola. Por supuesto, se pueden ofrecer ms mtodos que completen la funcionalidad de esta estructura de datos como por ejemplo: 1. 2. 3. 4. Determinar si la cola est vaca. Determinar si la cola est llena. Obtener el elemento de la primera posicin de la cola (sin sacarlo de la cola). Etc.

Algunos ejemplos de utilizacin de estructuras de datos colas los podemos encontrar en los siguientes contextos: 1. Sistemas operativos. 2. Videojuegos. 3. Programas de comunicacin por red. Ejercicio: Partiendo de la estructura de datos Pila explicada anteriormente y visto el comportamiento de una estructura de datos cola, implementa una clase que modele el comportamiento de una cola.

/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Cola de Enteros. */

/** * Cola de enteros. */ class Cola

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
{ /** Mximo nmero de elementos a insertar en la cola*/ private int numElementos; /** Almacn de datos en el que se insertan los elementos **/ private int elementos[]; /** Referencia al ltimo elemento insertado. */ private int ultimo; /** Inicalizacin del estado del objeto */ Cola(int numElementos) { this.numElementos = numElementos; // En java el primer ndice de un array es 0. ultimo = -1; // Creamos el array elementos = new int [numElementos]; } /** Indica si la cola est vacia */ public boolean vacia() { return (ultimo == -1); } /** Indica si la cola est llena */ public boolean llena() { return (ultimo == numElementos-1); } /** Inserta un elemento en la cola. No hay control de errores. */ public void encolar(int elemento) { ultimo ++; elementos[ultimo] = elemento; } /** El elemento de la primera posicin es el que sale. * No hay control de errores */ public int desencolar() { int elemento = elementos[0]; // Hay que mover todos los elementos una posicin hacia // atrs. for (int i=0;i<ultimo;i++) elementos[i] = elementos[i+1]; // Decrementamos ltimo porque hemos sacado un elemento. ultimo--; return elemento; } /** Devuelve el nmero de elementos que tiene la cola */ public int numElementos() { return ultimo+1; } /** Imprime los elementos de la cola * Este mtodo es de comprobacin. No es un mtodo propio de la * clase Cola. */ public void imprimir() { for (int i=0; i<=ultimo; i++) System.out.print(elementos[i] + "-"); System.out.println(); } } // Cola

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

La clase que permite probar la cola es la siguiente:


/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Cola de Enteros. */ /** * Prueba de la cola de enteros. */ class EjercicioColas { public static void main(String args[]) { // Cola de cinco elementos. Cola cola = new Cola(5); System.out.println("Esta vacia?: " + cola.vacia()); cola.encolar(5); cola.encolar(4); cola.encolar(3); cola.encolar(2); cola.encolar(1); System.out.println("Esta llena?: " + cola.llena()); int elemento = 0; System.out.println("Elemento: System.out.println("Elemento: System.out.println("Elemento: System.out.println("Elemento: System.out.println("Elemento: " " " " " + + + + + cola.desencolar()); cola.desencolar()); cola.desencolar()); cola.desencolar()); cola.desencolar());

System.out.println("Esta vacia?: " + cola.vacia()); } // main

} // EjercicioColas

Al igual que en la clase Cola, el mtodo imprimir no es propio de la clase y slo es utilizado para realizar comprobaciones. La implementacin que se muestra es un ejemplo partiendo de la clase pila. Se nota que partimos de la clase pila porque prcticamente todos los mtodos son iguales salvo el que saca los elementos, que lo cambiamos para posicionar el resto de informacin en el lugar conveniente. Hay muchas variantes de implementacin de una estructura de datos cola. Si el alumno est interesado podemos discutir muchas de ellas. Aun as se propone el siguiente ejercicio. Ejercicio: En la implementacin anterior dejamos fijo el elemento de la cabeza de la cola y cada vez que sacamos un elemento tenemos que mover el resto. Hay una implementacin que permite no fijar el elemento de la cola a la posicin cero del array. Son las colas circulares. Imple menta una cola circular. Se te ofrece de ayuda un algoritmo que recorre un array de forma circular.

Jorge Ruiz Magaa

10

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Ejemplo de recorrido circular por un array. */ /** * Ejemplo de recorrido circular por un array. */ class RecorridoCircularArray { // Recorrido circular. public static void main(String args[]) { int elementos [] = new int[10]; int i = 0; // Cargamos el array for (i=0;i<10;i++) elementos[i] = i+1;

// Lo recorremos 2 veces de forma intuitiva. /* int j = 0; for (i=0;i<20;i++) { System.out.println(elementos[j]); if (j==9) j=0; else j++; } */ // Lo recorremos dos veces mediante operaciones mdulo for (i=0;i<20;i++) { // Observa que 10 es el nmero de elementos. System.out.println(elementos[i%10]); } } // main } // RecorridoCircularArray

Implementaremos una cola circular en las prcticas de la asignatura.

Ejercicio: Es aplicable el concepto de genricos visto anteriormente?

Ejercicio: existe alguna clase en java que implemente el comportamiento de una cola?

Jorge Ruiz Magaa

11

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

4 Ejercicio 1. Palndroma
Ejercicio: Utilizando las estructuras de datos anteriores determinar si una palabra o frase es palndroma. Una palabra o frase es palndroma si se lee igual de izquierda a derecha que de derecha a izquierda. Solucin: Los pasos a seguir para resolver este problema son los siguientes: 1) Se implementa una pila de caracteres. 2) Se implementa una cola de caracteres. 3) Se le pide al usuario por teclado la frase o palabra. 4) Cada uno de los caracteres de esa frase o palabra (sin tener en cuenta los espacios en blanco) se insertan en la pila y en la cola, transformndolos previamente a maysculas. 5) Para comprobar si la palabra o frase es palndroma se saca un elemento de la pila y un elemento de la cola, si los dos coinciden continuamos hasta terminar con todos los elementos. Si no coincide la palabra o frase no es palndroma y si hemos dejado la cola y pila vacas la frase o palabra es palndroma. La mejor solucin de las implementadas por los alumnos ser publicada en la web de la asignatura para que est disponible para el resto de alumnos. Enviad las soluciones a jruiz@solusoft.es

Jorge Ruiz Magaa

12

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

Ejercicio: Se te ocurre otra forma de determinar si una palabra o frase es palndroma sin utilizar estas estructuras de datos?

/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Ejemplo de programa que detecta si una palabra o frase es palndroma. */ /** * * Programa palabra o frase palndroma. */ public class Palindroma { /** * Detecta si una palabra es palndroma * @param cadena String * @return boolean */ public boolean esPalindroma(String cadena) { // Al incio suponemos que es palndroma boolean esPalin = true; // Variable para detectar el fin del bucle (llegamos al extremo) boolean fin = false; // Cadena a minsculas y sin blancos para evitar problemas String cad = cadena.replaceAll(" ",""); cad = cad.toLowerCase(); // Inicializamos en extremo izquierdo y extremo derecho int izq_a_der = 0; int der_a_izq = cad.length() - 1; // Recorremos while ((esPalin) && (!fin)) { // Comparamos el caracter esPalin = (cad.charAt(izq_a_der) == cad.charAt(der_a_izq)); // antes de comparar comprobamos que no es blanco el izq_a_der++; der_a_izq--; // Comprobamos si hemos terminado. fin = ((der_a_izq == -1) || (izq_a_der ==cad.length())); } return esPalin; } public static void main(String [] args) { boolean palindroma = false; Palindroma p = new Palindroma(); System.out.println("=========="); System.out.println("PALINDROMA"); System.out.println("=========="); palindroma = p.esPalindroma("Ana"); System.out.println("Ana: " + palindroma);

Jorge Ruiz Magaa

13

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
palindroma = p.esPalindroma("Si a la ingenieria telematica"); System.out.println("Si a la ingenieria telematica: " + palindroma); palindroma = p.esPalindroma("Dabale arroz a la zorra el abad"); System.out.println("Dabale arroz a la zorra el abad: " + palindroma); } } // Palindroma

Jorge Ruiz Magaa

14

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

5 Ejercicio 2. Repaso de Arrays


A continuacin se muestran una serie de algoritmos a modo de repaso sobre arrays. Los arrays es un tema que se ha visto con suficiente profundidad en la asignatura de Representacin de Datos y Aplicaciones por lo que no se le dedicar ms tiempo.
/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Repaso de arrays. */ /** * * Repaso de arrays. */ class RepasoArrays { /** Clculo del mayor de los enteros */ public void ejercicio1() { int elementos [] = new int[200]; // Cargamos el array for (int i=0;i<200;i++) { elementos[i] = i+1; } // Calculamos el mayor int mayor = Integer.MIN_VALUE; for (int i=0;i<200;i++) { if (elementos[i]>mayor) { mayor = elementos[i]; } } System.out.println("El mayor es: " + mayor); } // Ejercicio 1 // Media de los elementos public void ejercicio2() { long elementos [] = new long[200]; // Cargamos el array for (int i=0;i<200;i++) { elementos[i] = i+1; } // Sumnatorio long sumatorio = 0; for (int i=0;i<200;i++) { sumatorio = sumatorio + elementos[i]; } // Importante el cambio de tipo por la precisin. double media = (double)sumatorio/(double)200; System.out.println("la media es: " + media);

Jorge Ruiz Magaa

15

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
} // ejercicio2

// mostramos los pares de un array public void ejercicio3() { int elementos [] = new int[200]; // Cargamos el array for (int i=0;i<200;i++) { elementos[i] = i+1; } // Sacamos pares for (int i=0;i<200;i++) { if (elementos[i] % 2 == 0) System.out.println(elementos[i]); } } // ejercicio3

// Sumatorio public void ejercicio4() { long elementos [] = new long[200]; // Cargamos el array for (int i=0;i<200;i++) { elementos[i] = i+1; } // Sumnatorio long sumatorio = 0; for (int i=0;i<200;i++) { sumatorio = sumatorio + elementos[i]; } System.out.println("El sumatorio es: " + sumatorio); } // Ejercicio4 // Ejecucin public static void main(String args[]) { RepasoArrays r = new RepasoArrays(); r.ejercicio1(); r.ejercicio2(); r.ejercicio3(); r.ejercicio4(); } // main } // RepasoArrays

Ejercicio: Dibujo de un tablero de ajedrez en modo consola.


/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Pintar un tablero de ajedrez en modo consola */ /** *

Jorge Ruiz Magaa

16

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
* Pintamos un tablero de ajedrez en modo consola */ class TableroAjedrez { // Tablero de ajedrez con array de dos dimensiones. public void pintar() { char tablero[][] = new char[8][8]; char celda = '0'; for (int filas = 0; filas < 8; filas++) { for (int columnas = 0; columnas < 8; columnas++) { if (columnas == 0) { if (filas % 2 == 0) { // Negro celda = 'N'; } else { // Blanco celda = 'B'; } } else { if (celda == 'B') celda = 'N'; else celda = 'B'; } tablero[filas][columnas] = celda; } } // Imprimimos en pantalla for (int filas = 0; filas < 8; filas++) { for (int columnas = 0; columnas < 8; columnas++) { System.out.print(tablero[filas][columnas]); } System.out.println(); } } // Probamos public static void main(String args[]) { TableroAjedrez t = new TableroAjedrez(); t.pintar(); } //main } // TableroAjedrez

Ejercicio: Cmo deberamos ampliar el ejercicio para poder tratar el conjunto de piezas y situarlas sobre el tablero de ajedrez? Solucin: Crearamos objetos de la clase Pieza y los situaramos en su posicin. Se implementar en la clase prctica correspondiente.

Jorge Ruiz Magaa

17

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

6 Ejercicio 3. Combos de movimiento en un videojuego


Imaginemos un juego de lucha, estilo Teken, Virtua Figther, etc. se le ocurre alguna manera de implementar la gestin de los combos de ataque? Un combo, es la pulsacin consecutiva de varios botones durante un periodo de tiempo pequeo. Dependiendo de la secuencia de botones pulsada se ejecutar un ataque u otro. No es objetivo de este ejercicio implementar la el cdigo fuente necesario pero s hay que indicar mediante la redaccin de un pequeo prrafo la solucin que implementara usted.

Jorge Ruiz Magaa

18

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

7 Clculos en notacin polaca inversa


La notacin polaca inversa, tambin llamada notacin postfija, es un mtodo de introduccin de rdenes alternativo a la notacin algebraica usado en las calculadoras Hewlett-Packard y en algunos lenguajes como PostScript o Forth. En 1920 Jan Lukasiewicz ide un mtodo para escribir expresiones matemticas sin utilizar ni parntesis ni corchetes llamada notacin polaca. En 1972 HP se bas en l e incorporo en su primera calculadora cientfica de bolsillo, la HP35, la notacin polaca inversa. Este sistema no es el habitual de las calculadoras pero tiene varias ventajas: Ahorra pulsaciones de teclas, con lo que se introducen los datos ms rpido. Permite ver los resultados intermedios, con lo que se perciben ms fcilmente los errores. Se parece a como se calcula con papel y lpiz.

El RPN (por sus siglas en ingls) se basa en el concepto de pila de datos. Primero se introducen los datos en la pila y luego se indica la orden a realizar.
(fuente original: es.wikipedia.org)

En notacin polaca inversa la expresin: (12 + 54) / (6 / 3) equivale a: 12 54 + 6 3 / / El programa que realiza el clculo de expresiones mediante notacin polaca inversa se basa en una pila en la que se almacenan los valores y sus resultados aplicndole las operaciones. Utilizando la pila de enteros el resultado es:
/** * Universidad Carlos III de Madrid * Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido. * Organizacin de Contenidos Audiovisuales. * * Ejemplo de clculo de notacin polaca inversa */ /** * * La expresin se viene por args en notacin polaca inversa, * por ejemplo 12 54 + 6 3 / / */ class PolacaInversa { private String expresion[];

Jorge Ruiz Magaa

19

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
/** Inicializamos correctamente la expresin */ PolacaInversa(String expresion[]) { this.expresion = new String[expresion.length]; for (int i=0; i<expresion.length;i++) this.expresion[i] = expresion[i]; } /** Realiza los clculos segn expresion, utilizando una pila */ public int calcular() { // qu tamao hay que darle a la pila) Pila pila = new Pila(expresion.length); for (int i=0;i<expresion.length;i++) { if (esNumero(expresion[i])) { try { pila.apilar(Integer.parseInt(expresion[i])); } catch(Exception ex) { ; // No puede haber excepcin pero lo indicamos por javac } } else { // Sacamos los elementos y aplicamos resultado int operando2 = pila.desapilar(); int operando1 = pila.desapilar(); if (expresion[i].equals("+")) { pila.apilar(operando1 + operando2); } else if (expresion[i].equals("-")) { pila.apilar(operando1 - operando2); } // Problemas si la divisin no es entera. else if (expresion[i].equals("/")) { pila.apilar(operando1 / operando2); } else if (expresion[i].equals("*")) { pila.apilar(operando1 * operando2); } } } // El ltimo elemento debe ser el resultado. return pila.desapilar(); } public static void main(String args[]) { // No olvidar hacer la comprobacin sobre args PolacaInversa p = new PolacaInversa(args); int resultado = p.calcular(); System.out.println("El resultado es: " + resultado); // Para el ejemplo: // 12 54 + 6 3 // // da 33. } // main /** Nos dice si el string es un nmero. */ private boolean esNumero(String cadena) { try { int num = Integer.parseInt(cadena);

Jorge Ruiz Magaa

20

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
return true; } catch(Exception ex) { return false; } } // EsNumero } // PolacaInversa

Jorge Ruiz Magaa

21

You might also like