Sei sulla pagina 1di 175

ALGORITMOS Y PROGRAMAS: TEMA 1:

1. 2. 3. 4. . ". &. (. ). Sistemas de procesamiento de la informacin. Concepto de algoritmo. Lenguaje de programacin. Datos, tipos de datos y operaciones primitivas. Constantes y varia!les. #$presiones% tipos y operadores. 'unciones internas. La operacin de asignacin. #ntrada y salida de la informacin.

1. SISTEMAS DE PROCESAMIENTO DE LA INFORMACIN: *n ordenador es una m+,uina de procesamiento de informacin. #s una m+,uina por,ue tiene ca!les, c-ips,... , procesa por,ue es capa. de procesar cosas, e informacin por,ue maneja conjuntos ordenados de datos/. 0ara procesar la informacin est+ el -ard1are 2microprocesador, 345,.../, y el soft1are 2,ue sirve para manejar el -ard1are/. 2. CONCEPTO DE ALGORITMO: #l algoritmo trata de resolver pro!lemas mediante programas. 'ases% - 4n+lisis preliminar o evaluacin del pro!lema % #studiar el pro!lema en general y ver ,ue parte nos interesa. - Definicin o an+lisis del pro!lema% 6er ,ue es lo ,ue entra y ,ue es lo ,ue sale, las posi!les condiciones o restricciones, ... - Dise7o del algoritmo% Dise7ar la solucin. - #l programa% Codificacin del algoritmo en un lenguaje de programacin. - #jecucin del programa y las prue!as% 6er si el programa -ace lo ,ue ,uer8amos. Qu es un alg !"#$ %: #s una formula para resolver un pro!lema. #s un conjunto de acciones o secuencia de operaciones ,ue ejecutadas en un determinado orden resuelven el pro!lema. #$isten n algoritmos, -ay ,ue coger el m+s efectivo. Caracter8sticas% - 9iene ,ue ser preciso. - 9iene ,ue estar !ien definido. - 9iene ,ue ser finito. La programacin es adaptar el algoritmo al ordenador. #l algoritmo es independiente seg:n donde lo implemente. &. EL LENG'A(E DE PROGRAMACIN: #$isten diferentes tipos, de !ajo nivel y de alto nivel. ;nstrucciones en una computadora y sus tipos% *na instruccin es cada paso de un algoritmo, pero ,ue lo ejecuta el ordenador. *n programa es un conjunto de instrucciones ,ue ejecutadas ordenadamente resuelven un pro!lema.

0<=;>4 1?1&

T") s *e "ns#!u++" nes: - #?S% 0asar informacin del e$terior al interior del ordenador y al rev@s. - 4ritm@ticoAlgicas% 4ritm@ticas% B,A,C,... D Lgicas% or, and, E, F, ... - Selectivas% 0ermiten la seleccin de una alternativa en funcin de una condicin. - 3epetitivas% 3epeticin de un n:mero de instrucciones un n:mero finito de veces. T") s *e lengua,es: - Lenguaje m+,uina% 9odo se programa con 1 y G, ,ue es lo :nico ,ue entiende el ordenador. 6entaja% >o necesita ser traducido. ;nconveniente% La dificultad, la confusin, para corregir errores, es propia de cada m+,uina. - De !ajo nivel o ensam!lador% Se utili.an mnemot@cnicos 2a!reviaturas/. 6entaja% >o es tan dif8cil como el lenguaje m+,uina. ;nconvenientes% Cada m+,uina tiene su propio lenguaje, necesitamos un proceso de traduccin. #l programa escrito en ensam!lador se llama programa fuente y el programa ,ue se o!tiene al ensam!larlo se llama programa o!jeto. - Lenguajes de alto nivel% Los m+s cercanos al lenguaje -umano. 6entaja% Son independientes de cada ma,uina 2los compiladores aceptan las instrucciones est+ndar, pero tam!i@n tienen instrucciones propias/. ;nconveniente% #l proceso de traduccin es muy largo y ocupa m+s recursos. 4provec-a menos los recursos internos. P! +es *e #!a*u++"-n . e,e+u+"-n *e un )! g!a$a es+!"# en un lengua,e a al# n"/el: *samos un editor y o!tenemos el programa fuente, y el compilador es el ,ue traduce el programa al lenguaje m+,uina. #l compilador internamente -a sido dise7ado para traducir. #l compilador o!tiene el programa o el fic-ero o!jeto. #l compilador tiene ,ue !uscar los errores. >ormalmente no sale un ejecuta!le, sino ,ue necesita elementos, li!rer8as, ... 5ediante un linHador juntamos el programa o!jeto y las li!rer8as, y se forma un programa ejecuta!le. Cuando se ejecuta el programa, el cargador lleva al programa a memoria para ,ue @ste pueda ser ejecuta!le. De!!uger% Depura el programa ejecut+ndolo paso a paso, viendo la memoria paso a paso para encontrar el error.

0<=;>4 2?1&

0rograma fuente 2#ditor/ Compilador #rror

0rograma o!jeto

Li!rerias

LinHador #jecuta!les 0ara traducir puedo utili.ar el compilador o un interprete, con el compilador cojo todo el programa al completo y el interprete lee cada instruccin y lo va ejecutando. #l interprete es m+s r+pido, pero menos eficiente. 9odos los lenguajes tienen compiladores, pero no todos tienen interpretes. L;S0 2Lenguaje de inteligencia artificial/ % Slo tiene interpretes. 0. DATOS1 TIPOS DE DATOS 2 OPERACIONES PRIMITI3AS: 4 Da# : #s un o!jeto o elemento ,ue tratamos a lo largo de diversas operaciones. 9ienen 3 caracteristicas% - *n nom!re ,ue los diferencia del resto. - *n tipo ,ue nos determina las operaciones ,ue podemos -acer con ese dato. - *n valor ,ue puede variar o no a lo largo de la operacin. #$isten diferentes tipos de datos. 4 Ca!a+#e!"s#"+as *e l s #") s: - Cada tipo se representa o almacena de forma diferente en la computadora. Iit%1?GD IyteJ( !its. - *n tipo agrupa a los valores ,ue -acen las mismas operaciones. - Si tiene definida una relacin de orden es un tipo escalar. - Cardinalidad de un tipo% >:mero de valores distintos ,ue puede tomar un tipo. 0ueden ser finitos 2caracteres/, y si son infinitos el ordenador los toma como finitos por,ue esta limitado por el tama7o de los !ytes en el ,ue la cifra es almacenada. 4 L s *a# s )ue*en se!: - Simples% *n elemento. - Compuestos% 6arios elementos.

0<=;>4 3?1&

4 L s #") s )ue*en se!: - #standar% Kue vienen en el sistema por defecto. - >o estandar% Son los ,ue crea el usuario. 4 L s #") s s"$)les $5s "$) !#an#es s n: - >um@ricos. - Lgicos. - Caracteres. >um@ricos% - #ntero% Su!conjunto finito del conjunto matem+tico de los num@ros enteros. >o tiene parte decimal. #l rango de los valores depende del tama7o ,ue se les da en memoria. - 3eal% Su!conjunto finito del conjunto matem+tico de los n:meros reales. Llevan signo y parte decimal. Se almacenan en 4 Iytes 2dependiendo de los modificadores/. Si se utili.an n:meros reales muy grandes, se puede usar notacin cient8fica ,ue se divide en mantisa, !ase y e$ponenteD tal ,ue el valor se o!tiene multiplicando la mantisa por la !ase elevada al e$ponente. Lgicos o !ooleanos% - 4,uel ,ue slo puede tomar uno de los dos valores, verdadero o falso 21?G/. Car+cter% - 4!arca al conjunto finito y ordenado de caracteres ,ue reconoce la computadora 2letras, digitos, caracteres especiales, 4SC;;/. 9ipo de cadena o String% Conjunto de caracteres, ,ue van a estar entre LM. #l propio lenguaje puede a7adir m+s tipos, o se pueden a7adir modificadores. #ntero % ;nt Long int #n algunos lenguajes se definen tipos especiales de fec-a y -ora, so!re todo en los m+s modernos. 6. CONSTANTES 2 3ARIA7LES: - Constantes% 9ienen un valor fijo ,ue se le da cuando se define la constante y ,ue ya no puede ser modificado durante la ejecucin. - 6aria!les% #l valor puede cam!iar durante la ejecucin del algoritmo, pero nunca varia su nom!re y su tipo. 4ntes de usar una varia!le -ay ,ue definirla o declararla, al -acerlo -ay ,ue dar su nom!re y su tipo. #l nom!re ,ue le damos tiene ,ue ser un nom!re significativo, va a ser un conjunto de caracteres ,ue dependiendo del lenguaje -ay restricciones. 9iene ,ue empe.ar por una letra, y el tama7o depende del lenguaje. ;dentificador% 0ala!ra ,ue no es propia del lenguaje. #l valor de la varia!le si al declararla no se la iniciali.a, en algunos lenguajes toma una por defecto. #n cual,uier caso el valor de la varia!le podemos darle uno incial o podemos ir variandolo a lo largo de la ejecucin. Las constantes pueden llevar asociados un nom!re o no, si no lo llevan, se llaman literales. Su valor -ay ,ue darlo al definir la constante y ya no puede cam!iar a lo largo de la ejecucin, y en cuanto al tipo, dependiendo de los lenguajes en algunos -ay ,ue ponerlo, y en otros no -ace falta ponerlo por,ue toma el tipo del dato ,ue se le asigna. Const 0;J3,141". Nay ,ue iniciali.ar todas las varia!les. E F Nay ,ue poner algo o!ligatoriamente. 0<=;>4 4?1&

O P 0uede llevar algo o no llevarlo. La ventaja de usar constantes con nom!re es ,ue en cual,uier lugar donde ,uiera ,ue vaya la constante, !asta con poner su nom!re y luego el compilador lo sustituira por su valor. Las constantes sin nom!res son de valor constante% , ", QaR, L-olaM. Cuando una cadena es de tipo car+cter, se encierra entre QR QaR. 3elacin entre varia!les y constantes en memoria% 4l detectar una varia!le o una constante con nom!re, automaticamente se reserva en memoria espacio para guardar esa varia!le o constante. #l espacio reservado depende del tipo de la varia!le. #n esa .ona de memoria es en la ,ue se guarda el valor asociado a la varia!le o constante y cuando el programa use esa varia!le, ira a esa .ona de memoria a !uscar su valor. 8. E9PRESIONES: TIPOS 2 OPERADORES: *na e$presin es una com!inacin de constantes, varia!les, signos de operacin, par@ntesis y nom!res especiales 2nom!res de funciones estandar/, con un sentido un8voco y definido y de cuya evaluacin resulta un :nico valor. 9oda e$presion tiene asociada un tipo ,ue se corresponde con el tipo del valor ,ue devuelve la e$presion cuando se evalua, por lo ,ue -a!r+ tantos tipos de e$presiones como tipos de datos. Na!ra e$presiones num@ricas y lgicas. >um@ricas% Speradores aritm@ticos. Son los ,ue se utili.an en las e$presiones num@ricas 2una com!inacin de varia!les y?o constantes num@ricas con operadores aritm@ticos y ,ue al evaluarla devuelve un valor num@rico. B, A, C, ?. Speracin resto% Lo ,ue devuelve es el resto de una divisin entera. 5od% 0ascal. mod 3 J 2 T% C. Divisin entera% >os devuelve el cociente de una divisin entera 2en la ,ue no se sacan decimales/. Div% 0ascal. div 3 J 1 U% C. 0otencia% V V2. 9odos estos operadores son !inarios 2el operador se situa en medio/, el menos tam!ien puede ser unario 2lleva un :nico operando/ y significa signo negativo. 3eglas de precedencia% #l pro!lema es cuando una e$presin entera seg:n como la evalue pueda dar diferentes valores. &C3B4 2 4) La solucin es aplicar prioridad entre los operadores, de modo ,ue ante la posi!ilidad de usar varios siempre aplicaremos primero el de mayor prioridad. Cada lenguaje puede esta!lecer sus propias reglas de prioridad o precedencia de operadores. Si no nos acordamos, siempre podemos poner 2 /. 1W/ V 2W/ C ? div mod 3W/ B A

0<=;>4 ?1&

#ntre dos operaciones ,ue tienen la misma precedencia para resolver la am!igXedad, -ay ,ue usar la regla de la asociatividad. La m+s normal es la de la asociatividad a i.,uierdas 2primero lo de la i.,uieda/. E:)!es" nes l-g"+as: O)e!a* !es !ela+" nales . l-g"+ s. *na e$presin lgica es a,uella ,ue slo puede devolver dos valores 26erdadero o 'also/. Los valores ,ue pueden aparecer en una e$presin lgica son de 2 tipos% lgicos y relacionales. La particularidad de las e$presiones lgicas es ,ue mientras en una e$presin num@rica por devolver un valor num@rico los operandos solo pueden ser n:meros, en una e$presin lgica los operandos no tienen por,ue ser !ooleanos aun,ue se devuelva un valor !ooleano. #sto es lo ,ue ocurre cuando en la e$presin lgica utili.amos operadores relacionales con lo cual se o!tienen valores lgicos o !ooleanos a partir de otros ,ue no lo son. #n cam!io cuando los operadores son lgicos los operandos o!ligatoriamente tam!ien tienen ,ue ser lgicos. Speradores relacionales% E F J EF en C% YJ E Sperando1F operador E Sperando2F F 3 6erdadero ZCmo se evalua una e$presin relacional[% - 0rimero se evalua el primer operando y se sustituye por su valor. - Luego se evalua el seguno operando y se sustituye por su valor. - 'inalmente se aplica el operador relacional y se devuelve el valor !ooleano correspondiente. 223C2/B1A V2/ E 22A1/ A1( E 1 6erdadero. #l pro!lema del tipo real% Desde la inform+tica, los numeros reales son finitos, ya ,ue tenemos un m+$imo de cifras decimales. Cuando tra!ajamos con un J, matematicamente da un valor e$acto, pero informaticamente no es e$acto. 1? C J1 1.G? .G C .G EF1.G Soluciones% - La ,ue nos aporte el propio lenguaje de programacin. Se considera un valor de error. - 9ra!ajar con n:meros enteros siempre ,ue sea posi!le. - *tili.ar las comparaciones EF en ve. de si es posi!le. - Si -ay ,ue preguntar por igual, cam!iar la condicin utili.ando valores a!solutos y un valor m8nimo de error. Si la diferencia E G.GGGGGGG1 y 4IS 24AI/E min D son iguales. Speradores lgicos% #l pro!lema es ,ue a veces ,ueremos preguntar o evaluar por m+s de una condicin al mismo tiempo y para esto estan los operadores lgicos. \ and ]] 0<=;>4 "?1&

S or YY >o not ~Y \, S, son operadores !inarios 2necesitan 2 operandos de tipo logico/. Sperando 1 Sperador Sperando 2 #l >o es unario y se coloca primero el >o, y despues el operando. #l resultado es lgico y depende de% Sperando 1 Sperando 2 4>D 6 6 6 6 ' ' ' 6 ' ' ' ' #l >o niega % >S9 6 ' 0rioridades de los operadores% - Lo m+s prioritario es el >S9 - Luego el \ y el S. - E, F J,... 9a!la de prioridades% V >S ? div mod y BAS E, F, J, EF,... ;. F'NCIONES INTERNAS: Son funciones matem+ticas diferentes de las operaciones !+sicas pero ,ue se incorporan al lenguaje y ,ue se consideran estandar. Dependen del lenguaje. >ormalmente se encuentran en la li!rer8a de matem+ticas del lenguaje de programacin. 'rmulas% 4!s 2$/ 4rctan 2$/ Cos 2$/ Sen 2$/ #$p 2$/ Ln 2$/ Log 1G 2$/ 3edondeo 2$/ 9runc 2$/ Cuadrado 2$/ 3ai. 2$/ <. OPERACIN DE ASIGNACIN: Consiste en atri!uir un valor a una varia!le. #l valor sera una e$presin 2constante, varia!le,.../. 1?G ' 6

S3 6 6 6 '

0<=;>4 &?1&

Stros lenguajes J , %J 6aria!le a la ,ue se le asigna el valor el valor ,ue le vamos a asignar. 4 #n C 4 J J I Comparacin 4 J I 4signacin #n 0ascal 4%JI 4signacin 4JI Comparacin #l proceso de asignacion se reali.a en 2 fases% - Se eval:a la e$presin de la parte derec-a de la asignacin o!teniendose un :nico valor. - Se asigna ese valor a la varia!le de la parte i.,uierda. Qu es l =ue >a. =ue #ene! en +uen#a%: - #n la parte i.,uierda slo puede -a!er una varia!le. - La varia!le a la ,ue se le asigna el valor pierde su valor anterior. - La varia!le ,ue aparece en la derec-a ya ,ue como se evalua primero la de la derec-a cuando se tenga ,ue evaluar el valor de esa varia!le se tomara su valor antiguo. - #L 9;0S D#L 64LS3 K*# S# SI9;#># 4L #64L*43 L4 0439# D#3#CN4 9;#># K*# S#3 #L 5;S5S K*# #L 9;0S D# L4 643;4IL# D# L4 0439# ;^K*;#3D4, #S D#C;3 4 *>4 643;4IL# SSLS S# L# 0*#D#> D43 64LS3#S D# S* 5;S5S 9;0S. A #n 0ascal da un error. A #n C, no da error por,ue el compilador trunca el numero. 4% entero 42 4 3C4 B 4 J ( ?. ENTRADA 2 SALIDA DE LA INFORMACIN: Las dos operaciones !+sicas de cada salida son las de lectura y de escritura. La lectura es e,uivalente a la asignacin en cuanto ,ue va a -a!er una varia!le ,ue reci!e un valor, pero este valor no resulta de evaluar ninguna e$presin, sino ,ue el valor lo vamos a leer de un dispositivo e$terno de entrada. Leer 2nom!re de la varia!le/ #l valor introducido por el dispositivo e$terno, tiene ,ue ser del mismo tipo del ,ue la varia!le ,ue se le asigne. La operacin de escritura lo ,ue -ace es mostrar el valor de una varia!le en un dispositivo e$terno de salida. #scri!ir 2varia!le/ La operacin de escritura no es una operacin destructivo en memoria. 4l pedir un valor al usuario -ay ,ue decirle ,ue es lo ,ue se le ,uiere pedir escri!iendo un mensaje.

