ALGORITMOS Y ESTRUCTURAS DE DATOS II
|
|
|
- María Pilar Martín López
- hace 8 años
- Vistas:
Transcripción
1 ALGORITMOS Y ESTRUCTURAS DE DATOS II PRÁCTICA 2ª ESTUDIO EXPERIMENTAL DE ALGORITMOS RECURSIVOS (Sesiones de laboratorio = 2, Total = 3 horas. Curso 2000/01) ÍNDICE 1.- Introducción. 2.- Soporte operacional de la recursión. Coste espacial Estructura de la pila de registros de activación. Paso de parámetros 2.2. Estudio de algoritmos recursivos. Coste espacial de la recursión 3. Depuración de programas: gdb, xxgdb 4.- Actividades de laboratorio Mecanismo de llamadas a subprogramas Estudio de la función recursiva factorial Estudio del procedimiento recursivo potencia Implementación y estudio de un algoritmo recursivo: Hanoi Implementación Estudio de la complejidad del algoritmo 5.- Cuestiones relativas a la práctica APÉNDICE. Comandos del gdb OBJETIVOS Conocer el soporte que proporciona el lenguaje PASCAL para la ejecución de subprogramas y su aplicación a la ejecución de rutinas recursivas. Estudiar el paso de parámetros en las llamadas a subrutinas. Estudiar el coste espacial asociado a la ejecución de una rutina recursiva. Conocer el uso de un depurador. BIBLIOGRAFÍA Wirth, N. Algoritmos + Estructuras de Datos = Programas. Edit. del Castillo, Madrid, Capítulo 3: Algoritmos recursivos. Rohl, J.S., Recursion via Pascal. Edit. Cambridge University Press, En el capítulo 1 se estudia en detalle el funcionamiento de los registros de activación. Manuales de los comandos gdb y xxgdb, que se pueden obtener utilizando el comando man del sistema operativo. El depurador proporciona una ayuda interactiva (help). 1.- INTRODUCCIÓN Se dice que un algoritmo es recursivo si entre sus instrucciones aparece algún tipo de referencia a sí mismo, esto es, si la computación que el algoritmo realiza está parcialmente expresada en términos de sí mismo. EJEMPLO. Una definición habitual de la función factorial para un número n mayor que 0 es: n!=n (n-1) (n-2) (1) Además, 0! es 1 por definición. Esta función se puede implementar mediante una iteración: {n 0} función factoriali(n:entero) devuelve entero; var f,i: entero fvar f:=1; {f=1!=0!} Para i:=2 hasta n hacer {f=(i-1)!} f:=i*f {f=i(i-1)!=i!}; factoriali:=f ffunción {factoriali(n)=n!} cuya transcripción a un lenguaje de programación estructurado como PASCAL es inmediata. En la definición (1) dada para n!, y tal como se ha tenido en cuenta en los asertos que se ha incluido en la función anterior, se puede notar que, excepto para se tiene n!=n (n-1)! Ello hace pensar que en lenguaje algorítmico, se podría definir una función recursiva factorialr, cuyo código tuviera la siguiente estructura: {n 0} función factorialr(n:entero) devuelve entero; opción n>0: devuelve n*factorialr(n-1) n=0: devuelve 1 fopción ffunción {factorialr(n)=n!} La transcripción de esta función a un lenguaje de programación puede parecer problemática, dado que se está haciendo uso de la función factorialr para dar la definición de la propia función. Sin embargo, lenguajes como PASCAL, ADA y C sí que permiten y soportan este tipo de definiciones recursivas. En el apartado 2 se recuerda cuál es el mecanismo que resuelve las llamadas a procedimiento o función, y en el apartado 3 se muestra el uso de un depurador, que entre otras cosas permitirá observar el estado de la pila de llamadas a lo largo de la ejecución de un programa. Mediante un ejemplo se verá cómo este mecanismo es la base de la ejecución de una rutina recursiva. Las actividades y servirán para ilustrar este mecanismo. Finalmente, en la actividad 4.2 se propone la implementación y el estudio de la solución recursiva al problema de las Torres de Hanoi. 1 2
2 2.- SOPORTE OPERACIONAL DE LA RECURSIÓN. COSTE ESPACIAL Estructura de la pila de registros de activación. Paso de parámetros La invocación de un subprograma, función o procedimiento, implica la ejecución de las instrucciones asociadas a dicho subprograma con el entorno (información local y global) definido para el mismo. Para la información local (parámetros y variables) de la llamada, el compilador reserva un espacio de memoria destinado a mantener esta información sobre la que opera el subprograma. Al finalizar la ejecución del subprograma la zona de memoria asignada es liberada, tras lo cual puede ser reutilizada posteriormente. Es importante señalar que la reserva de memoria para la información local está asociada a la llamada al subprograma y no al propio subprograma. El programa sólo tiene acceso a la memoria asociada a la llamada activa y a la de los subprogramas de menor nivel. Tal como se estudió en la práctica 3 de IPR- AD1, Subprogramación, esta información local se estructura en una pila de registros de activación. En dicha práctica se mostraba el siguiente ejemplo. x EJEMPLO. Considérese la función x! combina(x,y) = y =. Se podría escribir un y! ( x y)! programa Pcombina que contuviese las siguientes definiciones, y que efectuase la llamada combina(5,2,nocomb), en donde Nocomb sería una variable del programa. {n 0} function factoriali(n:integer): integer; var f,i: integer; {4} f:=1; For i:=2 to n do f:=i*f; factoriali:=f {5} end; {factoriali(n)=n!} {x>=y>=0} procedure combina(x,y:integer; var res:integer); var i,j,k: integer; {1} i:=factoriali(x); {2} j:=factoriali(x-y); {3} k:=factoriali(y); res:=i div (j*k) end; {combina} {res=x sobre y=x!/[(x-y)!y!]} Supóngase que se dispusiese de algún mecanismo para marcar los puntos {1},{2},{3},{4} y {5} para que la ejecución se detuviese al alcanzar dichos puntos, y que se pudiese examinar la pila. Entonces, por ejemplo, alcanzado el punto {5} después de pasar por {1}, y antes de llegar a {2}, se podría observar lo siguiente : FactorialI(n=5) f=120, i=5 FactorialI=120 Combina(x=5,y=2,res=@) i=?, j=?, k=? Nocomb=? En la figura se ha sombreado el registro que en este estado permanece inaccesible al programa. Es especialmente interesante recordar y subrayar los siguientes puntos: 1. El registro de activación asociado a la llamada a cualquier función o procedimiento permanece en memoria hasta que esta llamada acaba. Por ejemplo, en el estado mostrado en la figura anterior, el registro asociado a combina permanece en memoria hasta que se completa su ejecución, después de completarse las tres llamadas factoriali(x), factoriali(x-y), factoriali(y). 2. En el caso en que dos o más subrutinas tengan una variable local o parámetro con el mismo nombre, no hay ambigüedad sobre su uso. En el ejemplo anterior, a pesar de que combina y factoriali tienen una variable local con el mismo nombre i-, el programa entiende que cualquier acción sobre la variable i se refiere a la que está ubicada en el registro activo. Son estas características de la pila las que van a permitir la correcta ejecución de funciones y procedimientos definidos recursivamente Estudio de algoritmos recursivos. Coste espacial de la recursión Mediante un ejemplo se va a estudiar el comportamiento de la pila de registros cuando se invoca a una rutina definida recursivamente. La llamada a la rutina desencadena una serie de registros de activación en la pila. Es importante señalar que cada registro de activación está asociado a la llamada al subprograma y no al propio subprograma, por lo que distintas llamadas a un mismo subprograma, como ocurre en el caso en que hay recursión, provocan la reserva de distintas registros de activación, uno para cada llamada. EJEMPLO. Supóngase la transcripción a PASCAL de la función recursiva factorialr definida en el apartado 1. Se desea estudiar la secuencia de registros de activación que se produce para ejecutar la instrucción num:=factorialr(2) Se observará el estado de la pila en los puntos {1} y {2} del código de la función: { n >= 0 } function factorialr(n: integer): integer; {1} if n > 0 then factorialr:= n * factorialr(n - 1) else factorialr:=1 {2} end; { factorialr(n) = n! } La invocación a factorialr(2), hará que se cargue el registro de activación correspondiente, y que la ejecución del programa continúe por el código de dicha función. Si al llegar al punto {1} se consulta el estado de la pila aparecen dos registros, que se numeran en orden inverso a su antigüedad en la pila. Al proseguir la ejecución y ser n>0, se invoca a factorialr(n-1). Esta nueva llamada supone otro registro de activación en la pila, y que la ejecución vuelva a entrar en el código de la función factorialr. Dado que el programa sólo tiene acceso a la memoria asociada a la llamada activa y a la de los subprogramas de menor nivel al de dicha llamada, cuando se 3 4
3 nombra una variable o parámetro de una rutina recursiva, no hay ambigüedad, y se sabe que se está referenciando las variables y parámetros asociados a la llamada. Las sucesivas llamadas producirían la siguiente secuencia de estados: num=? num=? num=? num=? Para la última llamada, se da valor a la variable factorialr en el registro activo, y al pasar la ejecución por el punto {2} se podría observar el cambio en dicho registro: num=? <----- factorialr:=1 Entonces, acaba la ejecución de la llamada activa, se libera su registro de activación, y continúa la ejecución de la llamada factorialr(1): num=? > factorialr:=n*factorial(n-1) En el registro activo: n=1 num=? La secuencia de retornos que se obtendría sería: factorialr=2 num=? num=? num=? num=2 Se puede definir el coste espacial de una llamada a función o procedimiento como el tamaño de la zona de memoria que se necesita para ejecutar dicha llamada. Si la rutina es recursiva, completar la ejecución de una llamada exige disponer en memoria su propio registro de activación, así como los asociados a las llamadas sucesivas que se generan. En ese caso: coste espacial = p tamaño del registro de activación en donde p es el máximo número de registros que llegan a existir simultáneamente en memoria a lo largo de la ejecución de la llamada. 3.- DEPURACIÓN DE PROGRAMAS: gdb, xxgdb Un depurador (debugger) es una herramienta software que permite la ejecución de un programa instrucción a instrucción, al tiempo que hace posible examinar aspectos relevantes de la ejecución, como el estado de las variables en un instante dado, las llamadas y los retornos de los subprogramas, etc. Para programas escritos en PASCAL, en el laboratorio se dispone de un depurador, el gdb, (gnu debugger). Con gdb se pueden depurar los programas compilados con los compiladores de GNU, como gpc y gcc. Fundamentalmente, un depurador permite: 1. Ejecutar un programa instrucción a instrucción (ver comandos de control de la ejecución en el apéndice). También se puede detener la ejecución en un punto dado, estableciendo lo que se denomina un punto de ruptura (ver comandos de gestión de los puntos de ruptura en el apéndice). 2. Una vez detenida momentáneamente la ejecución del programa, se puede consultar el estado de las variables (ver comandos de visualización de variables en el apéndice). 3. También se pueden examinar las llamadas y retornos de los subprogramas. 4. Examinar los registros de activación existentes en la pila en un momento dado de la ejecución del programa memoria (ver comandos de visualización de la pila en el apéndice). EJEMPLO. Considérese la figura del apartado 2.1, en la que se mostraba un estado de la pila de llamadas desencadenadas por combina(5,2,nocomb). Lo que se muestra a continuación correponde a una ejecución real del programa, detenida en el mismo estado que se muestra en 5 6
4 dicha en figura. Si en dicho estado se pide al depurador que muestre la pila de registros, (comando bt) proporciona la siguiente información: #0 Factorial_i (N=5) at Pcombina.p:11 #1 0x804941f in at Pcombina.p:21 #2 0x in program_pcombina() at Pcombina.p:32 #3 0x80495e8 in main (argc=1,argv=0xbffffac4,envp=0xbffffacc) at Pcombina.p:35 #4 0x4004bcb3 in libc_start_main... Los registros aparecen numerados en orden inverso a su aparición, siendo el registro 0 el activo, correspondiente a Factorial_I(5). El registro 1 corresponde a la llamada combina(5,2,nocomb), y el registro 2 al programa principal Pcombina. Los dos últimos registros (3 y 4) corresponden a información propia del compilador. Cabe destacar que en el registro 2, aparece como valor del parámetro Res la dirección de la variable Nocomb que se ha pasado por referencia en esa llamada. Ello se puede comprobar interrogando al depurador por la dirección de Nocomb (ver comando printf), que confirmaría que es 0x805b674. El depurador permite examinar en detalle cada uno de los registros. Por ejemplo el examen del registro 0 indicaría que sus variables locales son (ver comando info locals): retval_factorial_i = 120 F = 120 I = 5 Nótese que se usa una variable no declarada explícitamente retval_factorial_i en la que se dispone el valor que retorna la función. También puede dar información más detallada de los parámetros que se pasan por referencia. Por ejemplo, aunque el registro activo siempre es el más reciente en la pila (#0), se le puede pedir al depurador que se disponga a inspeccionar el registro 1 (ver comando frame). Entonces, si se escribe el contenido del parámetro formal Res, (ver comando print) la respuesta es: (Integer 0 indicando que el parámetro real es una variable entera que ocupa la dirección 0x805b674, y cuyo contenido es 0. En este caso, el valor del parámetro todavía no ha sido calculado, y el valor 0 corresponde a lo que el depurador encuentra en esa posición de memoria, interpretado como un entero. En el laboratorio, en el entorno de ventanas X del sistema operativo, se podrá usar el depurador gdb desde la interfaz gráfica xxgdb, la cual proporciona diversas facilidades, como el uso de botones para algunos de los comandos citados en los párrafos anteriores, el manejo del ratón para recorrer las líneas de código y situar el cursor, etc ACTIVIDADES DE LABORATORIO 4.1 Mecanismo de llamadas a subprogramas Las actividades a realizar en el laboratorio consisten en la ejecución desde el depurador xxgdb de dos subprogramas recursivos (factorial y potencia). La resolución de las llamadas a los subprogramas se examinará visualizando la sucesión de registros de activación que se generan. En /practicas/asignaturas/practicas/ad2alum/pract3 se dispondrá de los ficheros Pfactorial.p y Ppotencia.p con los programas que definen y usan estos subprogramas Estudio de la función recursiva factorial Se compilará el programa Pfactorial.p con las opciones adecuadas (ver el Apéndice) y se ejecutará desde el depurador, examinando la pila en las entradas y retornos de cada llamada, y poder comparar el coste espacial del factorial recursivo con el de la versión iterativa descrita en el apartado 2.1 (ver la cuestión 3 del boletín). El subprograma que se estudiará es el descrito en el apartado 2.2 de este boletín Estudio del procedimiento potencia Se compilará el programa Ppotencia.p y se ejecutará desde el depurador, para poder examinar la pila de llamadas y los resultados obtenidos (ver la cuestión 4 de este boletín). El subprograma cuya ejecución se estudiará, es un procedimiento que calcula la potencia entera de un número entero, sugiriéndose probar el cálculo de 3^2. Dicho subprograma se muestra a continuación: { x > 0 y >= 0 } Procedure potencia(x,y: Integer; var result: Integer); var aux:integer; Begin if y = 0 then result := 1 else potencia(x,y-1,aux); result := x * aux end End; Obsérvese que el tercer parámetro de este procedimiento se pasa por referencia, ya que es de salida. Por lo tanto, para hacer una llamada inicial a este procedimento desde el programa principal, será necesario utilizar una variable global en la posición del parámetro pasado por referencia. En la práctica se deberá estudiar la evolución de esta variable, y relacionarla con la evolución de la variable local aux y del parámetro variable result de cada registro de activación Implementación y estudio de un algoritmo recursivo: Torres de Hanoi El problema se plantea de la manera siguiente: Se dispone de tres torres numeradas de 1 a 3, y de N discos de diferentes tamaños. Al principio todos los discos se encuentran en una de las torres (torre 1) apilados en forma decreciente según su diámetro. Se deben desplazar a la torre número 3, utilizando como auxiliar la torre 2. Se imponen las siguientes limitaciones: 1. sólo se puede desplazar un disco cada vez, y 2. en cualquier situación intermedia, no puede haber un disco de mayor diámetro situado sobre uno más pequeño. 7 8
5 Una solución recursiva a este problema la da el siguiente algoritmo: {n>=1} Procedimiento Hanoi (n:integer; orig, dest, aux:torre); Opción n=1: mueve_disco(orig,dest); n>1: Hanoi (n-1, orig, aux, dest); mueve_disco(orig,dest); Hanoi(n-1,aux,dest,orig); Fopción fprocedimiento; Implementación Se debe escribir un programa en PASCAL que contenga este procedimiento, y se ejecutará Hanoi(N,1,3,2), para un número N de discos que se leerá del input. Para visualizar la resolución del problema, la acción mueve_disco(torre1,torre2) deberá implementarse para que escriba por pantalla entre qué dos torres se realiza el movimiento. El tipo torre se definirá como un subrango del integer desde 1 hasta 3. Se puede comprobar que el programa funciona correctamente con un número de discos pequeño (2 ó 3) Estudio de la complejidad del algoritmo Una alternativa a la medida de tiempos del sistema consiste en contabilizar los pasos de programa que en función de la talla, realiza el algoritmo para resolver el problema planteado. En el caso de algoritmos recursivos puede ser interesante estudiar el número de operaciones significativas que se realizan y el número de llamadas recursivas que se desencadenan en la resolución del problema. Por ejemplo, para el problema de las torres de Hanoi se propone estudiar: Número total de movimientos de discos, Número total de llamadas recursivas realizadas, Número total de llamadas recursivas al caso base. El método a seguir constará de los siguientes pasos: 1. Cambiar la cabecera del procedimiento añadiendo tres parámetros : Procedure Hanoi(n:integer;orig,dest,aux:torre; var nmov, nllam,nllamcb:integer); que deberán modificarse adecuadamente dentro del procedimiento para que cuenten, repectivamente, el número de movimientos (nmov), el número de llamadas (nllam) y el número de llamadas con el caso base (nllamcb). Estos contadores deberán de estar iniciados a 0 antes de la primera llamada. 2. Ejecutar el programa, con tallas 2, 3, 4,..., 20. Los cálculos realizados se presentarán en una tabla con un formato similar al siguiente: # Talla No.Mov No.Llam No.LlamCB # Comparar los resultados obtenidos con lo que se prevé teóricamente (ver cuestiones 8, 9 y 10 del boletín). 5.- CUESTIONES RELATIVAS A LA PRÁCTICA 1.- Suponer que en el algoritmo de búsqueda binaria de la práctica 2 se modifica el parámetro de tipo vector y se pasa por valor. Cómo repercute esta modificación en el coste temporal del algoritmo?. Qué ocurriría si la modificación se realiza sobre el algoritmo de búsqueda secuencial?. Cómo afectaría al coste en memoria en ambos algoritmos?. 2.- En la siguiente tabla se muestran los tiempos de ejecución que se obtienen para el producto escalar de dos vectores que se ha implementado en la primera práctica. En la columna Tref se muestran los tiempos cuando la función se ha implementado con el perfil Function ProdEsc(var u,v:vector): real; mientras que los tiempos de la columna Tval corresponden a una implementación con el perfil Function ProdEsc(u,v: vector): real; Teniendo en cuenta cómo se tratan los parámetros en el registro de activación correspondiente a una llamada a subrutina, según se pasen por valor o por referencia, y que el tipo vector se definió como array[ ] of real, explicar la diferencia entre los tiempos obtenidos. #Medidas de tiempo: Producto escalar de vectores # Talla TRef Tval # Comparar el coste espacial y el coste temporal en función de n, del cálculo de n!, cuando se implementa con la función factoriali(n) y con la función factorialr(n), descritas en la práctica. 4.- Considérese el programa Ppotencia de la práctica, en el que se hubieran marcado {1} y {2} como puntos de ruptura dentro del código de potencia: {x>0, y>=0} procedure potencia(x, y: integer; var res: integer); var aux: integer; {1} if y = 0 then res:=1 else potencia(x,y-1,aux); res:=x*aux end {2} end; { res = x ^ y } Supóngase que la ejecución del programa se hubiera detenido en {2}. Escribir en los recuadros al efecto, la respuesta que daría el depurador gdb a los comandos dados. Justificar la respuesta. (gdb) bt #0 Potencia (X=4, Y=0, Res=@0xbffffa40) at Ppotencia.p:14 #1 0x80493e2 in Potencia (X=4, Y=1, Res=@0xbffffa58) at Ppotencia.p:16 #2 0x80493e2 in Potencia (X=4, Y=2, Res=@0x805b59c) at Ppotencia.p:16 #3 0x80494af in program_ppotencia () at Ppotencia.p:
6 #4 0x in main (argc=1, argv=0xbffffac4, envp=0xbffffacc) at Ppotencia.p:27 #5 0x4004bcb3 in libc_start_main... (gdb) continue Continuing. Breakpoint 2, Potencia (X=4, Y=0, at Ppotencia.p:19 end; {potencia} (gdb) print Res $1 = (Integer 1 (gdb) frame 1 #1 0x80493e2 in Potencia (X=4, Y=1, Res=@0xbffffa58) at Ppotencia.p:16 potencia(x,y-1,aux); (gdb) print Aux... (gdb) continue Continuing. Breakpoint 2, Potencia (X=4, Y=2, Res=@0x805b59c) at Ppotencia.p:19 end; {potencia} (gdb) bt #0 Potencia (X=4, Y=2, Res=@0x805b59c) at Ppotencia.p:19 #1 0x80494af in program_ppotencia () at Ppotencia.p:25 #2 0x in main (argc=1, argv=0xbffffac4, envp=0xbffffacc) at Ppotencia.p:27 #3 0x4004bcb3 in libc_start_main (main=0x804952c... (gdb) print Res function fib(n: integer):integer; var f1, f2:integer; Begin If (n=1) or (n=0) then fib:= n else Begin f1:=fib(n-1); f2:=fib(n-2); fib:=f1+f2 End End; El cálculo de fib(n) se despliega o ramifica en el cálculo de fib(n-1) y de fib(n-2), lo que se puede representar gráficamente como: fib(n-1) fib(n) fib(n-2) Nótese que antes de ejecutar fib(n-2) se debe terminar la ejecución de fib(n-1), lo que quiere decir que los registros de activación asociados a ambas llamadas no llegan a coexistir en memoria. Con esta representación en árbol, la estructura de llamadas asociada al cálculo de fib(4) quedaría: fib(3) fib(4) fib(2) (gdb) print Resultado (gdb) continue Continuing. 4 elevado a 2 es 16 Program exited normally. 5.- Otro posible método para contabilizar el número de movimientos y de llamadas del procedimiento Hanoi consistiría en definir los contadores nmov, nllam, nllamcb como variables globales del programa principal en lugar de parámetros del subprograma, y que éste las modificara como efecto lateral. Reescribir el programa del apartado siguiendo este método. Podrían haberse definido estos contadores como variables locales del subprograma?. 6.- Representar gráficamente con gnuplot (o herramienta equivalente) los valores obtenidos en el apartado en función de la talla. Escribir unas relaciones de recurrencia que expresen el número de movimientos de discos realizados en función de la talla del problema. Resolver la recurrencia y comparar el resultado obtenido con los obtenidos en el laboratorio. 7.- Supóngase la siguiente implementación en PASCAL de la función de Fibonacci: { n >= 0} fib(1) fib(2) fib(1) fib(1) fib(0) fib(0) a) Numerar el orden en que se generan las sucesivas llamadas de la figura anterior. b) Cuántos registros de activación llegan a existir simultáneamente en memoria para fib(4)?, y para fib(n)?. 8.- Estudiar el coste espacial del algoritmo recursivo Hanoi para N discos. Dibujar el árbol de llamadas que se producen para N=4. Demostrar analíticamente que, para cualquier N, el número total de llamadas es una menos que el doble de llamadas al caso base. 9.- Suponer que el algoritmo Hanoi gobernara un robot que pudiese mover un disco de una torre a otra en una décima de segundo. Cuánto tiempo le costaría al robot trasladar una torre de 64 discos? El siguiente procedimiento es una variante correcta del algoritmo Hanoi presentado: {n>=0} Procedimiento Hanoi2(n: integer; orig,dest,aux: torre); Opción n=0: n>0: instrucción vacía; Hanoi2(n-1,orig,aux,dest); mueve_disco(orig,dest); 11 12
7 Hanoi2(n-1,aux,dest,orig); fopción fprocedimiento; Este algoritmo se diferencia del anterior en que se admite como subproblema más pequeño posible el de la torre vacía (n=0), que se toma como caso base, y se resuelve trivialmente, dado que no hay ningún disco que trasladar. Con este tratamiento de Hanoi(0,t1,t2,t3), el caso general del algoritmo también trata correctamente el caso y por ello se ha englobado en dicho caso general. A esta solución, se le puede objetar que es peor que la anterior, porque se hacen llamadas con un argumento n=0 que antes no se hacían. Se puede pensar que al resolverse con la instrucción vacía, estas llamadas recursivas deben ser muy poco costosas y su contribución al coste temporal total del algoritmo se puede despreciar. Para comprobarlo, se ha medido el tiempo de ejecución de los dos algoritmos en función de la talla, con el siguiente resultado: # Talla Hanoi Hanoi2 (tiempo en mseg.) # Para explicar este aumento de tiempo de Hanoi2, contar cuántas llamadas recursivas más hace Hanoi2 con repecto a Hanoi, para una n dada. Cómo aumenta el coste espacial de Hanoi2 con respecto a Hanoi? Por qué el siguiente algoritmo recursivo no resuelve correctamente el problema de las torres de Hanoi? {n>=1} Procedimiento HanoiE(n:integer; orig, dest, aux:torre); Opción n=1: mueve_disco(orig,dest); n>1: fopción fprocedimiento; mueve_disco(orig,dest); HanoiE(n-1, orig, aux, dest); HanoiE(n-1,aux,dest,orig); Como prerrequisito a la depuración, se debe añadir la opción -g al compilar el código fuente: gpc -g -o programa.out programa.p Para invocar al depurador, se pasa como parámetro el nombre del ejecutable: xxgdb programa.out Comandos de control de la ejecución run Ejecuta una instancia del programa desde el principio hasta el final, o hasta el siguiente punto de ruptura continue Continúa la ejecución hasta el final, o hasta el siguiente punto de ruptura step stepi kill quit print var print expresión printf "%p", &var bt (botón stack) frame n info locals info args break n delete Se ejecuta una línea de código Se ejecuta una instrucción Termina (mata) la ejecución del proceso en curso Salir del depurador Comandos de visualización de variables Visualiza el estado de la variable var Evalúa y visualiza expresión Escribe la dirección de var, en hexadecimal Comandos de visualización de la pila Muestra el estado de la pila El depurador se sitúa en el registro nº n, para su posible inspección, y muestra su contenido. Por defecto, es el registro activo Muestra las variables locales del registro en el que se ha situado el depurador Muestra los parámetros del registro en el que se ha situado el depurador Comandos de gestión de los puntos de ruptura Establece un punto de ruptura en la línea n Borra el punto de ruptura indicado Los comandos sombreados aparecen como botones en la interfaz xxgdb. APÉNDICE. Comandos del gdb
Concepto de Recursión. Características de algoritmos recursivos. Ejemplos
RECURSION Temario Concepto de Recursión Características de algoritmos recursivos Ejemplos RECURSION Metodologías para resolver problemas: 1. Diseño Top Down 2. Recursión 3. Abstracción de Datos 4. Diseño
Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2
Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2 Diseño de algoritmos recursivos 1. Dado un vector de enteros de longitud N,
RECURRENCIA RECURSIÓN o RECURSIVIDAD
RECURRENCIA RECURSIÓN o RECURSIVIDAD 1 Definición Definición de diccionario Recursividad: Véase Recursividad 2 Definición Técnica que para resolver problemas basándose en la propia definición del mismo
UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.
UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO. TRUJILLO Recursividad: La recursividad es una técnica de programación
Programación MODULAR: Subalgoritmos - funciones y procedimientos
Programación MODULAR: Subalgoritmos - funciones y procedimientos Uno de los métodos fundamentales para resolver un problema es dividirlo en problemas más pequeños, llamados subproblemas. Estos problemas
Funciones Tipos de funciones y Recursividad
Funciones Tipos de funciones y Recursividad SESION 4 Definición Una función es una subrutina o subprograma que forman un programa que realiza tareas bien definidas. Todo programa en C consta de una o más
Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros
Práctica 3. Paso de parámetros entre subrutinas 1. Objetivo de la práctica El objetivo de esta práctica es que el estudiante se familiarice con la programación en ensamblador y el convenio de paso de parámetros
Tutorial de GDB. Algoritmos y Estructuras de Datos II. Algoritmos y Estructuras de Datos II () Tutorial de GDB 1 / 1
Tutorial de GDB Algoritmos y Estructuras de Datos II Algoritmos y Estructuras de Datos II () Tutorial de GDB 1 / 1 Qué es gdb? GNU Debugger Es un depurador para varios lenguajes, incluyendo C y C++. Permite
Guía de uso del programa AVR-Studio
Guía de uso del programa AVR-Studio El entorno de desarrollo AVR-STUDIO nos permite cargar, ensamblar y depurar los programas que escribimos en lenguaje ensamblador. Los pasos para crear un proyecto nuevo
2.2 Nombres, Ligado y Ámbito
2.2 Nombres, Ligado y Ámbito Ligado estático y dinámico, reglas de ámbito y prueba de tipos. Conceptos Nombres e Identificadores Variables Tipos Ámbito Constantes Nombres Identificador que designa en el
Estructuras de control
Estructuras de control Introducción Los algoritmos vistos hasta el momento han consistido en simples secuencias de instrucciones; sin embargo, existen tareas más complejas que no pueden ser resueltas empleando
Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa
PROGRAMACIÓN 10. Prof. Dolores Cuiñas H. Recuerde que estos son apuntes muy simplificados que deberá completar con la bibliografía recomendada APUNTES Nº 4 ESTRUCTURA SECUENCIAL GENERAL La estructura secuencial
FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información. Ejercicios de recursividad
H AC LUCE FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información Ejercicios de recursividad 1. Determinar qué operación realiza: //x>=0, y>0 function funcion_x (x,y:
Funciones básicas del depurador
Funciones básicas del depurador Con frecuencia, los alumnos piensan que cuando su programa no tiene errores de compilación (está correctamente escrito) entonces ya es correcto. Muchas veces esto no es
Ejercicios sobre recursividad
Ejercicios sobre recursividad 11 de febrero de 2003 1. Implementa una función recursiva que devuelva la suma de los dígitos de un número natural, que se le pasa por parámetro. 2. Implementa una función
TEMA 5: Subprogramas, programación modular
TEMA 5: Subprogramas, programación modular 5.1.-Definición de módulo. Programación modular La programación modular está basada en la técnica de diseño descendente, que como ya vimos consiste en dividir
La eficiencia de los programas
La eficiencia de los programas Jordi Linares Pellicer EPSA-DSIC Índice General 1 Introducción... 2 2 El coste temporal y espacial de los programas... 2 2.1 El coste temporal medido en función de tiempos
Tema 7: Recursividad
Tema 7: Recursividad Objetivos: en este tema estudiaremos funciones recursivas; esto es, funciones que se invocan a sí mismas. Estas funciones son equivalentes a estructuras tipo bucle pero permiten especificar
Funciones y paquetes PL/SQL. Jonathan Medina Gómez Facultad de ingeniería Universidad de Antioquia
Funciones y paquetes PL/SQL Jonathan Medina Gómez Facultad de ingeniería Universidad de Antioquia Funciones Una función es un subprograma que retorna un valor simple. Las funciones se pueden invocar dentro
Las torres de Hanoi. Informática - Hoja de Ejercicios 6
Las torres de Hanoi Informática - Hoja de Ejercicios 6 Posición inicial Objetivo Mover todos los discos desde la aguja A a la aguja C Normas. Sólo se puede mover un disco a la vez de una aguja a otra..
EI MT1008 Programación II
GRADO EN INGENIERÍA INFORMÁTICA GRADO EN MATEMÁTICA COMPUTACIONAL EI1008 - MT1008 Programación II Curso 2010-2011 Departamento de Lenguajes y Sistemas Informáticos 1. Datos de la asignatura Carácter: Formación
Fundamentos de Ordenadores. Depurar programas usando Nemiver
Fundamentos de Ordenadores Depurar programas usando Nemiver Departamento de Arquitectura de Computadores Autor: Mario Macias. Fecha de elaboración: 16/10/2015 1 Manual básico Nemiver Nemiver es un sencillo
DEPURADOR GDB. Debugging de programas complejos con múltiples archivos.
Introducción DEPURADOR GDB GDB es el source debugger de GNU. Es un poderoso debugger que permite "ver" que esta sucediendo dentro de programas escritos en C, C++ y Modula-2. Entre las capacidades más notorias
2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.
2007/2008 Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS 1.-Introducción. -Comprender cómo funciona un lenguaje de programación 2. Características del lenguaje C -Entender las
Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.
LENGUAJE C CARACTERISTICAS DEL LENGUAJE 'C' El lenguaje 'C' se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan
ESTRUCTURAS DE CONTROL
ESTRUCTURAS DE CONTROL En lenguajes de programación, las estructuras de control permiten modificar el flujo de ejecución de las instrucciones de un programa. Con las estructuras de control se puede: De
Tema 8 Gestión de la memoria en tiempo de ejecución.
Traductores, Compiladores e Intérpretes 1 Tema 8 Gestión de la memoria en tiempo de ejecución. S Organización de la memoria en tiempo de ejecución. Cuando un programa se ejecuta sobre un sistema operativo
259. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m
258. Aplicar el algoritmo de programación dinámica para el problema del cambio de monedas sobre el siguiente ejemplo: n = 3, P = 9, c = (1, 3, 4). Qué ocurre si multiplicamos P y c por un valor constante,
http://www.conclase.net/c/devcpp.php?art=depurar Depurar programas
Depurar programas Siempre hay que tener en cuenta que los ordenadores hacen sólo aquello que nosotros les decimos que hagan: si los programas no funcionan es porque no los hemos diseñado bien o porque
Estructuras de Control
Algorítmica y Lenguajes de Programación Estructuras de Control Estructuras de Control. Introducción Hasta ahora algoritmos han consistido en simples secuencias de instrucciones Existen tareas más complejas
Alonso Ramírez Manzanares Computación y Algoritmos 10.03
Recursividad mat-151 1 Ejercicio de recursión: dibujando una regla Queremos dibujar las marcas de diferentes tamaños de una regla. Marcas grandes cada 1/2 cm, marcas más pequeñas cada 1/4 cm... hasta una
Guía práctica de estudio 05: Diagramas de flujo
Guía práctica de estudio 05: Diagramas de flujo Elaborado por: M.C. Edgar E. García Cano Ing. Jorge A. Solano Gálvez Revisado por: Ing. Laura Sandoval Montaño Guía práctica de estudio 05: Diagramas de
INDICE Parte 1. Visual Basic Capitulo 1. Qué es Visual Basic? Capitulo 22. Mi Primera Aplicación Capitulo 3. Elementos del lenguaje
INDICE Prólogo XV Parte 1. Visual Basic 1 Capitulo 1. Qué es Visual Basic? 3 Introducción 3 Como crear una aplicación 5 Otras facilidades de Visual Basic 6 Un lenguaje de alto nivel 9 Menús 10 Colores
Módulo 8: Primitivas en Pascal
Módulo 8: Primitivas en Pascal Tecnologías en la Educación Matemática Dr. Carlos Gonzalía DCIC - UNS Técnologías en la educación matemática Dr. Carlos Gonzalía 1 de Copyright Copyright 2010, 2012 M. Capobianco,
La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.
Manual de Dev-C++ 4.9.9.2 Página 1 de 11 Introducción Dev-C++ es un IDE (entorno de desarrollo integrado) que facilita herramientas para la creación y depuración de programas en C y en C++. Además, la
Conceptos de Arquitectura de Computadoras Curso 2015
PRACTICA 1 Assembly, Instrucciones, Programas, Subrutinas y Simulador MSX88 Objetivos: que el alumno Domine las instrucciones básicas del lenguaje assembly del MSX88. Utilice los diferentes modos de direccionamiento.
Tema: Funciones, Procedimientos y Recursividad en C#.
Tema: Funciones, Procedimientos y Recursividad en C#. Objetivos Programación I, Guía 6 1 Utilizar la sintaxis de las funciones definidas por el usuario (programador) para resolver problemas. Identificar
Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)
Práctico 4 Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap) Clasificación de ejercicios: (I) Imprescindibles (R) Recomendados (C) Complementarios Árboles balanceados (AVL)
Tema 3. Análisis de costes
Tema 3. Análisis de costes http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz}@icc.uji.es Estructuras de datos y de la información
1. Cuántas sentencias hay en la secuencia principal del siguiente programa?
1. Cuántas sentencias hay en la secuencia principal del siguiente programa? public class PruebaSwitch { System.out.print ("Opcion: "); case 3: System.out.println ("miércoles "); A. 1. B. 4. C. Más de 10.
Tema 2 Conceptos básicos de programación. Fundamentos de Informática
Tema 2 Conceptos básicos de programación Fundamentos de Informática Índice Metodología de la programación Programación estructurada 2 Pasos a seguir para el desarrollo de un programa (fases): Análisis
Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1
Prologo Agradecimientos Nota de los autores Índice general I III V VII 1 Problemas, algoritmos y programas 1 1.1 Programas y la actividad de la programación.................... 4 1.2 Lenguajes y modelos
Tema 6 Organización y gestión de la memoria
Departamento de Tecnologías de la Información Tema 6 Organización y gestión de la memoria Ciencias de la Computación e Inteligencia Artificial Índice 6.1 Organización de la memoria en tiempo de ejecución
UNIVERSIDAD MAYOR DE SAN SIMON FACULTAD DE CIENCIAS Y TECNOLOGÍA PLAN GLOBAL COMPUTACION I
UNIVERSIDAD MAYOR DE SAN SIMON FACULTAD DE CIENCIAS Y TECNOLOGÍA PLAN GLOBAL COMPUTACION I I. DATOS DE IDENTIFICACIÓN Nombre de la materia: Computación I Código: 2010008 Grupo: 2 Carga horaria: 4 Docencia
El TAD Grafo. El TAD Grafo
! Esta representación resulta útil cuando el número de vértices se conoce previamente y permanecerá fijo durante la resolución del problema, pero resulta ineficiente si necesitamos añadir o eliminar vértices
Unidad II: Análisis semántico
Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid. Indíce Algoritmo Elementos de un algoritmo: Variables, Constantes, Expresiones Datos: Definición y
Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7
Estructuras selectivas Programación I Ingeniería Técnica Informática Ejercicios de los Temas 4, 5, 6 y 7 24.- Elabore un programa para determinar si una hora leída en la forma horas, minutos y segundos
Computadora y Sistema Operativo
Computadora y Sistema Operativo Según la RAE (Real Academia de la lengua española), una computadora es una máquina electrónica, analógica o digital, dotada de una memoria de gran capacidad y de métodos
Programación Modular. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz
Programación Modular Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz Programación Modular Un software monolítico no puede ser entendido fácilmente por un solo lector. El
Universidad de Cantabria. Facultad de Ciencias Ingeniería en Informática. Ingeniería del Software II
Universidad de Cantabria. Facultad de Ciencias Ingeniería en Informática. Ingeniería del Software II Ejercicios del Tema 1: Construcción y Pruebas del Software Ejercicio 1 Se desean realizar pruebas de
Departamento de Informática Universidad de Valladolid Campus de Segovia LABORATORIO: INTRODUCCIÓN A LAS UNIDADES EN TURBO PASCAL
Departamento de Informática Universidad de Valladolid Campus de Segovia LABORATORIO: INTRODUCCIÓN A LAS UNIDADES EN TURBO PASCAL UNIDADES EN TURBO PASCAL 7.0 Concepto de unidad Estructura de una unidad
Recursión. Capítulo 4
Recursión Capítulo 4 Introducción La recursión o recursividad es un concepto amplio, con muchas variantes, y difícil de precisar con pocas palabras.. Actividades Cotidianas; fotografía donde se observa
TUTORIAL DEL PROGRAMA DE CÁLCULO DE INSTALACIONES ELECTROTÉCNICAS DMELECT
TUTORIAL DEL PROGRAMA DE CÁLCULO DE INSTALACIONES ELECTROTÉCNICAS DMELECT Nos centraremos en los módulos de cálculo de BT: CIBT y VIVI. El programa CIEBT se utilizará para Calcular Instalaciones Eléctricas
Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1
Facultad de Ingeniería de Sistemas Lenguajes y Compiladores Análisis Sintáctico Parte I 1 Introducción El analizador sintáctico recibe una secuencia de tokens y decide si la secuencia está correcta o no.
Estructura de un programa. Algoritmos - Universidad Francisco de Vitoria 2
Algoritmos TEMA 2 Estructura de un programa Algoritmos - Universidad Francisco de Vitoria 2 Hola Mundo! #include main() { /* mi primer programa en C */ printf( "Hola Mundo!" ); } Algoritmos -
Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A)
aprenderaprogramar.com Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A) Sección: Cursos Categoría: Curso Visual Basic Nivel I Fecha revisión: 2029 Autor: Mario R. Rancel
Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5
Planificaciones 7540 - Algoritmos y Programación I Docente responsable: AZCURRA DIEGO ANDRES 1 de 5 OBJETIVOS Objetivos estratégicos: -Desarrollar el concepto algorítmico. -Aplicar técnicas de programación
PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07
PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07 1. En qué método de análisis sintáctico puede suceder que en la construcción del árbol de derivación de las posibles expansiones de un símbolo no terminal
TEMA 3: El proceso de compilación, del código fuente al código máquina
TEMA 3: El proceso de compilación, del código fuente al código máquina 3.1 Fase de compilación y linkado (link, montado o enlace) Un programa escrito en un lenguaje de alto nivel, no puede ser ejecutado
TEMA 1: Algoritmos y programas
TEMA 1: Algoritmos y programas 1.1.-Introducción La razón principal para utilizar un ordenador es para resolver problemas (en el sentido más general de la palabra), o en otras palabras, procesar información
1 La línea de comandos
Primeros pasos en GAP 1 GAP es un entorno de cálculo algebraico discreto. Tiene un núcleo implementado en c y dispone aparte de librerías escritas en su propio lenguaje de programación. Este lenguaje es
UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO
UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO LICENCIATURA EN PRODUCCIÓN INDUSTRIAL. UNIDAD DE APRENDIZAJE: PROGRAMACIÓN Créditos institucionales de la UA: 6 Material visual: Diapositivas Unidad de competencia
Declaración de Procedimientos
Procedimientos Concepto Un procedimiento es un subprograma que realiza una tarea especifica. Puede recibir cero más valores del programa que llama y devolver cero o más valores a dicho programa que lo
Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática
Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso 2013-2014. 1º Grado en Informática Práctica 2: Memoria dinámica y Bibliotecas Objetivos Practicar conceptos
PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY
PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY ALGORITMO DEFINICIÓN: CONSISTE EN LA DESCRIPCIÓN CLARA Y DETALLADA DEL PROCEDIMIENTO A SEGUIR PARA ALCANZAR LA SOLUCIÓN A UN PROBLEMA EN DONDE SE ESTABLECE
Tema 2 Introducción a la Programación en C.
Tema 2 Introducción a la Programación en C. Contenidos 1. Conceptos Básicos 1.1 Definiciones. 1.2 El Proceso de Desarrollo de Software. 2. Lenguajes de Programación. 2.1 Definición y Tipos de Lenguajes
Formatos para prácticas de laboratorio
Fecha de efectividad: CARRERA PLAN DE ESTUDIO CLAVE ASIGNATURA NOMBRE DE LA ASIGNATURA TRONCO COMÚN 2009-2 11214 PROGRAMACIÓN PRÁCTICA No. LABORATORIO DE PROGRAMACIÓN DURACIÓN (HORA) 9 NOMBRE DE LA PRÁCTICA
2.3 DEFINICIÓN DE LENGUAJES ALGORÍTMICOS
2.3 DEFINICIÓN DE LENGUAJES ALGORÍTMICOS Características de los algoritmos Las características fundamentales que debe cumplir todo algoritmo son: Un algoritmo debe ser preciso e indicar el orden de realización
ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF
ESCUELA POLITÉCNICA SUPERIOR GRADO EN DISEÑO IND. INFORMÁTICA CURSO 2012-13 PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF HASTA AHORA... En prácticas anteriores se ha aprendido: La estructura principal de un
Funciones Lógicas X5
DOCUMENTACIÓN ESPECÍFICA Funciones Lógicas X5 Módulo Zennio de 5 funciones lógicas Edición: 1.a ÍNDICE 1. Introducción... 3 1.1. Módulo de Funciones lógicas... 3 1.2. Dispositivos Zennio con módulo X5...
Algoritmos y programas. Algoritmos y Estructuras de Datos I
Algoritmos y programas Algoritmos y Estructuras de Datos I Primer cuatrimestre de 2012 Departamento de Computación - FCEyN - UBA Programación funcional - clase 1 Funciones Simples - Recursión - Tipos de
funciones printf scanf
FUNCIONES EN C FUNCIONES Los módulos en C se llaman funciones. Hemos estado utilizando funciones de la biblioteca estandar stdio.h como por ejemplo printf y scanf. Comenzaremos viendo algunas funciones
LABORATORIO 4: CONCURRENCIA Juan Antonio de la Puente - 21/10/15
LABORATORIO 4: CONCURRENCIA Juan Antonio de la Puente - 21/10/15 Esta obra está bajo licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported. Objetivos Entender el comportamiento
Programación Avanzada
Programación Avanzada Instructivo de Compilación 1 1 Índice 1 ÍNDICE... 2 2 INTRODUCCIÓN... 3 3 HERRAMIENTAS... 3 3.1 SINTAXIS DE LOS COMANDOS GCC Y G++... 3 3.2 OTRAS HERRAMIENTAS:... 4 3.3 EJEMPLOS:...
Tema 6: Generación de código (parte 2)
Tema 6: Generación de código (parte 2) Procesamiento de Lenguajes Dept de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 1 /
Análisis de Algoritmos
Análisis de Algoritmos Amalia Duch Barcelona, marzo de 2007 Índice 1. Costes en tiempo y en espacio 1 2. Coste en los casos mejor, promedio y peor 3 3. Notación asintótica 4 4. Coste de los algoritmos
Introducción a la programación
Introducción a la programación Conceptos Básicos El objetivo fundamental de éste curso es enseñar a resolver problemas mediante una computadora. El programador de computadoras es antes que nada una persona
Manual de turbo pascal
Universidad Nacional Experimental De Los Llanos Occidentales Ezequiel Zamora UNELLEZ-Barinas Manual de turbo pascal Bachilleres: Martinez Ninibeth C.I:20.867.002 Mora Yaco C.I:17.205.073 Estructura de
MANUAL DE INSTRUCCIONES PARA LA SOLICITUD DE AYUDAS
MANUAL DE INSTRUCCIONES PARA LA SOLICITUD DE AYUDAS Contenido Introducción...2 Registro...2 Iniciar sesión...4 Solicitar ayuda...4 Página de proyectos solicitados...5 Completar solicitud Página de proyecto...5
Universidad Autónoma del Estado de México Facultad de Medicina
Universidad Autónoma del Estado de México Facultad de Medicina Licenciatura en Bioingeniería Médica Unidad de Aprendizaje: Algoritmos y programación básica Unidad 3: Estructuras de control de flujo en
PROGRAMACIÓN UNIDADES
PROGRAMACIÓN Semestre: Segundo Horas: 90 horas Hrs/sem: 4.5 Créditos: 9 Clave: AI-02 DESCRIPCIÓN DE LA ASIGNATURA Al finalizar el curso el alumno tendrá el conocimiento y la capacidad de implementar programas
PROGRAMA: COMPUTACION I
UNIVERSIDAD NACIONAL EXPERIMENTAL DEL TACHIRA VICERECTORADO ACADÉMICO DECANATO DE DOCENCIA DEPARTAMENTO DE INGENIERÍA INFORMÁTICA 1 PROGRAMA: COMPUTACION I Código 0415102T Carrera: Ingeniería Informática
CIRCUITOS SECUENCIALES
CIRCUITOS SECUENCIALES 1 Obtener el cronograma del circuito de la figura, y caracterizarlo, sabiendo que parte del estado 000. 2 Obtener el cronograma del circuito de la figura. De qué circuito se trata?
2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.
Modulo 1. Introducción a los lenguajes de programación La solución de problemas mediante en uso de un computador nos lleva a desarrollar programas o aplicaciones, la construcción de estos programas debe
Para ingresar a la aplicación Microsoft Access 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 Access 97, los pasos que se deben seguir pueden ser los siguientes: A través del botón : 1. Seleccionar
Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño
Clase adicional 9 Temas Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño Listas enlazadas Previamente en este curso, ya habrá trabajado con dos de las estructuras de datos
Trabajo Práctico 6 Funciones, Procedimientos y División de Problemas
Trabajo Práctico 6 Funciones, Procedimientos y División de Problemas Ejercicio 1: Considere definida la función Invertir. function Invertir( num: integer ):integer; {Objetivo: Invierte el orden de los
Ejercicios de Hilos. Índice
Índice 1 Creación de hilos (0.5 puntos)...2 2 Prioridades (0.5 puntos)... 2 3 Productor/Consumidor (1 punto)...2 4 Pool de hilos (1 punto)... 3 1. Creación de hilos (0.5 puntos) En la clase Ej1 se crean
La manera más sencilla de agregar texto a una diapositiva es escribirlo directamente en cualquier marcador de posición definido para tal fin.
Trabajar con texto Agregar texto a las diapositivas La manera más sencilla de agregar texto a una diapositiva es escribirlo directamente en cualquier marcador de posición definido para tal fin. Marcador
SISTEMAS OPERATIVOS I (Sistemas) / SISTEMAS OPERATIVOS (Gestión) septiembre 2009
SISTEMAS OPERATIVOS I (Sistemas) / SISTEMAS OPERATIVOS (Gestión) septiembre 2009 4. (2 p) Dos procesos A y B se ejecutan concurrentemente en un determinado sistema. El proceso A ejecuta unas tareas ( Tareas
Evolución del software y su situación actual
Evolución del software y su situación actual El software es el conjunto de programas que permite emplear la PC, es decir, es el medio de comunicación con la computadora, el control de sus funciones y su
Convertir un AFND a un AFD
Convertir un AFND a un AFD Existe una equivalencia entre los AFD y AFN, de forma que un autómata M es equivalente a un autómata M' si L(M) ) L(M'). Ejemplo: Los autómatas de la siguiente figura son equivalentes.
Tema 2. Recursividad. Fundamentos de Programación II. Luís Rodríguez Baena ([email protected])
Fundamentos de Programación II Tema 2. Recursividad Luís Rodríguez Baena ([email protected]) Universidad Pontificia de Salamanca (campus Madrid) Escuela Superior de Ingeniería y Arquitectura Naturaleza
