MEMORIA DE LA PRÁCTICA DE PROGRAMACIÓN III CURSO

Tamaño: px
Comenzar la demostración a partir de la página:

Download "MEMORIA DE LA PRÁCTICA DE PROGRAMACIÓN III CURSO 2006-2007"

Transcripción

1 MEMORIA DE LA PRÁCTICA DE PROGRAMACIÓN III CURSO CENTRO ASOCIADO DE ALBACETE

2 Contenido: 1. RESPUESTAS A LAS CUESTIONES PLANTEADAS EN EL ENUNCIADO Características de la aplicación del esquema al problema planteado 1.2. Descripción del grafo asociado al espacio de soluciones 1.3. Función de coste para la selección del nodo más prometedor 1.4. Cálculo de una cota del valor de las soluciones generadas 1.5. Estructura de datos utilizada para el almacenamiento de los nodos no explorados 1.6. Pseudocódigo del esquema y de su instanciación al problema 1.7. Coste computacional del programa desarrollado 2. EJEMPLO DE EJECUCIÓN PARA EL CASO DE PRUEBA. 3. ESTUDIO DEL COSTE DEL ALGORITMO. 4. LISTADO DEL CÓDIGO FUENTE COMPLETO Clase Puzzle 4.2. Clase Resuelve 4.3. Clase Nodo 4.4. Clase Arbol 4.5. Clase Traduce i

3 1.- RESPUESTAS A LAS CUESTIONES PLANTEADAS EN EL ENUNCIADO Características particulares de la aplicación del esquema al problema planteado. 1.1.a.- Estructura de datos asociada al puzzle. Como estructura de datos para almacenar las fichas se ha elegido un array de n 2 enteros, dado el carácter fijo del número de fichas de los puzzles, y la facilidad de cálculo de la posición relativa de las fichas respecto a la posición final requerida. El uso de un array permite también una identificación rápida de identidad entre puzzles (con la comparación en secuencia de sus datos) e incluso la ordenación entre ellos, para facilitar su búsqueda. 1.1.b.- Adaptación del esquema general. El esquema general de ramificación y poda permite la utilización de varias estrategias a la hora de generar los nodos. Para la elección del nodo a expandir podemos seguir un recorrido del grafo de soluciones en anchura o en profundidad. O bien podemos utilizar un cálculo previo de una función de coste que nos permita seleccionar el nodo en principio más prometedor, el de menor coste. Debido al alto número de nodos diferentes posibles obtenidos al modificar el inicial adoptaremos esta última, para reducir al máximo el número de nodos a analizar. Para implementar la citada estrategia de minimización de costes, los nodos generados se almacenarán en una estructura de datos que permita la selección del nodo de menor coste de manera eficiente, que se describirá en el punto c.- Consideraciones en la expansión del grafo de soluciones. Debemos tener en cuenta la posibilidad de aparición de ciclos en la generación de los nodos. Si uno de los nodos del grafo de soluciones es igual a uno de sus ascendientes, generará en una de sus ramas un grafo igual al que se desarrolla a partir de ese antecesor repetido, lo que multiplicará los nodos a investigar de manera superflua, ya que este subgrafo, si contiene la solución, siempre tendrá un camino de mayor longitud que la de aquel del que se deriva. Para evitar la aparición de los aludidos ciclos, al generar los descendientes de cada nodo se comprobará: que ninguno de ellos es igual a su padre, mediante el descarte del movimiento opuesto al que generó el nodo evaluado, y que ninguno de ellos ha sido ya evaluado, por medio de la exploración de un árbol binario de búsqueda (ordenado por el valor de las casillas de cada puzzle comprobadas en orden ascendente). Se utiliza una estructura diferente a la de la selección del nodo más prometedor debido al diferente criterio de búsqueda a utilizar: ordenados por coste en la selección del nodo (varios nodos diferentes pueden tener el mismo coste) y por el valor de las casillas (que pretendemos que nunca sea igual). 1

4 1.2.- Descripción del grafo asociado al espacio de soluciones. Las soluciones se distribuyen en un árbol cuya raíz es el puzzle inicial. A partir de ella se desarrollan las diferentes ramas, que serán generadas expandiendo cada uno de los nodos. Los hijos de un nodo se generan al ir moviendo las fichas del puzzle padre; tomando como referencia el caso de prueba, los movimientos aparentes del hueco podrán ser: Arriba (norte), intercambio de posición con el Abajo (sur), intercambio de posición con el 8. Derecha (este), intercambio de posición con el Izquierda (oeste), intercambio de posición con el De esta manera tenemos un máximo de cuatro movimientos a partir de cada nodo. Según hemos visto en el punto 1.1.c, debemos rechazar siempre al menos uno de los movimientos posibles del hueco, aquel que deshaga el último realizado. Esto nos da un máximo de tres hijos para cada nodo distinto del raíz (que no tiene un movimiento anterior), sin tener en cuenta la posición del nodo, que puede hacer descartar a su vez los movimientos que lo puedan sacar del tablero. Por lo tanto, el árbol asociado al espacio de soluciones será un árbol ternario, con la excepción del primer nivel de descendientes, que podrá ser de cuatro hijos Función de coste para seleccionar el nodo más prometedor. Dado que lo que buscamos es la solución con menos movimientos realizados, la función de coste la estableceremos como la suma de dos factores, los movimientos realizados hasta llegar al nodo evaluado y una estimación de los movimientos restantes hasta alcanzar la solución. f coste =(movimientos realizados) + f movimientos estimados Para el cálculo aproximado de los movimientos restantes se usará la suma de las distancias de Manhattan de cada ficha a su posición final. Ésta se calcula en nuestro caso contando las filas y columnas que diferencian las posiciones actual y final de cada ficha. Dará un número de movimientos cercano al real pero no exacto, ya que no tiene en cuenta que al mover una ficha pueden descolocarse otras (y acercarse a su posición final o alejarse de la misma). 2

5 distancia=math.abs((pos/numfilas)-(posfinal/numfilas)) + Math.abs((pos%numFilas)-(posfinal%numFilas)); pos, posfinal: son las posiciones de la ficha dentro del array de datos del nodo y de la solución, respectivamente. pos/numfilas da la fila de la casilla; pos%numcolumnas da la columna. Como ejemplo presentamos el caso de prueba, resoluble en cuatro movimientos: Valores Distancias movs. hechos distancia = 4 coste = 4 Por tanto, para seleccionar el nodo más prometedor usaremos una estrategia de mínimo coste (LC), implementada en la ordenación de la estructura de datos en la que se almacenarán los nodos aún no desarrollados: la extracción del nodo a analizar en cada iteración debe proporcionar el nodo de menor coste de los almacenados Cálculo de una cota del valor de las soluciones que se encontrarán generando sucesores a un determinado nodo. Inicialmente tomaremos como cota un número de movimientos que depende de la magnitud de n; tomaremos 1 para n=1 (trivial), 6 para n=2 (1), 31 para n=3 (2), 80 para n=4 (3) y 1000 para n>4. A esta cota le añadimos un margen de trabajo de 2, dado que a veces la función de coste sobreestima ligeramente los movimientos restantes, como acabamos de ver en 1.3. Una vez encontrada la primera solución, se toma como cota el número de movimientos de la misma, para desarrollar sólamente nodos con coste menor o igual que el de la solución encontrada Estructura de datos utilizada para almacenar en orden de prioridad los nodos creados y aún no explorados. Se utiliza un montículo de mínimos, implementado mediante la clase PriorityQueue de Java 5.0. La inserción y la extracción de la raíz las realiza en O(log(n)). La comprobación de estado vacío y del número de nodos contenidos se obtiene en tiempo constante (4). Para la implementación de la estrategia LC nos bastará con extraer la raíz como selección del nodo más prometedor. Tras esa extracción, la clase automáticamente restaura la condición de montículo de mínimos. (1) (2) (3) (4) Java 2.0 Platform Standard Edition 5.0 API Specification 3

6 1.6.- Pseudocódigo correspondiente al esquema y a su instanciación al problema. El esquema general es el siguiente: fun ramificación-y-poda (ensayo) dev ensayo m montículo-vacío cota-superior cota-superior-inicial solución solución-vacía añadir-elemento (ensayo, m) mientras vacío (m) hacer nodo extraer-raíz si válido(nodo) entonces hacer si coste (nodo) < cota-superior entonces hacer solución nodo cota-superior coste (nodo) fsi si no si cota-inferior (nodo) cota-superior entonces dev solución si no para cada hijo en expandir (nodo) hacer si condiciones-de-poda(hijo) y cota-inferior(hijo)< cota-superior entonces añadir-nodo (hijo, m) fsi fpara fsi fsi fmientras ffun En nuestro caso en particular no necesitamos el uso de una cota inferior, ya que lo que buscamos es un tablero resuelto, comprobado tras la llamada a es-solución (nodo). Como hemos comentado antes, usaremos dos estructuras para almacenar los nodos, un montículo para los nodos no visitados y otro para los que ya hemos evaluado; la función expandir debe comprobar que los hijos que genere no han sido ya visitados, para evitar ciclos. Incluimos el pseudocódigo de la función expandir en la presentación de la instanciación del problema. 4