0<=;>4 (?1&

EJERCICIOS: TEMA 1
1. 4 23C2V mod 1 B (C23A / E 22B(A1 mod 1/ 4 23C32 mod 1 B 2A1"// E 1G 4 A1" E 1G 4 6erdadero 1.1. 4 4 o 23B C(/ E 3 y 22A"?3 div 4/C2 E 2/ 4 6erdadero o 43 E 3 y 2GC2 E 2/ 4 6erdadero o 'also y 6erdadero 4 6erdadero o 'also 4 6erdadero 2. I 3 mod 2 div 3 I 1 div 3 IG 2.1. C 2AIC2 EF (C3 mod 4/ y 2Q4RFRIR/ C 2G EF 24 mod 4/ y 'also C 'also y 'also C 'also 2.2. 4 C o no 23J / y 2( EF 3BI/ 4 'also o 6erdadero y 6erdadero 4 'also o 6erdadero 4 6erdadero

0<=;>4 )?1&

RESOLUCIN DE PROBLEMAS CON COMPUTADORA Y HERRAMIENTAS DE PROGRAMACIN: TEMA 2


1. 2. 3. 4. . ". &. 3esolucin de pro!lemas. 4n+lisis del pro!lema. Dise7o del algoritmo. 3esolucin en la computadora. 'lujogramas. Diagramas >S o de >4SS;ASCN#D#354> 0seudocdigo.

1. RESOL'CIN DE PRO7LEMAS: La resolucin de un pro!lema desde el punto de vista algor8tmico tiene 3 fases% - 4n+lisis del pro!lema% Comprensin. - Dise7o del algoritmo% 3esolucin algor8tmica. - 3esolucin en computadora% ;mplantacin del algoritmo en un lenguaje de programacin. 2. AN@LISIS DEL PRO7LEMA: #l o!jetivo de @sta fase es comprender el pro!lema para lo cual como resultado tenemos ,ue o!tener la especificacin de las entradas y salidas del pro!lema. 9iene ,ue ,uedar claro ,ue entra y ,ue sale. &. DISEAO DEL ALGORITMO: *na ve. comprendido el pro!lema se trata de determinar ,ue pasos o acciones tenemos ,ue reali.ar para resolverlo. Como criterios a seguir a la -ora de dar la solucin algor8tmica -ay ,ue tener en cuenta% 1. Si el pro!lema es !astante complicado lo mejor es dividirlo en partes m+s pe,ue7as e intentar dividirlo en partes m+s pe,ue7as e intentar resolverlas por separado. #sta metodolog8a de Ldivide y vencer+sM tam!i@n se conoce con el nom!re de dise7o descendente. 2. Las ventajas de aplicar esto son% - 4l dividir el pro!lema en mdulos o partes se comprende m+s f+cilmente. - 4l -acer modificaciones es m+s f+cil so!re un mdulo en particular ,ue en todo el algoritmo. - #n cuanto a los resultados, se pro!ar+n muc-o mejor compro!ando si cada mdulo da el resultado correcto ,ue si intentamos pro!ar de un golpe todo el programa por,ue si se produce un error sa!emos en ,ue mdulo -a sido.

0<=;>4 1G?1&

*na segunda filosof8a a la -ora de dise7ar algoritmos es el refinamiento por pasos, y es partir de una idea general e ir concretando cada ve. m+s esa descripcin -asta ,ue tengamos algo tan concreto para resolver. 0asamos de lo m+s complejo a lo m+s simple. La !e)!esen#a+"-n *e l s alg !"#$ s: *na ve. ,ue tenemos la solucin -ay ,ue implementarla con alguna representacin. Las representaciones m+s usadas son los flujogramas, los diagramas >S y el pseudocdigo. 9am!i@n la solucin se puede escri!ir en algunos casos en lenguaje natural pero no se -ace por,ue es muy am!iguo, e incluso otras formas de e$presin como frmulas matem+ticas. Es+!"#u!a *el alg !"#$ : 4l escri!ir el algoritmo -ay ,ue tener en cuenta% - Las acciones o pasos a reali.ar tienen ,ue tener un determinado orden. - #n cada momento solo se puede ejecutar una accin. - Dentro de las sentencias del algoritmo pueden e$istir pala!ras reservadas 2pala!ras propias del lenguaje de programacin ,ue tienen para el compilador un determinado significado/. - Si estamos utili.ando pseudocdigo tenemos tam!i@n ,ue usar la identacin 2aumenta la legi!ilidad del pro!lema para ,ue se pueda leer mejor/. 0. RESOL'CIN EN LA COMP'TADORA: #s -acer entender nuestro algoritmo a la computadora para ,ue lo pueda -acer. 1. Codificamos el algoritmo en un leguaje de programacin. 2. #jecutar el programa antes compilado. 3. Compro!ar los resultados y si no funciona, corregirlo. 6. FL'(OGRAMAS: #s una notacin gr+fica para implementar algoritmos. Se !asa en la utili.acin de unos s8m!olos gr+ficos ,ue denominamos cajas, en las ,ue escri!imos las acciones ,ue tiene ,ue reali.ar el algoritmo. Las cajas est+n conectadas entre s8 por l8neas y eso nos indica el orden en el ,ue tenemos ,ue ejecutar las acciones. #n todo algoritmo siempre -a!r+ una caja de inicio y otra de fin, para el principio y final del algoritmo. L s sB$C l s: L8neas de flujo% *na l8nea con una flec-a ,ue sirve para conectar los s8m!olos del diagrama y la flec-a indica la secuencia en la ,ue se van a ejecutar las acciones. S8m!olo de proceso% ;ndica la accin ,ue tiene ,ue reali.ar la computadora. Dentro escri!imos la accin. 3epresenta las acciones de entrada y salida. Dentro colocaremos las acciones de lectura y escritura.

0<=;>4 11?1&

Condicin% Dentro se va a colocar una condicin. Sirve para representar estructuras selectivas y repetitivas y lo ,ue se -ace al encontrar ese signo es evaluar la condicin ,ue -ay dentro tal ,ue seg:n la condicin sea verdadera o falsa iremos por caminos distintos.

0rincipio y fin% Dentro del s8m!olo ira la pala!ra inicio o fin del algoritmo. Su!programa% Dentro se coloca el nom!re del su!programa al ,ue se llama.

Conectores% >os sirven cuando un flujograma no me ca!e en una columna de la -oja y -ay ,ue seguir en otra columna% - Si es en la misma -oja% Si es en -oja distinta%

Los conectores se ponen uno donde termina la columna y otra donde empie.a. #s una aclaracin para entender mejor el cdigo, pero no es parte del cdigo, no se ejecuta.

O#! s sB$C l s: A 0antalla% Cuando una salida es por pantalla.

A 9eclado% 0ara representar una entrada por teclado.

A ;mpresora%

A #ntrada?Salida por disco%

0<=;>4 12?1&

C0ro!lema% Kueremos -allar el producto de varios n:meros positivos introducidos por teclado y el proceso termina cuando se meta un n:mero negativo. 1. ;niciar la varia!le del producto. 2. Leer el primer n:mero. 3. 0reguntar si es negativo o positivo. 4. Si es negativo nos salimos y escri!imos el producto. . Si es positivo, multiplicamos el n:mero le8do y luego leemos un nuevo n:mero, y se vuelve al paso 3. ;nicio

01 Leer num

>um FJ G

#scri!ir 0

0 0 C num Leer num

'in

0<=;>4 13?1&

6. DIAGRAMAS N4S O DE NASSI4SCDEDERMAN: #s semejante al flujograma, peor sin flec-as y cma!iando algo los s8m!olos de condicin y repeticin. Las cajas van unidas. EaccinF Condiciones%
Condicin

S; Eacc1F 3epetitivas% 5ientas EcondF EaccionesF

>S Eacc2F

EaccionesF 3epetir -asta EcondF

Desde viJv1 -asta vn EaccionesF

0ro!lema anterior% ;nicio 01 Leer num 5ientras num FJ G 0 pCnum Leer num #scri!ir 0 'in

0<=;>4 14?1&

8. PSE'DOCDIGO: #s un lenguaje de especificacin de algoritmos, pero muy parecido a cual,uier lenguaje de programacin, por lo ,ue luego su traduccin al lenguaje es muy sencillo, pero con la ventaja de ,ue no se rige por las normas de un lenguaje en particular. >os centramos m+s en la lgica del pro!lema. #l pseudocdigo tam!i@n va a utili.ar una serie de pala!ras clave o pala!ras especiales ,ue va indicando lo ,ue significa el algoritmo. 1. ;nicio y 'in% 0or donde empie.a y aca!a el algoritmo. Iegin ?end % 0acal. _ ` % #n C. 2. S8 EcondF #ntonces Eacc1F ;f t-en else Sino Eacc2F 3.5ientras EcondF ?-acer 1-ile do 4. 3epetir ? -asta repeat until . Desde ?-asta for .. to ". Seg:n sea Case S1it Los comentarios van encerrados entre llaves. Nay ,ue utili.ar la identacin. 4lgoritmo Enom!re algF 6ar Enom!reF% EtipoF ;nicio E;nstruccionesF 'in

4lgoritmo 0roducto 6ar 0, num% entero ;nicio 01 Leer num 5ientras num FJG -acer 0 pCnum Leer num 'in mientras

0<=;>4 1 ?1&

#scri!ir p 'in

EJERCICIOS: TEMA 2
1. 3eali.ar un programa ,ue convierta los grados a radianes. 4lgoritmo convertir 6ar =rados, rad% real ;nicio #scri!ir L;ntroduce los gradosM Leer grados Si grados FJ 3"G #ntonces grados grados mod 3"G 'in si 3ad grados ? 1(G #scri!ir rad L radiantesM 'in 2. 3eali.ar un algoritmo ,ue pida un valor entero ,ue e,uivale a un n:mero de duros y me calcule a cuantos !illetes de GGG, 1GGG, monedas de 2GG, 2 , 1. 4lgoritmo cam!io 6ar Duros% real ;nicio #scri!ir L;ntroduce los durosM Leer duros Duros duros C #scri!ir duros div GGG L!illetes de GGGM Duros duros mod GGG #scri!ir duros div 1GGG L!illetes de 1GGGM Duros duros mod 1GGG #scri!ir duros div 2GG Lmonedas de 2GGM Duros duros mod 2GG #scri!ir duros div 2 Lmonedas de 2 M Duros duros mod 2 #scri!ir duros Lmonedas de 1M 'in

0<=;>4 1"?1&

3. 3eali.ar un programa ,ue pida al usuario la velocidad en m?s y el radio de la circunferencia de la pista, y resultada el programa devuelve el tiempo ,ue tarda el atleta en dar 2 vueltas a la pista, sa!iendo ,ue el atleta descansa 1 minuto cada 1GGG metros. 4lgoritmo recorrido 6ar 6elocidad,radio,tiempo,longitud% entero ;nicio #scri!ir L;ntroduce la velocidadM Leer velocidad #scri!ir L;ntroduce el radioM Leer radio Longitud 4 C 3.141" C radio Descanso longitud div 1GGG 9iempo longitud div velocidad B descanso C "G #scri!ir tiempo 'in

0<=;>4 1&?1&

ESTRUCTURA GENERAL DE UN PROGRAMA TEMA 3


1. 2. 3. 4. Concepto de programa. ;nstrucciones y tipos. #lementos !+sicos de un programa. #structura de algoritmos y programas.

1. CONCEPTO DE PROGRAMA: *n programa es un conjunto de instrucciones ,ue al ser ejecutadas resuelven un pro!lema. *n programa tiene 3 partes% 1. #ntrada de datos% >ormalmente se va a ejecutar a trav@s de instrucciones de lectura, y en lo ,ue se le pide al usuario la informacin ,ue el programa va a necesitar para ejecutarse y se -ace a trav@s de lecturas. 2. 4cciones de un algoritmo% 0arte en la ,ue se resuelve el pro!lema usando los datos de entrada. 3. Salida% 5ostrar en un dispositivo de salida los resultados de las acciones anteriormente reali.adas. Son acciones de escritura. #n la parte de las acciones a ejecutar se distinguir+n dos partes% - Declaracin de varia!les. - ;nstrucciones del programa. 2. INSTR'CCIONES 2 TIPOS: 0ara ,ue una instruccin se ejecute tiene ,ue ser llevada a memoria. #n cuanto al orden de ejecucin de las instrucciones, el programa puede ser de dos tipos% - 0rogramas lineales% Se va ejecutando una instruccin m+s otra y el orden de ejecucin es igual al orden de escritura. - 0rogramas no lineales% Las instrucciones no se ejecutan en el mismo orden en el ,ue aparecen escritas, sino ,ue se reali.an saltos ,ue nos mandan de unas instrucciones a otras. >unca se de!en -acer saltos no lineales. T") s *e "ns#!u++" nes: 1. ;nicio y fin. 2. 4signacin% Dar un valor a una varia!le. 3. Lectura ? escritura% ;ntroducir o sacar informacin por dispositivos #?S. 4. ;nstrucciones de !ifurcacin% 4lternan el orden de ejecucin del programa. Salto a otra instruccin ,ue no es la siguiente. 4.1. Iifurcacin incondicional% #l salto se produce siempre ,ue el programa vaya a esa instruccin% =oto ;r a. 0<=;>4 1(?1&

4.2. Iifurcacin condicional% Se ejecutan un conjunto de instrucciones u otras dependiendo del valor devuelto al evaluar una condicin. #s la ,ue vamos a usar. &. ELEMENTOS 7@SICOS DE 'N PROGRAMA: Qu es la s"n#a:"s *e un lengua,e%: Conjunto de reglas ,ue tenemos ,ue seguir a la -ora de escri!ir un programa en ese lenguaje tal ,ue si no seguimos esas reglas de sinta$is el compilador da errores. Ele$en# s *el lengua,e *e )! g!a$a+"-n: 1. 0ala!ras reservadas% Son un conjunto de pala!ras especiales ,ue nos sirven para definir la estructura del programa, y solo se pueden usar para el fin para el ,ue est+n reservadas. 2. ;dentificadores% Son los nom!res ,ue aparecen en el programa dados por el usuario. Son por tanto los nom!res de varia!les, de constantes, de su!programas y nom!res de tipos creados por el usuario. 3. Caracteres especiales% Sirven como separadores entre sentencias, por ejemplo el D. 4. ;nstrucciones% De 3 tipos, secuenciales, repetitivas y selectivas, y pueden aparecer elementos especiales 2!ucles, contadores, interruptores y acumuladores/. 7u+le% *n conjunto de instrucciones ,ue se repiten un n:mero finito de veces. Lleva asociado aparte de las instrucciones una condicin ,ue es la ,ue determina cuando se termina un !ucle. #jecucin de un !ucle 2iteracin/. Los !ucles se pueden anidar unos dentro de otros, y puede -a!er varios !ucles al mismo nivel, pero nunca se entrela.an. C n#a* !% *n elemento cuyo valor se incrementa o decrementa en un valor constante en cada iteracin de un !ucle, y se utili.a para controlar la condicin del !ucle. A+u$ula* !% #s una varia!le ,ue tam!i@n se suele usar en los !ucles y ,ue se incrementa o decrementa en cada iteracin del !ucle, pero no en una cantidad constante. 4lgoritmo ejemplo 6ar cont, num, sum% entero ;nicio Cont G Sum G 5ientras cont EF 3 Leer num Sum sum B num Cont cont B1 'in mientras #scri!ir suma #nd In#e!!u)# ! E$a!+a1 Can*e!a FlagG% #s una varia!le ,ue sirve como indicador de una determinada informacin y ,ue solo puede tomar uno de dos valores. #l valor de la varia!le tiene asociado un signo y puede variar a lo largo de la ejecucin.

0<=;>4 1)?1&

4lgoritmo ejemplo 6ar cont, num, suma% entero >eg% !oolean ;nicio Cont G Sum G >eg falso 5ientras cont EF3 Leer num Si num E G #ntonces neg verdadero 'in si Sum sum B num Cont cont B 1 'in mientras Si negJverdadero #ntonces escri!ir 2LSe -a le8do negativosM/ Sino escri!ir 2L>o negativosM/ 'in si 'in Si es leer un n:mero negativo o -asta 3 n:meros% 5ientras 2cont EF 3/ y 2neg J verdadero/ 0. ESCRIT'RA DE ALGORITMOS 2 PROGRAMAS: #n pseudocdigo el programa tiene dos partes, la ca!ecera y el cuerpo. La ca!ecera contiene el nom!re del algoritmo, y el cuerpo contiene 2 partes. La primera es la .ona de declaraciones de var y const, y la segunda es la .ona de las instrucciones del programa. #n la .ona de instrucciones para ,ue ,uede m+s legi!le -ay ,ue usar la identacin y si es necesario -ay ,ue usar comentarios entre llaves.

0<=;>4 2G?1&

EJERCICIOS: TEMA 3
1. ZCu+les y cu+ntos son los n:meros primos comprendidos entre 1 y 1GGG[ 4lgoritmo naprimos Const 0rimeroJ1 LimiteJ1GGG 6ar cont, i, j% entero primo% !oolean ;nicio Cont G Desde iJ primero -asta limite primo verdadero j2 mientras 2iFj/ y 2primo Jverdadero/ Si i mod j J G #ntonces primo falso Sino j j B 1 'in si 'in mientras Si primo J verdadero #ntonces escri!ir iM L Cont cont B 1 'in si 'in desde #scri!ir L#ntre LprimeroM y LlimiteM -ay LcontM nb primosM 'in 2. Calcular el m+$imo de n:meros positivos introducidos por teclado, sa!iendo ,ue metemos n:meros -asta ,ue introdu.camos uno negativo. #l negativo no cuenta. 4lgoritmo ma$imo 6ar >um, ma$% entero ;nicio 5a$ G #scri!ir L;ntrodu.ca nb positivos y para aca!ar introdu.ca uno negativoM

0<=;>4 21?1&

Leer num 5ientras num FJG Si num Fma$ #ntonces ma$ num 'in si Leer num 'in mientras #scri!ir L#l mayor n:mero esM ma$ 'in

3. Determinar cuales son los m:ltiplos de 4lgoritmo multiplos 6ar i% entero ;nicio Desde iJ1 -asta n Si i mod JG #ntonces escri!ir i 'in si 'in desde 'in

comprendidos entre 1 y >.

0<=;>4 22?1&

INTRODUCCIN A LA PROGRAMACIN ESTRUCTURADA: TEMA 4:


1. 2. 3. 4. . ". &. (. 9@cnicas de programacin. 0rogramacin modular. 0rogramacin constructora. #structura secuencial. #structuras selectivas. #structuras repetitivas. 4nidacin de !ucles y condicionales. Control de datos de entrada.

1. THCNICAS DE PROGRAMACIN: #l programar con flujogramas o diagramas >S resulta muy lioso en el momento en ,ue el programa se complica, por eso vamos a utili.ar siempre el pseudocdigo, en el ,ue vamos a utili.ar dos t@cnicas de programacin ,ue no se usan por separado, sino ,ue son complementarios. #stas t@cnicas son% 0rogramacin modular% Consiste en dividir el programa en partes llamadas mdulos, e implementar cada uno de esos mdulos por separado. 0rogramacin estructurada% Cuyo o!jetivo es -acer m+s legi!le y lgico la estructura del programa utili.ando para ello solamente tres tipos de estructuras% selectivas, secuenciales 2condicionales/ y repetitivas. 2. PROGRAMACIN MOD'LAR: Se !asa en dividir el programa en partes llamadas mdulos, ,ue se anali.an y codifican de forma independiente y ,ue reali.an una determinada tarea ,ue ser+ en realidad una parte del pro!lema total a resolver. #n todo algoritmo o programa e$istir+ un mdulo o programa principal ,ue es al ,ue transfiere el control cuando comien.a la ejecucin del programa, y luego desde @l, se va llamando al resto de los su!programas. Llamar a un su!programa ,uiere decir transferirle el control, es decir ,ue se comien.a a ejecutar y lo -ar+ desde el comien.o del su!programa -asta ,ue se termine y al terminar devuelve el control al su!programa ,ue lo llam. Dentro del su!programa a su ve. tam!i@n puedo llamar a otros pero en cual,uier caso al final se devuelve el control al mdulo ,ue -ace la llamada. #l control al programa llamado se devuelve a la instruccin siguiente a la ,ue se -i.o la llamada.

0<=;>4 23?1&

*n mdulo solo tiene acceso a los mdulos a los ,ue llama y a los su!mdulos a los ,ue a su ve. llaman @stos. Los resultados producidos por un mdulo pueden ser utili.ados por otros. >o e$iste un criterio fijo para determinar el tama7o, ni muy grandes ni muy pe,ue7os, la idea fundamental es ,ue realicen una :nica cosa y muy concreta. Los mdulos o su!programas reci!en diferentes nom!res seg:n el lenguaje de programacin y seg:n su tipo. Se llaman procedimientos y funciones 20ascal, C/, su!rutinas 2!asic, fortran/, secciones 2co!ol/,...

&. PROGRAMACIN ESTR'CT'RADA: La caracter8stica fundamental es ,ue se va a !asar en el uso :nicamente de tres estructuras de control. 0ara ello se apoya en las siguientes filosof8as% 1. 3ecursos a!stractos% Son los recursos con los ,ue no contamos a la -ora de programar, pero en los ,ue nos apoyamos a la -ora de solucionarlos. #stos recursos se tienen ,ue ir transformando en recursos concretos. 2. Dise7o descendente 2top do1n/% Se trata de ir descomponiendo el pro!lema en niveles o pasos cada ve. m+s sencillos, tal ,ue la salida de una etapa va a servir como entrada de la siguiente. #n las primeras etapas tomamos el punto de vista e$terno, es decir, ,ue entradas -ay y ,ue salidas -ay, y a medida ,ue vamos !ajando de nivel, lo vamos viendo de modo interno 2como lo -ace por dentro/. 3. #structuras !+sicas de control% 0ara -acer cual,uier programa siguiendo los anteriores pasos de ra.onamiento, al final codificamos el programa usando tres tipos de secuencias 2repetitivas, alternativas y secuenciales/. 4l final todo programa va a tener una :nica entrada y una :nica salida. Desde la entrada tienen ,ue e$istir caminos ,ue nos permiten pasar por todas las partes del programa y llevarnos a la salida, y finalmente no se van a permitir los !ucles infinitos. 0. ESTR'CT'RA SEC'ENCIAL: #s cuando una instruccin sigue a otra en secuencia, es decir, la salida de una instruccin es la entrada de la siguiente. 'L*cS=3454% D;4=3454S >S% 0S#*DSCdD;=S% Leer num >um numC2 #scri!ir num

6. ESTR'CT'RAS SELECTI3AS: Se eval:a la condicin y en funcin del resultado se ejecuta un conjunto de instrucciones u otro. Nay tres tipos de selectivas 2simple, do!le o m:ltiple/%

0<=;>4 24?1&

C Simple% #s la estructura %

S8 EcondF entonces EaccionesF fin s8 #valuamos la condicin y si es verdadera ejecutamos el conjunto de condiciones asociadas al entonces, y si es falso, no -acemos nada. 'L*cS=3454% D;4=3454 >S%
ECond1F S; EaccionesF EaccionesF EaccionesF Condicin >S

C Do!le% Se eval:a la condicin y si es verdad se ejecutan el conjunto de acciones asociadas a la parte entonces, y si es falso se ejecutan el conjunto de acciones asociadas a la parte sino. 'L*cS=3454% D;4=3454S >S% 0S#*DSCdD;=S% Si >o Cond S8 EcondF Si Cond >o #ntonces EaccionesF 4cc1 4cc2 Sino EaccionesF 4cc1 4cc2 'in si

*na condicin se ejecuta una :nica ve.. C 4lternativa m:ltiple% Se eval:a una condicin o e$presin ,ue puede tomar n valores. Seg:n el valor ,ue la e$presin tenga en cada momento se ejecutan las acciones correspondientes al valor. #n realidad e,uivale a un conjunto de condiciones anidadas. #n cual,uier lenguaje, es Case o S1it-. 0S#*DSCdD;=S% Seg:n sea Ee$presinF E6alor1F% Eaccin1F Evalor2F% Eaccin2F ................................. OEotroF% EaccionesFP fin seg:n Stro% Las acciones asociadas al valor otro se ejecutan cuando la e$presin no toma ninguno de los valores ,ue aparecen antes. St-er1ise, #lse. #l valor con el ,ue se compara la e$presin, va a depender de los lenguajes, de lo ,ue sea ese valor. #n general ese valor puede ser un valor constante, un rango de valores o incluso otra condicin 'L*cS=3454% D;=3454S >S% #$pr
61 62 63 64 ...

#$presin
Stro

61

62

63

64

6"

0<=;>4 2 ?1&

Nacer un programa ,ue pueda di!ujar una recta, un punto o un rect+ngulo. 4lgoritmo di!ujo 6ar op% car+cter #scri!ir 2L;ntroduce una opcinM 1. 0unto 2. 3ecta 3. 3ect+nguloM/ Leer op Seg:n sea op L1M% leer $ ......... L2M% leer $ .......... L3M% leer $ .......... LotroM% escri!ir Lopcin errneaM fin seg:n 0ara un rango de valores% Leer una nota y escri!ir en pantalla la calificacin% 6ar nota% entero Leer nota Seg:n sea nota 1..4% escri!ir LsuspensoM .."% escri!ir Lapro!adoM &..(% escri!ir L>ota!leM )% escri!ir LSo!resalienteM 1G% escri!ir L5atricula de -onorM fin seg:n #n algunos lenguajes se permite poner una condicin% Seg:n sea nota >ota FJ1 y nota EJ4% escri!ir LsuspensoM #n pseudocdigo no se pueden poner condiciones. 8. ESTR'CT'RAS REPETITI3AS:

0<=;>4 2"?1&

#n a,uella ,ue contiene un !ucle 2conjunto de instrucciones ,ue se repiten un n:mero finito de veces/. Cada repeticin del !ucle se llama iteracin. 9odo !ucle tiene ,ue llevar asociada una condicin, ,ue es la ,ue va a determinar cuando se repite el !ucle. Nay cuatro tipos de !ucles, aun,ue solo se pueden usar tres% 1. 5ientras -acer e-ile do 2. 3epetir -asta repeat until 3. Desde for 4. ;terar loop % >o se usa.

M"en#!as >a+e!: Sinta$is% 0S#*DSCdD;=S% 5ientras EcondF -acer EaccionesF fin mientras

'L*cS=3454% >o Cond Si Eacc1F

D;4=3454S >S% mientras cond acciones

'uncionamiento% La condicin del !ucle se eval:a al principio, antes de entrar en @l. Si la condicin es verdadera, comen.amos a ejecutar las acciones del !ucle y despu@s de la ultima volvemos a preguntar pro la condicin. #n el momento en el ,ue la condicin sea falsa nos salimos del !ucle y ejecutamos la siguiente condicin al !ucle. 4l evaluarse la condicin antes de entrar en el !ucle al principio, si la condicin al ser evaluada la primera ve. es falsa, no entraremos nunca en el !ucle, el !ucle puede ,ue se ejecute G veces, por tanto usaremos o!ligatoriamente este tipo de !ucle en el caso de ,ue e$ista la posi!ilidad de ,ue el !ucle pueda ejecutarse G veces. Re)e#"! >as#a: Sinta$is% 'L*cS=3454% EaccF >o Cond Si 3epetir EcondF -asta

D;4=3454S >S% acciones

'L*cS=3454% 3epetir EaccionesF -asta EcondicinF

'uncin%

0<=;>4 2&?1&

Se repite el !ucle -asta ,ue la condicin sea verdadera. Se repite mientras la condicin sea falsa. La condicin se eval:a siempre al final del !ucle, si es falsa volvemos a ejecutar las acciones, si es verdad se sale del !ucle. Como la condicin se eval:a al final, incluso aun,ue la primera ve. ya sea verdadera, -a!remos pasado al menos una ve. por el !ucle. #s decir ,ue cuando un !ucle se tenga ,ue ejecutar como m8nimo una ve., podremos usar una estructura repetir o mientras, la :nica diferencia ,ue -a!r+ entre las dos, es ,ue para -acer lo mismo, las condiciones tienen ,ue ser contrarias. Leer 3 n:meros y dar su suma% Cont G Cont G Suma G suma G 5ientras cont EF 3 repetir Suma suma B num leer num Leer num suma suma B num Cont cont B 1 cont cont B 1 'in mientras -asta cont J 3 Des*e: #ste tipo de !ucles se utili.a cuando se sa!e ya antes de ejecutar el !ucle el n:mero e$acto de veces ,ue -ay ,ue ejecutarlo. 0ara ello el !ucle llevara asociado una varia!le ,ue denominamos varia!le 8ndice, a la ,ue le asignamos un valor inicial y determinamos cual va a ser su valor final y adem+s se va a incrementar o decrementar en cada iteracin de !ucle en un valor constante, pero esto se va a -acer de manera autom+tica, el programador no se tiene ,ue ocupar de incrementar o decrementar esta varia!le en cada iteracin, sino ,ue va a ser una operacin impl8cita 2lo -ace por defecto/. 0or tanto en cada iteracin del !ucle, la varia!le 8ndice se actuali.a autom+ticamente y cuando alcan.a el valor ,ue -emos puesto como final se termina la ejecucin del !ucle. Sinta$is% 0S#*DSCdD;=S% Desde Evar 8ndiceFJEvalor inicialF -asta Evalor finalF EaccionesF fin desde 'L*cS=3454S% 6 6i Desde vJvi -asta v1
6 EF 61

D;4=3454S >S%

EsentenciasF

sentencias vvB1

0<=;>4 2(?1&

7u+le + n sal"*a "n#e!na: l ) "#e!a!. 0ermite la salida del !ucle desde un punto intermedio del mismo siempre ,ue se cumpla la condicion ,ue aparece, entonces nos salimos a la siguiente instruccin del !ucle. ;terar Esent1F salir si EcondF >*>C4 S# *S4 Esent2F fin iterar

;. ESTR'CT'RAS ANIDADAS: 9anto las estructuras selectivas como los !ucles se pueden anidar unos dentro de otros. An"*a+"-n *e + n*"+" nales: La ventaja de anidar sentencias condicionales, es ,ue cuando una se cumple no -ay por ,ue mirar a las ,ue estan de!ajo. 9enemos ,ue tratar anidar la condicion en la parte sino 2else/ en ve. ,ue en la parte entonces. Si Econdicion1F #ntonces Esentencia1F Sino si Econdicion2F #ntonces Esentencia2F Sino si Econdicion2F #ntonces Esentencia3F 'in si 'in si 'in si #l case siempre e,uivale a una anidacin de condicionales, pero no al reves. 7u+les an"*a* s: 4l igual ,ue podemos colocar unas e$presiones dentro de otras, unos !ucles pueden estar dentro de otros, pero nunca pueden cru.arse. 4l anidar !ucles -ay ,ue tener en cuenta ,ue el !ucle mas interno funciona como una sentencia mas del !lo,ue mas e$terno y por tanto en cada iteracin del !ucle mas e$terno se van a ejecutar todas las iteraciones del !ucle mas interno por cada iteracin del mas e$terno. Si el !ucle mas e$terno se repite n veces y el mas interno se repite m veces, si por cada iteracin del mas e$terno se repite el mas interno, el n:mero total de iteraciones ser+ mCn. Los !ucles ,ue se anidan pueden se de igual o distinto tipo. Desde iJ1 -asta ( Desde jJ1 -asta #scri!ir L0rofesorMiMintrodu.ca su asignatura nbMj Leer asignatura 'in desde 0<=;>4 2)?1&

'in desde <. CONTROL DE DATOES DE ENTRADA: 1. Cuan* e:"s#e un /al ! +en#"nela =ue *e#e!$"na el F"n *el Cu+le: #l !ucle se va a repetir mientras no se lea un determinado valor. La primera lectura se va a reali.ar fuera del !ucle, y si la primera ve. ,ue lo leo ya encuentro ese valor centinela no podemos entrar en el !ucle y seguir+ a continuacin, sino entramos en el !ucle. Se va utili.ar una estructura M"en#!as. 2. Le+#u!a se+uen+"al *e un F"+>e! : 9endremos ,ue leer del primero al :ltimo registro del fic-ero. Na!r+ ,ue usar un M"en#!as, aun,ue -ay dos posi!ilidades% Leer fuera del !ucle y al final de !ucle, o leer dentro al principio del !ucle. Se usa una u otra dependiendo del lenguaje. &. Cuan* en un Cu+le saCe$ s el nI$e! e:a+# *e /e+es =ue se !e)"#e el Cu+le: *samos el Des*e...Das#a. 0. C n#! l *e *a# s )a!a n )e!$"#"! *a# s e!! ne s: >o dejar seguir al usuario -asta ,ue no introdu.ca datos correctos. Nay ,ue usar un Re)e#"!...Das#a. 3epetir Leer datos Nasta 2datos correctos/ 3epetir leer op -asta 2opFJ1/ y 2opEJ3/

0<=;>4 3G?1&

EJERCICIOS: TEMA 4
1. 4l final de curso deseamos sa!er cual -a sido el alumno de primero con mejor nota media. Se sa!e ,ue este a7o entraron 1 G alumnos y ,ue en primero todos tienen asignaturas. Dar el nom!re y la nota media. 4lgoritmo notaamedia Const 4lumnosJ1 G 4signaturasJ 6ar >om!re, mejoraalum% cadena >ota, suma, media, acum% real ;, j% entero ;nicio 4cum G Desde iJ1 -asta alumnos -acer Suma G #scri!ir L;ntrodu.ca el nom!re del alumnoM Leer nom!re Desde jJ1 -asta asignaturas -acer #scri!ir L;ntrodu.ca la nota de la asignaturaM Leer nota Suma suma B nota 'in desde 5edia suma ? asignaturas Si media F acum #ntonces acum media 5ejoraalum nom!re 'in si 'in desde #scri!ir L#l mejor alumno es Lmejoraalum

0<=;>4 31?1&

#scri!ir LSu nota media es Lacum 'in

2. Calcular la suma de los divisores de cada n:mero introducido por teclado. 9erminaremos cuando el n:mero sea negativo o G. 4lgoritmo divisores 6ar >umero, i, suma %entero ;nicio #scri!ir L;ntroduce un n:mero, y para aca!ar uno negativoM Leer n:mero 5ientras numero F G Suma G Desde iJ1 -asta numero ?2 Si numero mod i JG #ntonces suma suma B i 'in si 'in desde Suma suma B numero #scri!ir LLa suma de los divisores del n:mero es Lsuma Leer numero 'in mientras 'in 3. Se coloca un c+pital C, a un interes ;, durante 5 a7os y se desea sa!er en cuanto se -a!r+ convertido ese capital en m a7os, sa!iendo ,ue es acumulativo. 4lgoritmo interes 6ar ;, j, m% entero C, temporal% real ;nicio repetir #scri!ir L;ntroduce el capital, el interes y el tiempoM Leer c, i, m Nasta 2cFG/ y 22iEJG/y2iEJ1GG// y 2m FJG/ 0<=;>4 32?1&

Desde jJ1 -asta m C c C 21B;?1GG/ 'in desde #scri!ir L9ienes LcM ptsM 'in

4. Dada una fec-a en formato dia?mes?a7o determinar el n:mero de d8as y el nom!re del mes de dic-a fec-a, y sacar por pantalla la fec-a convertida a formato de dia LdeM mes LdeM a7o. 4lgoritmo fec-a 6ar Dia, mes, a7o, nadias% entero >ames% cadena ;nicio 3epetir #scri!ir L;ntroduce la fec-a en formato dia mes a7oM Leer dia, mes, a7o Seg:n sea mes 1,G1% names LeneroM nadias 31 2,G2% names Lfe!reroM si a7o mod 4JG entonces nadias 2) entonces nadias 2( 3,G3% names Lmar.oM nadias 31 4,G4% names La!rilM nadias 3G ,G % names LmayoM nadias 31 ",G"% names LjunioM nadias 3G &,G&% names LjulioM nadias 31 (,G(% names LagostoM nadias 31 0<=;>4 33?1&

),G)% names Lseptiem!reM nadias 3G 1G% names Loctu!reM nadias 31 11% names Lnoviem!reM nadias 3G 12% names Ldiciem!reM nadias 31 fin seg:n sea -asta 2dia EJnadias/ y 22mes FJ1/y2mes EJ12// y 2a7o FJG/ escri!ir L#l mes de LnamesMtiene LnadiasM diasM escri!ir LLa fec-a es% LnadiasM de LnamesM de La7o fin

. Dada la siguiente frmula%

X =

22a b/
i =1 n 1 i=2

3/ + n

22 + a C 2i 1//

4veriguar el valor de $ pidiendo al usuario los valores de n, a, !. 4lgoritmo ecuacion 6ar >, a, !, primer, seg:n, i, j% entero f% real ;nicio 0rimer G Seg:n 1 3epetir #scri!ir L;ntroduce el valor de n, a, !M Leer n, a, ! Nasta nFJG Desde iJ1 -asta n 0rimer 222aA!/Vi g3/Bn/Bprimer 'in desde Desde jJ2 -asta nA1 Seg:n 222CaC2iA1//Cseg:n/ 'in desde f primer ? seg:n #scri!ir $ 'in 0<=;>4 34?1&

". Dada la siguiente serie matem+tica% a1JG a2JG anJanA1 B 22CanA2/ para nFJ3 Determinar cual es el valor y el rango del primer t@rmino cuyo valor sea mayor o igual a 2GGG. 4lgoritmo serie 6ar 41, a2, an, cont% entero ;nicio 41 1 42 G 4n a1 B 22Ca2/ >3 5ientras an E 2GGG 42 a1 41 an 4n a1 B 22Ca2/ Cont cont B 1 'in mientras #scri!ir L#l rango es LcontM y el resultado esMan fin

0<=;>4 3 ?1&

SUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES. TEMA 5


1. 2. 3. 4. . ;ntroduccin a los su!programas o su!algoritmos. 'unciones. 0rocedimientos. <m!itos% varia!les locales y glo!ales. Comunicacin entre su!programas% 0aso de par+metros. - 9ipos y m@todos de paso de par+metros. - 0aso de par+metros por copia. - 0aso de par+metros por referencia. - 0aso de par+metros por nom!re. ". 'unciones y procedimientos como par+metros. &. #fectos laterales. (. 3ecursividad. 1. INTROD'CCIN A LOS S'7PROGRAMAS O S'7ALGORITMOS: La programacin modular es una de las t@cnicas fundamentales de la programacin. Se apoya en el dise7o descendente y en la filosof8a de Ldivide y vencer+sM, es decir se trata de dividir el pro!lema dado, en pro!lemas m+s simples en ,ue cada uno de los cuales lo implementaremos en un mdulo independiente. 4 cada uno de estos mdulos es a lo ,ue llamamos su!algoritmos o su!programas. Siempre e$istir+ un mdulo o programa principal ,ue es con el ,ue comien.a la ejecucin de todo el programa, y a partir de @l iremos llamando al resto. Cada ve. ,ue se llama a un su!programa se le pasa la informacin ,ue necesita en la llamada, a continuacin comien.a a ejecutarse el su!programa llamado, y cuando termine su ejecucin, devuelve el control a la siguiente instruccin a la de llamada en el programa ,ue lo llam. #n cuanto a la estructura de un su!programa es igual a la estructura de un programa, va a tener una informacin de entrada ,ue es la ,ue le pasamos al -acer la 0<=;>4 3"?1&

llamada y ,ue se coloca junto al nom!re del su!programa. Despu@s va a tener un conjunto de acciones, declarar otras varia!les propias del su!programa, y al terminar la ejecucin puede ,ue devuelva o no resultados al programa ,ue lo llam. Nay dos tipos fundamentales de su!programas% 'unciones y procedimientos. 2. F'NCIONES: Desde el punto de vista matem+tico, una funcin es una operacin ,ue toma uno o varios operandos, y devuelve un resultado. \ desde el punto de vista algor8tmico, es un su!programa ,ue toma uno o varios par+metros como entrada y devuelve a la salida un In"+ resultado. 0ascal% #n las funciones se puede devolver m+s de un :nico resultado mediante par+metros. C% Se devuelve todo por par+metros. #ste :nico resultado ir+ asociado al nom!re de la funcin. Nay dos tipos de funciones% - ;nternas% Son las ,ue vienen definidas por defecto en el lenguaje. - #$ternas% Las define el usuario y les da un nom!re o identificador. 0ara llamar a una funcin se da su nom!re, y entre par@ntesis van los argumentos o par+metros ,ue se ,uieren pasar. De+la!a+"-n *e una Fun+"-n: La estructura de una funcin es semejante a la de cual,uier su!programa. 9endr+ una ca!ecera 2con el nom!re y los par+metros/ y un cuerpo2con la declaracin de los par+metros de la funcin y las instrucciones/. S"n#a:"s: 'uncion Enom!reafuncionF 2naparametro% tipo, naparametro% tipo/% tipo funcion 6ar Evaria!les locales funcionF ;nicio EaccionesF retorno EvalorF fin Enom!reafuncionF La lista de par+metros es la informacin ,ue se le tiene ,ue pasar a la funcin. Los par+metros luego dentro de la funcin los podemos utili.ar igual ,ue si fueran varia!les locales definidas en la funcin y para cada par+metro -ay ,ue poner su nom!re y tipo. #l nom!re de la funcin lo da al usuario y tiene ,ue ser significativo. #n las varia!les locales se declaran las varia!les ,ue se pueden usar dentro de la funcin. #ntre las acciones tendr+ ,ue e$istir entre ellas una del tipo retorno <valor>. #sta sentencia pondr+ fin a la ejecucin de la funcin y devolver+ el valor de la funcin, es decir, como valor asociado al nom!re de mismo tipo ,ue el tipo de datos ,ue devuelve a la funcin, este valor por tanto tiene ,ue ser del mismo tipo ,ue el tipo de datos ,ue devuelve la funcin, ,ue es el ,ue -a!remos indicado al declarar la funcin en la parte final de la ca!ecera. >o se permiten funciones ,ue no devuelvan nada. Los par+metros ,ue aparecen en la declaracin de la funcin se denominan par+metros formales, y los par+metros ,ue yo utili.o cuando llamo a la funcin se denominan par+metros actuales o reales. In/ +a+"-n *e una Fun+"-n: 0<=;>4 3&?1&

0ara llamar a una funcin se pone el nom!re de la funcin, y entre par@ntesis los par+metros reales, ,ue podr+n ser varia!les, e$presiones, constantes,... pero siempre del mismo tipo ,ue los par+metros normales asociados Enom!reafuncionF 2par+metros reales/ La funcin puede ser llamada desde el programa principal o desde cual,uier otro su!programa. 0ara llamar a la funcin desde cual,uier parte, implica el conocimiento previo de ,ue @sta funcin e$iste. 4 trav@s de los par+metros reales de la llamada se proporciona a la funcin la informacin ,ue necesita, para ello, al -acer la llamada lo ,ue se produce es una asociacin autom+tica entre par+metros reales y par+metros formales. #sta asociacin se reali.a seg:n el orden de la aparicin y de i.,uierda y derec-a. Si el par+metro formal y real no son del mismo tipo, en 0ascal se produce un error, y en C se transforman los tipos si es posi!le. La llamada a una funcin, s"e$)!e /a a F !$a! )a!#e *e una e:)!es"-n, de cual,uier e$presin en la ,ue en el punto en la ,ue se llama a la funcin, pudiera ir colocado cual,uier valor del tipo de datos ,ue devuelve la funcin, esto se de!e a ,ue el valor ,ue devuelve una funcin esta asociado a su nom!re. Pas s )a!a >a+e! la lla$a*a a una Fun+"-n: 1. 4l -acer la llamada y ceder el control a la funcin, se asocia 2asigna el valor/ de cada par+metro real a cada par+metro formal asociado, siempre por orden de aparicin y de i.,uierda a derec-a, por lo ,ue siempre ,ue no coincidan los tipos y el n:mero de par+metros formales y reales, se produce un error. 2. Si todo -a ido !ien, se ejecutan las acciones de la funcin -asta ,ue lleguemos a una de tipo retorno <valor> ,ue pondr+ fin a la ejecucin. 0ueden e$istir varias sentencias de retorno en la misma funcin, pero en cada llamada solo se podr+ ejecutar uno. 3. Se le asocia al nom!re de la funcin el valor retornado y se devuelve el control al su!programa ,ue -i.o la llamada pero sustituyendo el nom!re de la funcin por el valor devuelto. O#!a F !$a *e es)e+"F"+a! el !e# !n *e una Fun+"-n: Se le asigna el valor devuelto al nom!re de la funcin. >afuncion valor E,e$)l *e Fun+"-n: *na funcin ,ue calcule la mitad del valor ,ue le paso par+metro. Suponemos ,ue es un valor entero. 'uncion mitad 2n% entero/% real 6ar m% real ;nicio 5 n?2 3etorno m 'in mitad 4lgoritmo calcamitad 6ar num% entero ;nicio #scri!ir L;ntroduce un n:mero para -allar su mitadM Leer num 0<=;>4 3(?1&

#scri!ir LLa mitad de LnumM es Lmitad2num/ 'in * La !"#$%" &'(' )!*+* &*, ((a-a+a +*&+* !"a *.),*&$%". &. PROCEDIMIENTOS: #l inconveniente de una funcin es ,ue solo puede devolver un :nico valor, por lo ,ue s8 nos interesa devolver G o > valores, aun,ue puedo usarlo para devolver un solo valor, de!o usar un procedimiento. *n procedimiento es un su!programa o un su!algoritmo ,ue ejecuta una determinada tarea, pero ,ue tras ejecutar esa tarea no tienen ning:n valor asociado a su nom!re como en las funciones, sino ,ue si devuelve informacin, lo -ace a trav@s de par+metros. 4l llamar a un procedimiento, se le cede el control, comien.a a ejecutarse y cuando termina devuelve el control a la siguiente instruccin a la de llamada. D"Fe!en+"as en#!e Fun+" nes . )! +e*"$"en# s: 1. *na funcin devuelve un :nico valor y un procedimiento puede devolver G,1 o >. 2. >inguno de los resultados devueltos por el procedimiento se asocian a su nom!re como ocurr8a con la funcin. 3. 5ientras ,ue la llamada a una funcin forma siempre parte de una e$presin, la llamada a un procedimiento es una instruccin ,ue por s8 sola no necesita instrucciones. #sta llamada consiste en el nom!re del procedimiento y va entre par@ntesis van los par+metros ,ue se le pasan. #n algunos lenguajes 2como el C/, se pone delante la pala!ra Llamar a 2Call/ procedimiento 2par+metro/. S"n#a:"s: 0rocedimiento Enom!reaprocF 2EtipoapasoaparF Enom!reaparF% tipoapar,.../ 6ar Evaria!les localesF% tipo ;nicio EsentenciasF fin Enom!reaprocF La ca!ecera va a estar formada por el nom!re del procedimiento ,ue ser+ un identificador y ,ue de!e de ser significativo, y luego entre par@ntesis los par+metros o la informacin ,ue se le pasa al procedimiento. 0ara cada par+metro -ay ,ue indicar el tipo de paso de par+metro. Nay dos tipos fundamentales de paso de par+metros, por valor y por referencia, si no ponemos tipo de paso de par+metros, se toma el tipo de paso de par+metros por valor. #n el cuerpo del procedimiento donde van las sentencias ya no -a!r+ ninguna de tipo Eretorno valorF, a-ora !ien, si el procedimiento devuelve resultados a trav@s de sus par+metros, cosa ,ue solo podr+ -acer a trav@s de los par+metros ,ue se pasan por referencia, tendr+n ,ue e$istir sentencias de asignacin de valores a estos par+metros pasados por referencia, a trav@s de los cuales se van a devolver los resultados. C $ se lla$a a un )! +e*"$"en# : Ollamar a 2Call/P nom!reaproc 2parareales/ Pas s )a!a >a+e! la lla$a*a a un )! +e*"$"en# : 1. Se cede el control al procedimiento al ,ue se llama y lo primero ,ue se -ace al cederle el control es sustituir cada par+metro formal de la definicin por el par+metro actual o real de la llamada asociado a @l. #sta asociacin entre par+metros formales y reales se -ace de i.,uierda a derec-a por orden de colocacin y para ,ue

0<=;>4 3)?1&

se pueda producir esta asociacin tienen ,ue e$istir el mismo n:mero de par+metros formales ,ue reales, y adem+s el tipo tiene ,ue coincidir con el del par+metro formal asociado, sino se cumple alguna de estas condiciones -ay un error. 2. Si la asociacin -a sido correcta comien.an a ejecutarse las instrucciones del procedimiento -asta llegar a la :ltima instruccin. 4l llegar a la instruccin se vuelven a asociar los par+metros formales ,ue devuelven los resultados a los par+metros formales asociados en la llamada, es decir, de esta manera algunos de los par+metros reales de la llamada ya contendr+n los resultados del procedimiento. 3. 'inalmente se cede el control a la siguiente instruccin a la ,ue se -ace la llamada, pero teniendo en cuenta ,ue en esta instruccin y en las siguientes puedo usar ya los par+metros reales en los ,ue se devolvieron los resultados del procedimiento para tra!ajar con ellos.

0rocedimiento mitad 2num%entero,entAsal 5%real/ ;nicio 5 num?2 'in mitad 4lgoritmo calcamitad 6ar >% entero 5it% real ;nicio #scri!ir L;ntroduce un n:meroM Leer n 5itad 2n,mit/ #scri!ir LLa mitad esMmit fin 0. @M7ITOS: 3ARIA7LES LOCALES 2 GLO7ALES: Qu es el 5$C"# *e un "*en#"F"+a* !%: #l +m!ito de un identificador 2varia!les, constantes, funciones,.../ es la parte del programa en la ,ue se conoce y por tanto se puede usar un identificador. Seg:n el +m!ito -ay 2 tipos de varia!les, locales y glo!ales% 1. Local% 4,uella ,ue est+ declarada y definida dentro de un su!programa luego su +m!ito coincidir+ con el +m!ito del su!programa en la ,ue este definida. #sto ,uiere decir ,ue la varia!le no tiene ning:n significado, no se conoce y no se puede acceder a ella desde fuera del su!programa y ,ue tiene una posicin de memoria distinta a la de cual,uier otra, incluso si es de una varia!le ,ue tiene el mismo nom!re pero ,ue est+ definida fuera del su!programa. Las varia!les locales a un su!programa se definen en la parte de la definicin de varia!les del mismo. Los par+metros formales ,ue se le ponen a un su!programa se comportan dentro de @l como si fueran tam!i@n varia!les locales a @l.

0<=;>4 4G?1&

2. =lo!ales% Son las ,ue est+n definidas a nivel del programa, es decir, su +m!ito es el programa o algoritmo principal y todos los su!programas ,ue van junto con @l. 4 esta varia!le podemos acceder desde cual,uiera de los su!programas y el programa principal, salvo ,ue alguno de esos su!programas tenga definida una varia!le local con el mismo nom!re ,ue la varia!le glo!al, en este caso si utili.o el nom!re de esa varia!le me referir@ a la local, nunca a la glo!al2ya ,ue tienen 2 .onas de memoria distintas/. Luga! en el =ue se *eF"nen las /a!"aCles gl Cales: #n algunos lenguajes se define en el programa principal, y esa varia!le ser+ glo!al, en otros lenguajes se definen fuera del programa principal y fuera de cual,uier otro su!programa2antes de empe.ar el programa principal/. 5@todo ,ue vamos a usar. #l pro!lema de usar varia!les glo!ales es ,ue como todos los su!programas las pueden modificar, puede ser posi!le ,ue -aya usos inde!idos cuando un su!programa utili.a una varia!le glo!al sin sa!er ,ue otro la -a modificado, por esa ra.n nunca usaremos para pasar informacin entre los su!programas varia!les glo!ales, sino ,ue usaremos varia!les de entradaAsalida, salvo ,ue no nos ,uede m+s remedio.

P! +e*"$"en# s an"*a* s: La anidacin de procedimientos no se permite en todos los lenguajes y consiste en ,ue dentro de un procedimiento podamos definir o meter el cdigo de otros. Si la anidacin de procedimientos est+ permitida, se plantean m+s pro!lemas en cuanto al +m!ito, desde este punto de vista, se dice ,ue una varia!le local se conoce en el procedimiento en el ,ue est+ definida y en todos los procedimientos anidados a @l ,ue son los ,ue componen el +m!ito de dic-o procedimiento, salvo ,ue en alguno de esos procedimientos anidados este definida una varia!le local con el mismo nom!re en cuyo caso dentro de ese procedimiento siempre nos referiremos a la varia!le local definida en @l por,ue siempre se considera el +m!ito m+s restringido. 00 6ar 4,I 01 4,C,D 02 4 03 D,# 04 D,' 0 0" ',4

643;4IL#S 4 del 00 04,0 0<=;>4 41?1&

<5I;9S S*I03S=3454

I del 00 4 del 01 C del 01 D del 01 4 del 02 D del 03 # del 03 D del 04 ' del 04 ' del 0" 4 del 0"

01,02,03,04,0 ,0" 01,03 01,02,03 01,02,03 02 03 03 04,0 ,0" 04,0 0" 0"

6. COM'NICACIN ENTRE S'7PROGRAMAS: PASO DE PAR@METROS. La mejor forma para llevar a ca!o la comunicacin ente su!programas, es el paso de par+metros. 9rataremos de evitar siempre ,ue sea posi!le el uso de varia!les glo!ales. Cuando llamamos a una funcin o procedimiento, le pasamos a trav@s de los par+metros la informacin ,ue necesita, y en el caso de un procedimiento tam!i@n devolvemos a trav@s de sus par+metros los resultados. 0ara ello definiremos el tipo del par+metro a principio del su!programa, ,ue es lo ,ue conocemos como par+metros formales, y al -acer la llamada pasamos la informacin a trav@s de los par+metros reales. C-$ se eFe+#Ia la + !!es) n*en+"a en#!e )a!5$e#! s F !$ales . !eales%: #$isten 2 m@todos% 1. Correspondencia posicional% #n este caso se emparejan los par+metros formales y reales por la posicin ,ue ocupan 2orden de declaracin/ y de i.,uierda a derec-a. 0ara ,ue se pueda reali.ar esta asociacin, tiene ,ue -a!er el mismo n:mero de par+metros formales y reales, y con el mismo tipo. ' 2$%entero,y%real/ 6ar a%real ' 23,4/ 2. Correspondencia por nom!re impl8cito% 4-ora en la llamada al su!programa se pone e$pl8citamente a ,ue par+metro formal corresponde cada real. 4-ora en la llamada ponemos el nom!re del par+metro formal, separado por dos puntos 2%/ y el nom!re del par+metro real ,ue le pasamos, con lo cual ya no importa la posicin en la ,ue colo,uemos la informacin. ' 2$%3,y%4/ ' 2y%4,$%3/ *n lenguaje ,ue permite esto es 4D4. *saremos siempre el primer m@todo 2posicional/.

0<=;>4 42?1&

Pas *e )a!5$e#! s: Del modo de paso de par+metros va a depender el resultado ,ue se o!tenga. 1. T") s *e )a!5$e#! s: Seg:n se usen para meter datos o para o!tener resultados. #$isten 3 tipos% 1. De entrada% Son par+metros ,ue solo aportan informacin de entrada al su!progama en el ,ue pertenecen como par+metros. 4porta el valor ,ue tienen como entrada al su!programa. #n el caso de una funcin, todos sus par+metros son de este tipo. Como solo sirven como entrada, solo pueden ser le8dos, pero no modificados, y aun,ue se modificasen dentro de un su!programa, fuera no va a tener efecto esa modificacin. 2. De salida% Se usan solo y e$clusivamente para devolver resultados a trav@s de ellos. Su valor al -acer la llamada al su!programa no nos importa, sino ,ue ese valor solo va a tener importancia cuando termina la ejecucin del programa. *n par+metro de este tipo tericamente nunca se puede leer, solo se va actuali.ar.

3. De entrada y salida% #l valor del par+metro tiene importancia tanto a la entrada como a la salida del su!programa, nos aporta informacin cuando llamamos al su!programa y por otra parte devolvemos a trav@s de @l resultados cuando terminamos el su!programa, en este caso, tiene sentido tanto leer como actuali.ar el par+metro. Solo 4D4 es un lenguaje ,ue va a soportar los 3 tipos de paso de par+metro. Se ponen como ;n, Sut, ;nASut. #l resto de los lenguajes solo permiten dos tipos de par+metros, de entrada 2solo para leer datos/ y de entradaAsalida 2para devolver resultados, aun,ue tam!i@n se puede usar para leer datos/.

2. M# * s *e )as *e )a!5$e#! s: - 0aso de par+metros por copia% - 0or valor. - 0or resultado. - 0or valorAresultado. - 0aso de par+metros por referencia. - 0aso de par+metros por nom!re o nominal. Pas *e )a!5$e#! s ) ! + )"a: La caracter8stica fundamental de este m@todo de paso de par+metros es ,ue el par+metro formal siempre se considera ,ue tiene asociada una direccin de memoria en la ,ue est+ almacenado y ,ue por tanto se comporta igual ,ue una varia!le local del su!programa en ,ue aparece. #n este m@todo lo ,ue importa es el valor del par+metro actual. 1. P ! /al !: >os interesa el valor del par+metro actual a la entrada, para ello este valor se copia en la direccin de memoria del par+metro formal asociado. #n este caso el par+metro real puede se una constante, e$presin o varia!le, y nunca se va a usar para devolver resultado a trav@s de @l, por esa ra.n precisamente puede ser una constante o una e$presin, por,ue al no devolver resultados a trav@s de @l no

0<=;>4 43?1&

necesita tomar ninguna .ona de memoria en la ,ue este almacenado, es m+s, incluso si el par+metro actual fuera una varia!le y la modific+semos dentro del su!programa 2algo ,ue no de!er8amos -acer/, fuera del su!programa no tendr8a ninguna repercusin esta modificacin, es decir, esa varia!le servir8a valiendo lo mismo en el programa desde el ,ue se -ace la llamada despu@s y antes de -acerla. #l funcionamiento ser8a el siguiente% - 4l -acer la llamada al su!programa se eval:a el valor del par+metro real, y ese es el ,ue se asocia, es decir, el ,ue se guarda o asigna al par+metro formal asociado. - Comen.amos a ejecutar el su!programa y si por casualidad se produce alg:n cam!io en el par+metro formal, el par+metro actual no se ver+ afectado, es decir, su valor seguir+ siendo el mismo en el su!programa desde donde se llama ,ue antes de -acer la llamada al su!programa.

4lgoritmo #j 6ar 4%entero ;nicio 43 0 24/ #scri!ir 4 'in 0rocedimiento 02$%entero/ ;nicio f $C2 #scri!ir $ 'in p #l valor de 4 ser8a 3 y el de f ser8a ".

3
4 del 00

"
f de 0

2. P ! /al !4!esul#a* : #n el valorAresultado nos interesa el valor del par+metro actual tanto a la entrada como a la salida de la ejecucin del su!programa. #sto ,uiere decir ,ue se cam!ia el valor del par+metro formal cam!iar+ tam!i@n el valor de su par+metro real asociado, cosa ,ue no ocurr8a antes, y esto supone por tanto ,ue a-ora el par+metro real tiene ,ue tener asociada o!ligatoriamente una direccin de memoria, por lo ,ue siempre tendr+ ,ue ser una varia!le 2no una constante ni una e$presin/. #l proceso ser8a el siguiente% A 4l -acer la llamada al su!programa se eval:a el par+metro real y su valor se copia en el par+metro formal asociado y al terminar la ejecucin el valor del par+metro formal se vuelve a copiar en el par+metro real asociado. 4lgoritmo #j 6ar 4%entero ;nicio 0<=;>4 44?1& Se copia

43 0 24/ #scri!ir 4 'in 0rocedimiento 02$%entero/ ;nicio f $C2 #scri!ir $ 'in p #l valor de la 4 y la f ser8a ".

3 " 0.3eal

3 " 0.'ormal Se devuelve

&. P ! !esul#a* : >os interesa el valor del par+metro real solamente a la salida o fin de la ejecucin del su!programa en ,ue aparece. #sto significa ,ue al -acer la llamada no se copia el valor del par+metro real en el par+metro formal asociado, sin em!argo a la salida se copia el valor del par+metro formal en la direccin del par+metro real asociado, esto significa por tanto, ,ue el par+metro real tiene ,ue tener asociada una e$presin ,ue tiene ,ue ser una varia!le 2no puede ser una constante o una e$presin/.

4lgoritmo ej 6ar 4%entero ;nicio 43 0 24/ #scri!ir 4 'in 0rocedimiento 02$%entero/ ;nicio f1 f $C2 #scri!ir $ 'in p #l valor de 4 y de f es 2.

>o se copia 0.3eal 0.'ormal

Se copia a la salida

#n la pr+ctica la mayor parte de los lenguajes dentro del tipo de paso de par+metro por copia solo van a soportar el tipo de paso de par+metro por valor, ,ue se usar+ cuando un par+metro solo lo ,uiero utili.ar como entrada de informacin al su!programa, pero no para devolver resultados a trav@s de @l. Los otros dos tipos de paso de par+metros por copia 2por valor y por valorA resultado/, no se implementan normalmente por,ue los efectos son pr+cticamente iguales ,ue el paso de par+metros por referencia, es decir, cuando ,uiero usar un par+metro no solo para pasar informacin a trav@s de @l sino tam!i@n para devolver resultados o si lo voy a usar slo para devolver resultados, utili.ar@ el paso de par+metros por referencia ,ue vamos a ver a continuacin. 0ara sim!oli.ar ,ue el tipo de paso de par+metros es por valor, en la definicin del su!programa no pongo ning:n tipo de paso de par+metros para ese par+metro, es

0<=;>4 4 ?1&

decir, no poner ning:n tipo significa ,ue por defecto el tipo de paso de par+metros es por valor. #n el caso de las funciones como solamente pueden reci!ir informacin de entrada pero nunca pueden devolver informacin por sus par+metros ya ,ue lo devuelven a trav@s de la sentencia retorno y asociado a su nom!re. #l tipo de paso de sus par+metros va a ser siempre por valor.

Pas *e )a!5$e#! s ) ! !eFe!en+"a: 4-ora la caracter8stica principal de este tipo de paso de par+metros es ,ue el par+metro formal va a tener tam!i@n asignada una direccin de memoria en la ,ue se almacena, pero en esa direccin NO SE G'ARDA S' 3ALOR, sino ,ue se almacena la direccin de su par+metro real asociado, es decir, el par+metro formal apunta al par+metro real ,ue tiene asociado y cual,uier modificacin ,ue se efect:e so!re el par+metro formal tendr+ una repercusin directa en el par+metro real asociado ya ,ue lo ,ue modificar+ ser+ el valor almacenado en la direccin ,ue indica el par+metro formal ,ue es la de su par+metro formal asociado. #l proceso ser+ por tanto el siguiente% - 4l -acer la llamada al procedimiento en el par+metro formal ,ue se pasa por referencia, se va a guardar la direccin del par+metro real asociado para ,ue apunte a @l. - Durante la ejecucin cual,uier referencia al par+metro formal se -ar+ accediendo a la direccin apuntada por dic-o par+metro, es decir, accediendo directamente al par+metro real asociado, por lo ,ue cual,uier cam!io en el par+metro formal afectar+ directamente al par+metro real asociado. De esta manera -a!remos pasado el resultado. 0ara indicar ,ue el tipo de paso de par+metro es por referencia, vamos a utili.ar la pala!ra clave entAsal precediendo al par+metro ,ue se pasa por referencia. 4 estos par+metros tam!i@n se les llama par+metros varia!les 2por,ue su valor var8a/, por eso en 0ascal se usa la pala!ra clave 6ar para indicarlo. #n otros lenguajes como C, se usan como par+metros punteros para indicar ,ue son direcciones. 4lgoritmo #c 6ar 4 apunta ;nicio 43 0<=;>4 4"?1&

0124/ #scri!ir 24/ 'in 0rocedimiento 012entAsal $%entero/ ;nicio f $C2 'in 01 0or valor el par+metro actual no cam!ia de valor. 0or referencia el par+metro actual puede cam!iar.

3 4 del 00

direccin 4 f del 01

Pas *e )a!5$e#! s ) ! n $C!e: #n este caso, el par+metro formal se sustituye literalmente por el par+metro actual asociado. #sta sustitucin literal del par+metro formal por el par+metro actual no se produce -asta ,ue no se usa el par+metro formal. La ventaja es ,ue si no usamos en ning:n momento el par+metro formal dentro del su!programa llamado 2cosa poco pro!a!le/, no se tendr+ ,ue -acer ning:n tipo de su!stitucin. 0ero el gran inconveniente es ,ue si se usa el par+metro formal, -ay ,ue ir a !uscar en ese momento la e$presin del par+metro real asociado. #l paso de par+metro por nom!re es lo ,ue se parece m+s a la su!stitucin de par+metros en una funcin matem+tica. ' 2$/J $B2 ' 2aB1/ J aB1C2 ' 2$/J $B2 ' 2aB1/J a B1 2 JK 2aB1/C2 4lgoritmo #c 6ar 4% entero ;nicio 43 0124B1/ #scri!ir 24/ 'in 0rocedimiento 012entAsal $% entero/ ;nicio f $C2 'in 01 4l final solo vamos a usar 2 tipos de paso de par+metros, ,ue son los ,ue usan casi todos los lenguajes% 0or valor y por referencia. 0or valor% Solo lo usamos cuando un par+metro solo sirve para informacin de entrada, no devolvemos nada con @l. 0or eso este paso puede ser una constante, varia!le o e$presin. 0ara sim!oli.arlo en la declaracin de varia!les no ponemos nada. 0or referencia% Lo usamos cuando un par+metro lo usamos como entrada de informacin y como salida o solo como salida. 0or esta ra.n a-ora s8 ,ue se va a variar el par+metro formal y por lo tanto no podemos usar constantes ni e$presiones, solo varia!les. Lo sim!oli.amos con la pala!ra entAsal. 8. F'NCIONES 2 PROCEDIMIENTOS COMO PAR@METROS: 0<=;>4 4&?1&

#n la mayor parte de los lenguajes se permite tam!i@n ,ue una funcin o procedimiento pueda ser pasado como par+metro de otro su!programa. #n este caso, es decir, cuando el par+metro formal es de tipo funcin o procedimiento, pasaremos como par+metro real funciones o procedimientos ,ue tengan la misma definicin ,ue el ,ue -emos puesto como par+metro formal, y en nuestro caso para indicar ,ue se pasa como par+metro real una funcin o procedimiento, !asta con poner su nom!re. Desde el su!programa al ,ue se pasa como par+metro esa funcin o procedimiento podemos llamar en cual,uier momento a esa funcin pasada como par+metro ,ue en cada momento podr+ ser una distinta dependiendo del par+metro formal asociado. 'uncion Enom!reafF 2par%tipoDfuncion EnafF2$%entero,y%car+cter/%entero 0rodedimiento Enom!reafF procedimiento 2$%tipo,.../D...

4lgoritmo #c 6ar v1,v2% entero ;nicio 61 1 62 2 02v1,f1,v2/ 02v1,f2,v2/ 'in 0rocedimiento 02$%enteroDfuncion '24%enteroDI%car+cter/%enteroDentAsal y%entero/ ;nicio f2 \ '2$,RaR/ 'in 0 'uncion '12$%enteroDy%car+cter/%entero ;nicio #scri!ir y 3etorno 2$B1/ 'in 'uncion '224%enteroDI%car+cter/%entero ;nicio #scri!ir LNolaM I 3etorno 4 'in '2 #l paso de funciones y procedimientos como par+metros, nos va a permitir ,ue desde un su!programa podamos llamar a otros, pero teniendo en cuenta ,ue el su!programa llamado no va a ser uno determinado, sino ,ue va a depender en cada momento del su!programa pasado como par+metro real, de esta manera el su!programa 0<=;>4 4(?1&

puede llamar a un conjunto de n su!programas ,ue cumplan unas determinadas caracter8sticas, pero solo uno en cada momento. >o -ay ,ue confundir el paso de una funcin como par+metro con la llamada a una funcin cuando aparece como par+metro real en la llamada a un su!programa. 0ara diferenciarlo, cuando paso una funcin como par+metro solo pondr@ su nom!re, en cam!io cuando llamo a una funcin para pasar el valor ,ue devuelve como par+metro pondr@ el nom!re de la funcin y con sus argumentos para indicar ,ue a-8 se puede -acer la llamada. #sto se puede -acer por,ue la llamada a una funcin puede aparecer en cual,uier e$presin en la ,ue apareciese cual,uier valor del tipo de datos ,ue devuelve. 0rocedimiento 024%entero/ ;nicio #scri!ir 4 'in 0 'uncion '2$%entero/%entero ;nicio 3etorno 2$C2/ 'in '

4lgoritmo #c 6ar ; ;nicio ;2 02'2;// #sto no es pasar una funcin como par+metro 'in ;. EFECTOS LATERALES: *n efecto lateral es cual,uier modificacin ,ue un su!programa 2sea funcin o procedimiento/, reali.a en elementos situados fuera de @l pero sin -acer esas modificaciones a trav@s del paso de par+metros. Los efectos laterales siempre -ay ,ue evitarlos por,ue no somos conscientes o no controlamos ,ue se -an producido. 0ara reali.ar comunicacin entre su!programas solo se -ar+ a trav@s del paso de par+metro para evitar los efectos laterales. Los efectos laterales normalmente se producen por el uso de varia!les glo!ales o varia!les locales ,ue a!arcan varios procedimientos 2esto solo es posi!le si -ay anidacin de su!programas/. 0or lo tanto evitaremos su uso e$cepto ,ue sea imprescindi!le. 6ar 4%entero 4lgoritmo #c 6ar I%entero ;nicio I1 42 02I/ #scri!ir 4 0<=;>4 4)?1&

'in 0rocedimiento 02$%entero/ ;nicio 4 $B2 'in 0 <. REC'RSI3IDAD: Se dice ,ue un su!programa es recursivo cuando se llama a s8 mismo. La recursividad se va a poder usar en su!programas ,ue pueden definirse en t@rminos recursivos, es decir, en termino de s8 mismo, como procesos de alguna manera repetitivos. La recursividad trataremos de evitarla siempre ,ue sea posi!le, es decir, siempre ,ue lo mismo se pueda solucionar con un !ucle, ya ,ue cada ve. ,ue un su!programa se llama a s8 mismo -ay ,ue almacenar en la pila del sistema la direccin de retorno de ese su!programa, con lo cual si -acemos muc-as llamadas recursivamente iremos llenando la pila del sistema, y se des!ordara aca!ando con la memoria. 9odo programa recursivo tiene ,ue tener alguna condicin ,ue ponga fin a la recursividad, es decir, ,ue el programa deje de llamarse a s8 mismo cuando se cumpla la condicin, sino se formar8a un !ucle infinito.

'uncion potencia 2!ase%enteroDe$p%entero/%real 6ar 0%real ;%entero ;nicio 0 1 Desde iJ1 -asta e$p 0 0C!ase 'in desde 3etorno 0 'in 'uncion potencia 2!ase%enteroDe$p%entero/%real ;nicio Si e$pJG entonces retorno 1 Sino 3etorno 2!aseCpotencia2!ase,e$pA1/ 'in potencia

0<=;>4 G?1&

TEMA 5: EJERCICIOS
1. ;mplementar un su!programa ,ue realice la serie de 'i!onacci, ,ue es% 'i!onacci 21/J 'i!onacci 22/J1 > F 2 'i!onacci 2n/J 'i!onacci 2nA1/ B 'i!onacci 2nA2/ 4lgoritmo serieafi!onacci 6ar ;, n% entero ;nicio #scri!ir L;ntroduce un n:meroM Leer n Desde iJ1 -asta n #scri!ir LLa serie de fi!onacci de LiM es Lfi!onacci 2i/ 'in desde 'in 'uncion fi!onacci 2num% entero/% entero ;nicio Si 2numJ1/ o 2numJ2/ #ntonces retorno 1 Sino 3etorno 2fi!onacci 2numA1/ B fi!onacci 2numA2/ 'in si 'in fi!onacci 2. ;mplementar un su!programa al ,ue pas+ndole como par+metros 2 valores enteros 5 y >, me calcule el com!inatorio 0<=;>4 1?1&

4lgoritmo com!inatorio 6ar 5,n% entero ;nicio 3epetir #scri!ir L;ntroduce el valor de 5 y >M Leer m,n Nasta m Fn #scri!ir L#l com!inatorio es Lfactorial 2m/ div 2factorial2n/Cfactorial2mAn// 'in 'uncion factorial 2num% entero/% real ;nicio Si numJG #ntonces retorno 1 Sino 3etorno 2num C factorial 2numA1// 'in si 'in factorial

3. ;mplementar un su!programa ,ue me -alle cual es la primera potencia en !ase 2 mayor ,ue un n:mero ,ue pasamos como par+metro, devolviendo el valor de dic-a potencia y el e$ponente al ,ue est+ elevado. 4lgoritmo elevar 6ar >umero, resp1, resp2% entero ;nicio #scri!ir L;ntroduce un n:meroM Leer numero Comprue!a 2numero, resp1, resp2/ #scri!ir L2VMresp1MJMresp2M FMnumero 'in 0rocedimiento comprue!a 2num% enteroD entAsal n% enteroD entAsal pot% entero/ ;nicio > 1 5ientras pot E n 0ot pot C2 > nB1 'in mientras 'in comprue!a 4. ;mplementar un su!programa ,ue calcule recursivamente en cuanto se convierte un capital C al final de > a7os y a un inter@s ;. 'uncion calculo 2c% enteroDi% enteroD n% entero/% real ;nicio Si mJG 0<=;>4 2?1&

#ntonces retorno C Sino 3etorno 2cC21Bi?1GG/Bcalculo 2c,i,nA1/ 'in si 'in calculo

. Calcular el primer t@rmino de la siguiente serie ,ue sea mayor o igual a un valor 6 ,ue se le pasa como par+metro y me devuelva el lugar ,ue ocupa en la serie y el valor. 4iJG 4nJnB24nA1/Y 'uncion factorial 2num% entero/% entero 6ar ;, acum% entero ;nicio 4cum 1 Desde iJ1 -asta num 4cum acum C i 'in desde 3etorno acum 'in factorial 0rocedimiento serie 2v% enteroD entAsal an% enteroD entAsal n% entero/ 6ar 41% entero ;nicio 41 G 4n G >1 5ientras an EJ 6 > nB1 4n n B factorial 2a1/ 41 an 'in mientras 'in serie 0<=;>4 3?1&

". Calcular el valor de la serie donde > es un valor ,ue se pasa como par+metro al su!programa ,ue -ace el c+lculo.
n 1 2 1 + i C / i =G i =G n 'uncion suma 2n% entero/% real 6ar ;, j% entero f, y, acum1, acum2, suma1, suma2% real ;nicio 4cum1 G 4cum 2 G Desde iJG -asta n f 1?n 4cum1 acum1 B $ 'in desde Desde jJG -asta nA1 \ 1 BiCacum1 B y 'in desde 3etorno acum2 'in suma &. ZKu@ se escri!e en pantalla tras la siguiente ejecucin[ 4lgoritmo #c 6ar 4,I,C% entero ;nicio 41 I2 C 4B3 01 24, IAC, C/ C C g '24/ 02 24,C/ 01 2C, I, 4/ #scri!ir 4, I, C 'in 0rocedimiento 01 2entAsal $% enteroD y% enteroD entAsal .% entero/ ;nicio f y B. \ $ B1 ^yC2 'in 01 0rocedimiento 02 2entAsal $% enteroD y% entero/ ;nicio f $ B1 gy \3 'in 02 'uncion ' 2$% entero/% entero ;nicio n 1

0<=;>4 4?1&

f$B3 3etorno 2$ g 1/ 'in ' La solucin es 4J(D IJ2D CJ3

ESTRUCTURAS DE DATOS: ARRAYS. TEMA /


1. 2. 3. 4. . ". &. (. ;ntroduccin a las estructuras de datos. 4rrays unidimensionales o vectores. Speraciones con arrays unidimensionales o vectores. 4rrays !idimensionales o matrices. 4rrays multidimensionales. 4lmacenamiento de arrays en memoria. 4rrays como par+metros de su!programas. 4rrays de LpunterosM.

1. INTROD'CCIN A LAS ESTR'CT'RAS DE DATOS: Clasificacin de los tipos de datos seg:n su estructura% A Simples% A #st+ndar 2entero, real, car+cter, !ooleano/ A >o est+ndar 2enumeracin, su!rango/ A #structurados% A #st+ticos 2arrays, cadena, registros, fic-eros, conjuntos/ A Din+micos 2punteros, listas enla.adas, +r!oles, grafos/

0ilas Colas

Los tipos simples son cuando cada dato representa un :nico elemento% A #st+ndar% #st+n definidos por defecto por el lenguaje. A >o est+ndar% 9ipos simples definidos por el usuario. Los tipos de datos estructurados, son cu+ndo un dato es una estructura ,ue se construyen a partir de otros complementos. 0<=;>4 ?1&

#st+ticos% Scupan un tama7o de memoria fijo, ,ue tengo ,ue definir antes de declararlo. - Din+micos% La estructura no ocupa un tama7o fijo de memoria, sino ,ue ocupa la memoria ,ue ocupa en cada momento. Se van a manejar a trav@s del tipo de dato puntero. 0untero% #s una varia!le cuyo contenido es una direccin de memoria y esa direccin de memoria corresponde a la direccin de memoria de otra varia!le, ,ue es la varia!le apuntada. Seg:n el tipo de datos de la varia!le apuntada variar+ el tipo de puntero. 4 trav@s de una varia!le de tipo puntero podemos esta!lecer la cone$in o enlace entre los elementos ,ue van a formar la estructura, y seg:n se reali.an estos enlaces vamos a tener diferentes tipos de estructuras 2listas enla.adas, +r!oles, grafos/. Las pilas y las colas son 2 estructuras de datos con un funcionamiento especial, ,ue pueden implementarse con memoria est+tica o din+mica. 2. ARRA2S 'NIDIMENSIONALES: 3ECTORES. *n array unidimensional, o lineal, o vector, es un conjunto finito y ordenado de elementos -omog@neos. #s finito por,ue tiene un n:mero determinado de elementos. Nomog@neo por,ue todos los elementos almacenados van a ser del mismo tipo. Srdenado por,ue vamos a poder acceder a cada elemento del array de manera independiente por,ue va a -a!er una forma de referenciar cada elemento. 0ara referenciar cada elemento de un array vamos a usar 8ndices 2valor ,ue directa o indirectamente referencia la posicin del array/. Los 8ndices tienen ,ue ser de cual,uier tipo de datos escalar 2entre los ,ue se puede definir un orden, y ,ue entre 2 elementos consecutivos no puede -a!er infinitos elementos/, aun,ue normalmente como 8ndices se van a utili.ar n:meros enteros. 0ara referenciar un elemento de un array usaremos el nom!re del array y entre corc-etes O P el 8ndice ,ue determina la posicin de ese elemento en el array. #l rango o longitud de un vector o array lineal es la diferencia entre el 8ndice de valor m+$imo y el 8ndice de valor m8nimo de ese array B 1. >ormalmente los 8ndices comien.an a enumerarse, es decir, el valor m8nimo del 8ndice es G 1, dependiendo del lenguaje 2en 0ascal con 1 y en C con G/. Sin em!argo nadie impide ,ue comiencen en cual,uier otro valor. Los arrays se almacenan siempre en posiciones consecutivas de memoria y podemos acceder a cada elemento del array de manera independiente a trav@s de los 8ndices. *n 8ndice no tiene por,ue ser un valor constante, sino ,ue puede ser tam!i@n una varia!le o una e$presin ,ue al ser evaluada devuelva ese 8ndice. 4 la -ora de definir un array siempre -a!r+ ,ue dar el nom!re del array, el rango de sus 8ndices y el tipo de los datos ,ue contiene, y para -acer esa declaracin, se utili.a la siguiente nomenclatura. EnomaarrayF% array OL; .. LSP de EtipoF sueldo% array O1 .. (P de real sueldo% array O1))G .. 1))&P de real sueldo O1))2P 1GGGGG ;% entero ; 1))2 Sueldo O;P Sueldo O;B2P

0<=;>4 "?1&

&. OPERACIONES CON ARRA2S 'NIDIMENSIONALES O 3ECTORES: 1. 4signacin de un dato a una posicin concreta del array% EnomaarrayFOindiceP valor 1 2 3 4 6entas O3P (GGGGG " & ( ) 1G 11 12

2. Lectura y escritura de datos% leer EnomaarrayFOindiceP escri!ir EnomaarrayFOindiceP desde iJ1 -asta 12 escri!ir L;ntroduce las ventas del mesMi leer ventas OiP fin desde desde iJ1 -asta 12 escri!ir L6entas del mesMiMJMventas OiP fin desde

3. 3ecorrido o acceso secuencial de un array% A Consiste en pasar por todas las posiciones del array para procesar su informacin. Desde iJ1 -asta 12 6entas OiP ventas OiP B 1GGGGGG 'in desde 4. 4ctuali.acin de un array% 1b/ 47adir datos% #s un caso especial de la operacin de inserccin de un elemento en un array, pero el elemento lo metemos despu@s de la :ltima posicin ,ue contiene informacin v+lida en el array. 0ara ,ue esto se pueda -acer es necesario ,ue si actualmente el array tiene h posiciones de informacin v+lida, tenga un tama7o de al menos hB1 para ,ue pueda a7adir otro elemento a continuacin de h. EnomaarrayFOhB1P valor 2b/ ;nsercin de datos% Consiste en introducir un elemento en el interior de un array para lo cual ser+ necesario despla.ar todos los elementos situados a la derec-a del ,ue vamos a insertar una posicin a la derec-a con el fin de conservar el orden relativo entre ellos. 0ara ,ue se pueda insertar un nuevo elemento en el array si ya e$isten > elementos con informacin en el array, el array tendr+ ,ue tener un tama7o de cmo m8nimo >B1 para poder insertar el elemento. C # ' c 5 S L=M 0<=;>4 &?1&

Siendo h la posicin en la ,ue tengo ,ue insertar el nuevo elemento y > el n:mero de elementos v+lidos en el array en el momento de la insercin y siempre suponiendo de >B1, el algoritmo de insercin ser+% Desde iJ> -asta h 4O;B1P 4O;P 'in desde 4OhP valor 3b/ Iorrar datos% 0ara eliminar un elemento de un array si ese elemento est+ posicionado al final del array, no -ay ning:n pro!lema, simplemente si el tama7o del array era >, a-ora -ay ,ue considerar ,ue el tama7o del array es >A1. Si el elemento a !orrar ocupa cual,uier otra posicin entonces tendr@ ,ue despla.ar todos los elementos situados a la derec-a del ,ue ,uiero !orrar una posicin -acia la i.,uierda para ,ue el array ,uede organi.ado. C # ' c 5 S Iorrar c. Suponiendo ,ue el n:mero de elementos validos actualmente es > y ,ue ,uiero !orrar el elemento de la posicin h. Desde iJh -asta >A1 4O;P 4O;B1P 'in desde 0ara indicar ,ue el n:mero de elementos validos es >, podr8amos indicarlo como > >A1. 0. ARRA2S 7IDIMENSIONALES O MATRICES: #n un array unidimensional o vector cada elemento se referencia por un 8ndice, en un array !idimensional cada elemento se va a referenciar por 2 8ndices, y a-ora la representacin lgica ya no va a ser un vector, sino una matri.. *n array !idimensional de 5C> elementos es un conjunto de 5C> elementos, todos del mismo tipo, cada uno de los cuales se referencia a trav@s de 2 su!8ndices. #l primer su!8ndice podr+ variar entre 1 y 5 si -emos empe.ado a numerar los 8ndices por 1, y el segundo 8ndice variar+ entre 1 y >, si -emos empe.ado a numerar los 8ndices por el 1. \ m+s en general podemos definir un array de 2 dimensiones de la siguiente manera. EnomaarrayF% array OL;1..LS2,L;2..LS2P de EtipoF EvaraarrayFO; , cP L;1 EJ ; EJ LS1 L;2 EJ c EJ LS2 #l tama7o del array ser+ 2LS1AL;1 B1/C2LS2AL;2 B1/ 6entas de cada mes de 1))G a 1)) % 6entas% array O1))G..1)) ,1..12P de real "C12J&2 La representacin lgica de un array !idimensional es una matri. de dimensiones 5C> donde 5 es el n:mero de filas de la matri. y > es el n:mero de columnas, es decir, la 1W dimensin indicar8a las filas y la 2W dimensin indicar8a las columnas, es decir, al intentar acceder a un elemento ;,c estar8amos accediendo al elemento ,ue ocupa la fila ; y la columna c.

0<=;>4 (?1&

#n memoria, sin em!argo todos los elementos del array se almacenan en posiciones contiguas pero nosotros lo vemos como una matri..
1 1))G 1))1 1))2 1))3 1))4 1)) 2 3 4 " & ( ) 1G 11 12

6entas O1))3,3P #n memoria estar8a almacenado todo seguido%

Mane, *e $a#!"+es: A 0ara poner a G todos los elementos de la matri.. 5% array O1..>,1..5P de entero 6ar i,j entero Desde iJ1 -asta n Desde jJ1 -asta 5 5 Oi,jP G 'in desde 'in desde A 0ara poner a G solo los elementos de la fila ;% Desde iJ1 -asta > 5 Oi,jP G 'in desde 6. ARRA2S M'LTIDIMENSIONALES: *n array multidimensional es un array de 3 m+s dimensiones. Si tenemos un array de > dimensiones, cada dimensin de tama7o d1,d2,..,d>, el n:mero de elementos del array ser+ d1Cd2C..Cd>, y para acceder a un elemento concreto del array utili.aremos > 8ndices, cada uno de los cuales referenciar+ a una posicin dentro de una dimensin, siempre seg:n el orden de declaracin. #n memoria, el array se sigue almacenando en posiciones consecutivas. La declaracin de un array multidimensional ser8a% >omaarray% array OL;1..LS1,L;2..LS2,L;3..LS3,L;>..LS>P de tipo >omaarray O;1,;2,;3,;>P L;1 EJ ;1 EJ LS2 0<=;>4 )?1&

L;> EJ ;2 EJ LS> 8. ALMACENAMIENTO DE ARRA2S EN MEMORIA: *n array en memoria siempre se almacena en posiciones contiguas a partir de la direccin !ase de comien.o del array ,ue me la dan cuando yo declaro una varia!le del tipo array. #l tama7o ,ue ocupa el array en memoria es el producto del n:mero de sus elementos por el tama7o de cada uno de ellos. 4rray O1..1GGP de car+cter 1 !yte C 1GG elementos J 1GG !ytes #n el caso de un array !idimensional, tam!i@n se seguir+ almacenando en posiciones contiguas de memoria, y su tama7o ser+ el producto de sus elementos pro el tama7o. 4-ora, la forma en la ,ue est+n almacenados esos elementos va a depender de ,ue el array se almacene fila a fila o columna a columna, ,ue tam!i@n se conoce como almacenamiento por orden de fila mayor o por orden de columna mayor. C1 C2 ..... Cm C1 C2 ... Cm '1 '2 '3

4% array O1..>,1..5P de EtipoF 'ila 1,1 1,2 1,3 ..... 1,5 2,1

2,2

2,3

....

2,5 >,1 >,2 ...

>,m

Como -allar la direccin !ase en la ,ue comien.a a almacenarse un determinado elemento de un array% A *nidimensionales% D;324O;P/J DiraIase B 2;A1/ C 9ama7o >:mero elemento J 3 9ama7o J DiraIase J 1GG 4O3P comien.a en la direccin 11G A Iidimensionales% - Srden de fila mayor Dir24Oi,jP/J DiraIase B O22;A1/C5/B2cA1/PC9ama7o - Srden de columna mayor Dir24Oi,jP/J DiraIase B O22cA1/C>/B2;A1/PC9ama7o ;. ARRA2S COMO PAR@METROS DE S'7PROGRAMAS: *n array es tam!i@n un tipo de datos estructurado, y se puede pasar como par+metro a un su!programa, pero el pro!lema es ,ue no sa!emos como indicar si su paso es por valor o por referencia. #n principio, el paso de un array siempre tiene sentido ,ue sea por referencia 2,ue se modifi,ue y tenga repercusin en el e$terior/, y si es por valor solo servir8a para leer informacin. La mayor parte de los lenguajes de programacin, pasan los arrays por referencia 2si se modifica el array se nota en el e$terior/. >osotros tam!i@n lo -aremos as8. 0<=;>4 "G?1&

Si paso el array y no ,uiero modificarlo, con no modificarlo !asta. #s distinto pasar un array como par+metro a pasar una posicin del array, si paso el array entero como par+metro, el par+metro formal asociado ser+ un array con la misma estructura ,ue el par+metro real, pero si lo ,ue ,uiero pasar es un elemento de una posicin concreta del array, el par+metro formal asociado no ser+ del tipo array, sino ,ue ser+ del tipo de datos ,ue contenga el array, por,ue cada elemento de un array es un elemento independiente ,ue se puede usar por separado. #n el caso de ,ue pasemos un array entero como par+metro, el par+metro formal asociado, tendr+ ,ue ser un array de la misma estructura ,ue tiene el mismo tipo de datos y el mismo tama7o. #n C, el par+metro formal asociado tiene ,ue ser del mismo tipo de datos, pero no -ace falta ,ue sea del mismo tama7o. 0ara pasar un array como par+metro real, utili.are el nom!re del array, en cam!io si pasamos una posicin concreta, usar@ el nom!re y el 8ndice. #n C, el nom!re de un array indica su direccin de comien.o en memoria, y por eso siempre se pasa por referencia. Siempre vamos a pasar los arrays por referencia, sin la pala!ra clave entAsal. Como en las funciones no se pasan los par+metros por referencia, lo mejor es no pasar los arrays como par+metros de las funciones. 0rocedimiento Enom!reapF 2EnomaparF%array OL;1..LS1P de EtipoFD .../ 6ar 4% array OL;1..LS1P de EtipoF >omap 2array/ Slo se pasa el nom!re. <. ARRA2S DE LP'NTEROSM: #n realidad lo ,ue vamos a e$plicar con este concepto es la posi!ilidad de ,ue desde un array se apunte a la posicin de otro array. Kue unos arrays sirvan para referenciar a otros. Qu es un )un#e! %: *n puntero es una varia!le ,ue contiene una direccin en la ,ue est+ almacenado un elemento ,ue llamamos apuntado. Desde este punto de vista, un 8ndice indirectamente tam!i@n es un puntero por,ue indirectamente indica una posicin del array, pero no lo es directamente por,ue no almacena una direccin. Desde este punto de vista, si un array contiene valores de 8ndices, es decir, ,ue cada posicin de ese array lo ,ue -ace es apuntar a la posicin de otro array, entonces decimos ,ue es un array de punteros, aun,ue en realidad la definicin mas correcta es ,ue es un array de 8ndices a otro array. Cu5n* es I#"l usa! un a!!a. *e Bn*"+e%: ;maginemos ,ue tenemos una compa78a ,ue ,uiere tener almacenados los datos de sus empleados organi.ados por .onas. ;maginemos ,ue -ay 4 .onas. ^1 f 4 \ ^2 e ^3 N c ^4 C D h L

0odemos almacenar esta informacin de distintas formas%

0<=;>4 "1?1&

*n array !idimensional 4C>, en donde 4 son las .onas y > es el n:mero m+$imo de empleados ,ue -ay por .ona. #l inconveniente es la perdida de espacio. *sar un array unidimensional o vector donde est@n todos los datos seguidos. #l inconveniente es ,ue no tengo los empleados ordenados por .onas. *sar un array unidimensional, y entre cada 2 .onas meter en la posicin ,ue va entre ellas una marca especial para indicar ,ue paso de .ona. #l inconveniente es ,ue para pasar a una .ona tengo ,ue pasar por todas las anteriores. *sar un array de 8ndices% *n array con la informacin de los empleados. Stro array de 8ndices ,ue contendr+ tantas posiciones como .onas -aya. #n cada posicin de cada .ona almacenar@ el 8ndice en donde comien.a el primer empleado de esa .ona en el array de empleados.

^onas 1 4 &

#mpleados f 4 \ e N c C D h L

C Listar todos los empleados de la .ona 3% Desde iJ.onaO3P -asta .onaO4PA1 #scri!ir #mpleados OiP 'in desde C >:mero de empleados% ^ona O4P g ^ona O3P

0<=;>4 "2?1&

EJERCICIOS: TEMA /
1. Nay unos multicines con salas, y cada sala con 1GG personas distri!uidas en 2G asientos y filas. Si yo pido entrada para una sala, implementar un programa ,ue me diga si -ay sitio en la sala. 4lgoritmo cines Const SalasJ 4sientosJ2G 'ilasJ 6ar >asalas,j,H% entero 5arca% !oolean 4% array O1..salas,1..asientos,1..filasP de entero ;nicio 0ediradatos 2nasalas/ 5ientras nasalas EF G 5arca falso cG h1 3epetir Si j F asientos #ntonces j 1 h HB1 0<=;>4 "3?1&

'in si Si 2jJasientos/ y 2HFJfilas/ #ntonces escri!ir LSala llenaM 5arca verdadero Sino si a Onasalas,j,HPJG #ntonces aOnasalas,j,HP 1 #scri!ir L4sientoMjMfilaMH 5arca verdadero 'in si 'in si Nasta 2aOnasalas,j,HPJ1/ y 2marcaJverdadero/ 0ediradatos 2nasalas/ 'in mientras 'in 0rocedimiento pediradatos 2entAsal s% entero/ ;nicio 3epetir #scri!ir LZ#n ,u@ sala ,uieres entrar[M Leer s Nasta 2sFJG/ y 2sEJsalas/ 'in pediradatos 2. ZKu@ escri!e este programa[ 4lgoritmo 0rin 6ar Datos% array O1..1GP de entero i% entero inicio desde iJ1 -asta 1G datos OiP i fin desde 01 2datos,datosO3P/ Desde iJ1 -asta 1G #scri!ir datos OiP 'in desde 'in 0rocedimiento 01 2a% array O1..1GP de enteroD entAsal $% entero/ ;nicio fG Desde iJ1 -asta 1G f $ B aOiP 'in desde 'in 01 C Solucin% 1, 2, , 4, , ", &, (, ), 1G.

0<=;>4 "4?1&

3. Dada una matri. 4 de 5C> elementos, actuali.arla tal ,ue la matri. resultante tenga divididos a los elementos de la diagonal principal por la suma de los elementos ,ue no forman parte de ella. 4lgoritmo divamatri. 6ar 4% array O1..5,1..>P de real Suma% real ;nicio 0ediradatos 2a/ Sumar 2a,suma/ #scri!ir 2a/ 'in 0rocedimiento pediradatos 2matri.% array O1..5,1..>P de real/ 6ar ;,j% entero ;nicio Desde iJ1 -asta 5 Desde jJ1 -asta > #scri!ir L;ntroduce el elementoMiM,Mj Leer aOi,jP 'in desde 'in desde 'in pediradatos 0rocedimiento sumar 2matri.% array O1..5,1..>P de realD entAsal s% real/ 6ar ;,j% entero ;nicio SG Desde iJ1 -asta 5 Desde jJ1 -asta > Si iE F j #ntonces s s B matri. Oi,jP 'in si 'in desde 'in desde 'in sumar 0rocedimiento escri!ir 2matri.% array O1..5,1..>P de realD s% real/ 6ar ;,j% entero ;nicio Desde iJ1 -asta 5 Desde jJ1 -asta > Si iJj #ntonces escri!ir aOi,jP?s Sino escri!ir aOi,jP 'in si 'in desde 'in desde 0<=;>4 " ?1&

'in escri!ir 4. 9engo guardado en una estructura los alumnos de nuestra escuela, sa!iendo ,ue -ay 3 cursos, 5 alumnos por curso y > asignaturas por alumno, determinar mediante su!programas% 1. Cual es la nota media de un determinado curso. 2. Cuantos apro!ados y suspensos -ay en una determinada asignatura. 3. Cual es el alumno de la escuela con mejor nota media. 4lgoritmo escuela Const CursosJ3 4lumnosJ5 4signaturasJ> 9ipo DatoJarray O1..cursos,1..alumnos,1..asignaturasP de real 6ar >ota% dato ;nicio 0ediradatos 2nota/ 5ediaacurso 2nota/ 4pasusp 2nota/ 5ediaaalum 2curso/ 'in 0rocedimiento pediradatos 2n% datos/ 6ar ;,j,H% entero ;nicio Desde iJ1 -asta cursos Desde jJ1 -asta alumnos Desde HJ1 -asta asignaturas 3epetir #scri!ir L>ota del alumnoMjMasignaturaMHMcursoMi Leer nOi,j,HP Nasta 2nOi,j,HFJG/ y 2nOi,j,HP EJ1G/ 'in desde 'in desde 'in desde 'in pediradatos 0rocedimiento mediaacurso 2n% dato/ 6ar c,H,resp% entero 5edia,suma% entero ;nicio Suma G.G 3epetir #scri!ir LZDe ,u@ curso ,uieres -acer la media[M Leer resp Nasta 2respEJ1/ y 2respEJcursos/

0<=;>4 ""?1&

Desde jJ1 -asta alumnos Desde HJ1 -asta asignaturas Suma%Jsuma B nOresp,j,HP 'in desde 'in desde 5edia suma ?alumnosCasignatura #scri!ir LLa nota media del cursoMrespMesMmedia 'in mediaacurso

0rocedimiento apasusp 2n%dato/ 6ar Susp,ap,i,j% entero ;nicio Susp G 4p G 3epetir #scri!ir LZKu@ asignatura ,uieres ver[M Leer asig Nasta 2asigFJ1/ y 2asigEJasignaturas/ Desde iJ1 -asta cursos Desde jJ1 -asta alumnos Si nOi,j,asigP FJ #ntonces ap ap B 1 Sino susp susp B 1 'in si 'in desde 'in desde #scri!ir L#n la asignaturaMasigM-ayMapMapro!adosM #scri!ir L#n la asignaturaMasigM-ayMsuspMsuspensosM 'in apasusp 0rocedimiento mediaaalum 2n% dato/ 6ar ;,j,alum,curs% entero Suma,media,mayor% real 0<=;>4 "&?1&

;nicio 5ayor G.G Desde iJ1 -asta cursos Desde jJ1 -asta alumnos Suma G.G Desde HJ1 -asta asignaturas Suma suma B nOi,j,HP 'in desde 5edia suma ? asignaturas Si media F mayor #ntonces mayor media Curs i 4lum j 'in si 'in desde 'in desde #scri!ir L#l alumno con mayor media es elMalumMdel cursoMcurs #scri!ir Ly su nota es deMmayor 'in mediaaalum

. 5ultiplicar 2 matrices de dimensiones 5C> y 0CK. 4lgoritmo multiplicaramatrices 9ipo 5atri.1Jarray O1..5,1..>P de entero 5atri.2Jarray O1..0,11..KP de entero 3esultadoJarray O1..5,1..KP de entero 6ar 5at1% matri.1 5at2% matri.2 3% resultado ;nicio 0ediradatos 2mat1,mat2/ 5ultiplicar 2mat1,mat2,r/ 6isuali.ar 2r/ 'in 0rocedimiento pediradatos 2m1% matri.1D m2% matri.2/ 6ar ;,j% entero ;nicio Desde iJ1 -asta 5 Desde jJ1 -asta > #scri!ir L;ntroduce el elementoMiM,MjMde la matri. 1M Leer m1Oi,jP 0<=;>4 "(?1&

'in desde 'in desde Desde iJ1 -asta 0 Desde jJ1 -asta K #scri!ir L;ntroduce el elementoMiM,Mde la matri. 2M Leer m2Oi,jP 'in desde 'in desde 'in pediradatos 0rocedimiento multiplicar 2m1% matri.1D m2% matri.2D entAsal resul% resultado/ 6ar 'ila,i,j,acum% entero ;nicio Desde filaJ1 -asta > Desde iJ1 -asta 0 3esulOfila,iP G Desde jJ1 -asta K 3esulOfila,iP resulOfila,iPBm1Ofila,jPCm2Oj,iP 'in desde 'in desde 'in desde 'in multiplicar 0rocedimiento visuali.ar 2resul% resultado/ 6ar ;,j% entero ;nicio Desde iJ1 -asta 5 Desde jJ1 -asta K #scri!ir resulOi,jP 'in desde 'in desde 'in visuali.ar ". 3esolver la siguiente serie% X =
m n

i C a[ i , j ] C j
i =1 j =1

b[ n, j ]
j =2

n 1

4lgoritmo serie 9ipo 5atri.1J array O1..5,1..>P de entero 5atri.2J array O1..>,1..>P de entero 6ar Suma1,suma2,suma3% entero f% real

0<=;>4 ")?1&

;nicio Sumas 2suma1,suma2,suma3/ 3esultado 2suma1,suma2,suma3,$/ #scri!ir L#l resultado esM$/ 'in 0rocedimiento sumas 2s1% enteroDs2% enteroDs3% entero/ 6ar ;,j% entero ;nicio Desde iJ1 -asta 5 S2 G Desde jJ1 -asta > S2 s2 B aOi,jPCj 'in desde S1 s1 B ;Cs2 'in desde S3 G Desde jJ2 -asta >A1 S3 s3 B !On,jP 'in desde 'in sumas 0rocedimiento resultado 2s1% enteroD s2% enteroD s3% enteroD entAsal y% real/ ;nicio \ s1Cs2?s3 'in resultado &. *na empresa consta de departamentos con 2G empleados cada departamento, si tengo todas las ventas en una estructura, determinar% - 6entas de un determinado departamento en un determinado mes. - 6entas de un determinado empleado en un determinado departamento. - Cual es el departamento con m+s ventas. 4lgoritmo empresa Const DJ #J2G 5J12 9ipo 5atri.J array O1..d,1..e,1..mP de real 6ar 6entas% matri. Cantidad% real Departamentos% entero ;nicio 0ediradatos 2ventas/ Depames 2ventas/

0<=;>4 &G?1&

Depaempleado 2ventas/ 5ejoradep 2ventas/ 'in 0rocedimiento pediradatos 2a% matri./ 6ar ;,j,H% entero ;nicio Desde iJ1 -asta D Desde jJ1 -asta # Desde HJ1 -asta 5 #scri!ir L6entas del departamentoMiMempleadoMjMmesMHM Leer aOi,j,HP 'in desde 'in desde 'in desde 'in pediradatos

0rocedimiento depames 2a% matri./ 6ar Dep,j,mes% entero 6% real ;nicio 6 G.G 3epetir #scri!ir LDepartamentoM Leer dep Nasta 2dep FJ1/ y 2dep EJd/ 3epetir #scri!ir L5esM Leer mes Nasta 2mes FJ1/ y 2mes EJ12/ Desde jJ1 -asta # 6 6 B aOdep,j,mesP 'in desde #scri!ir LLas ventas del departamentoMdepMen el mesMmesMsonMv 'in depames 0rocedimiento depaempleado 2a% matri./ 6ar Dep,empleado,H% entero 6% real ;nicio 0<=;>4 &1?1&

6 G.G 3epetir #scri!ir L#mpleadoM Leer empleado Nasta 2empleado FJ1/ y 2empleado EJ#/ 3epetir #scri!ir LDepartamentoM Leer dep Nasta 2dep FJ1/ y 2dep EJd/ Desde HJ1 -asta 5 6 6 B aOdep,empleado,HP 'in desde #scri!ir LLas ventas del empleadoMempleadoMdel departamentoMdepMsonMv 'in depaempleado

0rocedimiento mejoradep 2a% matri./ 6ar ;,j,H,dep% entero 5ayor,v% real ;nicio 5ayor G.G Desde iJ1 -asta D 6G Desde jJ1 -asta # Desde HJ1 -asta 5 6 6 B aOi,j,HP 'in desde 'in desde Si v F mayor #ntonces mayor v Dep i 'in si 'in desde #scri!ir L#l mejor departamento es elMdepMconMmayor 'in mejoradep (. Dado un array 4 de 5C> elementos donde los elementos son n:meros enteros, -allar la direccin de comien.o del elemento 4b del array sa!iendo ,ue se almacena a partir de la direccin 12GG y ,ue en nuestra m+,uina los enteros ocupan 2 !ytes.

0<=;>4 &2?1&

Dir 421,4/J 12GG B 3C2 J12G" ). Dado un array de 4 C elementos ,ue contiene caracteres, sa!iendo ,ue se almacena a partir de la posicin GG, en ,ue posicin comien.a a almacenarse el elemento 4O3, P. Dir 4O3, P J GG B 22C B4/C1 J 14 #n orden de fila mayor Dir 4O3, P J GG B 24C4B2/C1 J 1( #n orden de columna mayor

LAS CADENAS DE CARACTERES TEMA 0


1. 2. 3. 4. cuego de caracteres. Cadena de caracteres. Datos de tipo car+cter. Speraciones con cadenas.

1. ('EGO DE CARACTERES: #n principio se programa!a todo con G y 1, pero como esto costa!a muc-o, apareci la necesidad de crear un lenguaje semejante al -umano para entendernos m+s f+cilmente con la computadora, y para ello aparecen los juegos de caracteres. #l juego de caracteres es una especie de alfa!eto ,ue usa la m+,uina. Nay 2 juegos de caracteres principales% - 4SC;;% #l ,ue m+s se usa. - #ICD;C% Creado por ;I5. Nay 2 tipos de 4SC;;, el !+sico y el e$tendido. #n el 4SC;; !+sico, cada car+cter se codifica con & !its, por lo ,ue e$isten 2V&J12( caracteres. #n el 4SC;; e$tendido, cada car+cter ocupa ( !its 21 !yte/ por lo ,ue e$istir+n 2V(J 2 " caracteres, numerados del G al 2 . #n el #ICD;C, cada car+cter ocupa tam!i@n ( !its. #n cual,uiera de los 2 juegos, e$isten 4 tipos de caracteres% - 4lfa!@ticos% Letras may:sculas y min:sculas.

0<=;>4 &3?1&

>um@ricos% >:meros. #speciales% 9odos los ,ue no son letras y n:meros, ,ue vienen en el teclado. Control% >o son imprimi!les y tienen asignados caracteres especiales. Sirven para de terminar el fin de l8nea, fin de te$to. 6an del 12( al 2 . *n juego de caracteres es una ta!la ,ue a cada n:mero tiene asociado un n:mero. 2. CADENA DE CARACTERES: #s un conjunto de G m+s caracteres. #ntre estos caracteres puede estar incluido el !lanco. #n pseudocdigo, el !lanco es el !. Las cadenas de caracteres se delimitan con do!les comillas L L, pero en algunos lenguajes se delimitan con Q Q. Las cadenas de caracteres se almacenan en posiciones contiguas de memoria. La longitud de una cadena es el n:mero de caracteres de la misma. Si -u!iese alg:n car+cter ,ue se utili.ara como especial para se7alar el fin de cadena, no se considerar8a en la longitud. Si una cadena tiene longitud G, la llamamos cadena nula por lo ,ue no tiene ning:n car+cter, pero esto no ,uiere decir ,ue no tenga ning:n car+cter v+lido, por ,ue puede -a!er alg:n car+cter especial no imprimi!le ,ue forme parte de la cadena. *na su!cadena es una cadena e$tra8da de otra.

&. DATOS DE TIPO CAR@CTER: 1. Constantes% *na constante de tipo cadena es un conjunto de G o m+s caracteres encerrados entre L L. Si dentro de la cadena ,uiero poner como parte de la cadena las L, las pongo 2 veces. #sto depende del lenguaje. LNolaMM4diosM NolaM4dios #n algunos lenguajes -ay un car+cter de escape. #n C, el car+cter de escape es la U. *na constante de tipo car+cter es un solo car+cter encerrado entre comillas simples. 2. 6aria!les% Nay ,ue distinguir entre una varia!le de tipo car+cter y una varia!le de tipo cadena, el contenido de una varia!le de tipo cadena es un conjunto de G m+s caracteres encerrados entre L L, mientras ,ue una varia!le de tipo car+cter es un solo car+cter encerrado entre Q Q. F !$as *e al$a+ena$"en# *e +a*enas en $e$ !"a: 1. 4lmacenamiento est+tico% La longitud de la cadena se tiene ,ue definir antes de ser usada y siempre va a tener esa longitud, almacen+ndose en posiciones contiguas de memoria. Si la cadena no ocupa todo el espacio, el resto se rellena con !lancos, y esos !lancos se consideran parte de la cadena. #sto es muy deficiente y no se usa casi en ning:n lenguaje. 2. 4lmacenamiento semiest+tico%

0<=;>4 &4?1&

4ntes de usar la cadena, -ay ,ue declarar la longitud m+$ima ,ue puede tener y ese es el espacio ,ue se reserva en memoria para almacenar la cadena, siempre en posiciones contiguas. La longitud real de la cadena durante la ejecucin puede variar aun,ue siempre tiene ,ue ser menor ,ue el m+$imo de la cadena. 0uesto ,ue la cadena no tiene por,ue ocupar la longitud m+$ima, para determinar ,ue parte ocupa realmente esa cadena, se pueden utili.ar diferentes m@todos. 0ascal lo ,ue -ace es reservar los 2 primeros !ytes de la .ona de memoria en ,ue guardamos la cadena para indicar el primero la longitud m+$ima ,ue puede tener la cadena y el segundo la longitud actual. 1G 4 N S L 4 1 2 3 4 " & ( ) 1G Stros lenguajes como C, utili.an un car+cter especial ,ue indica el fin de cadena tal ,ue los caracteres ,ue utili.an parte de la cadena son todos los almacenados -asta encontrar ese car+cter especial. N S L 4 US G 1 2 3 4 " & ( ) La diferencia entre almacenar un solo car+cter en un tipo car+cter o en un tipo cadena, ser8a la siguiente% C QaR C LaM

3. 4lmacenamiento din+mico% >o -ay ,ue definir la longitud de la cadena antes de usarla, ni si,uiera la m+$ima. 0ara esto, se utili.a la memoria din+mica, y para esta!lecer el n:mero de elementos de la cadena usaremos listas enla.adas en las ,ue cada nodo de la lista contara un car+cter de la cadena y se enla.ar8a mediante punteros. La informacin no tiene ,ue estar almacenada en posiciones contiguas de memoria. N S L 4

0. OPERACIONES CON CADENAS: 4l igual ,ue con cual,uier tipo de datos, podemos -acer operaciones de entrada y salida 2leer y escri!ir/. 6ar cad% cadena Leer 2cad/ #scri!ir 2cad/ 4parte de estas instrucciones, la mayor parte de los lenguajes permiten reali.ar operaciones especiales con las varia!les de tipo cadena. La mayor parte de los lenguajes tienen operaciones de tratamiento de cadenas, y esas operaciones vienen en li!rer8as e$ternas. Las )e!a+" nes $5s usa*as s n:

0<=;>4 & ?1&

L ng"#u* *e una +a*ena: #s una funcin a la ,ue se le pasa una cadena como par+metro y como resultado devuelve su longitud. 'uncion longitud 2c%cadena/% entero C $)a!a+"-n *e +a*enas: Las cadenas se pueden comparar entre si usando los s8m!olos de comparacin. #sto se puede reali.ar por,ue lo ,ue voy a comparar son los valores 4SC;; asociados a cada car+cter. #n el caso de ,ue se comparen 2 cadenas de diferente longitud tal ,ue la cadena de menor longitud tiene > caracteres y estos > caracteres coinciden con los > primeros caracteres de la cadena m+s larga, se considera mayor la cadena m+s larga. 0#0# F 0404 0#0#S F 0#0# #n la mayor parte de los lenguajes, -ay una funcin ,ue -ace la comparacin. #n C es la funcin strcmp 2C1,C2/. 'uncion comparacion 2C1%cadenaDC2%cadena/% entero #sta funcin devuelve% - G si C1JC2 - *n positivo si C1 F C2 - *n negativo si C1 E C2

C n+a#ena+"-n: Lo ,ue permite es unir varias cadenas en una sola, manteniendo el orden de los caracteres ,ue se unen. #n pseudocdigo se usa el s8m!olo ]% C1]C2 C1JMNolaM C2JM4diosM C3JC1]C2JMNola4diosM 0rocedimiento concatenacion 2entAsal C1%cadenaDC2%cadena/ - Se devuelve en C1 la concatenacin C1]C2. SuC+a*enas: #$trae parte de una cadena. Se pueden usar 3 procedimientos% 0rocedimiento su!cadena 2c%cadenaDinicio%enteroDlongitud%enteroDentAsal s%cadena/ - Si inicio es negativo, o es mayor ,ue longitud, se devuelve la cadena nula. - Si inicioBlongitud es mayor ,ue el tama7o de la cadena, devuelvo desde inicio -asta de fin de la cadena. 0rocedimiento su!cadena 2c%cadenaDinicio%enteroDfin%enteroDentAsal s%cadena/ - Si fin es menor ,ue inicio, devuelve la cadena nula. - Si fin es mayor ,ue la longitud de la cadena, se devuelve desde inicio -asta el fin de la cadena. 0rocedimiento su!cadena 2c%cadenaDinicio%enteroDentAsal s%cadena/

0<=;>4 &"?1&

S va desde el inicio -asta el final de la cadena.

Inse!+"-n: Consiste en meter una cadena dentro de otra a partir de una determinada posicin. 0rocedimiento insertar 2entAsal C1%cadenaDC2%cadenaDinicio%entero/ C1JM0epeM C2JM>uriaM ;nsertar 2C1,C2,3/J 0e>uriape - Si inicio es mayor ,ue la longitud de C1 o inicio es menor ,ue G, no se inserta nada. 7 !!a* : Consiste en !orrar de una cadena una su!cadena ,ue forma parte de ella. Nay ,ue dar la posicin de inicio y final de la su!cadena ,ue ,uiero !orrar. 0rocedimiento !orrar 2entAsal C1%cadenaDinicio%enteroDfin%entero/ - Si fin es menor ,ue inicio, o inicio es mayor ,ue la longitud de la cadena, no se !orra nada. 0rocedimiento !orrar 2entAsal C1%cadenaDinicio%enteroDfin%entero/ C1JMCasa a.ulM Iorrar 2C1,3, / C1JMCaa.ulM

In#e!+a$C" : Consiste en su!stituir la aparicin de una su!cadena dentro de una cadena, por otra su!cadena. 0ara eso la primera su!cadena tiene ,ue aparecer en la otra. 0rocedimiento intercam!io 2entAsal C1%cadenaDS1%cadenaDS2%cadena/ C1JMCasa a.ulM S1JMasaM S2JMasitaM C1JMCasita a.ulM Si S1 no est+ en C1, no se cam!ia nada. C n/e!s"-n *e +a*enas a nI$e! s: #s una funcin ,ue se le pasa una cadena caracteres num@ricos y devuelve el n:mero asociado. 'uncion valor 2c%cadena/% entero ;JM234M 6ar i% entero ;J valor 2C1/ devuelve 234. C n/e!s"-n *e nI$e! s a +a*enas: #s un procedimiento al ,ue se le pasa un n:mero y lo convierte a una cadena. 0rocedimiento convacad 2n%enteroDentAsal c%cadena/ ;J234 0<=;>4 &&?1&

Convacad 2i,C1/ devuelve L234M Fun+"-n =ue *e/uel/e el +a!5+#e! ASCII *e un nI$e! : 'uncion convacar 2n%entero/% car+cter Fun+"-n =ue *e/uel/e el nI$e! as +"a* *e un +a!5+#e! ASCII: 'uncion 4SC;; 2c%car+cter/% entero Las cadenas van a estar almacenadas en arrays de caracteres donde el car+cter de fin de cadena es el i.

EJERCICIOS: TEMA 0
Los ejercicios de este tema van a consistir en implementar funciones y procedimientos relacionados con el manejo de las su!cadenas.

'uncion numero 2c%car+cter/%entero ;nicio Seg:n sea C QGR% retorno G Q1R% retorno 1 Q2R% retorno 2 Q3R% retorno 3 Q4R% retorno 4 Q R% retorno Q"R% retorno " Q&R% retorno & Q(R% retorno ( Q)R% retorno ) fin seg:n sea fin numero 'uncion caract 2n% entero/%car+cter 0<=;>4 &(?1&

;nicio Seg:n sea C G% retorno QGR 1% retorno Q1R 2% retorno Q2R 3% retorno Q3R 4% retorno Q4R % retorno Q R "% retorno Q"R &% retorno Q&R (% retorno Q(R )% retorno Q)R fin seg:n sea fin caract 'uncion longitud 2c%cadena/% entero var l% entero ;nicio LG 5ientras cOLB1P E F QiR L LB1 'in mientras 3etorno L 'in longitud

'uncion 6alor 2c%cadena/% entero 6ar Cif,num,i% entero ;nicio Cif longitud 2c/ Si cif F G #ntonces num G Desde iJ1 -asta Cif >um numBnumero 2cOiPC1GV2cifAi/ 'in desde 3etorno 2num/ Sino retorno 2A1/ 'in si 'in valor 0rocedimiento convacad 2n% enteroD entAsal c% cadena/ 6ar Cif,au$% entero ;nicio Cif 1 4u$ > 5ientras 2au$ F1G/ 0<=;>4 &)?1&

4u$ au$ div 1G Cif cif B 1 'in mientras Desde iJcif -asta 1 COiP caract2n mod 1G/ > n div 1G 'in desde COcifB1P QiR 'in convacad 0rocedimiento !orrar 2entAsal c%cadenaDinicio%enteroDfin%entero/ 6ar ;,f% entero ;nicio Si 2inicio FG/ y 2inicio EJ fin/ y 2inicio EJ longitud2c// #ntonces i inicio ' fin B1 5ientras 2i EJfin/ y 2cOfP E F QiR/ COiP cOfP ; iB1 ' fB1 'in mientras COiP QiR 'in si 'in !orrado

0rocedimiento su!cadena 2c1%cadenaDinicio%enteroDlongitud%enteroDentAsal c2% cadena/ 6ar ;,H% entero ;nicio Si 2inicio EJG/ o 2inicio F longitud 2c1// #ntonces c2O1P QiR Sino i inicio h1 5ientras 2i EJinicio B longitud/ y 2c1OiP E F QiR/ C2OHP c1OiP h HB1 ; iB1 'in mientras C2OHP QiR 'in si 'in su!cadena 'uncion comparacion 2c1%cadenaDc2%cadena/%entero 6ar ;% entero ;nicio 0<=;>4 (G?1&

;1 5ientras 2c1OiPJc2OiP/ y 2c1OiPE F QiR/ y 2c2OiP E F QiR/ ; ;B1 'in mientras Si c1OiPJc2OiP #ntonces retorno 2G/ Sino retorno2ascii 2c1OiP/A ascii 2c2OiP// 'in si 'in comparacion

'uncion !us,ueda 2c% cadenaDs1% cadena/% entero 6ar ;,pos,H% entero #ncontrado% !ooleano ;nicio ;1 #ncontrado falso 5ientras 2cOiP E FRiR/ y 2encontradoJfalso/ Si cOiP J sOiP #ntonces pos i h1 5ientras 2cOiPJsOHP/ y 2cOiP EFRiR/ y 2sOHPE FRiR ; ;B1 h HB1 'in mientras Si sOHPJRiR #ntonces encontrado verdadero Sino ; pos B1 0os G 'in si

0<=;>4 (1?1&

Sino ; ;B1 'in si 'in mientras 3etorno 2pos/ 'in !us,ueda 0rocedimiento !orrar 2entAsal c%cadenaDini%enteroDfin%entero/ 6ar ;,j% entero ;nicio ; ini ' fin B 1 5ientras cOfP EFRiR COiP cOfP ;iB1 'in mientras C OiP QiR 'in !orrar

0rocedure insertar 2entAsal c%cadenaDs%cadenaDpos%entero/ 6ar 0,j,i% entero ;nicio 0 pos c1 5ientras sOjPEFRiR Desde i longitud 2c/ B1 -asta 0 COiB1P cOiP 'in desde COpP sOjP c jB1 0 pB1 'in mientras 'in insertar 0rocedimiento intercam!io 2entAsal c%cadenaDc2%cadenaDc3%cadena/ 6ar ;,pos% entero

0<=;>4 (2?1&

;nicio ;1 5ientras c1OiP EFRiR Si c1OiPJc2OiP #ntonces pos !uscar2c1,c2/ Si pos EF G #ntonces !orrar 2c1,pos,posBlongitud2c2/A1/ ;nsertar 2c1,c3,pos/ ; pos B longitud2c3/ Sino ; i B1 'in si Sino ; ;B1 'in si 'in mientras 'in intercam!io

FICHEROS O ARCHI1OS: TEMA 2


1. 2. 3. 4. . ". &. (. #l tipo registro de datos. >ocin de arc-ivo. 9erminolog8a de arc-ivos. 9ipos de soporte. 9ipos de organi.aciones de fic-eros. Speraciones so!re fic-eros. 9ratamiento de fic-eros secuenciales. 'ic-eros de te$to.

1. EL TIPO REGISTRO DE DATOS: #l tipo registro de datos es un tipo estructurado de datos. *n tipo registro va a estar formado por datos ,ue pueden ser de diferentes tipos. 4 cada uno de esos datos lo denominamos campos, y el tipo de estos campos pueden ser uno estandar o uno definido por el usuario, ,ue puede ser cual,uier cosa. La sinta$is ,ue usaremos para definir un tipo registro es la siguiente%

0<=;>4 (3?1&

9ipo EnomatipoaregistroF J registro Ecampo1F% EtipoF Ecampo2F% EtipoF Ecampo3F% EtipoF fin registro *na ve. definida una estructura de tipo registro, ya puede pasar a declarar varia!les de ese tipo. 6ar EnomavarF% EnomatipoaregistroF tipo alumno J registro D>;% array O1..(P de caracteres >om!re% array O1..1GGP de caracteres >ota% real 'in registro 6ar 41,42% alumno 0ara declarar una varia!le de un tipo registro, !asta con poner% 6ar EnomavarF % EnomatipoaregF 0ara acceder a un campo concreto de una varia!le de tipo registro, utili.amos el operador punto. EnomavarF.EnomacampoF c.nom!re 0epe \ con ese valor puedo tra!ajar igual ,ue tra!ajar8a con cual,uier valor del mismo tipo ,ue ese campo.

9ipo cliente J registro D>;% array O1..(P de caracteres >om!re% Cadena Saldo% 3eal 'in registro 6ar C% cliente Iorrar 2c.nom!re,3, / C.saldo B3C(GGG Al$a+ena$"en# *e !eg"s#! s en $e$ !"a: #l tama7o ,ue ocupa una varia!le de tipo registro en memoria es el ,ue resulta de la suma del tama7o de cada uno de sus campos, y esa informacin tam!i@n estar+ almacenada de manera contigua y seg:n el orden en ,ue -ayamos declarado los campos. 2. NOCIN DE ARCDI3O: Las estructuras anteriores se almacena!an en memoria principal, y el pro!lema es ,ue la informacin se pierde al apagar el ordenador. La ventaja es ,ue los accesos 0<=;>4 (4?1&

son m+s r+pidos. 0ara resolver esto est+n los dispositivos de almacenamiento secundario. F"+>e! : #s un conjunto de datos estructurados en una coleccin de unidades elementales denominadas registros, ,ue son de igual tipo y ,ue a su ve. est+n formados por otras unidades de nivel m+s !ajo denominados campos. 9odos son del mismo tipo. &. TERMINOLOGNA CON FICDEROS: - Ca$) : #s una unidad elemental de informacin ,ue representa un atri!uto de una entidad. Se define con un nom!re, un tama7o y un tipo de datos. - Reg"s#! l-g"+ : #s un conjunto de campos relacionados lgicamente ,ue pueden ser tratados como unidad en el programa. Desde el punto de vista de programacin simplemente es una estructura de tipo registro. - A!+>"/ F"+>e! : #s un conjunto de registros del mismo tipo y organi.ados de tal forma ,ue esos datos pueden ser accedidos para a7adir, !orrar o actuali.ar. - Cla/e *e un F"+>e! : #s un campo o conjunto de campos ,ue sirve para identificar un registro y distinguirla del resto del fic-ero. - Reg"s#! FBs"+ Cl =ue: #s la cantidad de datos ,ue se transfieren en una operacin de #?S entre el dispositivo e$terno y la memoria. Desde este punto de vista, un registro f8sico puede estar compuesto por G,1,2,... registros lgicos. #l n:mero de registros lgicos ,ue -ay por cada registro f8sico, es decir, ,ue se transfiere en una operacin de #?S, es lo ,ue se denomina factor de !lo,ueo. #se factor de !lo,ueo puede ser E1,J1,F1% - Si es E1, ,uiere decir ,ue el registro lgico ocupa m+s ,ue el f8sico, se transfiere menos de un registro lgico en cada operacin de #?S. - Si es J1, significa ,ue el tama7o del registro lgico y el f8sico es el mismo, y se transfiere un registro lgico en cada operacin de #?S. - Si es F1, lo m+s normal, en cada operacin de #?S se transfiere m+s de un registro lgico. C-$ n s "n#e!esa =ue sea el Fa+# ! *e Cl =ue %: Desde un punto de vista, cuanto mayor sea el factor de !lo,ueo m+s registros lgicos se transferir+n, menos operaciones -a!r+ ,ue -acer y se tardar+ menos en procesar el fic-ero. Seg:n esto cuanto mayor sea mejor. 0or otra parte, cada ve. ,ue se transfiere informacin de #?S, se deja en una .ona de memoria especial llamada buffer. Cuanto mayor sea el tama7o de !lo,ueo, mayor ser+ el !uffer y menos memoria me ,uedar+ para el resto de la informacin. 4l final -ay ,ue lograr un e,uili!rio para determinar el tama7o idneo. 7ases *e *a# s: #s un conjunto de datos relacionados almacenados internamente en un conjunto de fic-eros.

0. TIPOS DE SOPORTE: Los soportes de almacenamiento secundario son en los ,ue almaceno la informacin, y pueden ser de 2 tipos%

0<=;>4 ( ?1&

Secuenciales% 0ara acceder a un registro o dato concreto dentro de @l, tengo ,ue pasar previamente por todos los registros anteriores a @l. #l ejemplo es una cinta magn@tica. Direcciona!les% #s posi!le acceder directamente a una direccin concreta de soporte. #l ejemplo es un disco.

6. TIPOS DE ORGANIOACIONES DE FICDEROS: O!gan"Pa+"-n *e a!+>"/ s: 6iene determinada por 2 caracter8sticas% - 5@todo de organi.acin% 9@cnica ,ue utili.o para colocar la informacin de los registros dentro del dispositivo. - 5@todo de acceso% Conjunto de programas ,ue me permiten acceder a la informacin ,ue previamente -e almacenado y van a depender muc-o del m@todo de organi.acin% - 4cceso directo% 0ara acceder a un acceso concreto no -ay ,ue pasar por los anteriores. #l soporte tiene ,ue ser direcciona!le. - 4cceso secuencial% 0ara acceder a un registro -ay ,ue pasar por todos los anteriores, y esto es posi!le si el soporte es secuencial, aun,ue tam!i@n puedo -acerlo en uno direcciona!le. M# * s *e !gan"Pa+"-n: Nay 3 tipos de organi.acin% - Secuencial - Directa - Secuencial inde$ada A Secuencial% Los registros se van gra!ando en un dispositivo unos detr+s de otros consecutivamente, sin dejar -uecos y seg:n el orden en ,ue son gra!ados o guardados. 4l final para determinar el fin de fic-ero se usa la marca #S' 2#nd Sf 'ile/. A Directa% Se puede acceder a un registro directamente. 0ara ello son necesarias 2 cosas% 1b/ Kue cada registro tenga asociada una clave ,ue lo identifi,ue. 2b/ 9iene ,ue e$istir una funcin especial llamada funcin de direccionamiento ,ue sea capa. de convetir la clave a una direccin f8sica real en el dispositivo, ,ue es a la ,ue accederemos para locali.ar la informacin !uscada. #n la pr+ctica en realidad -ay un paso intermedio entre la clave y la direccin f8sica ,ue es la direccin relativa a registro. Suponiendo un fic-ero de n registros lgicos numerados de G a nA1, este valor asociado al registro es lo ,ue ser8a su direccin relativa a registro, es decir, ,ue lo ,ue tiene ,ue e$istir es una funcin ,ue convierta la clave a direccin relativa a registro, y luego una funcin ,ue convierta la direccin relativa a registro a direccin f8sica, donde la direccin f8sica tendr+ 6olumen, Cilindro, 0ista y 3egistro, y esta funcin puede ser por ejemplo el procedimiento de divisiones sucesivas. 0ara reali.ar este procedimiento, primero -ay ,ue decir el n:mero de vol:menes, el n:mero de cilindros, el n:mero de pistas y el n:mero de registros ,ue -ay. Despu@s -ay ,ue reali.ar sucesivas divisiones% D33 nb registros

0<=;>4 ("?1&

31
3egistros

C1 32
0istas

nb pistas C2 33
Cilindros

nb cilindros C3
6olumen

6olumen % C3 Cilindro% 33 0ista% 32 3egistros% 31

#mpe.ando a contar desde G.

9enemos un dispositivo con vol:menes, 3 cilindros por volumen, 4 pistas por cilindro y 2G registros por pista. ZDnde est+ el registro 1GG1[ 1GG1 1 2G G 2 4 12 G

3 4

Solucin 4G21 4G22, seg:n empecemos a numerar por G o por 1. #l pro!lema est+ en como convertir la clave de un registro a direccin relativa a registro, si en un soporte como m+$imo podemos almacenar n registros la direccin relativa a registro ir+ de G a nA1 luego -a!r+ ,ue convertir la clave a uno de estos valores. #n cual,uier caso suele ocurrir ,ue el rango de claves 2conjunto de todas las claves posi!les ,ue se pueden dar/ es menor ,ue n, ya ,ue en la pr+ctica el espacio reservado es menor ,ue el rango de n por,ue no usamos todo el espacio. Seg:n esto puede ocurrir ,ue a diferentes claves les correspondan la misma direccin relativa a registro y por tanto la misma direccin f8sica para almacenarse. 4 estos registros se les denomina sinnimos, y cuando esto ocurre -a!r+ ,ue almacenar a los registros ,ue tienen la misma posicin en un lugar aparte reservado para guardar los sinnimos. #l +rea reservada se puede colocar en varios sitios dentro de un dispositivo. 0or ejemplo si el rango de claves va de G a ))), y la clave es 11)1))43 una forma de almacenarla, ser8a cogiendo los 3 :ltimos n:meros )43. #n cual,uier caso la funcin ,ue convierta una clave a direccin relativa a registro ser+ tal ,ue produ.ca el menor n:mero de colisiones de sinnimos posi!les. A Secuencial inde$ada% #n esta organi.acin tam!i@n se puede acceder a un registro directamente, pero a-ora lo -ar@ mediante investigacin jer+r,uica de 8ndices. 0ara ,ue se pueda aplicar esta organi.acin, o!ligatoriamente los registros tienen ,ue tener asociados una clave. #n un arc-ivo con esta organi.acin se distinguen 3 +reas% - 4rea de datos - 4rea de 8ndices - 4rea de e$cedentes

0<=;>4 (&?1&

Cuando se crea el fic-ero la informacin se va guardando en el +rea de datos y al mismo tiempo se van creando 8ndices en el +rea de 8ndices para poder luego locali.ar esos datos. Despu@s de la creacin del fic-ero la informacin se almacena en el +rea de e$cedentes y se va actuali.ando tam!i@n el +rea de 8ndices. T") s *e Bn*"+es: - ;ndice de pista% #s el de m+s !ajo nivel y es o!ligatorio. Nay un 8ndice de pista por cada pista del cilindro, y este 8ndice contiene 2 entradas o valores. #l primero determina cual es el valor de la clave m+s alta almacenada en esa pista, y el segundo determina cual es la clave del primer registro de e$cedente de esa pista. - ;ndice de cilindro% #s el de siguiente nivel y tam!i@n es o!ligatorio. 9iene una entrada por cada cilindro y en esa entrada contendr+ la clave m+s alta de los registros almacenados en ese cilindro. - ;ndice maestro% >o es o!ligatorio. Solo se usa cuando el 8ndice de cilindro ocupa m+s de 4 pistas. 9iene una entrada por cada pista del 8ndice de cilindros y contendr+ la clave m+s alta de los registros a los ,ue referencian todos los cilindros de esa pista. #j% 2 pistas ? cilindro y 2 registros ? pista 0ista 1 4rea de 8ndices 12 3 "G 0ista 2

12 1

2G

42

"G

4rea de datos

( C1

1G 12

14 2G C2

3G

3( 42 C3

G "G

4rea de e$cedentes

1&

1"

0ara !uscar el registro 3G, -ay ,ue ir mirando si 3G es EJ ,ue el registro con el ,ue lo comparamos. Si llega el 1 , lo metemos en el +rea de e$cedentes por,ue no ca!e. 8. OPERACIONES CON FICDEROS: 1. C!ea+"-n +a!ga *e un F"+>e! : Consiste en meter los datos por primera ve. en un fic-ero ,ue no e$iste. 0ara ello -ay ,ue determinar el espacio ,ue -ay ,ue reservar para el fic-ero y el m@todo de acceso. 2. Re !gan"Pa+"-n *e un F"+>e! : Consiste en crear un fic-ero nuevo a partir de uno ,ue ya e$iste. Conviene reorgani.arlo cuando ya resulta ineficiente su uso por,ue -ay demasiadas colisiones de sinnimos o muc-os registros ,ue ya no e$isten. &. Clas"F"+a+"-n *e un F"+>e! : 0<=;>4 ((?1&

Consiste en ordenar los registros por uno o varios campos. #n los sistemas grandes, el propio sistema operativo ya soporta operaciones ,ue reali.an la organi.acin 2SS39/. 0. Des#!u++"-n *e un F"+>e! : Destruccin de un fic-ero% Significa eliminar toda la informacin ,ue contiene el fic-ero. 6. Reun"-n Fus"-n *e un F"+>e! : Crear un fic-ero a partir de varios. 8. R #u!a es#all"* *e un F"+>e! : " 4 partir de un fic-ero crear varios. ;. Ges#"-n *e un F"+>e! : 0ara tra!ajar con un fic-ero lo primero ,ue tengo ,ue -acer es crearlo. 0ara crear un fic-ero tengo ,ue dar un nom!re ,ue es con el ,ue le va a guardar en el dispositivo. 0ero para manejar ese fic-ero dentro de un programa tendr@ ,ue asignarle una varia!le de tipo de fic-ero ,ue luego tendr@ ,ue asociar con el nom!re f8sico del fic-ero para poder tra!ajar con @l. 4 parte de esto, tam!i@n puedo dar el tama7o del fic-ero, su organi.acin y el tama7o de su !lo,ue o registro f8sico, aun,ue estos 3 :ltimos par+metros, solo ser+ necesario darlos para sistemas grandes. 4ntes de crear el fic-ero tengo ,ue definir la estructura de su registro para luego al definir la varia!le ,ue va a referenciar el fic-ero determinar ,ue fic-ero va a contener ese tipo de registro. *n fic-ero se crea cuando reali.amos la operacin de apertura del mismo, aun,ue -ay lenguajes en los ,ue -ay ,ue especificar 2 cosas 2creacin y apertura/, y en otros si al a!rirlo e$iste se crea. 4l crear un fic-ero si ya e$iste, va a depender del lenguaje, en unos da error y en otros se mac-aca lo ,ue ya e$iste. #n la operacin de apertura si ya e$iste de fic-ero, depende de la forma de apertura ,ue ese fic-ero ,ue ya e$ist8a sea mac-acado o permane.ca. De cual,uier forma en la operacin de a!rir tenemos ,ue indicar la varia!le de tipo fic-ero ,ue nos va a servir para tra!ajar con ese fic-ero en el programa, a continuacin y entre L L el nom!re real de ese fic-ero en el dispositivo, y finalmente el modo de apertura del fic-ero. 4!rir 2Enomafic-F,MnomarealM,EmodoaapertF/ Los modos de apertura, dependen del lenguaje de programacin y del modo de organi.acin. Se distinguen 3 modos de apertura% - 5odo de entrada o lectura. - 5odo de salida o escritura. - 5odo de entrada?salida o lectura?escritura. 400#>D% #$iste en algunos lenguajes. 0ara declarar una varia!le de tipo fic-ero, -ay ,ue usar una varia!le de tipo fic-ero ,ue es% 'ic-ero de EtipoaregF. 9ipo alumno% registro Codaalum% entero Direccion% cadenaO3GP >ota% real 'in registro 6ar f% fic-ero de alumno 0<=;>4 ()?1&

4!rir 2',Mc%Uestudiantes.datM,EmodoF/ - 5odo de entrada% #se fic-ero lo voy a usar para leer informacin de @l pero no lo voy a modificar. 0ara ,ue un fic-ero se a!ra en este modo previamente tiene ,ue e$istir y si no es as8, nos dar+ un error. - 5odo de escritura% *tili.o un fic-ero para escri!ir informacin en @l. 4l a!rirlo no -ace falta ,ue e$ista, si ya e$istiese, depende del lenguaje, pero normalmente se mac-aca lo ,ue -ay 2lo ,ue vamos a -acer/. - 5odo de entrada?salida% 6oy a -acer operaciones de consulta y actuali.acin de la informacin. - 5odo 400#>D% #n pseudocdigo no lo vamos a usar. 4ppend significa a7adir, y se utili.a para escri!ir en un fic-ero pero a7adiendo la informacin al final del mismo. #n algunos lenguajes tam!i@n e$iste la operacin 3#S#9, ,ue lo ,ue me -ace es posicionarme al principio del fic-ero. 3eset 2Evarafic-F/ #n todo momento, e$istir+ un puntero ,ue me indica en ,ue posicin del fic-ero estoy situado. 4l a!rir un fic-ero normalmente sea cual sea el modo de apertura me voy a ,uedar situado al comien.o del fic-ero, salvo ,ue use el modo de apertura 4ppend, ,u me posicionar8a al final del fic-ero. 4 medida ,ue voy -aciendo operaciones en el fic-ero, este valor se va actuali.ando. Cerrar un fic-ero% Kuiere decir des-acer la cone$in entre la varia!le del programa ,ue estoy usando para manejar el fic-ero y el fic-ero real ,ue est+ en el dispositivo. Cerrar 2Evarafic-F/ Siempre ,ue se aca!e de tra!ajar con un fic-ero o ,ue ,ueramos cam!iar el modo de tra!ajar con ese fic-ero, primero lo cerraremos y si ,ueremos volver a tra!ajar con @l, lo volvemos a a!rir. N'NCA DA2 Q'E DE(AR 'N FICDERO A7IERTO. #n algunos lenguajes e$iste la operacin !orrar un fic-ero y lo ,ue -ace es eliminar f8sicamente el fic-ero. 4parte de todo esto tam!i@n e$isten otras relacionadas con su actuali.acin, ,ue son las altas, las !ajas y las modificaciones. Las consultas son una operacin de mantenimiento del fic-ero. Al#a: Consiste en a7adir un registro al fic-ero. Si en el fic-ero los registros tienen alg:n campo clave, lo primero ,ue -ay ,ue compro!ar al dar una alta es ,ue no e$ista ya otro registro con la misma clave. 7a,a: Consiste en eliminar un registro del fic-ero. La !aja puede ser f8sica o lgica. - '8sica% Cuando elimino f8sicamente el registro del fic-ero. - Lgica% Cuando al registro lo marc de una manera especial para indicar ,ue ya no es v+lido pero no lo elimino f8sicamente. 4 rasgos del tratamiento de la informacin es como si ya no e$istiera. #n fic-eros secuenciales no se permite la modificacin de la informacin tal ,ue para dar de !aja a un registro de un fic-ero, lo ,ue -ay ,ue -acer es crear otro fic-ero con todos los registros menos el ,ue ,ueremos eliminar. 0<=;>4 )G?1&

#n el resto de las organi.aciones normalmente se da la !aja lgica 2con una marca/ y cuando tengo muc-os registros marcados como !aja lgica reorgani.o el fic-ero 2!aja f8sica/. Si los registros contienen clave para dar de !aja a un registro tendr@ ,ue dar su clave mirar lo primero si e$iste y solo en ese caso lo podr@ !orrar. Reglas "$) !#an#"s"$as: - 0ara dar la alta a un registro con clave, primero -ay ,ue ver si no -ay ning:n registro con esa clave. - Pa!a *a! la Ca,a a un !eg"s#! : 1. Da. =ue Cus+a! s" el !eg"s#! e:"s#e. 2. M s#!a! la "nF !$a+"-n ) ! )an#alla . )e*"! la + nF"!$a+"-n *el usua!" . M *"F"+a+"-n: 5odificar un registro consiste en cam!iar la informacin ,ue contiene, es decir, cam!iar el valor de uno o m+s de sus campos. #n el caso de la organi.acin secuencial como no se pueden modificar directamente, lo ,ue -ay ,ue -acer es a partir de la informacin ,ue ya e$iste crear otro fic-ero con todos los registros menos el ,ue ,uiero modificar, ,ue lo gra!ar@ con la informacin ,ue ,uiera. 4lgunos lenguajes ,ue soportan la organi.acin secuencial s8 permiten -acer la modificacin del registro en el mismo fic-ero 2como el C/. Cuando se modifican registros de un fic-ero con campos clave en el registro, -ay ,ue tener en cuenta ,ue lo ,ue jamas se puede modificar es el valor del campo clave, por,ue -acer eso es como -acer un alta. C nsul#as: Las consultas lo :nico ,ue -ace es leer informacin del fic-ero y mostrarme la informacin. 0ara -acer una consulta -ay ,ue dar 2 cosas% - Criterio con el ,ue consulto% Contendr+ el campo o campos por los ,ue ,uiero consultar y el valor ,ue tienen ,ue tener esos campos. - ;nformacin ,ue ,uiero mostrar% 4 la -ora de mostrar la informacin, decir ,ue campos ,uiero mostrar. ;. TRATAMIENTO DE FICDEROS SEC'ENCIALES: O)e!a+" nes C5s"+as: 1. Definir la estructura del fic-ero. 2. 4pertura del fic-ero. 3. 9ratamiento de los registros. - #scri!ir 2Evarafic-F,EvararegF/ - Leer 2Evarafic-F,EvararegF/ Los fic-eros secuenciales no se pueden modificar en una posicin concreta, por esa ra.n cada ve. ,ue se ,uiere dar un alta, !aja o modificacin de un registro, como no se puede -acer directamente, tendr@ ,ue usar un fic-ero au$iliar tal ,ue si es un alta, en el nuevo fic-ero tendr@ toda la informacin del fic-ero antiguo m+s el nuevo registro, si es dar de !aja, copio en el nuevo fic-ero todo lo ,ue -a!8a en el anterior fic-ero menos el

0<=;>4 )1?1&

registro ,ue ,uiero !orrar, y si ,uiero modificar un registro, copio toda la informacin y al llegar al registro a modificar, lo copio ya modificado. C nsul#as: 9odo tratamiento de fic-eros, lo voy a -acer en un !ucle, y el final de fic-ero lo se7ala la marca #S'. La primera lectura la voy a -acer fuera del !ucle, y las siguientes al final del !ucle, y el !ucle terminar+ cuando se lee la marca #S'. >ormalmente, en cual,uier lenguaje e$iste ya implementada una funcin ,ue dice s8 -emos llegado al final del fic-ero pero ,ue lo ,ue -ace es !uscar la marca #S'. 4!rir 2Evarafic-F,MnomM,entrada?Salida/ Leer 2Evarafic-F,EvararegF/ 5ientras no eof 2Evarafic-F/ Eproceso con registroF leer 2Evarafic-F,EvararegF/ 'in mientras #n 0ascal la marca de fin de fic-ero est+ f8sicamente en el fic-ero, mientras ,ue en C, se compara el tama7o del fic-ero con la del puntero del fic-ero, y si coinciden ,uiere decir ,ue es el fin del fic-ero. P! Cle$as =ue ) *e$ s en+ n#!a!: 1. Si el fic-ero est+ clasificado por 2 campos y voy a -acer un tratamiento de @l, normalmente tendr@ ,ue -acer 2 !ucles anidados y aprovec-ar ,ue est@n clasificados por campos. 2. Si el fic-ero est+ clasificado por un campo, para !uscar los fic-eros por ese campo, -acemos un solo !ucle aprovec-ando ,ue est+n clasificados por ese campo. 3. Si enfrento 2 fic-eros, si uno est+ clasificado y otro no, leer@ en el !ucle m+s e$terno el ,ue no est+ clasificado, y en el m+s interno el ,ue est+ clasificado, aprovec-ando ,ue est@n ordenados. 4. Si ninguno est+ clasificado, da igual el orden de los !ucles, por,ue en los 2 tendr@ ,ue !uscar -asta el final. . Si lo ,ue me piden es sacar informacin a trav@s de un campo ,ue no es el campo de clasificacin pero ,ue se sa!e el n:mero de valores concretos ,ue puede tomar ese campo, utili.aremos una estructura del tipo array. 9enemos un fic-ero con datos de alumnos +las"F"+a* s ) ! +u!s . nI$e! *e alu$n , teniendo en cuenta ,ue los alumnos se empie.an a numerar por 1. La informacin por alumno es curso, n:mero, nom!re y nota. Determinar cuantos alumnos apro!ados -ay en cada curso. 9ipo alumno % registro Curso% entero >umaal% entero >om% cadena >ota% real 'in registro 4lgoritmo clase 6ar 'aal% fic-ero de alumno

0<=;>4 )2?1&

3aal% alumno 4pro!% entero Cur% entero ;nicio 4!rir 2faal,Malumnos.datM,entrada/ Leer 2faal,raal/ 5ientras no eof 2faal/ 4pro! G Cur raal.curso 5ientras cur J raal.curso Si 2raal.nota FJ / y 2no eof2faal// #ntonces apro! apro! B 1 'in si Leer 2faal,raal/ 'in mientras #scri!ir L#n el cursoMcurM-an apro!adoMapro! 'in mientras Cerrar 2faal/ 'in

9enemos un fic-ero de empleados clasificado por el n:mero de empleado y un fic-ero de !ajas no clasificado ,ue contiene los n:meros de los empleados ,ue se -an dado de !aja. S!tener un tercer fic-ero ,ue contenga a los empleados ,ue realmente -ay en la empresa. 9ipo empleado% registro >umaemp% entero >om!re% cadena Sueldo% real 'in registro 4lgoritmo !aja 6ar 'aeaini,faeafin% fic-ero de empleado 0<=;>4 )3?1&

'a!aja% fic-ero de entero 3aeaini,raeafin% empleado 3a!% entero ;nicio 4!rir 2faeaini,M#mpleado1.datM,entrada/ 4!rir 2faeafin,M#mpleado2.datM,salida/ Leer 2faeaini,raeaini/ 5ientras no eof 2faeaini/ 4!rir 2fa!,MIajas.datM,entrada/ Leer 2fa!,ra!/ 5ientras ra! EF raeaini.numaemp/ y no eof 2fa!/ Leer 2fa!,ra!/ 'in mientras Si eof 2fa!/ #ntonces escri!ir 2faeafin,raeafin/ 'in si Cerrar 2fa!/ Leer 2faeaini,raeaini/ 'in mientras Cerrar 2faeaini/ Cerrar 2faeafin/ 'in

9enemos un fic-ero de clientes no clasificados y la clave del fic-ero de clientes es el D.>.;. y un fic-ero de morosos ,ue contiene el D.>.;. y ,ue est+ clasificado. Kueremos o!tener un listado de los clientes no morosos. Leer 2fac,rac/ 5ientras no eof 2fc/ 4!rir 2fm,M5orosos.datM,entrada/ Leer 2fam,ram/ 5ientras rac.D>; F ram y no eof 2fam/ Leer 2fam,ram/ 'in mientras Si rac.D>; EF ram #ntonces escri!ir rac.nom!re 'in si

0<=;>4 )4?1&

Cerrar 2fam/ Leer 2fac,ram/ 'in mientras 9enemos un fic-ero de ventas ,ue tiene el n:mero de venta, total de venta y n:mero de vendedor, sa!emos ,ue en nuestra empresa tra!ajan vendedores numerados del 1 al . Kueremos sa!er el total vendido por cada vendedor. 9ipo venta% registro Codaventa% entero 9otal% real 6endedor% entero 'in registro 4lgoritmo ventas 6ar 'av% fic-ero de venta 3av% venta 6end% array O1.. P de real ;% entero ;nicio Desde iJ1 -asta 6endOiP G 'in desde 4!rir 2fav,Mventas.datM,entrada/ Leer 2fav,rav/ 5ientras no eof 2fav/ 6endOrav.vendedorP vendOrav.vendedorP B rav.total Leer 2fav,rav/ 'in mientras Cerrar 2fav/ Desde iJ1 -asta #scri!ir L#l vendedorMiM-a vendidoMvendOiP 'in desde 'in

LA++es *"!e+# M en a!+>"/ s se+uen+"ales: #$isten lenguajes ,ue tienen funciones ,ue simulan el acceso directo a un registro dentro de un fic-ero secuencial 2en 0ascal SeeHD en C fseeH/, a estas funciones le indicamos el n:mero de registro 2en 0ascal/ o el n:mero de !ytes 2en C/, y nos acceden directamente a esa posicin. Sin em!argo es simulado, por,ue internamente esa funcin va a -acer una !:s,ueda secuencial -asta ,ue -aya llegado al n:mero de registro o al n:mero de !ytes. Man#en"$"en# *e F"+>e! s + n !gan"Pa+"-n *"!e+#a: - 4lta% 0rimero -ay ,ue ver ,ue no e$iste el registro, y si no e$iste se da de alta. 0ara ver si e$iste o no e$iste, a partir de la clave del registro ,ue ,uiero dar de alta, calculo con la funcin de direccionamiento la posicin en la ,ue

0<=;>4 ) ?1&

tendr8a ,ue meter ese registro. Si esa posicin est+ ocupada, no lo doy de alta y si no lo meto all8. Iaja% 0ara ver si e$iste, -ago igual ,ue antes. Si e$iste lo marco como !aja lgica, y cuando se reorganice el fic-ero, lo doy como !aja f8sica real. 5odificacin% 0ara ver si e$iste, -ago igual ,ue antes. Si e$iste lo modifico y lo vuelvo a gra!ar en la misma posicin. Consultas% 9ienen sentido las consultas de registros en particular con una determinada clave 2a trav@s de la funcin de direccionamiento/, pero no las !:s,uedas secuenciales.

Man#en"$"en# *e F"+>e! s + n !gan"Pa+"-n se+uen+"al "n*e:a*a: #s igual ,ue en organi.acin directa, pero a la -ora de locali.ar un registro, en ve. de aplicar una funcin de direccionamiento a su clave, utili.amos su clave para investigar a trav@s de los 8ndices en donde va a estar situado. Las altas si las doy cuando el fic-ero se crea, se gra!an en el +rea de datos, y si el fic-ero ya e$ist8a se gra!an en el +rea de e$cedentes. #n las consultas tienen sentido tanto las consultas de un registro en particular como las consultas secuenciales a trav@s de una clave por,ue van a estar todas seguidas. >o -ay ,ue confundir organi.acin secuencial inde$ada, con fic-eros inde$ados o de 8ndices, ,ue son un tipo especial de fic-eros asociados a un fic-ero secuencial pero independiente de @l, ,ue me agili.an las !:s,uedas en el fic-ero secuencial en el ,ue est+n inde$ados. Suelen utili.arse en !ases de datos dom@sticas.

<. FICDEROS DE TE9TO: Son un tipo de fic-eros especiales, en cuanto a lo ,ue podemos leer de ellos y escri!ir son cadenas de caracteres. Sin em!argo tienen significados distintos seg:n el lenguaje, y su o!jetivo es ,ue podemos tra!ajar con cadenas de caracteres. ' % 'ic-ero de te$to C % Cadena escri!ir 2', C/ leer 2', C/

0<=;>4 )"?1&

EJERCICIOS: TEMA 2
1. 9enemos un array con la informacin de nuestros productos, por cada producto almacenamos su cdigo, descripcin, stocH actual y stocH m8nimo. Se trata de o!tener otro array ,ue contenga los productos de los ,ue -alla ,ue -acer pedidos por,ue su stocH sea inferior al m8nimo, tal ,ue al proveedor le tenemos ,ue dar como datos la identificacin del producto y la cantidad ,ue pedimos, ,ue coincidir+ con el stocH m8nimo. >ormalmente tra!ajamos con 1GG productos. 9ipo producto J registro Codigo% entero 0<=;>4 )&?1&

Descripcin% cadena StocH% entero StocHamin% entero 'in registro 0edido J registro Codigo% entero Cantidad% entero 'in registro Listaaproducto J array O1..1GGP de producto Listaapedido J array O1..1GGP de pedido 4lgoritmo almacen 6ar 0rod% listaaproducto 0ed% listaapedido ;,j% entero ;nicio c1 Desde iJ1 -asta 1GG Si prodOiP.stocH E prodOiP.stocHamin #ntonces pedOjP.codigo prodOiP.codigo 0edOjP.cantidad prodOiP.stocHamin c jB1 'in si 'in desde 'in

2. Dado un array ,ue contiene la informacin de los alumnos de una clase de 1GG alumnos, y teniendo en cuenta ,ue de cada uno de ellos almacenamos su n:mero de e$pediente, nom!re y nota media. Nallar la media de todos los alumnos de esa clase y dar otra opcin ,ue pida el nom!re de un alumno y me de su nota si este alumno e$iste. 9ipo alumno J registro #$pediente% entero >om!re% cadena 5edia% real 'in registro Lista J arrayO1..1GGP de alumno

0<=;>4 )(?1&

4lgoritmo notas 6ar 4lum% lista Sp,i% entero 5arca% !ooleano ;nicio 0resentar 2op/ 5ientras 2op EFG/ Seg:n sea op 1% escri!ir LLa media de la clase esMnotaamedia 2alum/ 2% escri!ir L;ntroduce un nom!reM leer nom!re marca falso i1 repetir si comparar 2alumOiP.nom!re,nom!re/ J verdadero entonces marca J verdadero sino i iB1 fin si -asta 2i F 1GG/ o 2marcaJverdadero/ si marca J verdadero entonces escri!ir LLa nota deMnom!reMesMalumOiP.media sino escri!ir L#l alumno no e$isteM fin si fin seg:n sea presentar 2op/ fin mientras fin

3. 9enemos un array con la indicacin de cada producto, stocH, descripcin y fec-a. Nallar una opcin ,ue nos sirva iterativamente para -acer pedidos de productos y ,ue termina cuando pidamos el producto G. 0or cada pedido se da el identificador de producto ,ue se pide, y la cantidad de producto, y lo ,ue nos dice es si -ay cantidad suficiente, respondiendo L0edido suministradoM y actuali.ando el stocH, y si el producto solicitado no e$iste o no -ay suficiente cantidad, mostrar+ un mensaje de error e$plicando la causa. 9ipo tafec-a J registro Dia% entero 5es% entero 4nno% entero 'in registro 0roducto J registro 0<=;>4 ))?1&

Codigo% entero Descripicion% cadena StocH% entero 'ec-a% tafec-a 'in producto Lista J arrayO1..1GP de producto 4lgoritmo pedidos 6ar 0rod% lista Codigo,cantidad,i% entero 5arca% !ooleano ;nicio #scri!ir L;ntroduce el codigoM Leer codigo #scri!ir L;ntroduce la cantidadM Leer cantidad 5ientras codigo EF G ;1 5arca falso 3epetir Si codigo J prodOiP.codigo #ntonces marca verdadero Sino i iB1 'in si Nasta 2marca J verdadero/ o 2i F 1GG/ Si marca J falso #ntonces escri!ir L>o e$iste el productoM Sino si prodOiP.stocH E cantidad #ntonces escri!ir L>o -ay cantidad suficienteM Sino prodOiP.stocH prodOiP.stocH g cantidad #scri!ir Lpedido suministradoM 'in si 'in si 'in mientras 'in funcion notaamedia 2a% lista/% real var i% entero acum% real inicio acum G desde iJ1 -asta 1GG acum acum B aOiP.nota fin desde retorno 2acum?1GG/ fin notaamedia funcion comparacion 2c1%cadena,c2%cadena/% !ooleano var 0<=;>4 1GG?1&

i% entero inicio i1 mientras 2c1OiPJc2OiP/ y 2c1OiPEFRiR/ y 2c2OiPEFRiR/ i iB1 fin mientras si c1OiPJc2OiP entonces retorno verdadero sino retorno falso fin si fin comparacion 0rocedimiento presentar 2entAsal opcion% entero/ ;nicio 3epetir #scri!ir LG. SalirM #scri!ir L1. Nallar nota mediaM #scri!ir L2. Nallar la nota de un alumnoM #scri!ir L;ntroduce una opcinM Leer opcion Nasta 2opcion FJG/ y 2opcion EJ2/ 'in presentar

4. 9enemos un fic-ero de facturas. #n la factura viene el n:mero de cliente al ,ue pertenece la factura, el n:mero de factura, el importe de la factura y un campo pagado ,ue ser+ !ooleano. #l fic-ero est+ clasificado pro n:mero de cliente y de factura. Dise7ar un programa ,ue o!tenga por pantalla para cada cliente el total ,ue nos de!e, y al final me d@ el total de lo ,ue la empresa no -a co!rado. 9ipo factura% registro >umacl% entero >umafact% entero ;mporte% real 0agado% !oolean 'in registro 4lgoritmo facturas 6ar 0<=;>4 1G1?1&

'ic-% fic-ero de factura 'act% factura 9otal,deuda% real Cliente% entero ;nicio 4!rir 2fic-,Mfacturas.datM,entrada/ Leer 2fic-,fact/ 9otal G 5ientas no eof 2fic-/ Deuda G Cliente fact.numacl 5ientras 2cliente J fact.numacl/ y no eof 2fic-/ Si fact.pagado J falso #ntonces deuda deuda B fact.importe 9otal total B fact.importe 'in si Leer 2fic-,fact/ 'in mientras #scri!ir L#l clienteMclienteMde!eMdeuda 'in mientras #scri!ir LLa empresa no -a co!radoMtotal 'in

. 9enemos un fic-ero de empleados ,ue contiene el departamento, cdigo de empleado, nom!re, categor8a y sueldo. Nay 12 categor8as numeradas del G al 11. 0or cada departamento sacar el n:mero total de empleados ,ue tiene y el sueldo medio por departamento. Lo mismo -acerlo por categor8as. #l fic-ero est+ clasificado por cdigo de departamento y empleado. 9ipo emp% registro Codadep% entero Codaemp% entero >om!aemp% cadena Categoria% entero Sueldo% real 'in registro Cat% registro Sueldo% real 0<=;>4 1G2?1&

#mp% entero 'in registro 4lgoritmo empleados 6ar 'aemp% fic-ero de emp 3aemp% emp 9adep% real >adep,i,d% entero C% array OG..11P de cat ;nicio Desde iJG -asta 11 COiP.sueldo G COiP.empleado G 'in desde 4!rir 2faemp,Mempleados.datM,entrada/ Leer 2faemp,raemp/ 5ientras no eof 2faemp/ D raemp.codadep 9adep G >adep G 5ientras 2dJraemp.codadep/ y no eof 2faemp/ 9adep tadep B raemp.sueldo >adep nadep B 1 COraemp.categoriaP.sueldo cOraemp.categoriaP.sueldo B raemp.sueldo COraemp.categoriaP.emp cOraemp.categoriaP.emp B 1 Leer 2faemp,raemp/ 'in mientras #scri!ir L#l sueldo medio del departamentoM d L esM tadep ? nadep 'in mientas Desde i J G -asta 11 #scri!ir L#l sueldo de la categor8aMiMesMcOiP.sueldo?cOiP.emp 'in desde Cerrar 2faemp/ 'in ". 0ara controlar los stocHs de un almac@n tenemos% - *n fic-ero Lalmac@nM, no clasificado ,ue contiene las e$istencias de cada producto en almac@n, y sa!emos ,ue -ay un m+$imo de & G productos. Cada registro tiene el cdigo de producto21..& G/, la cantidad en stocH de ese producto y el nom!re del producto - *n fic-ero LpedidosM ,ue contiene todos los pedidos ,ue se solicitan al almac@n. Cada pedido contiene el n:mero de pedido, el cdigo de producto ,ue se pide y la cantidad ,ue se pide. #ste fic-ero est+ clasificado por n:mero de pedido. S!tener un fic-ero de stocH actuali.ado a partir de los pedidos, pudi@ndose dar% 1. #l producto ,ue se pide e$iste en el almac@n y ,ue la cantidad ,ue se pide sea menor o igual a la ,ue -ay. Slo se actuali.a el fic-ero.

0<=;>4 1G3?1&

2. #l producto e$iste, pero la cantidad ,ue nos piden es mayor ,ue la ,ue -ay. =uardaremos la informacin del pedido en el fic-ero LdenegadosM ,ue tiene el cdigo del producto, la cantidad pedida y la cantidad ,ue -a!8a en stocH. 3. #l cdigo de producto no e$iste. 5ostramos por pantalla un mensaje ,ue ponga LCdigo de producto erroneoM. Cada producto aparece como m+$imo una ve.. 9ipo alm% registro 0rod% entero StocH% entero 'in registro 0ed% registro >aped% entero 0rod% entero Cant% entero 'in registro Den% registro 0rod% entero StocH% entero Cant% entero 'in registro 4lgoritmo almac@n 6ar 'aa,faal% fic-ero de alum 'ad% fic-ero de den 'ap% fic-ero de pedidos 3aa% alm 3ap% ped 3ad% den ;nicio 4!rir 2fap,Mpedidos.datM,entrada/ 4!rir 2fan,Malmacenan.datM,salida/ 4!rir 2fad,Mdenegados.datM,salida/ Leer 2fap,rap/ 5ientras no eof 2fap/ 4!rir 2faa,Malmacen.datM,entrada/ Leer 2faa,raa/ 5ientras 2rap.prod EF raa.prod/ y no eof 2faa/ Leer 2faa,raa/ 'in mientras Si rap.prod J raa.prod #ntonces si rap.cantidad E raa.stocH #ntonces raan.prod raa.prod 3aan.stocH raa.stocH g rap.cantidad #scri!ir 2faan,raan/ Sino rad.prod raa.prod 3ad.cant rap.cant 3ad.stocH raa.stocH #scri!ir 2fad,rad/ 'in si Sino escri!ir L#rror. >o e$iste el productoMrap.producto 0<=;>4 1G4?1&

'in si Cerrar 2faa/ Leer 2fap,rap/ 'in mientras Cerrar 2fap/ Cerrar 2fad/ Cerrar 2faan/ 4ctuali.araalmacen 2faa,faan/ 'in 0rocedimiento actuali.araalmacen 2f1% fic-ero de almacenD f2% fic-ero de almacen/ 6ar 31,r2% alm '3% fic-ero de alm ;nicio 4!rir 2f1,Malmacen.datM,entrada/ 4!rir 2f3,Malm.actM,salida/ Leer 2f1,r1/ 5ientras no eof 2f1/ 4!rir 2f2,Malmacenan.datM,entrada/ Leer 2f2,r2/ 5ientras 2r1.prod EF r2.prod/ y no eof 2f2/ Leer 2f2,r2/ 'in mientras Si r1.prod J r2.prod #ntonces escri!ir 2f3,r2/ Sino escri!ir 2f3,r1/ 'in si Cerrar 2f2/ 'in mientras Cerrar 2f1/ Cerrar 2f3/ 'in

ORDENACIN3 B4S5UEDA E INTERCALACIN INTERNA: TEMA 6


1. ;ntroduccin. 2. Srdenacin% - 5@todo de la !ur!uja. - 5@todo de insercin. - 5@todo de seleccin. - 5@todo de KuicH S-ort. 3. I:s,ueda%

0<=;>4 1G ?1&

- I:s,ueda secuencial. - I:s,ueda !inaria. - I:s,ueda por conversin de claves o Nas-ing. 4. ;ntercalacin. 1. INTROD'CCIN: 4 la -ora de tratar datos, muc-as veces nos conviene ,ue est@n ordenados. #stos m@todos nos pueden resultar eficientes cuando -acemos las !:s,uedas. 2. ORDENACIN: Consiste en organi.ar un conjunto de datos en un orden determinado seg:n un criterio. La ordenacin puede ser interna o e$terna% - ;nterna% La -acemos en memoria con arryas. #s muy r+pida. - #$terna% La -acemos en dispositivos de almacenamiento e$terno con fic-eros. 0ara determinar lo !ueno ,ue es un algoritmo de ordenacin -ay ,ue ver la complejidad del algoritmo 2cantidad de tra!ajo de ese algoritmo/, se mide en el n:mero de operaciones !+sicas ,ue reali.a un algoritmo. La operacin !+sica de un algoritmo es la operacin fundamental, ,ue es la comparacin. M# * *e la Cu!Cu,a: La filosof8a de este m@todo es ir comparando los elementos del array de 2 en 2 y si no est+n colocados correctamente intercam!iarlos, as8 -asta ,ue tengamos el array ordenado. Nay ,ue comparar la posicin 1 y la 2 y si no est+n ordenadas las intercam!io. Luego la 2 y la 3 y as8 sucesivamente -asta ,ue comparo las :ltimas posiciones. Con esta primera pasada lograremos ,ue ,uede ordenado el :ltimo elemento del array. 9ericamente, en cada pasada iremos colocando un elemento, y tendr8amos ,ue -acer n g1 pasadas. Si en una pasada no se -acen cam!ios, el array ya est+ ordenado.

0rocedimiento !ur!uja 2datos% array O1..>P de EtipoF/ 6ar Srdenado% !ooleano ;, c% entero 4u$% EtipoF ;nicio Srdenado falso ;1 5ientras 2ordenado J falso/ y 2i EF n g 1/ Srdenado verdadero 0<=;>4 1G"?1&

c; Desde j J 1 -asta n g 1 Si datos OjP F datos Oj B 1P #ntonces au$ datos OjP Datos OjP datos Oj B 1P Datos OjP au$ Srdenado falso 'in si 'in desde ;;B1 'in mientras 'in M# * *e "nse!+"-n: Se supone ,ue se tiene un segmento inicial del array ordenado, y -ay ,ue ir aumentando la longitud de segmento -asta ,ue coincide con la longitud del array. 0ara ello insertaremos el siguiente elemento en el lugar adecuado dentro del segmento ordenado. #sto se -ace moviendo cada elemento del segmento ordenado a la derec-a -asta ,ue se encuentre uno menor o igual al elemento ,ue ,ueremos colocar en el segmento o -asta ,ue no tenemos elementos, y lo coloco en esa posicin. 0ara arrancar este m@todo se parte de ,ue el segmento ordenado inicial este es la primera posicin. 0rocedimiento insercion 2datos% array O1..>P de EtipoF/ 6ar ;, c% entero 4u$% EtipoF ;nicio Desde i J 2 -asta > 4u$ datos OiP cig1 5ientras 2j F G/ y 2au$ E datosOjP/ DatosOj B 1P datosOjP cjg1 'in mientras Datos Oj B 1P au$ 'in desde 'in M# * *e la sele++"-n: Se trata de !uscar el elemento m+s pe,ue7o y colocarlo en la primera posicin, despu@s el segundo m+s pe,ue7o y colocarlo en la segunda posicin, y as8 sucesivamente -asta ,ue el array este ordenado. 0ara ello vamos a recorrer el array, y por cada elemento !uscamos a la derec-a de esa posicin cual es el m+s pe,ue7o, y lo intercam!io con el elemento ,ue estoy e$aminando. 0rocedimiento selecccion 2datos% arrayO1..>P de EtipoF/

0<=;>4 1G&?1&

6ar ;,j,pos% entero 4u$% EtipoF ;nicio Desde i J 1 -asta >A1 4u$ datosOiP 0os i Desde j J iB1 -asta > Si datosOjP E au$ #ntonces pos j 4u$ datosOjP 'in si 'in desde DatosOposP datosOiP DatosOiP au$ 'in desde 'in M# * *e !*ena+"-n !5)"*a Qu"+QS> !#: Consiste en dividir la lista inicial en otras dos ,ue ordenamos por separado recursivamente. 0ara ello, se elige un elemento de la lista al ,ue llamamos pivote, tal ,ue a la derec-a del pivote va a ,uedar lo m+s grande, y a la i.,uierda lo m+s pe,ue7o, es decir, ,ue el pivote ,uedar+ colocado en su posicin. 0rocedimiento KuicHS-ort 2ini% enteroD fin% enteroD datos% arrayO1..>P de EtipoF/ ;nicio Si ini E fin #ntonces su!listas 2ini,fin,pivote,datos/ KuicHs-ort 2ini,pivoteA1,datos/ KuicHs-ort 2pivoteB1,fin,datos/ 'in si 'in

0rocedimiento su!listas 2ini%enteroDfin%enteroDentAsal pivote%enteroD datos%arrayO1..>Pde EtipoF/ ;nicio 0ivote ini 4u$ datosOiniP Desde i J pivoteB1 -asta fin Si datosOiP E au$ #ntonces pivote pivote B 1

0<=;>4 1G(?1&

4u$2 datosOiP DatosOiP datosOpivoteP DatosOpivoteP au$2 'in si 'in desde DatosOiniP datosOpivoteP DatosOpivoteP au$ 'in &. 7RSQ'EDAS: Nay 2 tipos de !:s,uedas, internas ,ue se -acen en memoria y e$ternas ,ue se -acen en fic-eros. Cuando !uscamos en un fic-ero, normalmente lo -acemos a trav@s de una clave. Dado un determinado valor, se trata de ver si e$iste un elemento con ese valor en el array de fic-eros donde se !usca, tal ,ue se devuelve si est+ o no. #$isten 3 m@todos de !:s,ueda% - Secuencial. - Iinaria o dicotnica. - 0or transformacin de claves o Nas-ing. 7Is=ue*a se+uen+"al: Se puede aplicar para !:s,uedas internas y e$ternas, y -ay ,ue ir pasando secuencialmente por todos los elementos de la estructura -asta encontrar el elemento o aca!ar la lista. 0rocedimiento !asecuencial 2datos% arrayO1..>P de EtipoFD elem% EtipoF/ 6ar ;% entero ;nicio ;1 5ientras 2i EJ >/ y 2datosOiP EF elem/ ;;B1 'in mientras Si datosOiP J elem #ntonces escri!ir L#lemento encontrado en la posicinMi Sino escri!ir L#lemento no encontradoM 'in si 'in

7Is=ue*a se+uen+"al + n +en#"nela: Se trata de optimi.ar en cierto modo la !:s,ueda secuencial normal, lo ,ue -acemos es a7adir al final del array el elemento ,ue ,uiero !uscar por lo ,ue siempre lo encontrare. Si encuentro el elemento en una posicin distinta de >B1 significa ,ue no est+ en la estructura. La ventaja es ,ue en la condicin del mientras no tengo ,ue preguntar

0<=;>4 1G)?1&

si se aca!a la estructura, me a-orro una condicin, el inconveniente es ,ue tiene ,ue so!rar espacio al final del array. 0rocedimiento !asecacentineal 2datos% arrayO1..>B1P de EtipoFD elem% EtipoF/ 6ar ;% entero ;nicio DatosOnB1P elem ;1 5ientras datosOiP EF elem ; iB1 'in mientras Si i EF nB1 #ntonces escri!ir L#lemento encontrado en la posicinMi Sino escri!ir L#lemento no encontradoM 'in si 'in 7Is=ue*a C"na!"a *"+ #-n"+a: 0ara ,ue se pueda aplicar es ,ue la lista en la ,ue ,ueremos !uscar el elemento este previamente ordenada. Se trata de dividir el espacio de !:s,ueda en sucesivas mitades -asta encontrar el elemento !uscado o -asta ,ue ya no pueda -acer m+s mitades. 0rimero -allamos el 8ndice de la mitad del array y miramos si el elemento coincide con @l, sino coincide averiguamos donde de!er8a estar el elemento !uscado, si en la lista de la derec-a o de la i.,uierda, y dentro de esa mitad -ago lo mismo sucesivamente. 0rocedimiento !a!inaria 2datos%array O1..>P de EtipoFD elem%EtipoFD ini%enteroD fin% entero/ 6ar mit% entero ;nicio mit 2iniBfin/ div 2 mientras 2ini E fin/ y 2elem EF datosOmitP/ si elem E datosOmitP entonces fin mit g 1 sino ini mit B 1 fin si fin mientras si ini E fin entonces escri!ir L#lemento encontrado en la posicinM mit sino escri!ir L#lemento no encontradoM fin si fin 7Is=ue*a ) ! #!ansF !$a+"-n *e +la/es Das>"ng: #s necesario ,ue lo ,ue se !us,ue sea por un determinado campo clave. Se trata de convertir ese campo clave en una direccin real, si estamos en un array, en un posicin del array y si estamos en un fic-ero, en un registro del fic-ero. Lo ,ue -ace ,ue se convierta la clave en una direccin real es la funcin de direccionamiento. #$isten diferentes tipos de funciones de direccionamiento% 0<=;>4 11G?1&

La m+s usada es la funcin mdulo, ,ue consiste en dividir la clave entre el n:mero de elementos m+$imos de la estructura y coger el resto como direccin real de almacenamiento 2el 8ndice si es un array, o una direccin relativa si es un fic-ero/. #ntruncamiento% #s la parte de la clave como 8ndice. 0legamiento% Dividir la clave en partes iguales de tama7o, ,ue va a ser igual al n:mero de cifras del tama7o del array, luego sumarlas y coger las :ltimas cifras de la suma. 5itad del cuadrado% #s el cuadrado de la clave y despu@s coger las cifras centrales.

#l pro!lema de estos casos, es ,ue cuando el rango de claves es mayor ,ue el n:mero de posiciones de la estructura, est+ el pro!lema de ,ue a diferentes claves les corresponde la misma posicin, as8 ,ue cuando se produce el segundo sinnimo -ay ,ue ver donde se manda. 0ara evitar esto, tratar ,ue la funcin de direccionamiento produ.ca el menor n:mero de colisiones posi!les. 0ara solucionar el pro!lema de los sinnimos% - Dejar tanto espacio como rango de claves. #s ilgico. - Si se trata de un array, ,ue por cada posicin dejemos una posicin m+s. - La mejor solucin es la t@cnica de encadenamiento, ,ue consiste en ,ue de cada posicin del array salga un puntero a una lista enla.ada ,ue enlace a todos los elementos ,ue de!er8an ir posicionados en esa posicin o 8ndice del array.

0. INTERCALACIN: Consiste en juntar varias listas ordenadas en una sola lista ,ue ,uede ordenada. 0rocedimiento fusion 2a1% 91D a2% 92D a3% 93/ 6ar ;,j,H,l% entero 0<=;>4 111?1&

;nicio ;1 c1 h1 5ientras 2iEJn/ y 2jEJm/ Si a1OiP E a2OjP #ntonces a3OHP a1OiP ;;B1 Sino a3OHP a2OjP ccB1 'in si hhB1 'in mientras Si i E n #ntonces desde LJi -asta m h H B1 43OHP a2OlP 'in desde Sino desde LJj -asta n h HB1 43OHP a1OlP 'in desde 'in si 'in

ORDENACIN3 B4S5UEDA Y FUSIN E7TERNA: TEMA 18


1. 4rc-ivos ordenados. 2. 'usin o me.cla de arc-ivos ordenados. 0<=;>4 112?1&

3. 0articin de arc-ivos. 4. Clasificacin de arc-ivos. 1. ARCDI3OS ORDENADOS: *n arc-ivo se puede ordenar por un campo o un conjunto de campos. La mayor parte de los sistemas disponen de una funcin SS39 para ordenar. 2. F'SIN O MEOCLA DE ARCDI3OS ORDENADOS: Dados 2 arc-ivos 4 y I ,ue tienen la misma estructura y clasificados por el mismo campo o campos, se trata de o!tener otro arc-ivo C ,ue tenga la misma estructura de los 2 anteriores y ,ue tam!i@n ,ueda clasificado por el mismo criterio. 0rocedimiento fusion 24% tafic-D I% tafic-D C% tafic-/ 6ar 31, r2% EtipoF ;nicio 4!rir 2C,Mfic-.salM,salida/ 4!rir 24,Mfic-1M,entrada/ 4!rir 2I,Mfic-2M,entrada/ Leer 24,r1/ Leer 2I,r2/ 5ientras no eof 24/ y no eof 2I/ Si r1.info E r2.info #ntonces escri!ir 2C,r1/ Leer 24,r1/ Sino escri!ir 2C,r2/ Leer 2I,r2/ 'in si 'in mientras Si eof 24/ #ntonces leer 2I,r2/ mientras no eof 2I/ #scri!ir 2C,r2/ Leer 2I,r2/ 'in mientras Sino leer 24,r1/ mientras no eof 24/ #scri!ir 2C,r1/ Leer 24,r1/ 'in mientras 'in si Cerrar 24/ Cerrar 2I/ Cerrar 2C/ 'in &. F'SIN DE ARCDI3OS: Se trata de dividir un arc-ivo en varios. Nay diferentes criterios de particin% Pa!#"+"-n ) ! + n#en"* : Se reparten los registros entre varios registros seg:n el valor de uno o m+s campos. E 61 '1

0<=;>4 113?1&

J 61 '2 F 61 '3 0rocedimiento partacont 2fic-% tafic-D entAsal fic-1, fic-2, fic-3% tafic-/ 6ar 3% EtipoF ;nicio 4!rir 2fic-,M'M,entrada/ 4!rir 2fic-1,M'1M,salida/ 4!rir 2fic-2,M'2M,salida/ 4!rir 2fic-3,M'3M,salida/ Leer 2fic-,r/ 5ientras no eof 2fic-/ Si r.info E 61 #ntonces escri!ir 2f1,r/ Sino si r.info F 61 #ntonces escri!ir 2f3,r/ Sino escri!ir 2f2,r/ 'in si 'in si Leer 2fic-,r/ 'in mientras Cerrar 2fic-/ Cerrar 2f1/ Cerrar 2f2/ Cerrar 2f3/ 'in Pa!#"+"-n ) ! nI$e! F", *e !eg"s#! s ) ! se+uen+"as + n +las"F"+a+"-n "n#e!na: Se trata de o!tener a partir de un fic-ero varios, tal ,ue todos tengan un n:mero fijo de registros e$cepto el :ltimo. Si el fic-ero inicial tiene f registros y ,uiero o!tener como resultado \ fic-eros, cada fic-ero tendr+ f?\ registros. Se trata de ir leyendo secuencias de f?\ registros del fic-ero ' y se vuelcan a un array, clasificar esas secuencias internamente, y cuando est@n clasificadas, las vuelco a otro fic-ero. #l pro!lema es ,ue se usa arrays para la ordenacin interna, y a veces el n:mero de fic-eros dependen del tama7o m+$imo del array. '% 3 ) 14 2 3G 1 '1% 3 ) '2% 2 14 3G '3% 1 Pa!#"+"-n ) ! se+uen+"as s"n +las"F"+a+"-n "n#e!na: Se trata de o!tener fic-eros a partir de uno dado, todos con el mismo tama7o, pero los fic-eros no tienen por ,ue estar clasificados. >osotros marcamos el tama7o del !lo,ue donde vaya a clasificar la informacin. Determino tam!i@n el n:mero m+$imo de fic-eros ,ue ,uiero tener. 0<=;>4 114?1&

Leer@ secuencias de > registros del fic-ero inicial y los ir@ gra!ando en los fic-eros resultantes de la particin. 0. CLASIFICACIN DE ARCDI3OS: #s o!ligatorio ,ue e$ista una clave. Si el fic-ero fuese pe,ue7o se llevan todos los registros a un array y los clasifico, pero esto no es lo m+s usual, por lo ,ue se usa la clasificacin e$terna. Clas"F"+a+"-n ) ! $eP+la *"!e+#a: 6amos a usar 2 fic-eros au$iliares '1 y '2. #l fic-ero ' lo organi.amos gra!ando en ' secuencias de registros ordenados cada ve. m+s grandes. 0rimero leemos las secuencias de un registro de ' y las gra!o alternativamente en '1 y '2. Luego leo las secuencias de un registro, una de '1 y otra de '2, y las gra!o ordenadas en '. 6uelvo a leer en ' con el do!le de secuencia ,ue antes y los gra!o en '1 y '2, y repetimos todas las fases duplicando en cada pasada el tama7o de la secuencia -asta ,ue el tama7o o!tenido sea igual ,ue el del fic-ero. 4 cada tratamiento de ' se le llama pasada, y el n:mero de pasadas m+$imo, ser+ ;, tal ,ue el tratamiento se repetir+ -asta ,ue 2 elevado a ; FJ n:mero de registros. #n cada pasada para clasificar la secuencia ,ue leemos de '1 y '2, utili.amos el m@todo de fusin e$terna. '% 3 ) 14 2 3G 1 12 1G '1% 3 ? ? 2 ? 1 ? 1G '2% ) ? 14 ? 3G ? 12 '% 3 ) 14 2 3G 1 12 1G '1% 3 ) ? 2 3G ? 1G '2% 14 ?1 12 '% 3 ) 14 1 2 12 3G 1G '1% 3 ) 14 ? 1G '2% 1 2 12 3G '% 1 2 3 ) 12 14 3G ? 1G '1% 1 2 3 ) 12 14 3G '2% 1G '% 1 2 3 ) 1G 12 14 3G

Clas"F"+a+"-n ) ! $eP+las *e se+uen+"as e=u"/alen#es: Se parece al m@todo anterior por,ue tam!i@n se intenta coger secuencias de registros m+s grandes, pero a-ora usamos 4 fic-eros au$iliares y en ve. de empe.ar leyendo secuencias de un registro, -acemos secuencias de > registros, ,ue la primera

0<=;>4 11 ?1&

ve. clasificamos internamente, por lo ,ue el valor de > vendr+ limitado por el tama7o del array. 0rimero leemos del arc-ivo inicial ' secuencias de > registros ,ue clasificamos internamente y ,ue gra!amos alternativamente en '1 y '2. Despu@s leo secuencias de > registros de '1 y '2 alternativamente, y por cada par de secuencias le8das las fusiono y las gra!o alternativamente ya ordenadas en '3 y '4. Las secuencias de 2> registros de '3 y '4 las fusiono y la secuencia 4> o!tenida ya ordenada la gra!o alternativamente en '1 y '2. 3epito esto -asta ,ue todos los fic-eros est@n vac8os menos 1, y la informacin de ese fic-ero la gra!o al fic-ero inicial. '% 3 ) 14 2 3G 1 12 1G '1% 3 ) ? 1 1G 12 '2% 2 14 3G '1% 6acio '2% 6acio '3% 2 3 ) 14 3G '4% 1 1G 12 '1% 1 2 3 ) 12 14 3G 6uelco '1 al fic-ero inicial '. '2% 6acio '3% 6acio '4% 6acio

ESTRUCTURAS DIN9MICAS LINEALES DE DATOS: LISTAS ENLA:ADAS. PILAS Y COLAS: TEMA 11

0<=;>4 11"?1&

1. 2. 3. 4. . ". &. (. ).

;ntroduccin a las estructuras din+micas de datos. Listas. Listas enla.adas. 0rocesamiento de listas enla.adas simples. Listas circulares con ca!ecera. Listas do!lemente enla.adas. 0ilas. Colas. Do!les colas o !icolas.

1. INTROD'CCIN A LAS ESTR'CT'RAS DIN@MICAS DE DATOS: Las ventajas de las estructuras din+micas de datos son% 1. >o -ay ,ue definir el tama7o antes de usarla, sino ,ue la voy utili.ando seg:n la necesito. 2. Los elementos ,ue forman est+ estructura no est+n situados en forma contigua en memoria, y esos elementos se relacionan entre s8 mediante campos enlace o puntero, y a cada uno de esos elementos lo llamamos nodo de la estructura. *n puntero es un dato cuyo contenido es una direccin de memoria ,ue es en la ,ue est+ almacenado el dato al ,ue apunta.

Las estructuras din+micas pueden ser lineales o no lineales seg:n ,ue desde un elemento se pueda acceder solamente a otro o a varios. De+la!a+"-n *e l s )un#e! s en *"s#"n# s lengua,es: #n C% EtipoF CEvarapF ;nt Cp #n 0ascal% EvaratipoapunteroF% VEtipoF 0% Vinteger #n pseudocdigo% EvaratipoapunteroF% puntero a EtipoF 0% puntero a entero A++e*e! a un +a$) *e un !eg"s#! : #n C% 0 nom!re #n 0ascal% pV.nom!re #n pseudocdigo% p nom!re 2. LISTAS: *na lista es una coleccin lineal de elementos. Nay 2 formas de almacenarla. Con arrays 2usando memoria est+tica/, en donde la relacin de los elementos de la lista viene dada por,ue ocupa posiciones contiguas de memoria. 0<=;>4 11&?1&

De forma enla.ada con memoria din+mica. Se conoce como listas enla.adas, y la relacin entre los elementos de la lista se mantiene mediante campos de enlace o punteros. &. LISTAS ENLAOADAS: #s una coleccin lineal de elementos llamados >SDSS, donde el orden entre los nodos se esta!lece mediante punteros, y por ser simple, adem+s desde un nodo solo puedo acceder al siguiente directamente. *na lista enla.ada tiene 2 partes% - Los nodos ,ue forman la lista. Cada nodo va a tener dos campos. *no de informacin ,ue ser+ del tipo de los elementos ,ue contiene la lista y un campo de enlace ,ue es de tipo puntero, y ,ue contendr+ la direccin de memoria en la ,ue est+ almacenado el siguiente nodo. 4l primer campo de informacin lo llamamos ;>'S, y el nodo lo llamamos S;=. - La segunda parte de la lista ser+ una varia!le de tipo puntero a los nodos de la lista ,ue contiene la direccin del primer nodo de la lista. 0or esa ra.n a esa varia!le la podemos llamar CS5ien.o. 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 'in registro 6ar Com% puntero a nodo #l :ltimo nodo de la lista tendr+ en su campo de enlace el valor nodo 2>ull,>il/, ,ue ,uiere decir ,ue no apunta a ninguna direccin y gr+ficamente se sim!oli.a con%

9ipo nodo% registro ;nfo% car+cter Sig% puntero a nodo 'in registro Los nodos de la lista pueden estar en cual,uier .ona de memoria, no tienen ,ue estar en posiciones consecutivas.

0. PROCESAMIENTO DE LISTAS ENLAOADAS SIMPLES: 0ara poder procesar una lista, se necesita la estructura de sus nodos y la varia!le de comien.o. Speraciones% 0<=;>4 11(?1&

;nsertar un elemento. Iorrar un elemento. 3ecorrer la lista. Iuscar un elemento.

La forma m+s normal de representar listas enla.adas es usar memoria din+mica. *na lista enla.ada tam!i@n se puede simular usando arrays 2memoria est+tica/, pero es poco eficiente. 0ara ello utili.ar8a 2 arrays del mismo tama7o y con la misma numeracin de 8ndices, tal ,ue en un array guardar8a los campos de informacin de la lista, y para cada campo de informacin en la posicin correspondiente en el otro array guardar8a el 8ndice del siguiente elemento a ese nodo. #s decir en ese segundo array guardar8a los campos enlace mediante valores de 8ndice.

4dem+s de los 2 arrays, tengo ,ue tener una varia!le ,ue contenga el 8ndice del primer elemento de la lista. #l :ltimo elemento, tiene en el campo de enlace el valor G. ;nfo 1 2 3 4 " 4 & ; ( ) 1G ^ 3 1G G N . Sig

Re+ !!"* e una l"s#a enlaPa*a: Consiste en paras por todos sus nodos y procesarlos. 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 0<=;>4 11)?1&

'in registro 4lgoritmo recorrido 6ar Com% puntero a nodo ;nicio 3ecorrer 2com/ 'in 0rocedimiento recorrer 2prin% puntero a nodo/ 6ar 0tr% puntero a nodo ;nicio Si prin J >il #ntonces escri!ir LLista vaciaM Sino ptr prin 5ientras ptr EF nil ptrsig EF nil _procesar ptrinfo` ptr ptrsig fin mientras posicionarme en el :ltimo nodo fin si . fin 7us=ue*a *e un n * : Se trata de locali.ar un nodo ,ue cumpla una determinada condicin 2por ejemplo ,ue su campo de informacin valga un valor determinado/. 4 la -ora de -acer las !:s,uedas tendremos en cuenta si la lista est+ ordenada o no, y si est+ ordenada por el criterio de !:s,ueda tendr@ ,ue aprovec-arlo. 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 'in registro 4lgoritmo !us,ueda 6ar 0,com% puntero a nodo #lem% EtipoF ;nicio Iuscar 2com,elem,p/ 'in 0rocedimiento !uscar 2prin% puntero a nodoD e% EtipoFD entAsal pos% puntero a nodo/ ;nicio 0os prin 5ientras 2posinfo EF #/ y 2pos EF >;L/ 0os possig 'in mientras 'in 7Is=ue*a *e un n * !*ena* as+en*en#e$en#e: 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 'in registro 0<=;>4 12G?1&

4lgoritmo !us,ueda 6ar 0,com% puntero a nodo #lem% EtipoF ;nicio Iuscar 2com,elem,p/ 'in 0rocedimiento !uscar 2prin% puntero a nodoD e%EtipoFDentAsal pos% puntero a nodo/ ;nicio 0os prin 5ientras 2e F posinfo/ y 2pos EF >;L/ 0os possig 'in mientras Si posinfo EF e #ntonces pos >;L 'in si 'in T!a#a$"en# *e la $e$ !"a *"n5$"+a: Siempre ,ue se -ace una insercin en una estructura din+mica, tenemos ,ue coger de memoria tantos !ytes de memoria din+mica como ocupa el nodo de la estructura din+mica, y cuando !orramos un elemento, tendremos ,ue li!erar la memoria ocupada por ese elemento. 0ara conseguir este manejo, todos los lenguajes de programacin tienen 2 instrucciones ,ue permiten reservar memoria y li!erar memoria din+mica, y asignar en el caso de la reserva la memoria a un puntero, y en el caso de la li!eracin se li!era la memoria asignada a un puntero. 0ascal % >#e , D;S0SS# C % 54LLSC , '3## CBB % >#e , D#L#9# La instruccin de reserva de memoria llevara un :nico argumento, ,ue ser+ el tipo de datos para el ,ue se -ace la reserva de memoria, y seg:n el tama7o de ese tipo, esa instruccin sa!r+ el n:mero de !ytes ,ue tiene ,ue reservar. \ lo ,ue devuelve es un puntero al comien.o de la .ona ,ue se -a reservado. #ste valor devuelto ser+ el ,ue tenemos ,ue asignar a un puntero al tipo de datos para el ,ue se -ace la reserva. La funcin li!erar memoria lleva un :nico argumento ,ue es el tipo puntero, y lo ,ue -ace es li!erar la memoria asignada a ese puntero, para lo cual es imprescindi!le ,ue a ese puntero previamente se le -aya -ec-o una asignacin de memoria din+mica con al funcin de reserva. 6ar p% puntero a EtipoF 0 J resamem 2EtipoF/ Li!amem 2EvarapunteroF/

>osotros vamos a simular el tratamiento de la memoria din+mica de la siguiente forma% 6amos a suponer ,ue todas las posiciones li!res de memoria est+n enla.adas entre s8 a trav@s de una lista enla.ada, a la ,ue vamos a llamar D;S0 2lista de memoria disponi!le/, donde la primera posicin de esa lista viene apuntada por la varia!le D;S0.

0<=;>4 121?1&

Cada ve. ,ue ,ueremos -acer una insercin en una estructura din+mica, cogeremos la primera posicin de D;S0, y se la asignaremos al puntero ,ue va a contener a ese elemento. \ cuando ,ueramos !orrar un elemento de una estructura din+mica para indicar ,ue li!eramos la memoria utili.ada por ese elemento, lo ,ue -aremos ser+ insertarlo en el D;S0, pero siempre al comien.o. Seg:n esto, todo !orrado en el D;S0 e,uivaldr+ a una instruccin de reserva de memoria en cual,uier lenguaje, y toda insercin en el D;S0, e,uivaldr+ a la instruccin de li!erar memoria en cual,uier lenguaje. O/e!Fl S . 'n*e!Fl S: La memoria del ordenador tiene un tama7o limitado, por lo ,ue la memoria din+mica tam!i@n tendr+ un tama7o limitado, es decir, ,ue puede ser ,ue se nos agote. #sta situacin, se conoce como S6#3'LSe. Siempre ,ue se -aga una instruccin de reserva de memoria, tendremos ,ue compro!ar antes si nos ,ueda memoria li!re. #so en cual,uier lenguaje ocurre cuando la instruccin de reservar de memoria devuelve el valor >;L. Si D;S0 J >il #ntonces escri!ir L>o -ay memoriaM ;gual se -ace para !orrar un elemento de una estructura din+mica, para !orrarlo, esa estructura tiene ,ue tener al menos un elemento. Si no lo tiene e intentamos !orrarlo, se produce un *>D#3'LSe. 0or esto, lo primero ,ue tenemos ,ue pro!ar en una estructura din+mica, es preguntar si tiene algo. Si comien.o J >il #ntonces escri!ir LLista 6aciaM Si slo manejo una estructura din+mica, pregunto por D;S0, si tra!ajo con varias estructuras din+micas cada una de un tipo, -a!r+ tantas D;S0 como estructuras din+micas. Inse!+"-n en una l"s#a enlaPa*a: 4ntes de reali.ar cual,uier proceso de insercin, tendr@ ,ue ver si me ,ueda memoria disponi!le. Si es posi!le -acer la insercin, lo primero ser+ reservar la memoria para el elemento ,ue ,uiero reservar. 0ara nosotros ser+ coger el primer elemento de D;S0. #n segundo lugar, asignaremos los valores correctos al elemento ,ue vamos a insertar, es decir, asignaremos al campo de informacin del nuevo elemento con la informacin, y despu@s actuali.amos el campo de enlace.

4 la -ora de asignar un valor al campo de enlace, lo primero ser+ locali.ar la posicin en la ,ue tenemos ,ue locali.ar el siguiente elemento, y se pueden dar los siguientes casos%

0<=;>4 122?1&

1. ;nsercin al comien.o de la lista% Se modifica el valor de la varia!le comien.o. 2. ;nsercin en cual,uier otro lugar de la lista, incluido el final% #n este caso, tendremos ,ue conocer tam!i@n el nodo ,ue va a estar delante de la posicin de insercin, ya ,ue a la -ora de insertar ese nuevo elemento, va a ocurrir ,ue el nodo de la posicin anterior a la de insercin apunte al nuevo elemento, y ,ue el nuevo apunte al nodo de la posicin a la ,ue insertamos. 4 la -ora de locali.ar la posicin de insercin depender+ de la aplicacin en particular. Como ejemplo de insercin, vamos a dar la insercin en una lista ordenada ascendentemente por el campo de informacin% 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 'in registro 0rocedimiento insercion 2entAsal com% puntero a nodoD elem%EtipoF/ 6ar Lug, Lugp, nuevo% puntero a nodo ;nicio Si D;S0 J >il #ntonces escri!ir L>o -ay memoria disponi!leM Sino nuevo D;S0 D;S0 D;S0S;= >uevoinfo elem Si 2com J >il/ o 2elem E cominfo/ #ntonces nuevosig Com Com nuevo Sino lugp com Lug comsig 5ientras 2elem F luginfo/ y 2lug EF >il/ Lugp lug Lug lugsig 'in mientras >uevosig lug Lugpsig nuevo 'in si 'in si 'in

7 !!a* en una l"s#a enlaPa*a:

0<=;>4 123?1&

Se trata de !orrar un nodo ,ue contenga una determinada informacin de una lista enla.ada simple, aun,ue el criterio de !orrado podr8a ser otro en lugar del campo de informacin. Siempre ,ue se -ace un !orrado de una estructura din+mica, en general, lo primero es compro!ar ,ue la estructura no est+ vac8a, y una ve. determinado esto, tendr@ ,ue locali.ar el nodo a !orrar. Se pueden dar 2 casos% - #l nodo a !orrar sea el primero. - Kue el nodo a !orrar ocupe cual,uier otra posicin. Si es el del comien.o, cam!iar+ la varia!le de comien.o de la lista por,ue a-ora tendr+ ,ue apuntar al siguiente elemento, al de comien.o. Si el elemento ocupa cual,uier otra posicin, tendr@ ,ue locali.ar la posicin del elemento y de su predecesor, por,ue para desenla.arlo de la lista, el predecesor tendr+ ,ue apuntar al elemento ,ue le sigue al nodo a !orrar. 'inalmente, una ve. desenla.ado el nodo, -a!r+ ,ue li!erar la memoria ,ue ocupa!a. #so en cual,uier lenguaje e,uivale a -acer la operacin de li!erar memoria, y en pseudocdigo ser8a insertar el elemento al principio de D;S0. 0rocedimiento !orrar 2entAsal com% puntero a nodoD elem% EtipoF/ 6ar Lug, lugp% puntero a nodo ;nicio Si com J >il #ntonces escri!ir LLista vaciaM Sino lugp nil Lug com 5ientras 2elem F luginfo/ y 2lug EF >il/ Lugp lug Lug lugsig 'in mientras Si elem EF luginfo #ntonces escri!ir L>o e$iste el nodo a !orrarM Sino Si lugp J >il #ntonces com comsig Sino lugpsig lugsig 'in si Lugsig D;S0 D;S0 lug 'in si 'in si 'in

0<=;>4 124?1&

6. LISTAS CIRC'LARES CON CA7ECERA: *na lista con ca!ecera, en general es una lista enla.ada simple normal, pero en la ,ue el primer nodo es un nodo especial ,ue no sirve para guardar informacin v+lida, sino solamente para marcar ,ue es el primer nodo.

Ca!ecera Nay dos tipos de listas enla.adas con ca!ecera% - Listas enla.adas con ca!ecera y tierra% #l primer nodo va a ser la ca!ecera, y el :ltimo apunta a nil. >o se utili.a por,ue perdemos un nodo y no tienen ventajas. - Listas circulares con ca!ecera% Se caracteri.an por,ue tienen un nodo ca!ecera, y adem+s el :ltimo nodo apunta al nodo ca!ecera.

#n cual,uier lista enla.ada con ca!ecera el primer nodo con informacin :til es el siguiente a comien.o 2Comsig/. #n una lista circular con ca!ecera, la ventaja ,ue presenta respecto a una normal, es ,ue en las inserciones y !orrados no -ay ,ue suponer ning:n caso especial, pues todos los nodos, incluido el primero :til, tienen un predecesor. 4l recorrer la lista completa, empe.aremos !uscando la informacin por el siguiente a comien.o, y sa!emos ,ue -emos llegado al final de la lista cuando el siguiente al puntero ,ue recorre la lista sea comien.o. 7Is=ue*a en una l"s#a +"!+ula! + n +aCe+e!a: 0rocedimiento !us,ueda 2com% puntero a nodoD elem%EtipoF/ 6ar 0tr% puntero a nodo ;nicio 0tr comsig 5ientras 2ptrinfo EF elem/ y 2ptr EF com/ 0tr ptrsig 'in mientras Si ptrsig J com #ntonces escri!ir L#lemento no encontradoM 'in si 'in

Inse!+"-n en una l"s#a +"!+ula! + n +aCe+e!a: 0rocedimiento insercion 2com% puntero a nodoD elem% EtipoF/ 0<=;>4 12 ?1&

6ar Lug,lugp,nuevo% puntero a nodo ;nicio Si D;S0 J >il #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0sig >uevoinfo #lem Lugp com Lug comsig 5ientras 2elem F luginfo/ y 2lug EF com/ Lugp lug Lug lugsig 'in mientras >uevosig lug Lugpsig nuevo 'in si 'in 7 !!a* en una l"s#a +"!+ula! + n +aCe+e!a: 0rocedimiento !orrado 2com% puntero a nodoD elem%EtipoF/ 6ar Lug,lugp% puntero a nodo ;nicio Si comJcomsig #ntonces escri!ir LLista vaciaM Sino lugp com Lug comsig 5ientras 2luginfo EF elem/ y 2lug EF com/ Lugp lug Lug lugsig 'in mientras Si lug J com #ntonces escri!ir L#lemento no encontradoM Sino lugpsig lugsig Lugsig D;S0 D;S0 lug 'in si 'in si 'in

8. LISTAS DO7LEMENTE ENLAOADAS: 0<=;>4 12"?1&

Las listas enla.adas simples se caracteri.an por,ue desde un nodo solo puedo acceder al siguiente a ese nodo, por lo ,ue solo puedo acceder al siguiente a ese nodo, por lo ,ue solo puedo recorrer la lista en un sentido, de principio a fin. Las listas do!les se caracteri.an por,ue desde un nodo podemos acceder directamente tanto al siguiente como al anterior a ese. #s decir, por cada nodo tendremos 2 campos enlace, uno para enla.ar un nodo con el siguiente, y otro para enla.ar a un nodo con el nodo anterior a @l. De esta manera, la lista la podemos recorrer en los 2 sentidos, de principio a fin, movi@ndonos con el enlace al nodo siguiente o de fin a principio movi@ndonos con el enlace al nodo anterior. 0ara ,ue se pueda -acer este segundo recorrido, adem+s de una varia!le comien.o para cada lista, ,ue contiene la direccin del primer nodo de la lista, necesitaremos tam!i@n otra varia!le especial ,ue denominaremos fin o final, ,ue apunta al :ltimo nodo de la lista. Seg:n esto, la estructura de una lista do!lemente enla.ada, ser+ la siguiente% - Cada lista tendr+ 2 varia!les, comien.o y final, del tipo puntero a nodo do!le, ,ue contendr+n respectivamente la direccin al primer y :ltimo nodo de la lista. - La estructura de cada nodo ser+% 9ipo nodoado!le% registro ;nfo% EtipoF Sig% puntero a nodoado!le 4nt% puntero a nodoado!le 'in registro ;>'S ant sig #l campo siguiente del :ltimo nodo tendr+ valor >;L, y el campo anterior del primer nodo tam!i@n tendr+ valor >;L, para indicar ,ue no -ay nada antes del primer nodo.

La caracter8stica de una lista do!lemente enla.ada vac8a es ,ue el comien.o y el final son iguales y apuntan a >;L. 0<=;>4 12&?1&

Si 2com J final/ y 2com J >il/

Lista do!lemente enla.ada con un solo elemento% Si 2com J final/ y 2com EF >il/

0ara implementar la insercin y el !orrado de una lista do!lemente enla.ada, vamos a suponer ,ue la lista de espacio disponi!le tiene la forma de una lista do!lemente enla.ada. Re+ !!"* *e una l"s#a * Cle$en#e enlaPa*a: 0ara pasar por todos los nodos de la lista, podemos -acerlo igual ,ue una lista enla.ada simple, solo ,ue a-ora la podemos recorrer la lista -acia delante con el campo S;=, y -acia atr+s con el campo 4>9. Re+ !!"* >a+"a *elan#e: 0rocedimiento recorridoaadelante 2com% puntero a nodo do!le/ 6ar 0tr% puntero a nodo do!le ;nicio 0tr Comien.o 5ientras 2ptr EF >il/ _0rocesar 093.;>'S` ptr ptrsig fin mientras fin Re+ !!"* >a+"a a#!5s: 0rocedimiento recorridoaadelante 2com% puntero a nodo do!le/ 6ar 0tr% puntero a nodo do!le ;nicio 0tr 'inal 5ientras 2ptr EF >il/ _0rocesar 093.;>'S` ptr ptrant fin mientras 'in 7Is=ue*a en una l"s#a * Cle$en#e enlaPa*a:

0<=;>4 12(?1&

#s e$actamente igual ,ue en una lista enla.ada simple, solo ,ue a-ora puedo !uscar el elemento !uscado desde el comien.o y movi@ndome con S;= o desde el final y movi@ndome con 4>9. Si tengo una idea de por donde va a estar el elemento, empe.are por donde sea mejor. 0rocedimiento !us,ueda 2com% puntero a do!le nodoD final% puntero a do!le nodoD elem% EtipoFD entAsal lug% puntero a do!le nodo/ 6ar 0tr, lug% puntero a do!le nodo ;nicio Lug nil 0tr final 5ientras 2ptr EF nil/ y 2elemento F ptrinfo/ 0tr ptrant 'in mientras Si 2ptr EF nil/ y 2elemento ptrinfo/ #ntonces lug ptr 'in si 'in Inse!+"-n en una l"s#a * Cle$en#e enlaPa*a: Lo primero es ver si me ,ueda espacio disponi!le en memoria din+mica, si me ,ueda, reservo memoria para un nuevo elemento y meto la informacin ,ue ,uiero en su campo de informacin, y lo siguiente es actuali.ar sus campos de enlace. Casos particulares% - ;nsercin al comien.o si la lista est+ vac8a. - ;nsercin al comien.o si la lista no est+ vac8a. - ;nsercin al final. - ;nsercin en medio de la lista.

0<=;>4 12)?1&

0rocedimiento insercion 2entAsal com% puntero a nodoado!leD entAsal final% puntero a nodoado!leD elem% EtipoF/ var lug, nuevo% puntero a nodoado!le ;nicio si D;S0 J >il entonces escri!ir L>o -ay memoriaM sino nuevo D;S0 D;S0 D;S0Sig >uevoinfo elem Si com J nil #ntonces nuevosig >;L >uevoant >;L Com nuevo 'inal nuevo Sino si elem E cominfo #ntonces nuevosig com >uevoant nil Comant nuevo Com nuevo Sino lug comsig 5ientras 2elem F luginfo/ y 2lug EF >il/ Lug lugsig 'in mientras Si lug EF nil #ntonces nuevosig lug >uevoant lugant Lugantsig nuevo Lugant nuevo Sino nuevosig nil >uevoant final 'inalsig nuevo 'inal nuevo 'in si 'in si 'in si 'in si 'in 7 !!a* en una l"s#a * Cle$en#e enlaPa*a: 0rimero -ay ,ue ver si la lista tiene alg:n elemento, y si tiene alg:n elemento, -a!r+ ,ue !uscar si el elemento ,ue ,ueremos !uscar e$iste en la lista, y si e$iste, !usco en ,ue posicin se encuentra. Casos particulares% - Iorrado del primer nodo. - Iorrado del :ltimo nodo. - Iorrado de cual,uier nodo. Despu@s de todo esto, -a!r+ ,ue li!erar la memoria del nodo. 0<=;>4 13G?1&

0rocedimiento !orrado 2entAsal com% puntero a nodoado!leD entAsal final% puntero a nodoado!leD elem% EtipoF/ var lug% puntero a nodoado!le inicio si com J >il entonces escri!ir LLista vaciaM sino lug com mientras 2luginfo EF elem/ y 2lug EF nil/ lug lugsig fin mientras si lug J >il entonces escri!ir L>o encontradoM sino si lug J com entonces com comsig si com J >il entonces final nil sino comant nil fin si sino si lug EF final entonces lugantsig lugsig lugsigant lugant sino lugantsig nil final lugant fin si fin si lugsig D;S0 D;S0 lug fin si fin si fin ;. PILAS: *na pila es una estructura lineal de datos con la caracter8stica especial de ,ue a-ora, no podemos -acer las inserciones y las eliminaciones en cual,uier lugar, sino ,ue o!ligatoriamente las tenemos ,ue -acer por un e$tremo de la lista. #se e$tremo lo llamamos cima de la pila. #sto supone ,ue se procesen los elementos de la pila en orden inverso a su entrada en la estructura, es decir, el primer elemento de la pila ,ue usare ser+ el :ltimo ,ue -a entrado 2L;'S/. Con una pila podemos -acer dos operaciones !+sicas, 0*SN 2meter/ y 0S0 2sacar/. 4parte de estas dos funciones se pueden definir otras como la de pila vac8a o top, ,ue me dice cual es elemento ,ue est+ en la cima de la pila pero sin sacarlo. Se puede implementar con memoria est+tica 2arrays/ o con memoria din+mica 2listas enla.adas/.

0<=;>4 131?1&

Si utili.o un array, tendr@ ,ue definir cual es el tama7o m+$imo del array, ,ue ser+ el de la pila, y aparte tendr@ definida una varia!le cima ,ue tendr+ en cada momento el 8ndice ,ue corresponde al elemento del array ,ue est+ en la cima de la pila. 0ila J array O1..ma$apilaP de EinfoF Cima% entero 0ara se7alar ,ue la cima est+ vac8a, cima es igual a G por,ue no tiene ,ue apuntar a ning:n elemento. I$)le$en#a+"-n *e una )"la + n $e$ !"a es#5#"+a: 4lgoritmo prinapila Const 5a$apila J Ema$apilaF 6ar 0% array O1..ma$apilaP de EinfoF C% entero #lem% EinfoF ;nicio CG Leer 2elem/ Si pilaavacia 2C/ J verdadero #ntonces escri!ir L0ila vaciaM Sino sacar 2pila,c,elem/ #scri!ir L#lemento sacadoMelem 'in si 'in 'uncion pilaavacia 2cima% entero/% !ooleano ;nicio Si cima J G #ntonces retorno verdadero Sino retorno falso 'in si 'in 0rocedimiento meter 2entAsal pila% arrayO1..ma$apilaP de EinfoFD cima% enteroD elem%EinfoF/ ;nicio si cima J ma$apila entonces escri!ir L0ila llenaM sino cima cima B 1 pilaOcimaP elem fin si 'in 'uncion cimaapila 2pila% arrayO1..ma$apilaP de EinfoFD cima% entero/%EinfoF ;nicio 3etorno pilaOcimaP 'in

0<=;>4 132?1&

0rocedimiento sacar 2entAsal pila% arrayO1..ma$apilaP de EinfoFD cima% enteroD entAsal e% EinfoF/ ;nicio # cimaapila 2cima,pila/ Cima cima g 1 'in I$)le$en#a+"-n *e una )"la + n $e$ !"a *"n5$"+a: 9ipo nodo% registro ;nfo% EtipoF Sig% puntero a nodo 'in registro 4lgoritmo manejoapila 6ar Cima% puntero a nodo #lem% EtipoF ;nicio Cima nil 5eter 2cima,elem/ Si pilaavacia 2cima/ #ntonces escri!ir L>o -ay memoriaM Sino sacar 2cima,elem/ #scri!ir L#lemento sacadoMelem 'in si 'in 'uncion pilaavacia 2cima% puntero a nodo/% !ooleano ;nicio Si cima J nil #ntonces retorno verdadero Sino retorno falso 'in si 'in 0rocedimiento poner 2entAsal cima% puntero a nodoD elem% EtipoF/ 6ar >uevo% puntero a nodo ;nicio Si D;S0 J nil #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0sig >uevoinfo elem >uevosig cima Cima nuevo 'in si 0<=;>4 133?1&

'in

'uncion cimaapila 2cima% puntero a nodo/%EtipoF ;nicio 3etorno cimainfo 'in 0rocedimiento sacar 2entAsal cima% puntero a nodoD entAsal elem% EtipoF/ 6ar Iorrado% puntero a nodo ;nicio #lem cimaapila 2cima/ Iorrado cima Cima cimasig Iorradosig D;S0 D;S0 !orrado 'in A)l"+a+" nes *e las )"las: *n ejemplo t8pico de uso de pilas, es en las llamadas entre funciones. #n este caso, el sistema operativo utili.a una pila en donde va guardando la direccin de retorno de cada una de estas llamadas. <. COLAS: *na cola tam!i@n es una lista lineal de elementos, en la ,ue las inserciones se -acen por un e$tremo de la lista, y los !orrados por otro. Las inserciones se -acen por el final y los !orrados por el principio. #sto significa ,ue es una estructura del tipo ';'S. Sea cual sea la implementacin, siempre tendr+n ,ue e$istir 2 varia!les, frente y final, ,ue apunten al comien.o y al fin de la cola respectivamente. 0odemos implementar una cola con memoria est+tica 2arrays/ y con memoria din+mica 2listas enla.adas/. Si implementamos la cola con arrays, tendremos un array llamado cola, ,ue contiene el tipo de informacin ,ue contiene la cola, y aparte dos valores, frente y final, cuyo valor servir+ como el 8ndice ,ue indica ,ue elemento est+ al frente y al final de la cola. La cola estar+ vac8a cuando frente y final no apunten a ning:n 8ndice del array, y esto ser+ cuando frente y final valgan G si el array se empie.a a numerar a partir del 1. 4parte de la funcin ,ue me dice si la cola est+ vac8a, tendr@ ,ue implementar funciones de sacar y meter un elemento. 0ara insertar un elemento en una cola, -a!r8a ,ue incrementar el valor en la varia!le final, y despu@s introducir en la cola del final el elemento. 0ara eliminar un elemento de una cola, !astar8a primero ver ,ue elemento est+ al frente de la cola, y para eliminarlo aumentar el frente en una unidad. Si solo consideramos esta posi!ilidad, es decir, manejar el array solo incrementando, no lo estar8amos utili.ando eficientemente, por,ue podr8amos llegar al caso en ,ue -a!iendo posiciones li!res al comien.o del array no pudi@semos usarlas cuando el final alcan.ase el m+$imo 8ndice del array. 0<=;>4 134?1&

0ara evitar esto, el array ,ue implementa la cola, lo vamos a tratar como un array circular 2suponemos ,ue despues de la posicin > del array, viene la posicin 1/. #sto ,uiere decir ,ue si la cola no est+ llena, despu@s de final J 5a$, viene final J 1, y al sacar el elemento de la cola, si no est+ vac8a, despu@s de frente J >, vendr+ frente J 1, y si despu@s de sacar el elemento la cola ,ueda vac8a, actuali.aremos frente y final a G. Si frente es igual a final y son distintos de G antes de sacar un elemento, ,uiere decir ,ue ese elemento es el :ltimo. 4ntes de insertar un elemento, tendr@ ,ue ver si la cola est+ llena 2frente J 1 y final J 5a$ o frente J final B 1/. I$)le$en#a+"-n *e + las + n $e$ !"a es#5#"+a: 9ipo datos% array O1..ma$acolaP de EtipoF 4lgoritmo manejoacola 6ar Cola% datos 'rente, final% entero #lem, result% EtipoF ;nicio 'rente G 'inal G 5eteracola 2frente,final,cola,elem/ Si colaavacia 2frente,final/ J verdadero #ntonces escri!ir LCola vac8aM Sino sacaracola 2frente,final,cola,result/ #scri!ir L#lemento sacadoMresult 'in si 'in 'uncion colaavacia 2frente% enteroD final% entero/% !oolean ;nicio Si 2frente J G/ y 2final J G/ #ntonces retorno verdadero Sino retorno falso 'in si 'in

0<=;>4 13 ?1&

0rocedimiento meteracola 2entAsal cola%datosD entAsal frente%enteroD entAsal final%enteroD #lem% EtipoF/ ;nicio Si 22frente J 1/ y 2final J 5a$acola// o frente J final B 1 #ntonces escri!ir LCola llenaM Sino si colaavacia 2frente,final/ J verdadero #ntonces frente 1 'inal 1 Sino si final J 5a$acola #ntonces final 1 Sino final final B 1 'in si 'in si ColaOfinalP elem 'in si 'in 0rocedimiento sacaracola 2entAsal cola%datosD entAsal frente%enteroD entAsal final%enteroD #lem% EtipoF/ ;nicio #lem colaOfrenteP Si frente J final #ntonces frente G 'inal G Sino si frente J 5a$acola #ntonces frente 1 Sino frente frente B 1 'in si 'in si 'in I$)le$en#a+"-n *e + las + n $e$ !"a *"n5$"+a: 'uncion colaavacia 2com% puntero a nodoado!le/% !ooleano ;nicio Si com J nil #ntonces retorno verdadero Sino retorno falso 'in si 'in

0<=;>4 13"?1&

0rocedimiento meteracola 2entAsal com% puntero a nodoado!leD entAsal final% puntero a nodoado!leD elem% EtipoF/ var nuevo% puntero a nodoado!le ;nicio Si D;S0 J nil #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0sig >uevoinfo elem >uevoant final >uevosig nil 'inalsig nuevo 'inal nuevo Si colaavacia 2frente/ J verdadero #ntonces frente nuevo 'in si 'in si 'in 0rocedimiento sacaracola 2entAsal com% puntero a nodoado!leD entAsal final% puntero a nodoado!leD result% EtipoF/ var ptr% puntero a nodoado!le ;nicio 3esult cominfo 0tr com Com comsig Si com J nil #ntonces final nil Sino comant nil 'in si 0trsig D;S0 D;S0 ptr 'in A)l"+a+" nes *e las + las: Las colas se suelen utili.ar en los procesos por lotes y en la utili.acin de recursos del sistema. Cuando un proceso ,uiere usar un recurso y otro lo est+ usando, tendr+ ,ue ponerse en la cola, y se ir+ asignando el recurso seg:n el orden en ,ue se -a pedido. 4 veces, la utili.acin de recursos por parte de los procesos, nos interesa ,ue ciertos procesos tengan mayor prioridad ,ue otros, incluso aun,ue lleguen m+s tarde, y para ello utili.ar8amos las colas de prioridades. 0<=;>4 13&?1&

Cada elemento de la cola, tendr+ otro campo ,ue indi,ue su prioridad, tal ,ue a la -ora de sacar un elemento de la cola, saco el del frente, y a la -ora de insertar un elemento en la cola, tendr@ en cuenta la prioridad del elemento ,ue ,uiero insertar, y para ello se inserta en la cola por orden de prioridad, y si -ay mas elementos ,ue tienen la misma prioridad ,ue el ,ue ,ueremos insertar, los procesamos seg:n su orden de llegada, es decir, ,ue lo colocamos como el :ltimo de los elementos con esa prioridad. DO7LES COLAS O 7ICOLAS: *na !icola es una lista lineal de elementos en la ,ue las inserciones y !orrados es pueden -acer por cual,uiera de sus e$tremos. 6a a -a!er 2 varia!les, i.,uierda y derec-a, ,ue apuntan a sus e$tremos. Nay 2 tipos especiales de !icolas% - De entrada restringida% Kue permite inserciones solo por un e$tremo y !orrados por los dos. - De salida restringida% Kue permite inserciones por cual,uier e$tremo y !orrado solo por uno. Se pueden implementar con memoria est+tica o din+mica.

0<=;>4 13(?1&

EJERCICIOS: TEMA 11
1. Dise7ar un algoritmo ,ue colo,ue el primer nodo de una lista enla.ada como pen:ltimo, pero cam!iando solo los campos enlace. La lista es una lista enla.ada do!le. 0rocedimiento resultado 2entAsal com% ptraa nodoD entAsal final% ptraa nodo/ 6ar 0rin% puntero a nodo ;nicio Si 2com J final/ o 2comsig J final/ #ntonces escri!ir L>o se puede -acer el cam!ioM Sino prin com Comsig final Comant finalant 'inalantsig com 'inalant com Com prinsig Comant nil 'in si 'in 2. Dada una cadena de caracteres C1, en un array de longitud m+$ima >, y con el fin de cadena QiR, y dada otra cadena C2 almacenada en una lista enla.ada simple, ,ue cada nodo de la lista contiene una letra. Se trata de ,ue pasandole a un su!programa 2 cadenas, determinar cuantas veces aparece C1 en C2. 'uncion compara 2c1% cadenaD c2% ptraa nodo/% entero 6ar ;ni,p% puntero a nodo ;,res% entero ;nicio 3es G 0 C2 5ientras 2pEF nil/ Si 2pinfo J c1OiP/ #ntonces ini 0 ;1 5ientras 2pinfo J c1OiP/ y 2c1OiP EF QiR/ y 2p EF nil/ ;iB1 0 psig 'in mientras Si c1OiP J QiR #ntonces res res B 1

0<=;>4 13)?1&

Sino p inisig 'in si Sino p psing 'in si 'in mientras 'in 3. Dada una lista do!lemente enla.ada ,ue contiene en cada nodo un d8gito decimal 2G..)/, determinar el valor ,ue se o!tiene si consideramos la informacin de cada nodo de la lista como los t@rminos de un polinomio, donde el t@rmino de menor grado es el :ltimo nodo y el de m+$imo grado es el del comien.o, evaluando el polinomio para un valor ,ue se le pasa como par+metro. 'uncion pot 2!ase% enteroD e$p% entero/% real 6ar ;% entero 4cum% real ;nicio 4cum 1 Desde i J 1 -asta e$p 4cum acum C !ase 'in desde 3etorno acum 'in 'uncion polinomio 2fin% ptraa nodoado!leD $% entero/% real 6ar 3es% real 0% puntero a nodoado!le ;nicio #$p G 3es G 0 final 5ientras p EF nil 3es res B 2cinfo C pot 2$,e$p/ 0 pant #$p e$p B 1 'in mientras 3etorno res 'in

0<=;>4 14G?1&

4. 9enemos almacenado en un fic-ero de productos el stocH de cada uno de ellos en el almac@n. Cada registro tiene identificador, nom!re, stocH actual y stocH m8nimo. ;terativamente, -asta ,ue se introdu.ca un identificador de producto igual a G, se ir+n -aciendo pedidos o entregas pidi@ndonos el identificador, la cantidad y si es pedido o entrega, y con ellos iremos actuali.ando la cantidad de productos en almac@n. 4l final ,uiero tener el fic-ero actuali.ado. 0ara ello, utili.aremos una lista enla.ada como estructura au$iliar. 9ipo producto% registro ;ndentificador% entero >om!re% cadena StocHaact% entero StocHamin% entero 'in registro >odo% registro ;nfo% producto Sig% puntero a nodo 'in registro 6ar Com, ptr% puntero a nodo 3eg% producto 'ic-% fic-ero de producto ;d,cant% entero Car% car+cter ;nicio Com nil 4!rir 2fic-,Mdatos.datM,entrada/ Leer 2fic-,reg/ 5ientras no eof 2fic-/ ;nsertar 2com,reg/ Leer 2fic-,reg/ 'in mientras Cerrar 2fic-/ #scri!ir L;dentificadorM Leer 2id/ 5ientras id EF G #scri!ir LCantidadM Leer cant #scri!ir L0edido?#ntregaM Leer car 5odifica 2com,id,cant,car/ #scri!ir L;dentificadorM