7 Esquema adaptado al problema: fun RyP (ensayo) dev ensayo m montículo-vacío a árbol-vacío cota-superior cota-superior-inicial solución solución-vacía añadir-elemento (ensayo, m) mientras vacío (m) hacer nodo extraer-raíz (m) si es-solución (nodo) entonces hacer solución nodo cota-superior coste (nodo) si cota (nodo) < cota-superior entonces para cada hijo en expandir (nodo, a) hacer añadir (hijo, m) fpara fsi añadir (nodo, a) fmientras dev solución ffun fun expandir (ensayo, a) dev lista lista lista-vacía para cada movimiento válido hacer si generar-ensayo(movimiento) Є a entonces hijo generar ensayo(movimiento) lista insertar (hijo) fsi fpara dev lista ffun Análisis del coste computacional del programa desarrollado. Para el cálculo del coste existe la dificultad de no conocer a priori el tamaño del problema. El tamaño del puzzle es siempre conocido, n = número de filas, y sabemos que el número máximo de nodos del árbol de sucesores del puzzle inicial es n 2!/2 (5). La estrategia LC pretende reducir al mínimo el número de nodos visitados (y, por lo tanto, expandidos) dentro del citado árbol mediante el uso de una función (5) 5

8 heurística h que escoge el nodo más prometedor mediante la estimación del número de movimientos necesarios. Pero no puede calcular cuántos nodos se deberán visitar para encontrar la solución. Las llamadas más costosas son las realizadas al montículo (inserción y extracción de la raíz) y al árbol de nodos visitados (inserción y búsqueda), y su coste depende en ambos casos del número de nodos generados. Por ello calcularemos el coste del programa con relación a ese número, del que inicialmente sólo conocemos su valor máximo. Llamando u al número total de nodos evaluados, m al número de nodos en cada momento en el montículo y a al de los nodos en el árbol, podemos calcular si suponemos siempre tres hijos generados: u T(u)= Σ (1 + log m + k [3 (k 2 + log a)+1]+ 3 log m + log a)+ 1 i=1 Entre corchetes se presenta la llamada a la función expandir (máximo de tres hijos) u T(n)= 7 + Σ (4 log m + k log a) i=1 Intentando una aproximación mejor, tratemos de relacionar m y a con u. Las inserciones y comprobaciones en el árbol a, de orden logarítmico, se hacen tras evaluar cada nodo, por lo que podemos afirmar que a valdrá en cada iteración i-1. Realizando los cálculos tenemos que la serie de los log a vale: log 0 + log log (u-1). Dado que la primera inserción es sobre un árbol vacío, por lo tanto de coste constante, podemos sustituir ese log 0 por k. Por tanto, k + log log (u-1); por las propiedades de los logaritmos, k + log (1 * 2 *... * (u-1))=k + log ((u-1)!) Para el cálculo de las operaicones sobre m, de coste también logarítmico, debemos tener en cuenta que este valor irá modificándose a lo largo de las pasadas por el bucle while, insertando entre 0 y 3 nodos y extrayendo uno por cada iteración. En cada momento m valdrá u-a = u-(i-1). Sustituyendo tenemos log u + log (u-1) log 1 = log (u!). Por ello T(n)= log (u!) + k 3 u + 4 (k 4 + log ((u-1)!)). Aplicando la regla del máximo, T(u) es de O(u), siendo u el número de nodos generados, tomando como valor máximo u = n 2!/2. 6