0<=;>4 141?1&

Leer id 'in mientras 4!rir 2fic-,Mdatos.datM,salida/ 0tr com

5ientras com EF nil #scri!ir 2fic-,cominfo/ Com comsig 0trsig D;S0 D;S0 ptr 0tr com 'in mientras Cerrar 2fic-/ 'in 0rocedimiento insertar 2entAsal com% puntero a nodoD elem% producto/ 6ar Lug,lugp,nuevo% puntero a nodo ;nicio Si D;S0 J >il #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0Sig >uevoinfo elem Si com J nil #ntonces nuevosig com Com nuevo Sino lugp com Lug comsig 5ientras 2elem.identificador F luginfo/ y 2lug EF nil/ Lugp lug Lug lugsig 'in mientras >uevosig lug Lugpsig nuevo 'in si 'in si 'in

0<=;>4 142?1&

0rocedimiento modifica 2prim% ptraa nodoD d% enteroD c% enteroD caract% car+cter/ 6ar 0tr% puntero a nodo ;nicio Si prin J nil #ntonces escri!ir LLista vaciaM Sino ptr prin 5ientras 2ptr EF nil/ y 2id EF ptrinfo.identificador/ 0tr ptrsig 'in mientras Si ptr J nil #ntonces escri!ir L#l producto no e$isteM Sino si 2caract J Q0R/ o 2caract J QpR/ #ntonces ptrinfo.cantidad ptrinfo.cantidad B c Sino si ptrinfo.cantidad FJ c #ntonces ptrinfo.cantidad ptrinfo.cantidad g c Sino escri!ir L>o -ay cantidad suficienteM 'in si 'in si 'in si 'in si 'in

0<=;>4 143?1&

. Dadas 2 listas enla.adas simples, L1 y L2, ordenadas en ascendente, actuali.ar las 2 listas de modo ,ue L2 ,uede vac8a y L1 contenga a todos los elementos de L2, menos a los repetidos. >o !orrar elementos, -ay ,ue enla.arlos. 0rocedimiento juntar 2entAsal com1% ptraa nodoD entAsal com2% ptraa nodo/ 6ar 01,a1, au$, !orrado% puntero a nodo ;nicio Si com2 EF nil #ntonces si com1 J nil #ntonces com1 com2 Sino si 2com2info E com1info/ y 2com2 EF nil/ #ntonces au$ com2 Com2 com2sig 4u$sig com1 Com1 au$ Sino a1 com1 01 com1sig 5ientras 2p1 EF nil/ y 2com2 EF nil/ Si 2com2info E p1info/ #ntonces a1 p1 01 p1sig Sino si 2com2info J p1info/ #ntonces !orrado com2 Com2 com2sig Iorradosig D;S0 D;S0 !orrado Sino au$ com2 41sig com2 Com2sig 01 Com2 au$sig 41 a1sig 'in si 'in si 'in mientas Si com2 EF nil #ntonces a1sig com2 Com2 nil 'in si

0<=;>4 144?1&