9 2.- EJEMPLO DE EJECUCIÓN PARA EL CASO DE PRUEBA. Se presenta a continuación la salida en modo traza del ejemplo de prueba, modificada para presentar datos cada nodo evaluado en lugar de cada 2000, como en una ejecución estándar. También se comenta para ilustrar el trabajo en el montículo de nodos sin visitar. Archivo: prueba.txt Traza activada. Solucionable. N= 3. Cota= 36. Analizados: 1. Coste: 4. Podados: 0. Sin analizar: 0 Analizado: Padre Montículo:{ Analizados: 2. Coste: 4. Podados: 0. Sin analizar: 3 Analizado: A Montículo:{D, B, C Analizados: 3. Coste: 4. Podados: 0. Sin analizar: 4 Analizado: AA Montículo:{AB, D, C, B Analizados: 4. Coste: 4. Podados: 0. Sin analizar: 4 Analizado: AAA Montículo:{D, AB, C, B Analizados: 5. Coste: 4. Podados: 0. Sin analizar: 5 Analizado:AAAA Mont:{AAAB,D,C,B,AB Primera solución encontrada, 4 movimientos. Cota= 4. Analizados: 6. Coste: 6. Podados: 0. Sin analizar: 4 Analizado: AAAB Montículo: {AB, D, C, B Analizados: 7. Coste: 6. Podados: 1. Sin analizar: 3 Analizado: AB Montículo: {B, D, C Analizados: 8. Coste: 6. Podados: 2. Sin analizar: 2 Analizado: B Montículo: {C, D Analizados: 9. Coste: 6. Podados: 3. Sin analizar: 1 Analizado: C Montículo: { D Analizados: 10. Coste: 6. Podados: 4. Sin analizar: 0 Analizado: D Montículo: { Mejor solucion encontrada: 4 movimientos. Tiempo: 0 seg. 0 mils. Tableros generados: 9. Tableros analizados: 10. Tableros podados: Nodo padre. Genera cuatro hijos A,B,C,D de coste 4,6,6 y 6, respectivamente. 4 * 3 Tras insertarlos, el montículo es: {A 4,B 6,C 6,D * 2 Tras extraer A, el montículo queda: {D 6,B 6,C A genera dos hijos AA, AB con coste 4 y 6, respectivamente Tras insertarlos, el montículo es: {AA 4,D 6,C 6,B 6,AB * Tras extraer AA, el montículo queda: {AB 6,D 6,C 6,B AA genera un hijo AAA de coste Tras insertarlo, el montículo es: {AAA 4,AB 6,C 6,B 6,D Tras extraer AAA, el montículo queda así: {D 6,AB 6,C 6,B * AAA genera dos hijos AAAA y AAAB, de coste 4 y 6, respectivamente Tras insertarlos, el montículo queda así: {AAAA 4,D 6,C 6,B 6,AB 6,AAAB Tras extraer AAAA, el montículo queda así: {AAAB 6,D 6,C 6,B 6,AB Se encuentra AAAA como solución, la cota pasa a ser * Al ir extrayendo los nodos restantes del montículo, no se expanden y se podan por ser su coste > 4. 7

10 3.- ESTUDIO DEL COSTE DEL ALGORITMO. Atendiendo exclusivamente al algoritmo principal, tomando como operaciones elementales las relacionadas con las estructuras de datos, tenemos : n T(n)= Σ ( [3 (1 + 1)+1]+ 3 * 1+ 1)+ 1 i=1 Es decir, coste lineal, siendo n el número de nodos desarrollados por el algoritmo. 4.- LISTADO DEL CÓDIGO FUENTE COMPLETO Clase puzzle // Clase principal public class puzzle { // parámetros de entrada public static boolean t=false,a=false,h=false,fichero=false; public static Nodo inicio=new Nodo(); //Puzzle inicial public static String nombrearchivo=""; //almacena el nombre del archivo public static void main(string[] args) { //comprobación de los argumentos pasados int parametros=args.length; //nº de parámetros if (( parametros>4)) { //si hay 0 ó más de 4 parámetros Traduce.ayuda(); //presentamos la ayuda (con la sintaxis) System.exit( 2 ) ; //Fallo 2=argumentos mal //if parametros for (int c=0;c<parametros;c++){ //leemos los parámetros if (args[c].equalsignorecase("-h")) h=true; else if (args[c].equalsignorecase("-a")) a=true; else if (args[c].equalsignorecase("-t")) t=true; else { //suponemos que si no es h,a,t es el archivo fichero=true;nombrearchivo=args[c]; //if else //for c if (h) Traduce.ayuda(); //si se pasó h, presentamos la ayuda if (!fichero){ //si no se pasa un archivo de entrada inicio=traduce.pasaatiponodo(); //leemos la entrada estándar //si se proporciona el archivo inicio=traduce.pasaatiponodo(nombrearchivo); //lo leemos 8

11 //if else if (t){ //if t //si se pasó t, comprobamos la matriz de entrada if(!inicio.compruebamatriz(t)){ //si no es correcta System.out.println ( "Matriz de entrada incorrecta."); System.exit(1); else if (parametros==1){ //si sólo se pasa t System.out.println ( "Matriz de entrada correcta."); System.exit(0); //if!inicio // si se pasa a, activamos traza y lo ponemos en pantalla if (fichero && a) System.out.println("Archivo: " + nombrearchivo); if (a) System.out.println ( "Traza activada."); Resuelve.puzzle(inicio, a); //resolvemos el puzzle //fin main //fin clase puzzle Clase Resuelve //clase que contiene los algoritmos Ramificación y poda y expandir, //los contadores y la presentación de resultados import java.util.*; public class Resuelve { static long v1,v2; static int numanalizados=0,numgenerados=0,numpodados=0; static int maxcota,cota; public static void puzzle (Nodo entrada, boolean traza) { //candidato es un clon de entrada, para no modificar el puzzle original Nodo candidato=new Nodo(); candidato= entrada; candidato.actualizapuzzle(); boolean tienesol=candidato.tienesolucion(); if ((traza)&&(tienesol)) System.out.println("Solucionable."); else if (traza) System.out.println("No solucionable."); v1=system.currenttimemillis(); //tomamos tiempo al inicio //llamamos a Ramificación y Poda Nodo resultado=ryp(candidato,traza); 9

12 v2=system.currenttimemillis(); int segundos=(int)(v2-v1)/1000; int mils=(int)(v2-v1)%1000; //tomamos el tiempo final if ((resultado==null) (!resultado.essolucion())){ //si RyP devuelve un puzzle no resuelto entrada.presentapuzzle(); System.out.println("\nNo se ha encontrado solucion."); if (traza){ //comentarios si traza=true System.out.println("Tiempo: " + segundos + " seg. " + mils + " mils."); System.out.println("Tableros analizados: " + numanalizados + ".\ntableros podados: " + numpodados + "."); //if traza System.exit(0); //salimos del programa //si está resuelto presentamos la solución if (traza){ //comentarios si traza=true System.out.println(); System.out.println("Mejor solucion encontrada: " + resultado.devuelvemovimientos()+ " movimientos."); System.out.println("Tiempo: " + segundos + " seg. " + mils + " mils."); System.out.println("Tableros generados: " + numgenerados + ".\ntableros analizados: " + numanalizados + ".\ntableros podados: " + numpodados + "."); //if traza presentasolucion(candidato,resultado.devuelvecamino()); //if candidato //fin de puzzle // algoritmo Ramificación y Poda public static Nodo RyP(Nodo candidato, boolean traza){ Arbol vistos=new Arbol(); //árbol de búsqueda para los nodos ya vistos PriorityQueue <Nodo> monticulo=new PriorityQueue <Nodo>(); //montículo para los nodos aún sin analizar ArrayList <Nodo> hijos=new ArrayList<Nodo>(); //almacena los hijos Nodo n,solucion=candidato; monticulo.offer(candidato); //añadimos candidato al montículo switch (Nodo.devuelveNumFilas()){ //ajusta la cota según n al case 1: //número máximo de movimientos cota=maxcota=1;break; //según el número de casillas case 2: //más un margen de trabajo cota=maxcota=6+5;break; 10

13 case 3: cota=maxcota=31+5;break; case 4: cota=maxcota=80+5;break; default: cota=maxcota=1000;break; //switch if (traza){ System.out.println("N= " + Nodo.devuelveNumFilas() + ". Cota= " + cota + "."); //if traza while (!monticulo.isempty()){ //mientras haya nodos sin analizar n=monticulo.poll(); numanalizados++; if ((traza)&&(numanalizados%2000==0)){ //comentarios si traza=true System.out.println("Analizados: " + numanalizados + ". Coste: " + n.devuelvecoste()+ ". Podados: " + numpodados + ". Sin analizar: " + monticulo.size()); //if traza if (n.essolucion()){ //si n es solución solucion=n; cota=solucion.devuelvemovimientos(); //ajustamos la cota al número de movimientos de la solución //para la poda posterior if (traza){ //comentarios si traza=true System.out.println("Primera solucion encontrada, " + n.devuelvemovimientos() + " movimientos. Cota= " + cota + "."); //if traza else if (n.esaceptable(cota)){ //si n es aceptable hijos=expandir(n,vistos); //expandimos el árbol //hijos= el array de hijos de n que devuelve 'expandir' while (!hijos.isempty()){ //insertamos en el montículo, ordenados según el coste try { monticulo.offer(hijos.remove(0)); catch (OutOfMemoryError e) { System.out.println("Error al insertar un nodo.2 +"Falta memoria."); System.exit(2); //try catch //while numpodados++; //poda si no es aceptable n 11

14 //(ocurre tras el ajuste de la cota con la primera solución) //if n.essolucion try { //se añade n al árbol de nodos ya vistos ordenados según los datos vistos.insertarpordatos(n); catch (OutOfMemoryError e) { System.out.println("Error al insertar un nodo. " + "Falta memoria."); System.exit(2); //try catch //RyP //while return solucion; //Devuelve la mejor solución encontrada hasta llegar al límite. //Dará error "Solución no encontrada" si devuelve el nodo inicial. // desarrolla los hijos factibles del nodo padre, y los inserta en // la lista de posibles soluciones si no han sido ya comprobados // (mediante el árblo vistos) y si son viables (mediante esaceptable se // comprueba que su coste estimado no sobrepasa la cota) // devuelve la lista de hijos generados para introducir en 'nuevos' public static ArrayList <Nodo> expandir(nodo padre,arbol vistos){ ArrayList <Nodo> lista=new ArrayList <Nodo>(); //Array para devolver los hijos generados char ultimomov; String historia = padre.devuelvecamino(); int tamaño=historia.length(); if (tamaño!=0){ //localiza el último movimiento hecho ultimomov=historia.charat(tamaño-1); ultimomov='j'; //si es el tablero inicial boolean[] movposibles=padre.devuelvemovposibles(); if ((movposibles[0]) && (ultimomov!='s')){ //mov N Nodo hijo=(nodo) padre.clone(); hijo.mueven(); if ((!vistos.buscar(hijo))&&(hijo.esaceptable(cota))){ lista.add(hijo); numgenerados++; numgenerados++; numpodados++; //mov N if ((movposibles[1])&& (ultimomov!='n')){ //mov S 12

15 Nodo hijo=(nodo) padre.clone(); hijo.mueves(); if ((!vistos.buscar(hijo))&&(hijo.esaceptable(cota))){ lista.add(hijo); numgenerados++; numgenerados++; numpodados++; //mov S if ((movposibles[2])&& (ultimomov!='o')){ //mov E Nodo hijo=(nodo) padre.clone(); hijo.muevee(); if ((!vistos.buscar(hijo))&&(hijo.esaceptable(cota))){ lista.add(hijo); numgenerados++; else{ numgenerados++; numpodados++; //mov E if ((movposibles[3])&& (ultimomov!='e')){ //mov O Nodo hijo=(nodo) padre.clone(); hijo.mueveo(); if ((!vistos.buscar(hijo))&&(hijo.esaceptable(cota))){ lista.add(hijo); numgenerados++; numgenerados++; numpodados++; //mov O return lista; //expandir // presenta la solución desde el tablero inicial, mediante el movimiento // del hueco según el camino almacenado public static void presentasolucion(nodo inicio, String camino){ inicio.presentapuzzle(); //presenta el nodo inicial int tope=camino.length(); //nº de movimientos int contador=0; while (contador<tope){ char movimiento=camino.charat(contador); switch (movimiento){ //mueve y presenta según el movimiento leído case 'N': inicio.mueven();inicio.presentapuzzle();break; case 'S': inicio.mueves();inicio.presentapuzzle();break; case 'E': inicio.muevee();inicio.presentapuzzle();break; case 'O': 13

16 inicio.mueveo();inicio.presentapuzzle();break; contador++; //while //presentasolucion //resuelve Clase Nodo. //clase que almacena los datos de los puzzles y los métodos para su manipulación public class Nodo implements Comparable, Cloneable { // constantes definidas a partir de la entrada (excepto minvalor) private static int numfilas; private static int numcolumnas; private static int numcasillas; private static int minvalor=1; //si se introduce un cero, error private static int topevalor; //rango de valores de 1 a n^2-1 private static int blanco; // atributos de instancia private String camino; private int colocadas; private int movimientos; private int coste; private int datos[]=new int[numcasillas]; private int poshueco; //almacena los movimientos del hueco //nº de fichas colocadas //nº de movimientos realizados //coste de cada nodo //array de int con las piezas //posición del hueco en el array private boolean movposibles[]=new boolean[4]; //array de booleanos con // los movimientos posibles del hueco en orden Norte, Sur, Este, Oeste. public Nodo izda, dcha; //para el árbol // constructor public Nodo(){ for (int a= 0;a<numCasillas;a++){ datos[a]=0; //for a movimientos=0; camino=""; //fin del constructor de Nodo //rellena de ceros las casillas // imprime en pantalla public void presentapuzzle(){ 14

17 String relleno; if (numcasillas<10){ relleno=""; relleno=" "; //if numfilas //define el caracter de relleno si hay //números >10 para presentar el puzzle for (int a=0;a<numcasillas;a++){ if (a%numfilas==0) System.out.println(); int numero=datos[a]; if (numero==blanco) { System.out.print(relleno + "* "); //sustituye n^2 por '*' if (numero<10){ System.out.print(relleno + numero + " " ); System.out.print(numero + " " ); //if numero<10 //if numero==blanco //for a System.out.println(); //línea en blanco por debajo del puzzle //fin de presentapuzzle // devuelve el número de casillas rellenas public int devuelvecolocadas(){ return colocadas; //fin de devuelvecolocadas // devuelve un String que almacena el camino según los movimientos del hueco public String devuelvecamino(){ return camino; //devuelvecamino // devuelve un array de booleanos con los movimientos posibles del hueco en // orden Norte, Sur, Este, Oeste. public boolean[] devuelvemovposibles(){ return movposibles; //devuelvemovposibles // dvuelve un entero con el número de movimientos realizados public int devuelvemovimientos(){ return movimientos; //devuelvemovimientos // devuelve un entero con el número de filas del puzzle 15

18 public static int devuelvenumfilas(){ return numfilas; //devuelvenumfilas // devuelve un entero con el número de columnas del puzzle public static int devuelvenumcolumnas(){ return numcolumnas; //devuelvenumcolumnas // devuelve un entero con el número total de casillas del puzzle public static int devuelvenumcasillas(){ return numcasillas; //devuelvenumcasillas // devuelve un entero el mínimo valor que puede tener una casilla. Es 1. // Se usa en la comprobación del archivo de entrada public static int devuelveminvalor(){ return minvalor; //devuelve minvalor // devuelve un entero con el máximo valor que puede tener una casilla. Es n^2-1 // Se usa en la comprobación del archivo de entrada public static int devuelvetopevalor(){ return topevalor; //devuelvetopevalor // devuelve el int coste public int devuelvecoste(){ return coste; //devuelvecoste // devuelve el array de enteros con las casillas public int[] devuelvedatos(){ return datos; //devuelvedatos // se cambia el número de filas public static void ponernumfilas(int filas){ numfilas=filas; //ponernumfilas // se cambia el número de columnas public static void ponernumcolumnas(int columnas){ numcolumnas=columnas; //ponernumcolumnas // se cambia el número de casillas public static void ponernumcasillas(int casillas){ 16

19 numcasillas=casillas; //ponernumcasillas // se cambia el valor máximo de casilla public static void ponertopevalor(int valor){ topevalor=valor; //ponertopevalor // se cambia el valor del blanco. Es n^2 public static void ponerblanco(int valor){ blanco=valor; //ponerblanco // calcula el coste del nodo. Los movimientos realizados hasta el momento mas // la suma de las distancias Manhattan de las casillas (devuelta // por calculadistancias) public void actualizacoste(){ coste=movimientos+calculadistancias(); //actualizacoste // devuelve true si el coste del nodo es inferior a la cota public boolean esaceptable(int cota){ if (this.coste>=cota) return false; else return true; //esaceptable // compara los valores de las casillas del nodo con el array de enteros 'datos' // devuelve 1 si 'datos' es mayor casilla a casilla que el nodo; -1 si es menor // y 0 si es igual. Se usa para la construcción y búsqueda en el árbol binario. public int compara(int[] datos){ for (int i=0;i<numcasillas;i++){ if (this.datos[i]<datos[i]) return 1; else if (this.datos[i]>datos[i]) return -1; return 0; //compara //inserta una ficha en una casilla public void inserta(int posit, int dato){ datos[posit]=dato; //fin inserta // actualiza los datos de cada tablero, se usa tras mover el hueco public void actualizapuzzle(){ sumacolocadas(); //cuenta las casillas en posición correcta actualizacoste(); //recalcula el coste poshueco=devuelveposhueco(); //actualiza el array de booleanos movposibles 17

20 if (poshueco/numfilas>0) {movposibles[0]=true; //norte else movposibles[0]=false; if (poshueco/numfilas<numfilas-1) {movposibles[1]=true;//sur else movposibles[1]=false; if (poshueco%numcolumnas<numcolumnas-1) {movposibles[2]=true;//este else movposibles[2]=false; if ((poshueco%numcolumnas>0) ){movposibles[3]=true;//oeste else movposibles[3]=false; //actualizapuzzle // devuelve la posición del hueco public int devuelveposhueco(){ for (int a=0;a<numcasillas;a++){ int valor=datos[a]; if (valor==blanco){ return a; //if valor //for a return blanco; //devuelveposhueco //índices de fila //si lo encontramos, devuelve la fila // calcula y devuelve las distancias Manhattan de cada ficha. Para el cálculo // del coste public int calculadistancias(){ int distancia=0,distanciaa,distanciab,dato; for (int pos=0;pos<numcasillas;pos++){ dato=this.datos[pos]; if ((dato!=blanco)&&(dato!=pos+1)){ //se compara con pos+1 al ir el array de 0 a n^2 distanciaa=(((pos/numfilas))-((dato-1)/numfilas)); distanciab=(pos%numfilas)-((dato-1)%numfilas); distancia=distancia+math.abs(distanciaa)+math.abs(distanciab); //if dato //for return distancia; //calculadistancias // calcula y devuelve las inversiones en cada tablero. public int calculainversiones(){ int inversiones=0,dato,datob; for (int pos=0;pos<numcasillas;pos++){ dato=this.datos[pos]; if (dato!=blanco) { for (int y=pos+1;y<numcasillas;y++){ datob=this.datos[y]; if ((datob!=blanco)&&(datob<dato))inversiones++; //for 18

21 //if dato //for if (numfilas%2==0){ int filahueco=(this.devuelveposhueco()/numfilas)+1; return inversiones+filahueco; else return inversiones; //calculainversiones // Devuelve true si el tablero tiene solución posible public boolean tienesolucion(){ return this.calculainversiones()%2==0; // movimientos del hueco public void mueven(){ if (movposibles[0]){ inserta(poshueco,datos[poshueco-numfilas]); inserta(poshueco-numfilas,blanco); //intercambio de posiciones poshueco=poshueco-numfilas; //actualiza poshueco movimientos++; //incrementa movimientos camino=camino+"n"; //actualiza el camino actualizapuzzle(); //actualiza los datos del tablero System.out.println("Error: movimiento al N fuera de tablero." + "No se realiza."); //si no se puede realizar el movimiento //if //fin mueven public void mueves(){ if (movposibles[1]){ inserta(poshueco,datos[poshueco+numfilas]); inserta(poshueco+numfilas,blanco); poshueco=poshueco+numfilas; movimientos++; camino=camino+"s"; actualizapuzzle(); System.out.println("Error: movimiento al S fuera de tablero. " + "No se realiza."); //if //fin mueves public void muevee(){ if (movposibles[2]){ inserta(poshueco,datos[poshueco+1]); inserta(poshueco+1,blanco); poshueco++; movimientos++; 19

22 camino=camino+"e"; actualizapuzzle(); System.out.println("Error: movimiento al E fuera de tablero." + "No se realiza."); //if //fin muevee public void mueveo(){ if (movposibles[3]){ inserta(poshueco,datos[poshueco-1]); inserta(poshueco-1,blanco); poshueco--; movimientos++; camino=camino+"o"; actualizapuzzle(); System.out.println("Error: movimiento al O fuera de tablero." + "No se realiza."); //if //fin mueveo // devuelve true si el nodo es solucion, si todas sus casillas están colocadas public boolean essolucion(){ if (this.colocadas==numcasillas){ return true; else return false; //essolucion // devuelve 'true' si no hay valores repetidos y están definidas todas las // casillas. Devuelve 'False' si hay error. // Se le pasa como parámetro el booleano 't', que indica si se está // en modo traza; si es así, se presenta el mensaje // de error (si lo hubiera) public boolean compruebamatriz(boolean t){ //comprueba si todos los números están presentes for (int a=0;a<numcasillas;a++){ //índices de fila int valor=datos[a]; if (valor==0){ if (t) System.out.println("Falta un numero de ficha."); return false; //if valor //for a //comprueba si hay números repetidos o si falta alguno for (int num=1;num<topevalor+1;num++){ boolean presente=false; for (int a=0;a<numcasillas;a++){ //índices de fila 20

23 int valor=datos[a]; if ((presente)&&(valor==num)){ //si num ya está presente if (t) { //información extra si traza activada System.out.println("El "+ num + " repetido."); presentapuzzle(); // if t return false; //matriz errónea else if (valor==num){ presente=true; //if presente //for a if (!presente){ //si no se ha encontrada el número if (t) { System.out.print("El "+ num + " sin colocar."); presentapuzzle(); //if t return false; //matriz errónea //for num return true; //matriz correcta //fin compruebamatriz // Repasa toda la tabla y cuenta las fichas colocadas public void sumacolocadas(){ int suma=0; for (int a=0;a<numcasillas;a++){ if (datos[a]==a+1) suma++; //for a colocadas=suma; //fin sumacolocadas // implementación de compareto public int compareto (Object nodo){ //ordena inicialmente por el coste int costeactual = this.devuelvecoste(); int costenuevo = ((Nodo)nodo).devuelveCoste(); int valor = costeactual > costenuevo? 1 : costeactual==costenuevo? 0 : -1; //a igualdad de coste, favorece al de menos movimientos hechos if (valor==0){ int movactual=this.devuelvemovimientos(); int movnuevo=((nodo)nodo).devuelvemovimientos(); 21

24 return movactual > movnuevo? -1 : movactual==movnuevo? 0 : 1; return valor; //compareto // sobreescritura de Object.clone para evitar variar los datos al manipular la // copia de un puzzle public Object clone() { Nodo temp; try { //para capturar posibles fallos de memoria al clonar temp = new Nodo(); for (int a=0;a<numcasillas;a++){ int dato=this.datos[a]; //insertamos los datos uno a uno temp.inserta(a,dato); //for a temp.actualizapuzzle(); temp.camino=this.camino; temp.movimientos=this.movimientos; return temp; catch (OutOfMemoryError e) { System.out.println("Error al crear un nodo. Falta memoria."); System.exit(2); return null; //trycatch //fin clone //fin clase Nodo Clase Arbol // Clase que implementa un árbol binario de búsqueda y los métodos //necesarios para su manejo public class Arbol { public Nodo raiz; public int numnodos; // Constructor public Arbol(){ raiz=null; numnodos=0; //Arbol() // devuelve true si se encuentra el nodo pedido 22

25 public boolean buscar(nodo nodo){ boolean encontrado=false; Nodo actual=raiz; //comenzamos por la raiz int []datosnodo=nodo.devuelvedatos(); while ((!encontrado)&&(actual!=null)){ //mientras queden nodos por ver int comp=actual.compara(datosnodo); if (comp>0){ //si el nuevo es mayor que actual, busca dcha actual=actual.dcha; else if (comp<0){ //si el nuevo es menor que actual, busca izda actual=actual.izda; else encontrado=true; //si es igual, encontrado //while return encontrado; //buscar // inserta ordenando por los datos del nodo (usado para el árbol de nodos // ya evaluados) public boolean insertarpordatos(nodo nodo){ boolean insertado=false; Nodo actual=raiz; //comenzamos en la raíz if (actual==null){ //si el árbol está vacío, insertamos como raíz raiz=nodo;return true; int []datosnodo=nodo.devuelvedatos(); while ((!insertado)&&(actual!=null)){ //mientras queden nodos por ver int comp=actual.compara(datosnodo); if (comp>0){ //si el nodo actual es menor if (actual.dcha!=null){ //si tiene hijo dcho,sigue búsqueda dcha actual=actual.dcha; actual.dcha=nodo; //si no tiene hijo dcho,inserta dcha insertado=true;break; //if actual.dcha else if (comp<0){ //si actual es menor if (actual.izda!=null){ //si tiene hjo izdo, busca izda actual=actual.izda; actual.izda=nodo; //si no, inserta izda insertado=true;break; //if actual.dcha else { //si el nodo es igual no se inserta break; //if comp //while if (insertado) numnodos++; 23

26 return insertado; //insertar por datos // devuelve true si el árbol está vacío public boolean esvacio(){ return (raiz==null); //esvacio // devuelve el número de nodos del árbol public int devuelvenumnodos(){ return numnodos; //devuelvenumnodos //clase Arbol Clase Traduce //Contiene los métodos para extraer los datos del archivo inicial (o pipeline) //y los introduce en la matriz de datos si están dentro de límites. import java.io.*; import java.util.vector; public class Traduce { // Si en la entrada se pasa un parámetro con el nombre del archivo public static Nodo pasaatiponodo(string nombrearchivo){ Nodo prueba=new Nodo(); try { //abrimos el archivo FileReader entrada = new FileReader(nombreArchivo) ; BufferedReader datosentrada=new BufferedReader((entrada)); prueba=traduce(datosentrada); entrada.close(); // cerramos el archivo catch ( IOException io ) { // si hay error al abrir el archivo System.out.println( "Error E/S. El archivo '" + nombrearchivo + "' no es valido o no esta en el directorio del programa." ) ; System.exit( 3 ) ; // Fallo 3= error en archivo de entrada return prueba; //devolvemos un Nodo con los valores de la entrada 24

27 // Si es a través de entrada estándar o pipeline no se le pasan argumentos. public static Nodo pasaatiponodo(){ BufferedReader datos=new BufferedReader (new InputStreamReader (System.in)); // abrimos el lector de entrada estándar try{ if (System.in.available()==0){ //si la entrada estandar esta vacía System.out.println("Entrada estandar o por 'pipe' vacia."); System.exit( 3 ) ; //Fallo 3= error en archivo de entrada catch ( IOException io ) { //si hay error en la entrada estandar System.out.println("Fallo en la entrada estandar o pipe."); System.exit( 3 ) ; //Fallo 3= error en archivo de entrada return traduce(datos); //devolvemos un TipoSudoku con los valores de la entrada // Dimensiona el array de datos con respecto al número de filas de la entrada // y fija las variables de Nodo referidas a n. Devuelve un vector public static Vector<String> dimensiona(bufferedreader datosentrada){ Vector <String> entrada = new Vector <String>(); int tamanoentrada=0; try{ String fila=datosentrada.readline(); while ( fila!= null ) { //añadimos al vector todas las líneas no vacías if ((fila.length()!=0)&&(fila.charat(0)!='#')){ entrada.addelement(fila); //y leemos la siguiente línea fila = datosentrada.readline(); //while //Definimos el tamaño del puzzle con las primera línea de la entrada for (int a=0;a<entrada.size();a++){ String linea = (String)entrada.elementAt(a); //linea es un string con la fila while ((linea.length()!=0)&&(linea.charat(0)==' ')){ linea=linea.replacefirst(" ", ""); //elimina los espacios iniciales //while 25

28 if (linea.length()==0){ errorentrada("una línea sólo contiene espacios."); String [] numero=linea.split("\\s+"); //dividimos la linea tamanoentrada=numero.length; // for a if (tamanoentrada<1) errorentrada("no hay líneas válidas."); Nodo.ponerNumFilas(tamanoEntrada); Nodo.ponerNumColumnas(tamanoEntrada); Nodo.ponerNumCasillas(tamanoEntrada*tamanoEntrada); Nodo.ponerTopeValor((tamanoEntrada*tamanoEntrada)-1); Nodo.ponerBlanco(tamanoEntrada*tamanoEntrada); if (tamanoentrada==1) { //caso especial de tamaño 1 Nodo.ponerTopeValor(1); Nodo.ponerBlanco(0); catch ( IOException io ) { //si hay error al abrir la entrada System.out.println( "Error al procesar los datos de entrada." ) ; System.exit( 2 ) ; //Fallo 2= error en entrada //try catch return entrada; //fin dimensiona // si la matriz de entrada es correcta (número de filas y columnas iguales, // los dígitos son de 1 a n^2-1 o asteriscos y las líneas que empiezan // por '#' son comentarios) devuelve una matriz de int Nodo. public static Nodo traduce(bufferedreader datosentrada){ Vector <String> entrada; entrada=dimensiona(datosentrada); //fija los límites Nodo prueba=new Nodo(); boolean yahayblanco=false; int filasentrada=entrada.size(); for (int a=0;a<filasentrada ;a++){ String linea = (String)entrada.elementAt(a); //linea es un string con la fila while ((linea.length()!=0)&&(linea.charat(0)==' ')){ linea=linea.replacefirst(" ", "");//elimina los espacios iniciales //while if (linea.length()==0){ errorentrada("una línea sólo contiene espacios."); 26

29 String [] numero=linea.split("\\s+"); //dividimos la linea if (numero.length!=nodo.devuelvenumcolumnas()) { errorentrada("incorrecto numero de datos en la fila " + (a+1) + ":\ndeberia haber " + Nodo.devuelveNumColumnas() + "."); //if for (int bb=0;bb<numero.length;bb++){ if (numero[bb].equals("*")){ if (!yahayblanco){ prueba.inserta((a*nodo.devuelvenumfilas())+ bb,nodo.devuelvetopevalor() +1); yahayblanco=true; errorentrada("mas de un blanco en el puzzle."); //if yahayblanco else { //si no es asterisco try{ int proximo=integer.parseint(numero[bb]); if ((proximo>=nodo.devuelveminvalor())&& (proximo<nodo.devuelvetopevalor()+1)){ prueba.inserta((a*nodo.devuelvenumf ilas())+bb,proximo); //fuera de rango errorentrada("valor fuera de rango: " + proximo + ". Debe estar entre " + Nodo.devuelveMinValor() + " y " + Nodo.devuelveTopeValor()+"." ); catch(exception e){ //si fallo en conversion a int errorentrada("valor extraño en la " + "entrada: '" + numero[bb] + "'"); //try catch //if numero //for bb //for a return prueba; //fin traduce //sale del programa con el mensaje recibido en el String 'error' public static void errorentrada(string error){ System.out.println("Matriz de entrada incorrecta:\n" + error); System.exit(1); //Fallo 1= matriz de entrada incompleta o incorrecta //fin errorentrada 27

30 // Muestra los créditos y la sintaxis. Se han evitado los acentos para evitar // conflictos entre la codificación UNICODE del java y el ASCII de la consola public static void ayuda(){ System.out.println("Puzzle."); System.out.println("DIEGO J. SANCHEZ CAAMAÑO. DNI J"); System.out.println("Centro Asociado de Albacete."); System.out.println(); System.out.println("Formato de la linea de parametros: " + "java puzzle [-t] [-a] [-h] [fichero]"); System.out.println(); System.out.println("-t: Realiza un test de correccion al puzzle de " + "entrada."); System.out.println(" Si es incompleto o incorrecto, devuelve 1." + "\n En caso contrario, devuelve 0."); System.out.println(); System.out.println("-a: Modo traza. "); System.out.println(" Muestra toda la secuencia de tableros que se "+ "van generando\n hasta alcanzar la solucion con menor " + "numero de movimientos."); System.out.println(); System.out.println("-h: Modo ayuda. Muestra sintaxis y creditos."); System.out.println(); System.out.println("fichero: archivo con la matriz de entrada."); System.out.println(); //fin ayuda //fin clase Traduce 28

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Solución al Examen de Prácticas de Programación (Ingeniería Informática) Solución al Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte I. Cuestiones (3 puntos=50% nota del examen) 1) Se desea crear un conjunto de clases para representar en un programa

Más detalles

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

En cualquier caso, tampoco es demasiado importante el significado de la B, si es que lo tiene, lo interesante realmente es el algoritmo. Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa

Más detalles

Modulo 1 El lenguaje Java

Modulo 1 El lenguaje Java Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto

Más detalles

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES CASO PRÁCTICO DISTRIBUCIÓN DE COSTES Nuestra empresa tiene centros de distribución en tres ciudades europeas: Zaragoza, Milán y Burdeos. Hemos solicitado a los responsables de cada uno de los centros que

Más detalles

Centro de Capacitación en Informática

Centro de Capacitación en Informática Fórmulas y Funciones Las fórmulas constituyen el núcleo de cualquier hoja de cálculo, y por tanto de Excel. Mediante fórmulas, se llevan a cabo todos los cálculos que se necesitan en una hoja de cálculo.

Más detalles

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B)

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B) APRENDERAPROGRAMAR.COM OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B) Sección: Cursos Categoría: Tutorial básico del programador web: PHP desde cero

Más detalles

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F) APRENDERAPROGRAMAR.COM LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F) Sección: Cursos Categoría: Curso básico de programación en lenguaje C desde

Más detalles

Árboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores

Árboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores Árboles Cursos Propedéuticos 2015 Dr. René Cumplido M. en C. Luis Rodríguez Flores Contenido de la sección Introducción Árbol genérico Definición y representación Árboles binarios Definición, implementación,

Más detalles

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Competencias IIC1103 Introducción a la Programación (I/2010) Interrogación 1 13 de Abril de 2010

Más detalles

11. Algunas clases estándar de Java (II)

11. Algunas clases estándar de Java (II) 122 A. García-Beltrán y J.M. Arranz 11. Algunas clases estándar de Java (II) Objetivos: a) Presentar la clase predefinida en Java para trabajar con arrays b) Interpretar el código fuente de una aplicación

Más detalles

Tema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código

Tema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código Tema 6 Reutilización de código Programación 2015-2016 Programación - Tema 6: Reutilización de código 1 Tema 6. Reutilización de código Modularidad. Implementación de métodos. Uso de métodos. Programación

Más detalles

Hoja1!C4. Hoja1!$C$4. Fila

Hoja1!C4. Hoja1!$C$4. Fila CAPÍTULO 6......... Cálculo y funciones con Excel 2000 6.1.- Referencias De Celdas Como vimos con anterioridad en Excel 2000 se referencian las celdas por la fila y la columna en la que están. Además como

Más detalles

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ; TEMA 5. CONTROL DE FLUJO DEL PROGRAMA 5.1 Sentencias Una sentencia es una expresión seguida de un punto y coma. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ; El ; es obligatorio

Más detalles

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL OBJETIVO Mejorar el nivel de comprensión y el manejo de las destrezas del estudiante para utilizar formulas en Microsoft Excel 2010. 1) DEFINICIÓN Una fórmula de Excel es un código especial que introducimos

Más detalles

Fórmulas y funciones

Fórmulas y funciones 05... Fórmulas y funciones En este tema vamos a profundizar en el manejo de funciones ya definidas por Excel, con el objetivo de agilizar la creación de hojas de cálculo, estudiando la sintaxis de éstas

Más detalles

Operación de Microsoft Word

Operación de Microsoft Word Trabajar con tablas Las tablas permiten organizar la información y crear atractivos diseños de página con columnas paralelas de texto y gráficos. Las tablas pueden utilizarse para alinear números en columnas

Más detalles

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO 1.- Objetivos del laboratorio Diseño de clases en C++ Comprensión y uso del TAD Árbol Binario de Búsqueda

Más detalles

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Introducción FACULTAD DE INGENIERÍA. Ordenación

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Introducción FACULTAD DE INGENIERÍA. Ordenación Introducción Uno de los procedimientos más comunes y útiles en el procesamiento de datos, es la clasificación u ordenación de los mismos. Se considera ordenar al proceso de reorganizar un conjunto dado

Más detalles

Práctica 2: Simón dice

Práctica 2: Simón dice Práctica 2: Simón dice Fecha de entrega: 31 de enero de 2016 0.- Descripción del juego (Wikipedia.org) Simon dice es un juego electrónico, creado por Ralph Baer, que consiste en reproducir una secuencia

Más detalles

Tema 1: Fundamentos de lógica, teoría de conjuntos y estructuras algebraicas: Apéndice

Tema 1: Fundamentos de lógica, teoría de conjuntos y estructuras algebraicas: Apéndice Tema 1: Fundamentos de lógica, teoría de conjuntos y estructuras algebraicas: Apéndice 1 Polinomios Dedicaremos este apartado al repaso de los polinomios. Se define R[x] ={a 0 + a 1 x + a 2 x 2 +... +

Más detalles

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí

Más detalles

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º 1. Ejercicio (1 punto) Dado el array A={8, 3, 7, 1, 4, 9, 5, 2, 6 Describir cual es el estado del array A después de cada paso principal del algoritmo: InsertionSort. {8, 3, 7, 1, 4, 9, 5, 2, 6 {3, 8,

Más detalles

Programación de Sistemas

Programación de Sistemas Programación de Sistemas Algoritmos de Ordenación Índice Por qué es importante la ordenación? Un par de ejemplos InsertionSort QuickSort Para cada uno veremos: En qué consisten, Casos extremos Eficiencia

Más detalles

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009 Árboles Ejemplos de estructuras arborescentes: con forma de árbol Regla de Alcance: los objetos visibles en un procedimiento son aquellos declarados en él mismo o en cualquier ancestro de él (cualquier

Más detalles

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Uso de Ficheros Todas las estructuras de datos vistas hasta ahora utilizan la

Más detalles

MATERIAL 2 EXCEL 2007

MATERIAL 2 EXCEL 2007 INTRODUCCIÓN A EXCEL 2007 MATERIAL 2 EXCEL 2007 Excel 2007 es una planilla de cálculo, un programa que permite manejar datos de diferente tipo, realizar cálculos, hacer gráficos y tablas; una herramienta

Más detalles

PROPUESTAS COMERCIALES

PROPUESTAS COMERCIALES PROPUESTAS COMERCIALES 1. Alcance... 2 2. Entidades básicas... 2 3. Circuito... 2 3.1. Mantenimiento de rutas... 2 3.2. Añadir ofertas... 5 3.2.1. Alta desde CRM... 5 3.2.2. Alta desde el módulo de Propuestas

Más detalles

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 ARBOLES ESTRUCTURAS DE DATOS 2006 DEFINICION Un árbol (tree) es un conjunto finito de nodos. Es una estructura jerárquica aplicable sobre una colección de elementos u objetos llamados nodos; uno de los

Más detalles

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS CONTENIDOS 1. Introducción a las cadenas 2. Definición 3. Declaración de cadenas 4. Inicialización de cadenas 5. Escritura y Lectura de datos tipo cadena 6. Funciones de manipulación de cadenas 7. Arrays

Más detalles

GUIA BÁSICA DE ABSYSNET PARA PRINCIPIANTES

GUIA BÁSICA DE ABSYSNET PARA PRINCIPIANTES GUIA BÁSICA DE ABSYSNET PARA PRINCIPIANTES 1. INTRODUCCIÓN...1 2. ESCRITORIO...2 3. CATÁLOGO....4 4. LECTORES...11 5. CIRCULACIÓN...12 Préstamos....12 Renovaciones....13 Devoluciones...14 Reservas...14

Más detalles

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía. Examen Curso 2001-2002. Convocatoria de Febrero Página 1 Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía. Este ejercicio se divide en dos partes con el fin de que el alumno no intente

Más detalles

INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO

INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO MARCEL SANTOS ARIEL MARTINEZ AGUILAR GILBERTO. MATERIA: ESTRUCTURA

Más detalles

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A) aprenderaprogramar.com Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A) Sección: Cursos Categoría: Curso Bases de la programación

Más detalles

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro USAR MYSQL EN PHP PHP tiene una librería de funciones nativas para conectarse a las base de datos MySQL. Por un lado reconoce la librería mysql y por otro mysqli. Se recomienda el uso de mysqli dado que

Más detalles

Tema: Sobrecarga de Operadores.

Tema: Sobrecarga de Operadores. Programación II. Guía 7 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Sobrecarga de Operadores. Objetivos Describir como redefinir (sobrecargar) operadores para que funcionen

Más detalles

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL BLACKJACK Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones 1. Explicación del juego de cartas del Blackjack El Blackjack

Más detalles

Instructivo de Microsoft Excel 2003

Instructivo de Microsoft Excel 2003 Instructivo de Microsoft Excel 2003 El presente instructivo corresponde a una guía básica para el manejo del programa y la adquisición de conceptos en relación a este utilitario. Que es Microsoft Excel?

Más detalles

Programación Lineal. Ficha para enseñar a utilizar el Solver de EXCEL en la resolución de problemas de Programación Lineal

Programación Lineal. Ficha para enseñar a utilizar el Solver de EXCEL en la resolución de problemas de Programación Lineal Programación Lineal Ficha para enseñar a utilizar el Solver de EXCEL en la resolución de problemas de Programación Lineal Ejemplo: Plan de producción de PROTRAC En esta ficha vamos a comentar cómo se construyó

Más detalles

Estructuras de Datos y Algoritmos. Árboles de Expresión

Estructuras de Datos y Algoritmos. Árboles de Expresión Estructuras de Datos y Algoritmos Árboles de Expresión Año 2014 Introducción Los avances tecnológicos producen día a día una gran cantidad de información que debe ser almacenada y procesada en forma eficiente.

Más detalles

Fórmulas y funciones

Fórmulas y funciones Fórmulas y funciones Uso de fórmulas Las fórmulas son el corazón y el alma de la hoja de cálculo. Si no las necesitáramos sería lo mismo que trabajáramos en un procesador de textos. Excel 2007 ofrece un

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Prácticas de C++ Practica Nº 5 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº 5 Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1. Introducción... 1 1.1 Ejercicio 1: Mi

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Carné: Nombre: Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante INDICE 1. INTRODUCCIÓN... 1 Pag.1 1.1 EJERCICIO1: CÁLCULO DEL IMC (3.0 PTS.)... 1 1.2 EJERCICIO2: OPERADOR VIRTUAL DE

Más detalles

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora

Más detalles

Índice ÍNDICE...1 1. EJERCICIO 1: CÁLCULO FINANCIERO (5 PTOS.)...1 2. EJERCICIO 2: AGENCIA DE COLOCACIONES (5 PTOS.)...4

Índice ÍNDICE...1 1. EJERCICIO 1: CÁLCULO FINANCIERO (5 PTOS.)...1 2. EJERCICIO 2: AGENCIA DE COLOCACIONES (5 PTOS.)...4 Pág.1 Índice ÍNDICE...1 1. EJERCICIO 1: CÁLCULO FINANCIERO (5 PTOS.)...1 2. EJERCICIO 2: AGENCIA DE COLOCACIONES (5 PTOS.)...4 1. Ejercicio 1: Cálculo Financiero (5 ptos.) Desde un banco se le ha encargado

Más detalles

Centro de Capacitación en Informática

Centro de Capacitación en Informática Combinación de funciones y fórmulas =SI(Y(...)...) o =Si(O(...)...) En secciones anteriores vimos que la función SI() debía cumplir una condición, como por ejemplo, controlar si en una celda determinada

Más detalles

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio

Más detalles

Resolución de Problemas

Resolución de Problemas Introducción Resolución de Problemas La resolución de problemas es una capacidad que consideramos inteligente Somos capaces de resolver problemas muy diferentes Encontrar el camino en un laberinto Resolver

Más detalles

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas. Formularios TEMA: FORMULARIOS. 1. INTRODUCCIÓN. 2. CREACIÓN DE FORMULARIOS. 3. INTRODUCIR DATOS EN UN FORMULARIO. 4. MODIFICAR UN FORMULARIO 5. MANERAS DE GUARDAR UN FORMULARIO. 6. IMPRIMIR FORMULARIOS.

Más detalles

Manual del Protocolo XML-RPC de Mensajería Negocios

Manual del Protocolo XML-RPC de Mensajería Negocios Manual del Protocolo XML-RPC de Mensajería Negocios Índice de contenidos 1 INTRODUCCIÓN... 3 2 FUNCIONALIDADES DEL API DE COMUNICACIÓN XML-RPC... 4 2.1 Envío Libre... 4 2.2 Envío a Grupo de Contactos...

Más detalles

!!!!!!!! !!!!! Práctica!4.! Programación!básica!en!C.! ! Grado!en!Ingeniería!!en!Electrónica!y!Automática!Industrial! ! Curso!2015H2016!

!!!!!!!! !!!!! Práctica!4.! Programación!básica!en!C.! ! Grado!en!Ingeniería!!en!Electrónica!y!Automática!Industrial! ! Curso!2015H2016! INFORMÁTICA Práctica4. ProgramaciónbásicaenC. GradoenIngenieríaenElectrónicayAutomáticaIndustrial Curso2015H2016 v2.1(18.09.2015) A continuación figuran una serie de ejercicios propuestos, agrupados por

Más detalles

Ejemplos de conversión de reales a enteros

Ejemplos de conversión de reales a enteros Ejemplos de conversión de reales a enteros Con el siguiente programa se pueden apreciar las diferencias entre las cuatro funciones para convertir de reales a enteros: program convertir_real_a_entero print

Más detalles

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System. CICLO: 01/2010 Universidad Don Bosco Materia: Lenguaje de Programación III Contenido: 1-Lectura de Datos de entrada. 2-Introduccion a JOPTIONPANE. 3-Estructuras de Control. ->LECTURA DE DATOS DE ENTRADA

Más detalles

7. Manejo de Archivos en C.

7. Manejo de Archivos en C. 7. Manejo de Archivos en C. Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de

Más detalles

Funciones en Excel (II)

Funciones en Excel (II) Funciones en Excel (II) Las Funciones de Texto Jose Ignacio González Gómez Departamento de Economía Financiera y Contabilidad - Universidad de La Laguna www.jggomez.eu INDICE 1 Para qué las funciones de

Más detalles

Examen Septiembre Curso 2001-2002 -- Programación en C++ Pág. 1

Examen Septiembre Curso 2001-2002 -- Programación en C++ Pág. 1 Examen Septiembre Curso 2001-2002 -- Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Convertidor Dec->Hex y Hex->Dec (5.0 ptos.)... 1 1.1.1 Apartado A (4.0 ptos.)... 1 1.1.2 Apartado B (1.0

Más detalles

SECRETARÍA VIRTUAL Perfil Ciudadano

SECRETARÍA VIRTUAL Perfil Ciudadano SECRETARÍA VIRTUAL Perfil Ciudadano Marzo 2012 ÍNDICE 1. INTRODUCCIÓN...1 3. COMPONENTES NECESARIOS...3 4. TELETRAMITAR UNA SOLICITUD...4 4.1 Enviar una solicitud...4 4.1.1. Grabación de la solicitud...5

Más detalles

ESPOCH ESCUELA DE MEDICINA HERNANDEZ MAYRA FORMULAS Y DUNCIONES BASICAS ESPOCH

ESPOCH ESCUELA DE MEDICINA HERNANDEZ MAYRA FORMULAS Y DUNCIONES BASICAS ESPOCH ESPOCH ESCUELA DE MEDICINA HERNANDEZ MAYRA FORMULAS Y DUNCIONES BASICAS ESPOCH Contenido FORMULAS Y FUNCIONES BASICAS EN EXCEL... 2 1. FÓRMULAS DE EXCEL... 2 1.1 QUÉ SON LAS FÓRMULAS DE EXCEL?... 2 1.2

Más detalles

LECCIÓN 4ª Operaciones Numéricas

LECCIÓN 4ª Operaciones Numéricas REALIZAR OPERACIONES NUMERICAS LECCIÓN 4ª Operaciones Numéricas Excel es una hoja de cálculo y, como su nombre indica, su función fundamental es trabajar con grandes volúmenes de números y realizar cálculos

Más detalles

Construcción de Escenarios

Construcción de Escenarios Construcción de Escenarios Consiste en observar los diferentes resultados de un modelo, cuando se introducen diferentes valores en las variables de entrada. Por ejemplo: Ventas, crecimiento de ventas,

Más detalles

Una breve introducción a Excel c

Una breve introducción a Excel c Una breve introducción a Excel c Martes 22 de febrero de 2005 Curso de Formación continua en Matemáticas UAM Curso 2004/2005 1. Introducción Excel c es una aplicación de hojas de cálculo electrónicas:

Más detalles

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO Fecha última revisión: Marzo 2016 INDICE DE CONTENIDOS HERRAMIENTA DE APROVISIONAMIENTO... 2 1. QUÉ ES LA HERRAMIENTA DE APROVISIONAMIENTO... 2 HERRAMIENTA

Más detalles

Matemáticas para la Computación

Matemáticas para la Computación Matemáticas para la Computación José Alfredo Jiménez Murillo 2da Edición Inicio Índice Capítulo 1. Sistemas numéricos. Capítulo 2. Métodos de conteo. Capítulo 3. Conjuntos. Capítulo 4. Lógica Matemática.

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Carnet Nombre: Examen C++ Grupo A Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Pág.1 Índice 1. INTRODUCCIÓN... 1 2. EJERCICIO 1: AGENDA TELEFÓNICA (4.0 PTOS.)...1 3. EJERCICIO 2:

Más detalles

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

Ejercicio 1 (2 puntos. Tiempo: 25 minutos) Fecha de publicación de notas: jueves 18 de Julio. Fecha de revisión: viernes 19 de Julio a las 10:00h. Despacho C-209. Ejercicio 1 (2 puntos. Tiempo: 25 minutos) Se desea desarrollar un programa en C

Más detalles

Fundamentos de la Programación

Fundamentos de la Programación Fundamentos de la Programación El Software Las operaciones que debe realizar el hardware son especificadas con una lista de instrucciones, llamadas programas o software. Dos grandes grupos de software

Más detalles

Árboles AVL. Laboratorio de Programación II

Árboles AVL. Laboratorio de Programación II Árboles AVL Laboratorio de Programación II Definición Un árbol AVL es un árbol binario de búsqueda que cumple con la condición de que la diferencia entre las alturas de los subárboles de cada uno de sus

Más detalles

Flor +. Manual básico para enfermeras y auxiliares de Enfermería

Flor +. Manual básico para enfermeras y auxiliares de Enfermería HOSPITAL UNIVERSITARIO REINA SOFÍA ÁREA DE ENFERMERÍA Flor +. Manual básico para enfermeras y auxiliares de Enfermería Consejería de Salud 0. ACCESO AL MÓDULO Para acceder al sistema informático del hospital

Más detalles

Introducción al lenguaje Java

Introducción al lenguaje Java Tipo de entrega: Fecha límite: Lugar: Introducción al lenguaje Java por grupos de prácticas sesión de laboratorio Atenea Objetivos de la práctica: Escribir aplicaciones simples en Java Utilizar el entorno

Más detalles

NemoTPV SAT Manual de usuario 1. NemoTPV SAT APLICACIÓN DE GESTIÓN DE SERVICIO TÉCNICO PARA PUNTOS DE VENTA DE EUSKALTEL

NemoTPV SAT Manual de usuario 1. NemoTPV SAT APLICACIÓN DE GESTIÓN DE SERVICIO TÉCNICO PARA PUNTOS DE VENTA DE EUSKALTEL NemoTPV SAT Manual de usuario 1 NemoTPV SAT APLICACIÓN DE GESTIÓN DE SERVICIO TÉCNICO PARA PUNTOS DE VENTA DE EUSKALTEL NemoTPV SAT Manual de usuario 2 Ante un problema, lo importante no es saber solucionarlo,

Más detalles

Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL

Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL Índice 1 Introducción... 5 1.1 Perfil de la aplicación... 5 1.2 Requisitos técnicos... 5 2 Manual de usuario... 7 2.1 Instalación del certificado...

Más detalles

Aplicaciones Lineales

Aplicaciones Lineales Aplicaciones Lineales Ejercicio Dada la matriz A = 0 2 0 a) Escribir explícitamente la aplicación lineal f : 2 cuya matriz asociada con respecto a las bases canónicas es A. En primer lugar definimos las

Más detalles

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática Manejo básico de base de datos Unas de las capacidades de Excel es la de trabajar con listas o tablas de información: nombres, direcciones, teléfonos, etc. Excel puede trabajar con tablas de información

Más detalles

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA ARREGLOS EN JAVA I I N T R O D U C C I Ó N En las sesiones anteriores, los datos manejados en los programas han sido datos simples (carácter, entero, reales) En un gran número de problemas es necesario

Más detalles

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario.

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario. WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario. Índice contenido. INTRODUCCIÓN... 1-2 1. ENTORNO DE TRABAJO... 1-2 2. EDICIÓN DE PROGRAMAS...

Más detalles

Arreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h>

Arreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h> Arreglos Introducción. En los temas anteriores se han estudiado los diferentes tipos de datos simples de C++, usados para representar valores simples como enteros, reales o caracteres. Sin embargo, en

Más detalles

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C) APRENDERAPROGRAMAR.COM GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C) Sección: Cursos Categoría: Lenguaje de programación Java nivel avanzado I

Más detalles

Capítulo 4 Procesos con estructuras de repetición

Capítulo 4 Procesos con estructuras de repetición Estructura de contador Capítulo 4 Procesos con estructuras de repetición Esta es una operación que incrementa en una unidad el valor almacenado en la variable c, cada vez que el flujo del diagrama pasa

Más detalles

Pruebas de unidad con JUnit

Pruebas de unidad con JUnit Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro

Más detalles

Capítulo 12: Indexación y asociación

Capítulo 12: Indexación y asociación Capítulo 12: Indexación y asociación Conceptos básicos Índices ordenados Archivos de índice de árbol B+ Archivos de índice de árbol B Asociación estática Asociación dinámica Comparación entre indexación

Más detalles

MANUAL DE USUARIO SECTOR PRIVADO (RESUMEN)

MANUAL DE USUARIO SECTOR PRIVADO (RESUMEN) MANUAL USUARIO - SIDREP DESARROLLO DE UN SISTEMA DE DECLARACIÓN Y SEGUIMIENTO DE RESIDUOS PELIGROSOS MANUAL DE USUARIO SECTOR PRIVADO (RESUMEN) PREPARADO PARA COMISIÓN NACIONAL DEL MEDIO AMBIENTE, CONAMA

Más detalles

Programa Presupuestos de Sevillana de Informática.

Programa Presupuestos de Sevillana de Informática. Programa Presupuestos de Sevillana de Informática. Introducción. En sus inicios, el programa Presupuestos estaba pensado únicamente para escribir e imprimir presupuestos, facilitando el trabajo con un

Más detalles

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes: Descripción del ambiente de trabajo Entrar y salir de la aplicación Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes: A través del botón :

Más detalles

<SOLICITUD DE CLAVE SAC> MANUAL DE USUARIO

<SOLICITUD DE CLAVE SAC> MANUAL DE USUARIO MANUAL DE USUARIO ÍNDICE 1 INTRODUCCIÓN... 3 1.1 Descripción de la aplicación... 3 1.2 Alcance de la aplicación... 3 1.3 Usuarios de la aplicación (roles)... 3 1.4 Acceso a la

Más detalles

Unidad: Representación gráfica del movimiento

Unidad: Representación gráfica del movimiento Unidad: Representación gráfica del movimiento Aplicando y repasando el concepto de rapidez Esta primera actividad repasa el concepto de rapidez definido anteriormente. Posición Esta actividad introduce

Más detalles

El palacio de la Alhambra: La primera expansión. El favor de los visires

El palacio de la Alhambra: La primera expansión. El favor de los visires El palacio de la Alhambra: La primera expansión El favor de los visires Traducido al español por javche Esta expansión contiene cuatro módulos diferentes, que pueden combinarse individualmente o todos

Más detalles

Nota 2. Luis Sierra. Marzo del 2010

Nota 2. Luis Sierra. Marzo del 2010 Nota 2 Luis Sierra Marzo del 2010 Cada mecanismo de definición de conjuntos que hemos comentado sugiere mecanismos para definir funciones y probar propiedades. Recordemos brevemente qué son las funciones

Más detalles

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso 2013-2014. v1.0 (05.03.

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso 2013-2014. v1.0 (05.03. INFORMÁTICA Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial Curso 2013-2014 v1.0 (05.03.14) A continuación figuran una serie de ejercicios propuestos, agrupados

Más detalles

GE Power Management. 6S``O[WS\bORS1]\TWUc`OQWÕ\g. GE-FILES 7\ab`cQQW]\Sa 539$ &

GE Power Management. 6S``O[WS\bORS1]\TWUc`OQWÕ\g. GE-FILES 7\ab`cQQW]\Sa 539$ & ')) GE Power Management 6S``O[WS\bORS1]\TWUc`OQWÕ\g /\ãzwawars@suwab`]arszawabs[o GE-FILES 7\ab`cQQW]\Sa 539$ & *(Ã3RZHUÃ0DQDJHPHQW +D\DOJRTXHQRHQFXHQWUD" $OJRQRHVWiVXILFLHQWHPHQWHFODUR" 6,Ã 7,(1(Ã $/*Ô1Ã

Más detalles

Para utilizar esta nueva funcionalidad usted debe hacer lo siguiente: Figura 1. Ventana buscar usuarios para modificar.

Para utilizar esta nueva funcionalidad usted debe hacer lo siguiente: Figura 1. Ventana buscar usuarios para modificar. Manejo de NIIF Sistema Administrativo Windows (SAW) Ahora el software administrativo (SAW) incluye las NIIF para facilitar el manejo de esta normativa en las actividades contables de su empresa. Este instructivo

Más detalles

Figura 1 Abrir nueva hoja de cálculo

Figura 1 Abrir nueva hoja de cálculo 1. DISEÑO DE UNA HOJA Para abrir una hoja de cálculo existente en el espacio de trabajo del usuario, debe ir al menú Archivo > Abrir, o bien desde el botón Abrir archivo de la barra de herramientas, o

Más detalles

BREVE MANUAL DE SOLVER

BREVE MANUAL DE SOLVER BREVE MANUAL DE SOLVER PROFESOR: DAVID LAHOZ ARNEDO PROGRAMACIÓN LINEAL Definición: Un problema se define de programación lineal si se busca calcular el máximo o el mínimo de una función lineal, la relación

Más detalles

PRÁCTICA N 2 SISTEMAS DE NUMERACIÓN

PRÁCTICA N 2 SISTEMAS DE NUMERACIÓN PRÁCTICA N 2 SISTEMAS DE NUMERACIÓN Ejercicio 1. Diseñar una planilla EXCEL que tome como dato de entrada un número entero y devuelva la representación en base 2. Testearla con los números 23, 245, 673,

Más detalles

Trabajo Práctico N 4: Diseño por Contratos

Trabajo Práctico N 4: Diseño por Contratos 1. Defina los contratos de las siguientes clases: Trabajo Práctico N 4: Diseño por Contratos a. La clase Fecha representa una fecha en el formato dia, mes y año. Especificar los contratos para asegurar

Más detalles

El proceso de edición digital en Artelope y CTCE

El proceso de edición digital en Artelope y CTCE El proceso de edición digital en Artelope y CTCE Carlos Muñoz Pons Universitat de València carlos.munoz-pons@uv.es Introducción Una de las cuestiones más importantes a la hora de trabajar en proyectos

Más detalles

Estimado usuario. Tabla de Contenidos

Estimado usuario. Tabla de Contenidos Estimado usuario. El motivo del presente correo electrónico es mantenerle informado de las mejoras y cambios realizados en el software Orathor (Athor/Olimpo) en su versión 5.7.041 la cual ha sido recientemente

Más detalles

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante) 1. : La clase Cuenta. Uso de la clase Cuenta 3. Métodos y objetos receptores de mensajes (Importante) 1 Una clase para cuentas de un banco Vamos a modelar con una clase, un nuevo tipo de datos, donde los

Más detalles

Proyectos de Innovación Docente

Proyectos de Innovación Docente Proyectos de Innovación Docente Manual de Usuario Vicerrectorado de Docencia y Profesorado Contenido INTRODUCCIÓN... 3 DATOS PERSONALES... 6 Modificar email... 6 Modificar contraseña... 7 GESTIÓN PROYECTOS...

Más detalles

Herramienta Solver. Activar Excel Solver

Herramienta Solver. Activar Excel Solver Herramienta Solver Introducción: Solver forma parte de una serie de comandos a veces denominados herramientas de análisis Y si. Con Solver, puede encontrar un valor óptimo (mínimo o máximo) para una fórmula

Más detalles

2. Estructura de un programa en Java

2. Estructura de un programa en Java 24 A. García-Beltrán y J.M. Arranz 2. Estructura de un programa en Java Objetivos: a) Describir la estructura del código fuente de una aplicación Java b) Presentar los conceptos de comentario y de identificador

Más detalles

Sistema de Gestión Académica TESEO. Revisión 1.0. Servicio de Informática Área de Gestión (GESTIÓN DE RESÚMENES DE TESIS DOCTORALES)

Sistema de Gestión Académica TESEO. Revisión 1.0. Servicio de Informática Área de Gestión (GESTIÓN DE RESÚMENES DE TESIS DOCTORALES) Sistema de Gestión Académica TESEO (GESTIÓN DE RESÚMENES DE TESIS DOCTORALES) Revisión 1.0 Servicio de Informática Área de Gestión Mayo de 2004 INDICE INDICE... 1 1 Introducción... 1 2 Procedimiento....

Más detalles