'in si 'in si 'in si 'in

". ;mplementar una cola usando listas enla.adas simples% 0rocedimiento meter 2entAsal com% ptraa nodoD entAsal final% ptraa nodoD e% EtipoF/ 6ar >uevo% ptraa nodo ;nicio Si D;S0 J nil #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0sig >uevosig >il Si com J nil #ntonces com nuevo 'inal nuevo Sino finalsig nuevo 'inal nuevo 'in si 'in si 'in 0rocedimiento sacar 2entAsal com%ptraa nodoD entAsal final%ptraa nodoD entAsal e%EtipoF/ 6ar Iorrado% puntero a nodo ;nicio # cominfo Iorrado com Com comsig Si com J nil #ntonces final nil 'in si Iorradosig D;S0 D;S0 !orrado 'in

0<=;>4 14 ?1&

&. ;mplementar una cola de prioridades con listas enla.adas simples% 0rocedimiento meter 2entAsal com% ptraa nodoD e% EtipoFD p% entero/ 6ar Lugp, lug, nuevo% puntero a nodo ;nicio Si D;S0 J nil #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0sig >uevoinfo e >uevoprioridad p Lugp nil Lug com 5ientras 2lug EF nil/ y 2p FJ lugprior/ Lugp lug Lug lugsig 'in mientras Si lugp J nil #ntonces nuevosig com Com nuevo Sino lugpsig nuevo >uevosig lug 'in si 'in si 'in 0rocedimiento sacar 2entAsal com%ptraa nodoD entAsal e%EtipoF/ 6ar Iorrado% puntero a nodo ;nicio # cominfo Iorrado com Com comsig Iorradosig D;S0 D;S0 !orrado 'in 0<=;>4 14"?1&

(. ;mplementar una cola de prioridades como lista de listas% 9ipo nodoaprior% registro 0rior% entero 0rinp% ptraa nodoainfo Sig% ptraa nodoapr 'in registro >odoainfo% registro ;nfo% EtipoF #nl% ptraa nodoainfo 'in registro 0rocedimiento meter 2entAsal com%ptraa nodoapriorD elem%EtipoFD p% entero/ 6ar >uevoi, lugi% puntero a nodoainfo >uevop, ptr, ptra% puntero a nodoaprior ;nicio Si 2D;S00 J nil/ y 2D;S0; J nil/ #ntonces escri!ir L>o -ay memoriaM Sino nuevoi D;S0; D;S0; D;S0;enl >uevoiinfo elem >uevosig >;L 0tra nil 0tr com 5ientras 2ptr EF nil/ y 2p F ptrprior/ 0tra ptr 0tr ptrsig 'in mientras Si 2p J ptrprior/ #ntonces lugi ptrprinp 5ientras 2lugisig EF nil/ Lugi lugienl 'in mientas Lugisig nuevo Sino nuevop D;S00 0<=;>4 14&?1&

D;S00 D;S00sig >uevopprior p >uevopsig ptr >uevopprinp nuevoi Si 2ptra J nil/ #ntonces com nuevop Sino ptrasig nuevop 'in si 'in si 'in si 'in

0rocedimiento sacar 2entAsal com% ptraa nodoapriorD entAsal e%EtipoF/ 6ar Iori% ptraa nodoainfo Iorp% ptraa nodoaprior ;nicio # comprinpinfo Iori comprinp Comprinp comprinpenl Iorienl D;S0; Si comprinp J nil #ntonces !orp com Com comsig Iorpsig D;S00 D;S00 !orp 'in si 'in

0<=;>4 14(?1&

9RBOLES Y GRAFOS: ESTRUCTURAS DE DATOS NO LINEALES: TEMA 12


1. 2. 3. 4. . ". &. <r!oles. <r!oles !inarios. <r!oles !inarios de !:s,ueda. 4plicaciones de los +r!oles !inarios. =rafos. Speraciones con grafos. 4plicaciones de los grafos.

1. @R7OLES: Los +r!oles est+n dentro de las estructuras de datos no lineales, ,ue consisten en ,ue desde un nodo tengo acceso a varios elementos. *n +r!ol es un conjunto finito de elementos llamados nodos, ,ue guardan entre s8 una relacin jer+r,uica tal ,ue siempre va a e$istir un nodo ra8. diferenciado del resto, y los restantes parten de @l, formando conjuntos disjuntos cada uno de los cuales es a su ve. otro +r!ol. 4 cada uno de esos +r!oles se les llama su!+r!oles del ra8.. *n +r!ol vac8o es a,uel ,ue no tiene ning:n nodo 23ai. J >;L/. 4 I C D # ; ' = c N h L

Te!$"n l gBa *e l s 5!C les: - 3a8.% >odo esencial de ,ue parten todos los dem+s. #s el :nico ,ue no tiene antecesor. - >odo% Cada uno de los elementos del +r!ol. 0<=;>4 14)?1&

Noja o nodo terminal% >odo ,ue no tiene ning:n otro su!+r!ol de!ajo de @l. Nijo% Cada nodo ,ue no es -oja tiene de!ajo de @l a otros su!+r!oles. 0adre% 9odo nodo e$cepto el ra8., ,ue tiene asociado un predecesor del ,ue desciende. Nermano% 3elacin entre los nodos -ijos del mismo padre. >odo interno% #l ,ue tiene alg:n -ijo. >ivel% Cada nodo de un +r!ol tiene asociado un n:mero de nivel. #l del ra8. es el G, y a partir de a-8 se va aumentando de 1 en 1. Camino entre 4 y I% Sucesin de enlaces o nodos por los ,ue -ay ,ue pasar para llegar de 4 a I. 3ama% Camino ,ue termina en una -oja. 0rofundidad de un +r!ol% #s el n:mero m+$imo de nodos de la rama m+s larga del +r!ol. #,uivale al n:mero m+$imo de niveles B 1. 0eso% >:mero de -ojas ,ue tiene un +r!ol. Ios,ue% Coleccin de 2 o m+s +r!oles.

2. @R7OLES 7INARIOS: Son un conjunto finito de elementos llamados nodos ,ue contienen un nodo ra8. y donde cada nodo puede tener G,1, 2 -ijos. 4 cada su!ar!ol se le denomina su!ar!ol i.,uierdo y su!ar!ol derec-o. Te!$"n l gBa: - Dos +r!oles !inarios son similares si tienen los nodos colocados igual. - <r!oles !inarios e,uivalentes o copias% 9ienen la misma estructura y los mismos contenidos. - <r!oles !inarios e,uili!rados% 4,uellos ,ue en la altura entre su +r!ol i.,uierdo y derec-o se diferencian como m+$imo en una unidad. - <r!oles !inarios completos% 4,uellos en ,ue cada nodo del +r!ol tiene G 2 -ijos, el n:mero m+$imo de -ijos de un determinado nivel i ser+ 2 elevado a i. - <r!ol lleno% Cuando todos los niveles est+n completos. Re)!esen#a+"-n *e 5!C les C"na!" s: Se pueden representar con memoria est+tica o din+mica. Con memoria din+mica la estructura de un nodo va a tener el campo info y otros 2 nodos ,ue refer@ncien al -ijo i.,uierdo y derec-o de cada nodo. Re)!esen#a+"-n *e 5!C les C"na!" s + n )un#e! s: Cada nodo va a tener un registro ,ue contiene el campo de informacin y 2 campos de tipo puntero. ;>'S ;^K 9ipo nodoaar!ol% registro ;nfo% EtipoF ;.,,der% ptraa nodoaar!ol 'in registro 0<=;>4 1 G?1& D#3

4 parte de los nodos, los +r!oles tienen una varia!le especial llamada ra8., ,ue es de tipo puntero a nodoaar!ol y apunta al nodo ,ue est+ al comien.o del +r!ol. 3ai.

D;S0a43 va a ser una lista enla.ada simple en la ,ue las inserciones y !orrados los -acemos por el comien.o y como campo de enlace vamos a usar el nodo i.,uierdo. Re+ !!"* *e l s 5!C les C"na!" s: #s pasar por todos sus nodos. 0ara recorrer un +r!ol lo podemos -acer de 3 formas, seg:n el momento en el ,ue procesemos el nodo ra8.. Las 3 formas se llaman % 0reorden, ;norden, 0osorden. #n cual,uiera de las tres, siempre se recorre primero el su!+r!ol i.,uierdo, y luego el derec-o, y se diferencian en el momento en el ,ue recorremos el ra8.. - 0reorden% La ra8. se procesa primero, luego el i.,uierdo y luego el derec-o. - ;norden% 0rimero la ra8., luego el i.,uierdo y luego el derec-o. - 0osorden% 0rimero el i.,uierdo, luego el derec-o y luego la ra8.. 0reorden% 4, I, D, #, =, C, ' ;norden% D, I, #, =, 4, ', C 0osorden% D, =, #, I, ', C, 4 4 Re+ !!"* *e un 5!C l C"na!" : Los ar!oles son estructuras recursivas, por lo ,ue los algoritmos m+s eficientes con +r!oles son los recursivos. 0rocedimiento preorden 2rai.% ptraa nodoaar/ ;nicio Si rai. EF nil #ntonces _procesar rai.info/ 0reorden 2rai.i.,/ 0reorden 2rai.der/ 'in si 'in 0rocedimiento inorden 2rai.% ptraa nodoaar/ ;nicio Si rai. EF nil #ntonces inorden 2rai.i.,/ _procesar rai.info/ 0<=;>4 1 1?1&

inorden 2rai.der/ 'in si 'in 0rocedimiento posorden 2rai.% ptraa nodoaar/ ;nicio Si rai. EF nil #ntonces posorden 2rai.i.,/ 0osorden 2rai.der/ _procesar rai.info/ 'in si 'in

9am!i@n se puede recorrer un +r!ol !inario con un algoritmo no recursivo% 4lgoritmo inorden 6ar 0ila% arrayO1..5a$P de puntero a nodoaar Cima% entero 3ai., ptr% puntero a nodoaar ;nicio Cima 1 0ilaOcimaP >il 0tr rai. 5ientras 2ptr EF nil/ Cima cima B 1 0ilaOcimaP ptr 0tr ptri., 'in mientras 0tr pilaOcimaP Cima cimaA1 5ientras 2ptr EF nil/ _procesar ptrinfo` si ptrder EF nil entonces ptr ptrder mientras ptr EF nil cima cima B 1 pilaOcimaP ptr ptr ptri., fin mientras fin si ptr pilaOcimaP cima cima g 1 fin mientras 'in

0<=;>4 1 2?1&

&. @R7OLES 7INARIOS DE 7RSQ'EDA: Son un tipo especial de +r!oles !inarios ,ue se caracteri.a por,ue los elementos del +r!ol son todos distintos y adem+s est+n colocados de tal manera ,ue el recorrido en ;norden de ese +r!ol da lugar a ,ue los elementos se procesen ordenados seg:n un determinado campo de informacin, para ello es necesario ,ue todos los nodos del +r!ol cumplan la siguiente regla% Kue todo lo ,ue est+ a la i.,uierda de un nodo tenga un valor menor ,ue el resto del nodo, y todo lo ,ue esta a la derec-a tenga un valor mayor. 2 1( 3 12 11 14 1 21 1" 22 3G 32 3& 3( 4G

3ecorrido inorden% 11,12,14,1 ,1",1(,21,22,2 ,3G,32,3 ,3&,3(,4G. 4 7Is=ue*a *e un ele$en# : Dado un elemento, mirar si se encuentra o no en el +r!ol, voy a devolver un puntero a ese elemento y a su padre. 0rocedimiento !uscar 2rai.% ptraa nodoaarD entAsal act% ptraa nodoaarD entAsal pad% ptraa nodoaarD e%EtipoF/ ;nicio 0ad >il 4ct rai. 5ientras 2act EF nil/ y 2actinfo EF e/ 0ad act Si 2e E actinfo/ #ntonces act acti., Sino act actder 'in si 'in mientras Si act EF nil #ntonces escri!ir L#lemento encontradoM Sino escri!ir L#lemento no encontradoM 'in si 'in 4 Inse!+"-n en un 5!C l C"na!" : 0rimero -ay ,ue ver ,ue no -aya otro elemento igual en el +r!ol, y despu@s -a!r+ ,ue colocar el elemento a la i.,uierda de su padre si es menor ,ue @l o al derec-a si es mayor. Alg !"#$ n !e+u!s"/ : 0rocedimiento insercion 2entAsal rai.% ptraa nodoaarD elem%EtipoF/ 6ar 0tr,pad,nuevo% ptraa nodoaar ;nicio Iuscar 2rai.,ptr,pad,elem/ Si ptr EF nil #ntonces escri!ir L#l elemento ya e$isteM 0<=;>4 1 3?1&

Sino si D;S0 J >il #ntonces escri!ir L>o -ay memoriaM Sino nuevo D;S0 D;S0 D;S0;^K >uevoinfo elem >uevoi., nil >uevoder nil Si 04D J nil #ntonces rai. nuevo Sino si elem E padinfo #ntonces padi., nuevo sino 0adder nuevo fin si fin si fin si fin si 'in Alg !"#$ !e+u!s"/ : 0rocedimiento insercion 2entAsal ptr% ptraa nodoaarD elem%EtipoF/ ;nicio Si ptr EF nil #ntonces si elem E ptrinfo #ntonces insercion 2ptri.,,elem/ Sino si elem F ptrinfo #ntonces insercion 2ptrder,elem/ Sino escri!ir L#l elemento ya e$isteM 'in si 'in si Sino ptr D;S0 D;S0 D;S0i., 0trinfo elem 0tri., nil 0trder nil 'in si 'in 4 7 !!a* en un 5!C l C"na!" : Si el nodo a !orrar slo tiene un -ijo, lo sustituimos por ese y ya se aca!o. 0ero si el nodo a !orrar tiene 2 -ijos, -ay ,ue !uscar cual es el sucesor de ese nodo 2estar+ a la derec-a del m+s a la i.,uierda/ y el padre de ese sucesor. Sustituir el nodo a !orrar por su sucesor. 4l final -ay ,ue poner como -ijos del sucesor 2,ue es el ,ue -a sustituido al nodo !orrado/ a los -ijos del nodo !orrado. A Alg !"#$ n !e+u!s"/ : 0rocedimiento !orrar 2entAsal rai.% ptraa nodoaarD elem%EtipoF/ 6ar 0tr, pad% ptraa nodoaar ;nicio 0<=;>4 1 4?1&

Iuscar 2rai.,ptr,pad,elem/ Si ptr J nil #ntonces escri!ir L#l elemento no e$isteM Sino si 2ptri., EF nil/ y 2ptrder EF nil/ #ntonces !orrara2a- 2rai.,ptr,pad/ Sino !orraraG1a- 2rai.,ptr,pad/ 'in si 0tri., D;S0 D;S0i., ptr 'in si 'in

0rocedimiento !orrara2a- 2entAsal rai.% ptraa nodoaarD entAsal% ptraa nodoaarD pad% ptraa nodoaar/ 6ar Suc,padsuc,-ijosuc% ptraa nodoaar ;nicio 0adsuc ptr Suc ptrder 5ientras suci., EF nil 0adsuc suc Suc suci., 'in mientras Nijosuc sucder Si padsuci., J suc #ntonces padsuci., -ijosuc Sino padsucder -ijosuc 'in si Si pad J nil #ntonces rai. suc Sino si padi., J ptr #ntonces padi., suc Sino padder suc 'in si 'in si Suci., ptri., Sucder ptrder 'in 0rocedimiento !orraraG1a- 2entAsal rai.% ptraa nodoaarD entAsal ptr% ptraa nodoaarD 0ad% ptraa nodoaar/ 6ar Nijo% ptraa nodoaar 0<=;>4 1 ?1&

;nicio Si ptri., EF nil #ntonces -ijo ptri., Sino -ijo ptrder 'in si Si pad J nil #ntonces rai. -ijo Sino si ptr J padi., #ntonces padi., -ijo Sino padder -ijo 'in si 'in si 'in

4 Alg !"#$ !e+u!s"/ : 0rocedimiento !orrar 2ptr% ptraa nodoaarD elem%EtipoF/ ;nicio Si ptr EF nil #ntonces si elem E ptri., #ntonces !orrar 2ptri.,, elem/ Sino si elem F ptrder #ntonces !orrar 2ptrder, elem/ Sino si ptri., J >il #ntonces ptr ptri., Sino si ptrder J >il #ntonces ptr ptri., Sino eliminar 2ptrder, ptr/ 'in si 'in si 'in si 0tri., D;S0 D;S0 ptr 'in si Sino escri!ir L#l nodo no e$isteM 'in si 'in 0rocedimiento eliminar 2entAsal suc% ptraa nodoaarD entAsal ptr% ptraa nodoaar/ ;nicio Si suci., EF nil #ntonces eliminar 2suci.,, ptr/ Sino ptrinfo sucinfo

0<=;>4 1 "?1&

0tr suc 'in si 'in 0. APLICACIONES DE LOS @R7OLES 7INARIOS: - *na de las aplicaciones m+s importantes es dentro de la inteligencia artificial, y m+s concretamente en el +rea de reconocimiento de patrones. Se trata de utili.ar los +r!oles para reali.ar clasificaciones. La clave est+ en asignar a cada nodo del +r!ol un significado y a cada rama, una respuesta ,ue nos ayude a determinar el sentido de la !:s,ueda. - 9ransformacin de una notacin alge!raica a otra% 0refija, infija, posfija 2Ba!,aB!,a!B/. 0ara ello la ra8. del +r!ol de!e de ser un signo y para las ramas o su!+r!oles, otra e$presin o un operando. - 0ara implementar el algoritmo de Nodman de compresin y codificacin.

6. GRAFOS: #l grafo es una estructura de datos no lineal, tal ,ue a-ora desde un nodo podemos apuntar a varios, pero a su ve. un nodo puede ser apuntado desde otros. Te!$"n l gBa *e l s g!aF s: *n grafo se compone por un conjunto 6 de v@rtices y un conjunto 4 de aristas. Cada arista se identifica con un par de v@rtices ,ue indican los v@rtices a los ,ue une la arista. Los v@rtices de una arista son entre s8 nodos adyacentes. - =rado de un nodo% >:mero de aristas ,ue contiene a ese nodo. - =rado de un grafo% >:mero de v@rtices de ese grafo. Si el grado de un nodo es G, se dice ,ue es un nodo aislado. - Camino% *n camino C de longitud > de un nodo 61 a un nodo 62, se define como la secuencia de nodos por los ,ue -ay ,ue pasar para llegar del nodo 61 a 62. La longitud de ese camino es el n:mero de aristas ,ue comprende ese camino. #l camino es cerrado si empie.a y termina en el mismo nodo. #l camino es simple si todos los nodos de dic-o camino son distintos a e$cepcin de los de los e$tremos ,ue pueden ser iguales.
2 1 4 " 3

C 21,"/ 1,4," Caminos simples 1,4, ," 1,4,3,4, ,"

4ristas especiales% - Iucles% #s una arista cuyos e$tremos son id@nticos. - 4rista m:ltiple% Dos o m+s aristas ,ue conectan los mismos nodos. T") s *e g!aF s:

0<=;>4 1 &?1&

=rafo conectado o cone$o% #$iste un camino simple entre 2 cuales,uiera de sus nodos. =rafo desconectado% 4,uel en ,ue e$isten nodos ,ue no est+n unidos por ning:n camino. =rafo dirigido% Cada arista tiene asignada una direccin 2identificada por un par ordenado/. =rafo no dirigido% La arista est+ definida por un par no ordenado. =rafo sencillo% 4,uel ,ue no tiene ni !ucles ni aristas m:ltiples. =rafo m:ltiple o multigrafo% 0ermite la e$istencia de aristas m:ltiples o !ucles. =rafo completo% Cada nodo del grafo es adyacente a todos los dem+s. =rafo eti,uetado con peso ponderado% 4,uel en el ,ue a cada arista del grafo va asociado un valor ,ue es lo ,ue llamamos peso de la lista. Se usa para indicar algo, como la longitud de la arista o la importancia de la arista, ... 0eso de un camino% La suma de los pesos de las aristas del camino.

Re)!esen#a+"-n *e l s g!aF s: Nay 2 formas de representar los grafos, con memoria est+tica y con memoria din+mica% Con memoria est+tica% - 5atri. de adyacencia% #s una matri. 5 de >C> elementos donde > es el n:mero de nodos del grafo, donde cada posicin 52i,j/ 8ndica si -ay una cone$in o no entre el nodo ,ue aparece asociado a la posicin ; de la matri. y el nodo ,ue aparece asociado a la matri. c. Si lo ,ue ,uiero es representar un grafo ponderado en ve. de poner G y 1, pondremos G si no esta conectado y el valor de la arista si e$iste cone$in. Si el grafo no es dirigido resulta una matri. simetrica. Las potencias de la matri. de adyacencia 5 elevado a h nos indican en las posiciones ,ue tiene valor 1 ,ue e$iste un camino de longitud h entre los nodos asociados a las posiciones ;, c de esa matri..
Destino

1 2 3 4 "
Srigen

1 G G 1 G G G

2 G G 1 G G G
2

3 G G G G G G

4 1 G 1 G 1 G

G G G G 1 G

" G G G G 1 G

3 1 4

0<=;>4 1 (?1&

"

Con memoria din+mica% 6amos a utili.ar 2 listas enla.adas, una es la lista de nodos 2formada por todos los v@rtices y aristas del grafo. Cada nodo de esa lista tendr+ la siguiente informacin% - ;nfo% ;nformacin del nodo. - Sig% 0untero ,ue enla.a con el siguiente nodo de la lista de nodos. - 4dy% 4punta al primer elemento de la lista de adyacencia. La lista de adyacencia contiene o enla.a a todas las aristas ,ue parten de ese nodo. #l conjunto de todas las listas de adyacencia, forman una lista de listas. La lista de adyacencia se implementa como otra lista enla.ada en la ,ue cada nodo de esa lista contiene 2 campos% - Des 2destino/% #s un campo puntero al nodo destino de la lista. - #nl 2enlace/% #s un campo puntero ,ue apunta al siguiente nodo o arista de la lista de adyacencia de ese nodo.

1
Sig 2 4dy Des #nl

2
3 4

3 4 9ipo vertice% registro ;nfo% EtipoF Sig% ptraa vertice 4dy% ptraa arista 'in registro 9ipo arista Des% ptraa vertice #nl% ptraa arista 2C #l peso de la arista ir8a a,u8 C/ 'in registro 0ara manejar la memoria disponi!le vamos a tener 2 listas% - 4D;S0% 4punta al primer nodo ,ue enla.a a los nodos de tipo arista disponi!le.

0<=;>4 1 )?1&

>D;S0% 4punta la primer nodo ,ue enla.a a los nodos de tipo v@rtices. >os movemos con el campo sig.

8. OPERACIONES CON GRAFOS: 4 7Is=ue*a *e un n * : Lo ,ue se trata es de locali.ar un nodo ,ue contiene una determinada informacin, para ello le pasamos la informacin al procedimiento y nos devuelve la posicin si lo encuentra o >il si no lo encuentra. 0rocedimiento Iuscaranodo 2elem%EtipoFDentAsal ptr%ptraa verticeD prin% ptraa vertice/ ;nicio 0tr prin 5ientras 2ptrinfo EF elem/ y 2ptr EF nil/ 0tr ptrsig 'in mientras 'in

4 7Is=ue*a *e una a!"s#a: Se trata de !uscar una arista dados sus campos de informacin origen y destino. Devuelve un puntero a la lista de aristas ,ue apunta a esa arista o >il si no e$iste. 0rocedimiento !uscaraarista 2prin% ptraa veriticeD orig%EtipoFD des%EtipoFD entAsal ptr% ptraa aristaD entAsal p1% ptraa verticeD entAsal p2% ptraa vertice/ ;nicio Iuscaranodo 2prin,orig,p1/ Si p1 J nil #ntonces escri!ir L>o e$iste el nodo origenM Sino !uscaranodo 2prin,des,p2/ Si p2 J nil #ntonces escri!ir L>o e$iste el nodo destinoM Sino ptr p1ady 5ientras 2ptr EF nil/ y 2ptrdes EF p2/ 0tr ptrenl 'in mientras 'in si 'in si 'in 4 Inse!+"-n *e un n * : 0rimero de!emos mirar si no e$iste un nodo ,ue contenga esa informacin y para insertar el nodo lo insertamos por el principio. 0rocedimiento insertaranodo 2entAsal prin% ptraa verticeD elem% EtipoF 0<=;>4 1"G?1&

6ar >uevo% ptraa verticeD ;nicio Si >D;S0 J >il #ntonces escri!ir L>o -ay memoriaM Sino nuevo >D;S0 >D;S0 >D;S0Sig >uevoinfo elem >uevoady >il >uevosig prin 0rin nuevo 'in si 'in

4 Inse!+"-n *e una a!"s#a: 0rimero -ay ,ue compro!ar si e$isten los nodos origen y destino, luego -ay ,ue compro!ar ,ue no e$iste una arista igual en esa direccin y para insertarla, como el orden no importa se inserta por el principio. 0rocedimiento insertaraarista 2prin% ptraa verticeD orig%EtipoFD dest%EtipoFD entAsal p1% ptraa verticeD entAsal p2% ptraa vertice/ 6ar >uevo, pa% ptraa arista ;nicio Si 4D;S0 J >il #ntonces escri!ir L>o -ay memoriaM Sino !uscaraarista 2prin,orig,des,pa,p1,p2/ Si pa EF nil #ntonces escri!ir LLa arista ya e$isteM Sino >uevo 4D;S0 4D;S0 4D;S0Sig >uevodest p2 >uevoenl p1ady 01ady nuevo 'in si 'in si 'in 4 7 !!a* *e una a!"s#a:

0<=;>4 1"1?1&

0rocedimiento !orraraarista 2prin% ptraa verticeD orig%EtipoFD des%EtipoFD p1% ptraa verticeD p2% ptraa vertice/ 6ar 4ct, ant, pa% ptraa arista ;nicio Iuscaraarista 2prim,or,dest,pa,p1,p2/ Si pa J nil #ntonces escri!ir LLa arista ya e$isteM Sino ant nil 4ct p1ady 5ientras 2actdest EF p2/ y 2act EF nil/ 4nt act 4ct actenl 'in mientras 4ntenl actenl Si ant J nil #ntonces p1ady p1adyenl Sino antenl actenl 'in si 4ctenl 4D;S0 4D;S0 act 'in si 'in 4 7 !!a* *e un n * : 0rimero -ay ,ue compro!ar si e$iste el nodo y despu@s se !orran todas sus aristas. 0rocedimiento !orraranodo 2entAsal prin% ptraa verticeD info%EtipoF/ 6ar 0tr, p1, p2, act, ant% ptraa vertice 0a, !orrado% ptraa arista ;nicio Iorraranodo 2prin,elem,ptr/ Si ptr J nil #ntonces escri!ir L>o e$iste el nodo a !orrarM Sino act prin 5ientras act EF nil Iorraraarista 2prin,actinfo,elem/ 4ct actsig 'in mientras 4ctenl 4D;S0 4D;S0 ptrady SSLS #> 0S#*DSCdD;=S 0trady >il Iorrado ptrady 5ientras !orrado EF nil Iorraraarista 2prin,elem,!orradodestinoinfo/ 0<=;>4 1"2?1&

#> C*4LK*;#3

Iorrado !orradoenl 'in mientras 4ntnil 4ctprin 5ientras 2act EF nil/ y 2actinfo EF elem/ 4nt ant 4ct actsig 'in mientras Si ant J nil #ntonces prin prinsig Sino antsig actsig 'in si 4ctsig >D;S0 >D;S0 act 'in si 'in

L#>=*4c#

;. APLICACIONES DE LOS GRAFOS: - Se pueden representar transformaciones de estado con los grafos. - Sirven en diversos campos de investigacin para encontrar el m@todo m+s corto y ,ue cueste lo menos posi!le. - 0ara el +lge!ra se utili.a la matri. de adyacencia.

EJERCICIOS: TEMA 12
1. #n un +r!ol !inario de !:s,ueda, dar todos los elementos inferiores a uno dado con informacin elem. 0rocedimiento !uscar 2rai.% ptraa nodoaarD entAsal ptr% ptraa nodoaarD elem% EtipoF/ ;nicio 0tr rai. 5ientras 2ptrinfo EF elem/ y 2ptr EF nil/ Si ptrinfo F elem #ntonces ptr ptrder Sino ptr ptri., 'in si 'in mientras 'in 0rocedimiento inorden 2ptr% ptraa nodoaar/ ;nicio Si ptr EF nil #ntonces inorden 2ptri.,/ #scri!ir 2ptrinfo/ ;norden 2ptrder/ 0<=;>4 1"3?1&

'in si 'in 0rocedimiento inferiores 2rai.% ptraa nodoaarD elem% EtipoF/ 6ar 0tr% ptraa nodoaar ;nicio Iuscar 2rai.,ptr,elem/ Si ptr J nil #ntonces escri!ir L#l elemento no e$isteM Sino inorden 2ptri.,/ 'in si 'in 2. Listar en orden descendente el valor de todos los nodos de un +r!ol !inario de !:s,ueda. 0rocedimiento decreciente 2p% ptraa nodoaar/ ;nicio Si p EF nil #ntonces decreciente 2pder/ #scri!ir pinfo Decreciente 2pi.,/ 'in si 'in

3. #ncontrar el m+$imo valor de un +r!ol !inario de !:s,ueda. 0rocedimiento !uscaama$ 2rai.% ptraa nodoaar/ 6ar 0tr% ptraa nodoaar ;nicio 0tr rai. 5ientras ptrder EF nil 0tr ptrder 'in mientras #scri!ir ptrinfo 'in 4. Iorrar el elemento menor de un +r!ol !inario de !:s,ueda. 0rocedimiento !orraramin 2entAsal rai.% ptraa nodoaar/ 6ar 0ad, ptr% ptraa nodoaar ;nicio Si rai. J nil #ntonces escri!ir L<r!ol vacioM Sino pad nil 0tr rai.

0<=;>4 1"4?1&

5ientras ptri., EF nil 0ad ptr 0tr ptri., 'in mientras Si pad J nil #ntonces rai. ptrder Sino padi., ptrder 'in si 0tri., D;S0 D;S0 ptr 'in si 'in

. #ncontrar el segundo elemento mayor de un +r!ol !inario de !:s,ueda. 0rocedimiento Dosamayor 2rai.% ptraa nodoaar/ 6ar 0ad,ma$,ma$2% ptraa nodoaar ;nicio Si rai. J nil #ntonces escri!ir L<r!ol vacioM Sino pad nil 5a$ rai. 5ientras ptrder EF nil 0ad ma$ 5a$ ma$der 'in mientras Si ptri., J nil #ntonces si pad EF nil #ntonces escri!ir L#l segundo mayor esM padinfo 'in si Sino ma$2 ptri., 5ientras ma$2der EF nil 5a$2 ma$2der 0<=;>4 1" ?1&

'in mientras #scri!ir L#l segundo mayor esM ma$2info 'in si 'in si 'in ". 47adir un !ucle en el nodo con informacin elem. 0rocedimiento insa!ucle 2prin% ptraa verticeD elem% EtipoF/ 6ar 0tr% ptraa vertice >uevo% ptraa arista ;nicio Iuscaranodo 2prin,elem,ptr/ Si ptr J nil #ntonces escri!ir L>o e$iste el nodoM Sino nuevo 4D;S0 4D;S0 4D;S0sig >uevoder ptr >uevoenl ptrady 0trady nuevo 'in si 'in

&. Dado un grafo, determinar si un nodo con informacin elem es un nodo fuente 2,ue no le lleguen aristas/ 0rocedimiento nodoafuente 2prin% ptraa verticeD elem% EtipoF/ 6ar 0tr, pn% ptraa vertice 'uente% !oolean 0a% ptraa arista ;nicio Iuscaranodo 2prin,elem,ptr/ Si ptr J nil #ntonces escri!ir L#l nodo no e$isteM Sino si ptrady J nil #ntonces escri!ir L>odo sin aristas de origenM Sino fuente verdadero 0n prin 5ientras 2pn EF nil/ y 2fuente J verdadero/ 0a pnady 5ientras 2pa EF nil/ y 2fuente J verdadero/ Si padest J ptr #ntonces fuente falso

0<=;>4 1""?1&

Sino pa paenl 'in si 'in mientras 0n pnsig 'in mientras Si fuente J verdadero #ntonces escri!ir LSi es un nodo fuenteM Sino escri!ir L>o es un nodo fuenteM 'in si 'in si 'in si 'in

(. Dado un grafo en ,ue cada arista tiene un peso asociado, determinar ,ue aristas del grado pesan m+s de 1GG, dando la informacin del nodo origen y destino. 9ipo aristaapeso% registro Des% ptraa vertice #nl% ptraa aristaapeso 'in registro 0rocedimiento arapeso 2prin% ptraa vertice/ 6ar 0n% ptraa vertice 0a% ptraa aristaapeso ;nicio 0n prin 5ientras pn EF nil 0a pnady 5ientras pa EF nil Si papeso F 1GG #ntonces escri!ir LSrigenM pninfo Sino escri!ir LDestinoM padesinfo 'in si 0<=;>4 1"&?1&

0a paenl 'in mientras 0n pnsig 'in mientras 'in

TABLAS DE DECISIN: TEMA 13


1. 2. 3. 4. Ku@ es una ta!la de decisin. 9ipos de ta!las. Construccin de ta!las. Conversin de ta!las a programas.

1. Q'H ES 'NA TA7LA DE DECISIN: *na ta!la de decisin es una -erramienta ,ue me va a servir para representar de manera m+s f+cil la lgica de un pro!lema cuando est+ es mas o menos complicada. 0ara ello se trata de identificar en el pro!lema las acciones ,ue -ay ,ue ejecutar y las condiciones ,ue se tienen ,ue cumplir para ejecutar esas acciones. Las acciones normalmente las vamos a identificar a trav@s de los ver!os, y las condiciones van a ser las condicionales 2si,.../. La ta!la va a tener 4 partes% Conjunto de condiciones o entradas #ntrada de condiciones com!inacin de condiciones

0<=;>4 1"(?1&

Conjunto de acciones o salidas

#jecucin de acciones salida de acciones

Conjunto de condiciones% Son las condiciones ,ue intervienen en el pro!lema. #ntrada de condiciones% Son las com!inaciones posi!les entre los valores de las condiciones. S;, >S, D4 ;=*4L. Conjunto de acciones% 4!arca todas las acciones ,ue se tienen ,ue ejecutar cuando se cumplen un conjunto dado de condiciones. Salida de ejecucin% Se determina cuando se ejecuta cada accin. Qu es una !egla *e *e+"s"-n%: #s una com!inacin de un estado en la entrada de condiciones y de una o m+s acciones asociadas en la parte de la salida de acciones asociadas en la parte de la salida de acciones siendo > el n:mero de condiciones y consider+ndolas como !inarias 2S;?>S/ -a!r+ un n:mero m+$imo de 2 elevado a > reglas. Cada regla e,uivale desde el parte de vista de programacin a una estructura si.. entonces, y en cada momento solo se puede cumplir una regla. Las ta!las de decisin las podemos usar para controlar la lgica de control de un programa, en los manuales de usuario para controlar un programa, para sa!er cuando se actuali.a un fic-ero,...

#jemplo% Si me -acen fijo me compro un corsa, si me -acen fijo y me su!en el sueldo me compro un familiar, y si me toca la loter8a me compro un I5e. C1% 'ijo ? no fijo C2% Salario ? no salario C3% Loter8a ? no loter8a 'ijo Salario Loter8a >o coc-e Corsa 'amiliar I5e S S S S S > f f f S > S S > > f 41% >o compro un coc-e 42% Compro un corsa 43% Compro un familiar 44% Compro un I5e > S S f > S > f > > S f > > > f

2. TIPOS DE TA7LAS: - SegIn el )lan#ea$"en# : 0<=;>4 1")?1&

- 0ropias% Solo tienen reglas simples, solo -ay S; ? >S. - ;mpropias% Son las ,ue tienen reglas compuestas 2S;?>S?;>D;'#3#>C;4/. SegIn en#!a*as: - Limitadas% Cuando las reglas son S ? > ? A ? f 2Si se ejecuta para las acciones/. - #$tendidas% Cuando los valores ,ue toman las condiciones son diferentes de S; ? >S, y las acciones son distintas de si se ejecuta o no se ejecuta.

#n cual,uier caso, siempre se puede traducir una ta!la mi$ta a una ta!la limitada. Cada condicin dar+ igual a tantas condiciones simples como valores pueda tomar, y para cada accin tantas acciones como estados pueda tomar. La ventaja de las ta!las mi$tas y e$tendidas es ,ue se ve mejor a primera vista, el inconveniente es ,ue son m+s dif8ciles de programar. SegIn el #!a#a$"en# : - 4!iertas% Cuando desde una ta!la se -ace referencia a otra ta!la, pero luego no se vuelve a la inicial. - Cerradas% Lo mismo ,ue la anterior, pero se vuelve a la original. - Iucles% Cuando una ta!la se llama a s8 misma.

T") s *e !eglas: >ormalmente las reglas de una ta!la se consideran como reglas 4>D, se tienen ,ue cumplir todos los valores de las condiciones para ,ue se ejecute la opcin asociada a esa regla. Si se implementa como reglas S3, significa ,ue con ,ue se cumpla una sola regla, se ejecuta la accin asociada. Las reglas #LS# se -acen cuando un conjunto de reglas de una ta!la dan todas lugar a la misma accin, entonces se asocian todas como una regla #LS#.

&. CONSTR'CCIN DE TA7LAS: 0rimero locali.amos las condiciones en el enunciado, despu@s las acciones y las reglas entre las acciones y las condiciones. Despu@s comprue!o ,ue la ta!la sea correcta. Kue no ocurran% - 3edundancias% 0oner la misma regla m+s de una ve.. - Completa% Kue no falte alguna regla. - Contradictoria% Kue la misma accin de lugar a cosas contradictorias. Despu@s se mira a ver si se puede simplificar la ta!la, a7adiendo si es posi!le indiferencias 2cada una sustituye a 2 reglas/. *na ta!la se puede simplificar si -ay 2 reglas ,ue dan lugar a la misma accin o conjunto de acciones y solo se diferencia en el estado o valor de una de sus condiciones, entonces sustituyo esas 2 reglas por una sola, ,ue tenga para esa condicin el valor de indiferencia. 'ijo Salario Loter8a >o coc-e Corsa S S S S S > S > S S > > f 0<=;>4 1&G?1& > S S f > S > f > > S f > > > f

'amiliar I5e

f f f

0. CON3ERSIN DE TA7LAS A PROGRAMAS: 0rimero -ay ,ue ver si se puede simplificar la ta!la. Nay 2 formas de -acer la conversin% - 0rogramacin directa% Kue cada regla e,uivale a una sentencia condicional. #s muy ineficiente. - 0asar la ta!la de decisin a flujograma mediante el siguiente el m@todo% 1. 0ara cada regla al final de su columna ponemos el n:mero de reglas simples a las ,ue e,uivale. Cada indiferencia de una regla e,uivale a 2 reglas simples. 2. 0ara cada condicin al final de su fila -allamos un coeficiente ,ue resulta de la suma de los valores de las reglas para las ,ue esa condicin valga indiferente, cuanto menor sea ese valor, m+s importante es esa regla, por,ue va a tener menos reglas para las ,ue esa condicin es indiferente. 3. #lijo la condicin con menor valor en su coeficiente, si -ay varias condiciones ,ue tienen el mismo valor en su coeficiente y adem+s es el menor, -allo un segundo coeficiente ,ue se o!tiene por la diferencia en valor a!soluto de la diferencia entre el n:mero de S; y >S en valor a!soluto de esas condiciones, y elijo la ,ue tenga la diferencia mayor, y si sigue -a!iendo empate cojo cual,uiera de ellas. 4. 0ara la regla elegida o!tengo otras 2 ta!las, ,ue se caracteri.an por,ue no contienen ya a la condicin por la ,ue -e dividido las ta!las, y una ta!la contiene las reglas para las ,ue esa condicin contiene valor S;, y la otra contiene las reglas para las ,ue la condicin es >S, y para las reglas con condicin indiferencia las pongo en las 2 ta!las, y con las 2 ta!las vuelvo a -acer otra ve. lo mismo -asta ,ue no se pueda dividir m+s, y cada ve. ,ue se -ace una divisin pago la condicin en el flujograma.

#jemplo anterior% 'ijo Salario Loteria >o coc-e Corsa 'amiliar I5e 'ijo S; Salario Loteria >o coc-e Corsa 'amiliar A S S > f > > f 2 G S A S S S > f f 2 1 1 4 S > > f > A A f G " 4

0<=;>4 1&1?1&

I5e 'ijo >S Salario Loteria >o coc-e Corsa 'amiliar I5e

f 2

A A f

Si Si Loteria I5e Si 'amiliar Salario >o Corsa >o

'ijo >o coc-e

>o

Si no fijo #ntonces escri!ir L>o coc-eM Sino si loteria #ntonces escri!ir LI5eM Sino si salario #ntonces escri!ir L'amiliarM Sino escri!ir LCorsaM 'in si 'in si 'in si

0<=;>4 1&2?1&

EJERCICIOS: TEMA 13
1. Dado un fic-ero de empleados ordenado por n:mero de empleado con el formato, n:mero de empleado, antigXedad, se$o, categor8a, se trata de -allar mediante ta!las de decisin ,ue prima reci!e cada empleado sa!iendo ,ue% 4% 5ujeres ,ue son jefes. I% 5ujeres empleadas con antigXedad y -om!res empleados. C% Nom!res ,ue son jefes. D% Sin prima. #l resto. Nacer la ta!la de decisin y el flujograma. 4ntiguedad 5ujer cefe 4 I C D S S S f S > S f f S S > f S > > f f > S S f > S > > > S > > > f

0<=;>4 1&3?1&

4ntiguedad 5ujer cefe 4 I C D cefe S; 4ntiguedad 5ujer 4 I C D cefe >S 4ntiguedad 5ujer 4 I C D

A S S f

A > S f

S A > f

> S >

> > > f

4 2 G

2 A S f

2 A > f

2 4 G

f 1

2 S A f

2 > S > > f G 2

f 1

cefe 5ujer I 4 C D 5ujer I 4ntiguedad

Si jefe #ntonces si mujer #ntonces escri!ir L4M Sino escri!ir LCM 'in si Sino si antigXedad #ntonces escri!ir LIM

0<=;>4 1&4?1&

Sino si mujer #ntonces escri!ir LDM Sino escri!ir LIM 'in si 'in si 'in si

0<=;>4 1& ?1&

Potrebbero piacerti anche