You are on page 1of 184

ALGORITMOSYPROGRAMAS:

TEMA1:
1.
2.
3.
4.
5.
6.
7.
8.
9.

Sistemasdeprocesamientodelainformacin.
Conceptodealgoritmo.
Lenguajedeprogramacin.
Datos,tiposdedatosyoperacionesprimitivas.
Constantesyvariables.
Expresiones:tiposyoperadores.
Funcionesinternas.
Laoperacindeasignacin.
Entradaysalidadelainformacin.

1.SISTEMASDEPROCESAMIENTODELAINFORMACIN:
Un ordenador es una mquina de procesamiento de informacin. Es una
mquinaporquetienecables,chips,...,procesaporqueescapazdeprocesarcosas,e
informacinporquemanejaconjuntosordenadosdedatos).
Paraprocesarlainformacinestelhardware(microprocesador,RAM,...),yel
software(quesirveparamanejarelhardware).
2.CONCEPTODEALGORITMO:
Elalgoritmotrataderesolverproblemasmedianteprogramas.
Fases:
- Anlisis preliminar o evaluacin del problema: Estudiar el problema en
generalyverquepartenosinteresa.
- Definicinoanlisisdelproblema:Verqueesloqueentrayqueesloque
sale,lasposiblescondicionesorestricciones,...
- Diseodelalgoritmo:Disearlasolucin.
- Elprograma:Codificacindelalgoritmoenunlenguajedeprogramacin.
- Ejecucin del programa y las pruebas: Ver si el programa hace lo que
queramos.
Quesunalgoritmo?:
Es una formula para resolver un problema. Es un conjunto de acciones o
secuencia de operaciones que ejecutadas en un determinado orden resuelven el
problema.Existennalgoritmos,hayquecogerelmsefectivo.
Caractersticas:
- Tienequeserpreciso.
- Tienequeestarbiendefinido.
- Tienequeserfinito.
Laprogramacinesadaptarelalgoritmoalordenador.
Elalgoritmoesindependientesegndondeloimplemente.
3.ELLENGUAJEDEPROGRAMACIN:
Existendiferentestipos,debajonivelydealtonivel.
Instruccionesenunacomputadoraysustipos:

PGINA1/184

Unainstruccinescadapasodeunalgoritmo,peroqueloejecutaelordenador.
Unprogramaesunconjuntodeinstruccionesqueejecutadasordenadamenteresuelven
unproblema.

Tiposdeinstrucciones:
- E/S:Pasarinformacindelexterioralinteriordelordenadoryalrevs.
- Aritmticolgicas:Aritmticas:+,,*,...;Lgicas:or,and,<,>,...
- Selectivas: Permiten la seleccin de una alternativa en funcin de una
condicin.
- Repetitivas:Repeticindeunnmerodeinstruccionesunnmerofinitode
veces.
Tiposdelenguajes:
- Lenguaje mquina: Todo se programa con 1 y 0, que es lo nico que
entiendeelordenador.
Ventaja:Nonecesitasertraducido.
Inconveniente:Ladificultad,laconfusin,paracorregirerrores,espropiade
cadamquina.
- Debajoniveloensamblador:Seutilizanmnemotcnicos(abreviaturas).
Ventaja:Noestandifcilcomoellenguajemquina.
Inconvenientes: Cada mquina tiene su propio lenguaje, necesitamos un
procesodetraduccin.
Elprogramaescritoenensambladorsellamaprogramafuenteyelprogramaquese
obtienealensamblarlosellamaprogramaobjeto.
- Lenguajesdealtonivel:Losmscercanosallenguajehumano.
Ventaja: Son independientes de cada maquina (los compiladores aceptan las
instruccionesestndar,perotambintieneninstruccionespropias).
Inconveniente:Elprocesodetraduccinesmuylargoyocupamsrecursos.
Aprovechamenoslosrecursosinternos.
Procesodetraduccinyejecucindeunprogramaescritoenunlenguajeaalto
nivel:
Usamosuneditoryobtenemoselprogramafuente,yelcompiladoreselque
traduceelprogramaallenguajemquina.Elcompiladorinternamentehasidodiseado
paratraducir.
Elcompiladorobtieneelprogramaoelficheroobjeto.Elcompiladortieneque
buscarloserrores.
Normalmentenosaleunejecutable,sinoquenecesitaelementos,libreras,...
Medianteunlinkadorjuntamoselprogramaobjetoylaslibreras,yseformaun
programaejecutable.
Cuandoseejecutaelprograma,elcargadorllevaalprogramaamemoriapara
questepuedaserejecutable.
Debbuger:Depuraelprogramaejecutndolopasoapaso,viendolamemoria
pasoapasoparaencontrarelerror.

PGINA2/184

Programafuente(Editor)
Compilador
Error

ProgramaobjetoLibrerias

Linkador
Ejecutables
Paratraducirpuedoutilizarelcompiladorouninterprete,conelcompiladorcojo
todoelprogramaalcompletoyelinterpreteleecadainstruccinylovaejecutando.
Elinterpreteesmsrpido,peromenoseficiente.
Todosloslenguajestienencompiladores,peronotodostieneninterpretes.
LISP(Lenguajedeinteligenciaartificial):Slotieneinterpretes.
4.DATOS,TIPOSDEDATOSYOPERACIONESPRIMITIVAS:
Dato:Esunobjetooelementoquetratamosalolargodediversasoperaciones.
Tienen3caracteristicas:
- Unnombrequelosdiferenciadelresto.
- Untipoquenosdeterminalasoperacionesquepodemoshacerconesedato.
- Unvalorquepuedevariaronoalolargodelaoperacin.
Existendiferentestiposdedatos.
Caracteristicasdelostipos:
- Cadatiposerepresentaoalmacenadeformadiferenteenlacomputadora.
Bit:1/0;Byte=8bits.
- Untipoagrupaalosvaloresquehacenlasmismasoperaciones.
- Sitienedefinidaunarelacindeordenesuntipoescalar.

PGINA3/184

Cardinalidaddeuntipo:Nmerodevaloresdistintosquepuedetomarun
tipo.
Puedenserfinitos(caracteres),ysisoninfinitoselordenadorlostomacomo
finitosporqueestalimitadoporeltamaodelosbytesenelquelacifraes
almacenada.
Losdatospuedenser:
- Simples:Unelemento.
- Compuestos:Varioselementos.
-

Lostipospuedenser:
- Estandar:Quevienenenelsistemapordefecto.
- Noestandar:Sonlosquecreaelusuario.
Lostipossimplesmsimportantesson:
- Numricos.
- Lgicos.
- Caracteres.
Numricos:
- Entero:Subconjuntofinitodelconjuntomatemticodelosnumrosenteros.
Notienepartedecimal.Elrangodelosvaloresdependedeltamaoquese
lesdaenmemoria.
- Real: Subconjunto finito del conjunto matemtico de los nmeros reales.
Llevansignoypartedecimal.Sealmacenanen4Bytes(dependiendodelos
modificadores).Siseutilizannmerosrealesmuygrandes,sepuedeusar
notacincientficaquesedivideenmantisa,baseyexponente;talqueel
valorseobtienemultiplicandolamantisaporlabaseelevadaalexponente.
Lgicosobooleanos:
- Aquelqueslopuedetomarunodelosdosvalores,verdaderoofalso(1/0).
Carcter:
- Abarca al conjunto finito y ordenado de caracteres que reconoce la
computadora(letras,digitos,caracteresespeciales,ASCII).
TipodecadenaoString:Conjuntodecaracteres,quevanaestarentre.
Elpropiolenguajepuedeaadirmstipos,osepuedenaadirmodificadores.
Entero:IntLongint
Enalgunoslenguajessedefinentiposespecialesdefechayhora,sobretodoen
losmsmodernos.
5.CONSTANTESYVARIABLES:
- Constantes:Tienenunvalorfijoqueseledacuandosedefinelaconstantey
queyanopuedesermodificadodurantelaejecucin.
- Variables: Elvalorpuedecambiardurantelaejecucindelalgoritmo,pero
nuncavariasunombreysutipo.
Antesdeusarunavariablehayquedefinirlaodeclararla,alhacerlohayquedar
sunombreysutipo.Elnombrequeledamostienequeserunnombresignificativo,vaa
PGINA4/184

serunconjuntodecaracteresquedependiendodellenguajehayrestricciones.Tieneque
empezarporunaletra,yeltamaodependedellenguaje.
Identificador:Palabraquenoespropiadellenguaje.
Elvalordelavariablesialdeclararlanoselainicializa,enalgunoslenguajes
tomaunapordefecto.Encualquiercasoelvalordelavariablepodemosdarleunoincial
opodemosirvariandoloalolargodelaejecucin.
Las constantes pueden llevar asociados un nombre o no, si no lo llevan, se
llamanliterales.Suvalorhayquedarloaldefinirlaconstanteyyanopuedecambiara
lolargodelaejecucin,yencuantoaltipo,dependiendodeloslenguajesenalgunos
hayqueponerlo,yenotrosnohacefaltaponerloporquetomaeltipodeldatoquesele
asigna.ConstPI=3,1416.
Hayqueinicializartodaslasvariables.
<>Hayqueponeralgoobligatoriamente.
[]Puedellevaralgoonollevarlo.
Laventajadeusarconstantesconnombreesqueencualquierlugardondequiera
quevayalaconstante,bastaconponersunombreyluegoelcompiladorlosustituirapor
suvalor.
Lasconstantessinnombressondevalorconstante:5,6,a,hola.
Cuandounacadenaesdetipocarcter,seencierraentrea.
Relacinentrevariablesyconstantesenmemoria:
Al detectar una variable o una constante con nombre, automaticamente se
reservaenmemoriaespacioparaguardaresavariableoconstante.Elespacioreservado
dependedeltipodelavariable.
Enesazonadememoriaesenlaqueseguardaelvalorasociadoalavariableo
constanteycuandoelprogramauseesavariable,iraaesazonadememoriaabuscarsu
valor.
6.EXPRESIONES:TIPOSYOPERADORES:
Unaexpresinesunacombinacindeconstantes,variables,signosdeoperacin,
parntesis y nombres especiales (nombres de funciones estandar), con un sentido
unvocoydefinidoydecuyaevaluacinresultaunnicovalor.
Todaexpresiontieneasociadauntipoquesecorrespondeconeltipodelvalor
que devuelve la expresion cuando se evalua, por lo que habr tantos tipos de
expresionescomotiposdedatos.Habraexpresionesnumricasylgicas.
Numricas:Operadoresaritmticos.
Son los que se utilizan en las expresiones numricas (una combinacin de
variables y/o constantes numricas con operadores aritmticos y que al evaluarla
devuelveunvalornumrico.
+,,*,/.
Operacinresto:Loquedevuelveeselrestodeunadivisinentera.
Mod:Pascal.5mod3=2
%:C.
Divisinentera:Nosdevuelveelcocientedeunadivisinentera(enlaquenosesacan
decimales).
Div:Pascal.5div3=1
\:C.
Potencia:^5^2.

PGINA5/184

Todosestosoperadoressonbinarios(eloperadorsesituaenmedio),elmenos
tambienpuedeserunario(llevaunnicooperando)ysignificasignonegativo.
Reglasdeprecedencia:
Elproblemaescuandounaexpresinenterasegncomolaevaluepuedadar
diferentesvalores.
7*3+425
49
La solucin es aplicar prioridad entre los operadores, de modo que ante la
posibilidaddeusarvariossiempreaplicaremosprimeroeldemayorprioridad.
Cadalenguajepuedeestablecersuspropiasreglasdeprioridadoprecedenciade
operadores.Sinonosacordamos,siemprepodemosponer().
1)^
2)*/divmod
3)+
Entre dos operaciones que tienen la misma precedencia para resolver la
ambigedad, hay que usar la regla de la asociatividad. La ms normal es la de la
asociatividadaizquierdas(primerolodelaizquieda).
Expresioneslgicas:Operadoresrelacionalesylgicos.
Unaexpresinlgicaesaquellaqueslopuededevolverdosvalores(Verdadero
o Falso).Los valores quepueden aparecer enunaexpresin lgica sonde2tipos:
lgicosyrelacionales.
Laparticularidaddelasexpresioneslgicasesquemientrasenunaexpresin
numricapordevolverunvalornumricolosoperandossolopuedensernmeros,en
unaexpresinlgicalosoperandosnotienenporqueserbooleanosaunquesedevuelva
un valor booleano. Esto es lo que ocurre cuando en la expresin lgica utilizamos
operadoresrelacionalesconlocualseobtienenvaloreslgicosobooleanosapartirde
otrosquenoloson.
Encambiocuandolosoperadoressonlgicoslosoperandosobligatoriamente
tambientienenqueserlgicos.
Operadoresrelacionales:
<
>
=
<>enC:!=

<Operando1>operador<Operando2>
5
>
3
Verdadero
Cmoseevaluaunaexpresinrelacional?:
- Primeroseevaluaelprimeroperandoysesustituyeporsuvalor.
- Luegoseevaluaelsegunooperandoysesustituyeporsuvalor.
- Finalmenteseaplicaeloperadorrelacionalysedevuelveelvalorbooleano
correspondiente.
((3*2)+15^2)<(21)
18
<1Verdadero.
Elproblemadeltiporeal:

PGINA6/184

Desdelainformtica,losnumerosrealessonfinitos,yaquetenemosunmximo
decifrasdecimales.Cuandotrabajamosconun=,matematicamentedaunvalorexacto,
peroinformaticamentenoesexacto.
1/5*5=1
1.0/5.0*5.0<>1.0
Soluciones:
- Laquenosaporteelpropiolenguajedeprogramacin.Seconsideraunvalor
deerror.
- Trabajarconnmerosenterossiemprequeseaposible.
- Utilizarlascomparaciones<>envezdesiesposible.
- Si hay que preguntar por igual, cambiar la condicin utilizando valores
absolutosyunvalormnimodeerror.
Siladiferencia<0.00000001yABS(AB)<min;soniguales.
Operadoreslgicos:
El problema es que a veces queremos preguntar o evaluar por ms de una
condicinalmismotiempoyparaestoestanlosoperadoreslgicos.
Yand&&
Oor!!
Nonot~!
Y,O,sonoperadoresbinarios(necesitan2operandosdetipologico).
Operando1OperadorOperando2
ElNoesunarioysecolocaprimeroelNo,ydespueseloperando.
Elresultadoeslgicoydependede:
Operando1
Operando2
AND
V
V
V
V
F
F
F
V
F
F
F
F
ElNoniega:

NOT
V
F

1/0
F
V

Prioridadesdelosoperadores:
- LomsprioritarioeselNOT
- LuegoelYyelO.
- <,>=,...
Tabladeprioridades:
^NO
/divmody
+O
<,>,=,<>,...
7.FUNCIONESINTERNAS:
PGINA7/184

OR
V
V
V
F

Sonfuncionesmatemticas diferentesdelasoperacionesbsicasperoquese
incorporan al lenguaje y que se consideran estandar. Dependen del lenguaje.
Normalmenteseencuentranenlalibreradematemticasdellenguajedeprogramacin.
Frmulas:
Abs(x)
Arctan(x)
Cos(x)
Sen(x)
Exp(x)
Ln(x)
Log10(x)
Redondeo(x)
Trunc(x)
Cuadrado(x)
Raiz(x)
8.OPERACINDEASIGNACIN:
Consiste en atribuir un valor a una variable. El valor sera una expresin
(constante,variable,...).
Otroslenguajes=,:=
Variablealaqueseleasignaelvalorelvalorquelevamosaasignar.
A5
EnCA==BComparacin
A=BAsignacin
EnPascalA:=BAsignacin
A=BComparacin
Elprocesodeasignacionserealizaen2fases:
- Seevalalaexpresindelapartederechadelaasignacinobteniendoseun
nicovalor.
- Seasignaesevaloralavariabledelaparteizquierda.
Quesloquehayquetenerencuenta?:
- Enlaparteizquierdaslopuedehaberunavariable.
- Lavariablealaqueseleasignaelvalorpierdesuvaloranterior.
- Lavariablequeapareceenladerechayaquecomoseevaluaprimerola
deladerechacuandosetengaqueevaluarelvalordeesavariablesetomara
suvalorantiguo.
- ELTIPODELVALORQUESEOBTIENEALEVALUARLAPARTE
DERECHA TIENE QUE SER EL MISMO QUE EL TIPO DE LA
VARIABLEDELAPARTEIZQUIERDA,ESDECIRAUNAVARIABLE
SOLOSELEPUEDENDARVALORESDESUMISMOTIPO.
EnPascaldaunerror.
EnC,nodaerrorporqueelcompiladortruncaelnumero.
A:entero
A2
A3*A+A=8
PGINA8/184

9.ENTRADAYSALIDADELAINFORMACIN:
Lasdosoperacionesbsicasdecadasalidasonlasdelecturaydeescritura.La
lecturaesequivalentealaasignacinencuantoquevaahaberunavariableque
recibeunvalor,peroestevalornoresultadeevaluarningunaexpresin,sinoqueel
valorlovamosaleerdeundispositivoexternodeentrada.
Leer(nombredelavariable)
Elvalorintroducidoporeldispositivoexterno,tienequeserdelmismotipodel
quelavariablequeseleasigne.
Laoperacindeescrituraloquehaceesmostrarelvalordeunavariableenun
dispositivoexternodesalida.
Escribir(variable)
Laoperacindeescrituranoesunaoperacindestructivoenmemoria.
Alpedirunvaloralusuariohayquedecirlequeesloqueselequierepedir
escribiendounmensaje.

EJERCICIOS:TEMA1
1.

A(3*2^5mod1+8*(35)<(2+81mod1)
A(3*32mod1+(16))<10
A16<10
AVerdadero

1.1.AAo(3+5*8)<3y((6/3div4)*2<2)
AVerdaderoo43<3y(0*2<2)
AVerdaderooFalsoyVerdadero
AVerdaderooFalso
AVerdadero
2.

B3mod2div3
B1div3
B0

2.1.

C(B*2<>8*3mod4)y(A>B)
C(0<>24mod4)yFalso

PGINA9/184

CFalsoyFalso
CFalso
2.2.

ACono(3=5)y(8<>3+B)
AFalsooVerdaderoyVerdadero
AFalsooVerdadero
AVerdadero

RESOLUCINDEPROBLEMASCONCOMPUTADORAY
HERRAMIENTASDEPROGRAMACIN:
TEMA2
1.
2.
3.
4.
5.
6.
7.

Resolucindeproblemas.
Anlisisdelproblema.
Diseodelalgoritmo.
Resolucinenlacomputadora.
Flujogramas.
DiagramasNSodeNASSISCHEDERMAN
Pseudocdigo.

1.RESOLUCINDEPROBLEMAS:
Laresolucindeunproblemadesdeelpuntodevistaalgortmicotiene3fases:

PGINA10/184

Anlisisdelproblema:Comprensin.
Diseodelalgoritmo:Resolucinalgortmica.
Resolucin en computadora: Implantacin del algoritmo en un lenguaje de
programacin.

2.ANLISISDELPROBLEMA:
Elobjetivodestafaseescomprenderelproblemaparalocualcomoresultado
tenemosqueobtenerlaespecificacindelasentradasysalidasdelproblema.Tieneque
quedarclaroqueentrayquesale.
3.DISEODELALGORITMO:
Unavezcomprendidoelproblemasetratadedeterminarquepasosoacciones
tenemosquerealizarpararesolverlo.
Comocriteriosaseguiralahoradedarlasolucinalgortmicahayqueteneren
cuenta:
1. Sielproblemaesbastantecomplicadolomejoresdividirloenpartesms
pequeaseintentardividirloenpartesmspequeaseintentarresolverlas
porseparado.Estametodologadedivideyvencerstambinseconoce
conelnombredediseodescendente.
2. Lasventajasdeaplicarestoson:
- Aldividirelproblemaenmdulosopartessecomprendemsfcilmente.
- Alhacermodificacionesesmsfcilsobreunmduloenparticularqueentodo
elalgoritmo.
- En cuanto a los resultados, se probarn mucho mejor comprobando si cada
mdulodaelresultadocorrectoquesiintentamosprobardeungolpetodoel
programaporquesiseproduceunerrorsabemosenquemdulohasido.
Unasegundafilosofaalahoradedisearalgoritmos eselrefinamiento por
pasos,yespartirdeunaideageneraleirconcretandocadavezmsesadescripcin
hastaquetengamosalgotanconcretopararesolver.Pasamosdelomscomplejoalo
mssimple.
Larepresentacindelosalgoritmos:
Una vez que tenemos la solucin hay que implementarla con alguna
representacin.Lasrepresentacionesmsusadassonlosflujogramas,losdiagramasNS
yelpseudocdigo.
Tambinlasolucinsepuedeescribirenalgunoscasosenlenguajenaturalpero
nosehaceporqueesmuyambiguo,einclusootrasformasdeexpresincomofrmulas
matemticas.
Escrituradelalgoritmo:
Alescribirelalgoritmohayquetenerencuenta:
- Lasaccionesopasosarealizartienenquetenerundeterminadoorden.
- Encadamomentosolosepuedeejecutarunaaccin.
- Dentro de las sentencias del algoritmo pueden existir palabras reservadas
(palabraspropiasdellenguajedeprogramacinquetienenparaelcompiladorun
determinadosignificado).
- Si estamos utilizando pseudocdigo tenemos tambin que usar la identacin
(aumentalalegibilidaddelproblemaparaquesepuedaleermejor).
PGINA11/184

4.RESOLUCINENLACOMPUTADORA:
Eshacerentendernuestroalgoritmoalacomputadoraparaquelopuedahacer.
1. Codificamoselalgoritmoenunleguajedeprogramacin.
2. Ejecutarelprogramaantescompilado.
3. Comprobarlosresultadosysinofunciona,corregirlo.

5.FLUJOGRAMAS:
Esunanotacingrficaparaimplementaralgoritmos.Sebasaenlautilizacin
deunossmbolosgrficosquedenominamoscajas,enlasqueescribimoslasacciones
quetienequerealizarelalgoritmo.
Lascajasestnconectadasentresporlneasyesonosindicaelordenenelque
tenemosqueejecutarlasacciones.
En todo algoritmo siempre habr una caja de inicio y otra de fin, para el
principioyfinaldelalgoritmo.
Lossmbolos:
Lneas deflujo:Unalneaconunaflechaquesirveparaconectarlos
smbolosdeldiagramaylaflechaindicalasecuenciaenlaquesevanaejecutarlas
acciones.
Smbolo de proceso: Indica la accin que tiene que realizar la
computadora.Dentroescribimoslaaccin.
Representalasaccionesdeentradaysalida.Dentrocolocaremoslas
accionesdelecturayescritura.
Condicin:Dentrosevaacolocarunacondicin.Sirvepara
representarestructurasselectivasyrepetitivasyloquesehace
alencontraresesignoesevaluarlacondicinquehaydentro
talquesegnlacondicinseaverdaderaofalsairemospor
caminosdistintos.

Principioyfin:Dentrodelsmboloiralapalabrainicioofindel
algoritmo.
Subprograma:Dentrosecolocaelnombredelsubprogramaalque
sellama.

Conectores:Nossirvencuandounflujogramanomecabeenunacolumnadelahojay
hayqueseguirenotracolumna:
PGINA12/184

Siesenlamismahoja:

Siesenhojadistinta:

Losconectoresseponenunodondeterminalacolumnayotradondeempieza.
Esunaaclaracinparaentendermejorelcdigo,peronoesparte
delcdigo,noseejecuta.

Otrossmbolos:
Pantalla:Cuandounasalidaesporpantalla.

Teclado:Pararepresentarunaentradaporteclado.

Impresora:

Entrada/Salidapordisco:

*Problema:
Queremos hallar el producto de varios nmeros positivos introducidos por
tecladoyelprocesoterminacuandosemetaunnmeronegativo.
1. Iniciarlavariabledelproducto.
2. Leerelprimernmero.
3. Preguntarsiesnegativoopositivo.
4. Siesnegativonossalimosyescribimoselproducto.

PGINA13/184

5. Siespositivo,multiplicamoselnmeroledoyluegoleemosunnuevonmero,yse
vuelvealpaso3.
Inicio

P1
Leernum

Num>=0EscribirP

PP*numFin
Leernum

5.DIAGRAMASNSODENASSISCHEDERMAN:
Essemejantealflujograma,peorsinflechasycmabiandoalgolossmbolosde
condicinyrepeticin.Lascajasvanunidas.
<accin>
PGINA14/184

Condiciones:
Condicin

SINO
<acc1><acc2>
Repetitivas:
Mientas<cond><acciones>Desdevi=v1hastavn
<acciones>
Repetirhasta<cond><acciones>
Problemaanterior:
Inicio
P1
Leernum
Mientrasnum>=0
Pp*num
Leernum
EscribirP
Fin

6.PSEUDOCDIGO:
Esunlenguajedeespecificacindealgoritmos,peromuyparecidoacualquier
lenguajedeprogramacin,porloqueluegosutraduccinallenguajeesmuysencillo,
PGINA15/184

peroconlaventajadequenoserigeporlasnormasdeunlenguajeenparticular.Nos
centramosmsenlalgicadelproblema.
Elpseudocdigotambinvaautilizarunaseriedepalabrasclaveopalabras
especialesquevaindicandoloquesignificaelalgoritmo.
1. InicioyFin:Pordondeempiezayacabaelalgoritmo.
Begin/end:Pacal.
{
}:EnC.
2. S<cond>
Entonces<acc1> Ifthenelse
Sino<acc2>
3.Mientras<cond>/hacerwhiledo
4.Repetir/hastarepeatuntil
5.Desde/hastafor..to
6. SegnseaCase
Swith
Loscomentariosvanencerradosentrellaves.
Hayqueutilizarlaidentacin.
Algoritmo<nombrealg>
Var
<nombre>:<tipo>
Inicio
<Instrucciones>
Fin

AlgoritmoProducto
Var
P,num:entero
Inicio
P1
Leernum
Mientrasnum>=0hacer
Pp*num
Leernum
Finmientras
Escribirp
Fin

PGINA16/184

EJERCICIOS:TEMA2
1.Realizarunprogramaqueconviertalosgradosaradianes.
Algoritmoconvertir
Var
Grados,rad:real
Inicio
EscribirIntroducelosgrados
Leergrados
Sigrados>=360
Entoncesgradosgradosmod360
Finsi
Radgrados/180
Escribirradradiantes
Fin
2.Realizarunalgoritmoquepidaunvalorenteroqueequivaleaunnmerodedurosy
mecalculeacuantosbilletesde5000,1000,monedasde200,25,1.
Algoritmocambio
Var
Duros:real
Inicio
EscribirIntroducelosduros
Leerduros
Durosduros*5
Escribirdurosdiv5000billetesde5000
Durosdurosmod5000
Escribirdurosdiv1000billetesde1000
Durosdurosmod1000
Escribirdurosdiv200monedasde200
Durosdurosmod200
Escribirdurosdiv25monedasde25
Durosdurosmod25
Escribirdurosmonedasde1
Fin

PGINA17/184

3. Realizar un programa que pida al usuario la velocidad en m/s y el radio de la


circunferenciadelapista,yresultadaelprogramadevuelveeltiempoquetardaelatleta
endar2vueltasalapista,sabiendoqueelatletadescansa1minutocada1000metros.
Algoritmorecorrido
Var
Velocidad,radio,tiempo,longitud:entero
Inicio
EscribirIntroducelavelocidad
Leervelocidad
EscribirIntroduceelradio
Leerradio
Longitud4*3.1416*radio
Descansolongituddiv1000
Tiempolongituddivvelocidad+descanso*60
Escribirtiempo
Fin

PGINA18/184

ESTRUCTURAGENERALDEUNPROGRAMA
TEMA3
1.
2.
3.
4.

Conceptodeprograma.
Instruccionesytipos.
Elementosbsicosdeunprograma.
Estructuradealgoritmosyprogramas.

1.CONCEPTODEPROGRAMA:
Unprogramaesunconjuntodeinstruccionesquealserejecutadasresuelvenun
problema.
Unprogramatiene3partes:
1. Entradadedatos:Normalmentesevaaejecutaratravsdeinstruccionesde
lectura,yenloqueselepidealusuariolainformacinqueelprogramavaa
necesitarparaejecutarseysehaceatravsdelecturas.
2. Accionesdeunalgoritmo:Parteenlaqueseresuelveelproblemausandolos
datosdeentrada.
3. Salida:Mostrarenundispositivodesalidalosresultadosdelasacciones
anteriormenterealizadas.Sonaccionesdeescritura.
Enlapartedelasaccionesaejecutarsedistinguirndospartes:
- Declaracindevariables.
- Instruccionesdelprograma.
2.INSTRUCCIONESYTIPOS:
Paraqueunainstruccinseejecutetienequeserllevadaamemoria.Encuantoal
ordendeejecucindelasinstrucciones,elprogramapuedeserdedostipos:
- Programaslineales:Sevaejecutandounainstruccinmsotrayel
ordendeejecucinesigualalordendeescritura.
- Programasnolineales:Lasinstruccionesnoseejecutanenelmismo
ordenenelqueaparecenescritas,sinoqueserealizansaltosquenos
mandandeunasinstruccionesaotras.
Nuncasedebenhacersaltosnolineales.
Tiposdeinstrucciones:
1. Inicioyfin.
2. Asignacin:Darunvaloraunavariable.
3. Lectura/escritura:IntroducirosacarinformacinpordispositivosE/S.
4. Instruccionesdebifurcacin:Alternanelordendeejecucindelprograma.Saltoa
otrainstruccinquenoeslasiguiente.
4.1. Bifurcacinincondicional:Elsaltoseproducesiemprequeelprogramavayaa
esainstruccin:GotoIra.

PGINA19/184

4.2. Bifurcacin condicional: Se ejecutan un conjunto de instrucciones u otras


dependiendodelvalordevueltoalevaluarunacondicin.
Eslaquevamosausar.
3.ELEMENTOSBSICOSDEUNPROGRAMA:
Queslasintaxisdeunlenguaje?:
Conjuntodereglasquetenemosqueseguiralahoradeescribirunprogramaen
eselenguajetalquesinoseguimosesasreglasdesintaxiselcompiladordaerrores.
Elementosdellenguajedeprogramacin:
1. Palabrasreservadas:Sonunconjuntodepalabrasespecialesquenossirvenpara
definirlaestructuradelprograma,ysolosepuedenusarparaelfinparaelqueestn
reservadas.
2. Identificadores:Sonlosnombresqueaparecenenelprogramadadosporelusuario.
Sonportantolosnombresdevariables,deconstantes,desubprogramasynombres
detiposcreadosporelusuario.
3. Caracteresespeciales:Sirvencomoseparadoresentresentencias,porejemploel;.
4. Instrucciones: De3tipos,secuenciales,repetitivasyselectivas,ypuedenaparecer
elementosespeciales(bucles,contadores,interruptoresyacumuladores).
Bucle:Unconjuntodeinstruccionesqueserepitenunnmerofinito
deveces.Llevaasociadoapartedelasinstruccionesunacondicin
queeslaquedeterminacuandoseterminaunbucle.Ejecucindeun
bucle(iteracin).Losbuclessepuedenanidarunosdentrodeotros,y
puedehabervariosbuclesalmismonivel,peronuncaseentrelazan.
Contador:Unelementocuyovalorseincrementaodecrementaen
unvalorconstanteencadaiteracindeunbucle,yseutilizapara
controlarlacondicindelbucle.
Acumulador:Esunavariablequetambinsesueleusarenlosbucles
yqueseincrementaodecrementaencadaiteracindelbucle,perono
enunacantidadconstante.
Algoritmoejemplo
Varcont,num,sum:entero
Inicio
Cont0
Sum0
Mientrascont<>3
Leernum
Sumsum+num
Contcont+1
Finmientras
Escribirsuma
End

Interruptor (marca, bandera o flag): Es una variable que sirve


comoindicadordeunadeterminadainformacinyquesolopuede
PGINA20/184

tomarunodedosvalores.Elvalordelavariabletieneasociadoun
signoypuedevariaralolargodelaejecucin.

Algoritmoejemplo
Varcont,num,suma:entero
Neg:boolean
Inicio
Cont0
Sum0
Negfalso
Mientrascont<>3
Leernum
Sinum<0
Entoncesnegverdadero
Finsi
Sumsum+num
Contcont+1
Finmientras
Sineg=verdadero
Entoncesescribir(Sehaledonegativos)
Sinoescribir(Nonegativos)
Finsi
Fin
Siesleerunnmeronegativoohasta3nmeros:
Mientras(cont<>3)y(neg=verdadero)
4.ESCRITURADEALGORITMOSYPROGRAMAS:
En pseudocdigo el programa tiene dos partes, la cabecera y el cuerpo. La
cabeceracontieneelnombredelalgoritmo,yelcuerpocontiene2partes.
Laprimeraeslazonadedeclaracionesdevaryconst,ylasegundaeslazonade
lasinstruccionesdelprograma.
En la zona de instrucciones para que quede ms legible hay que usar la
identacinysiesnecesariohayqueusarcomentariosentrellaves.

PGINA21/184

EJERCICIOS:TEMA3
1.Culesycuntossonlosnmerosprimoscomprendidosentre1y1000?
Algoritmon_primos
Const
Primero=1
Limite=1000
Var
cont,i,j:entero
primo:boolean
Inicio
Cont0
Desdei=primerohastalimite
primoverdadero
j2
mientras(i>j)y(primo=verdadero)
Siimodj=0
Entoncesprimofalso
Sinojj+1
Finsi
Finmientras
Siprimo=verdadero
Entoncesescribiri
Contcont+1
Finsi
Findesde
EscribirEntreprimeroylimitehaycontnprimos
Fin

PGINA22/184

2. Calcularelmximodenmeros positivosintroducidos porteclado,sabiendo que


metemosnmeroshastaqueintroduzcamosunonegativo.Elnegativonocuenta.
Algoritmomaximo
Var
Num,max:entero
Inicio
Max0
EscribirIntroduzcanpositivosyparaacabarintroduzcaunonegativo
Leernum
Mientrasnum>=0
Sinum>max
Entoncesmaxnum
Finsi
Leernum
Finmientras
EscribirElmayornmeroesmax
Fin

3.Determinarcualessonlosmltiplosde5comprendidosentre1yN.
Algoritmomultiplos
Var
i:entero
Inicio
Desdei=1hastan
Siimod5=0
Entoncesescribiri
Finsi
Findesde
Fin

PGINA23/184

INTRODUCCINALAPROGRAMACINESTRUCTURADA:
TEMA4:
1.
2.
3.
4.
5.
6.
7.
8.

Tcnicasdeprogramacin.
Programacinmodular.
Programacinconstructora.
Estructurasecuencial.
Estructurasselectivas.
Estructurasrepetitivas.
Anidacindebuclesycondicionales.
Controldedatosdeentrada.

1.TCNICASDEPROGRAMACIN:
ElprogramarconflujogramasodiagramasNSresultamuyliosoenelmomentoenque
elprogramasecomplica,poresovamosautilizarsiempreelpseudocdigo,enelque
vamosautilizardostcnicasdeprogramacinquenoseusanporseparado,sinoque
soncomplementarios.
Estastcnicasson:
Programacinmodular:Consisteendividirelprogramaenpartesllamadas
mdulos,eimplementarcadaunodeesosmdulosporseparado.
Programacinestructurada:Cuyoobjetivoeshacermslegibleylgicola
estructura del programa utilizando para ello solamente tres tipos de
estructuras:selectivas,secuenciales(condicionales)yrepetitivas.
2.PROGRAMACINMODULAR:
PGINA24/184

Sebasaendividirelprogramaenpartesllamadasmdulos,queseanalizany
codifican deformaindependiente yquerealizan unadeterminada tareaqueseren
realidadunapartedelproblematotalaresolver.
Entodoalgoritmooprogramaexistirunmdulooprogramaprincipalqueesal
quetransfiereelcontrolcuandocomienzalaejecucindelprograma,yluegodesdel,
sevallamandoalrestodelossubprogramas.
Llamaraunsubprogramaquieredecirtransferirleelcontrol,esdecirquese
comienzaaejecutarylohardesdeelcomienzodelsubprogramahastaqueseterminey
alterminardevuelveelcontrolalsubprogramaquelollam.Dentrodelsubprogramaa
suveztambin puedollamar aotrosperoencualquier casoalfinalsedevuelve el
controlalmduloquehacelallamada.Elcontrolalprogramallamadosedevuelveala
instruccinsiguientealaquesehizolallamada.
Unmdulosolotieneaccesoalosmdulosalosquellamayalossubmdulosa
losqueasuvezllamanstos.Losresultadosproducidosporunmdulopuedenser
utilizadosporotros.
Noexisteuncriteriofijoparadeterminareltamao,nimuygrandesnimuy
pequeos,laideafundamentalesquerealicenunanicacosaymuyconcreta.
Losmdulososubprogramasrecibendiferentesnombressegnellenguajede
programacin y segn su tipo. Se llaman procedimientos y funciones (Pascal, C),
subrutinas(basic,fortran),secciones(cobol),...

3.PROGRAMACINESTRUCTURADA:
Lacaractersticafundamentalesquesevaabasarenelusonicamentedetres
estructurasdecontrol.Paraelloseapoyaenlassiguientesfilosofas:
1. Recursosabstractos:Sonlosrecursosconlosquenocontamosalahorade
programar,peroenlosquenosapoyamosalahoradesolucionarlos.Estos
recursossetienenqueirtransformandoenrecursosconcretos.
2. Diseodescendente(topdown):Setratadeirdescomponiendoelproblema
ennivelesopasoscadavezmssencillos,talquelasalidadeunaetapavaa
servircomoentradadelasiguiente.Enlasprimerasetapastomamoselpunto
devistaexterno,esdecir,queentradashayyquesalidashay,yamedidaque
vamosbajandodenivel,lovamosviendodemodointerno(comolohacepor
dentro).
3. Estructurasbsicasdecontrol:Parahacercualquierprogramasiguiendolos
anteriorespasosderazonamiento,alfinalcodificamoselprogramausando
trestiposdesecuencias(repetitivas,alternativasysecuenciales).
Alfinaltodoprogramavaatenerunanicaentradayunanicasalida.
Desdelaentradatienenqueexistircaminosquenospermitenpasarportodaslas
partesdelprogramayllevarnosalasalida,yfinalmentenosevanapermitirlosbucles
infinitos.
4.ESTRUCTURASECUENCIAL:
Escuandounainstruccinsigueaotraensecuencia,esdecir,lasalidadeuna
instruccineslaentradadelasiguiente.
PGINA25/184

FLUJOGRAMA:

DIAGRAMASNS:

PSEUDOCDIGO:
Leernum
Numnum*2
Escribirnum

5.ESTRUCTURASSELECTIVAS:
Seevalalacondicin yenfuncindelresultadoseejecuta unconjunto de
instruccionesuotro.Haytrestiposdeselectivas(simple,dobleomltiple):
*Simple:Eslaestructura:S<cond>
entonces<acciones>
fins
Evaluamos la condicin y si es verdadera ejecutamos el conjunto de condiciones
asociadasalentonces,ysiesfalso,nohacemosnada.
FLUJOGRAMA:
DIAGRAMANS:

<Cond1>
Condicin
SINO
<acciones>
<acciones><acciones>

*Doble:Seevalalacondicinysiesverdadseejecutanelconjuntodeacciones
asociadasalaparteentonces,ysiesfalsoseejecutanelconjuntodeaccionesasociadas
alapartesino.
FLUJOGRAMA:
DIAGRAMASNS: PSEUDOCDIGO:
Si
No
Cond
S<cond>
SiCond No Entonces<acciones>
Acc1
Acc2
Sino<acciones>
Acc1 Acc2Finsi

Unacondicinseejecutaunanicavez.
*Alternativamltiple:Seevalaunacondicinoexpresinquepuedetomarnvalores.
Segn el valor que la expresin tenga en cada momento se ejecutan las acciones
correspondientesalvalor.Enrealidadequivaleaunconjuntodecondicionesanidadas.
Encualquierlenguaje,esCaseoSwith.
PSEUDOCDIGO:
Segnsea<expresin>
<Valor1>:<accin1>

PGINA26/184

<valor2>:<accin2>
.................................
[<otro>:<acciones>]
finsegn

Otro:Lasaccionesasociadasalvalorotroseejecutancuandolaexpresinnotoma
ningunodelosvaloresqueaparecenantes.Otherwise,Else.
Elvalorconelquesecomparalaexpresin,vaadependerdeloslenguajes,deloque
seaesevalor.Engeneralesevalorpuedeserunvalorconstante,unrangodevaloreso
inclusootracondicin
FLUJOGRAMA:
DIGRAMASNS:
-

ExprExpresin
V1V2V3V4...Otro
V1V2V3V4V5V6

Hacerunprogramaquepuedadibujarunarecta,unpuntoounrectngulo.
Algoritmodibujo
Varop:carcter
Escribir(Introduceunaopcin
1. Punto
2. Recta
3. Rectngulo)
Leerop
Segnseaop
1:leerx
.........
2:leerx
..........
3:leerx
..........
otro:escribiropcinerrnea
finsegn

PGINA27/184

Paraunrangodevalores:
Leerunanotayescribirenpantallalacalificacin:
Varnota:entero
Leernota
Segnseanota
1..4:escribirsuspenso
5..6:escribiraprobado
7..8:escribirNotable
9:escribirSobresaliente
10:escribirMatriculadehonor
finsegn
Enalgunoslenguajessepermiteponerunacondicin:
Segnseanota
Nota>=1ynota<=4:escribirsuspenso
Enpseudocdigonosepuedenponercondiciones.
6.ESTRUCTURASREPETITIVAS:
Enaquellaquecontieneunbucle(conjuntodeinstruccionesqueserepitenun
nmerofinitodeveces).Cadarepeticindelbuclesellamaiteracin.Todobucletiene
quellevarasociadaunacondicin,queeslaquevaadeterminarcuandoserepiteel
bucle.
Haycuatrotiposdebucles,aunquesolosepuedenusartres:
1. MientrashacerWhiledo
2. Repetirhastarepeatuntil
3. Desdefor
4. Iterarloop:Noseusa.

Mientrashacer:
Sintaxis:
PSEUDOCDIGO:
FLUJOGRAMA:
DIAGRAMASNS:
Mientras<cond>hacerNo
<acciones>Condmientrascond
finmientrasSi
<acc1>
acciones
Funcionamiento:
La condicin del bucle se evala al principio, antes de entrar en l. Si la
condicinesverdadera,comenzamosaejecutarlasaccionesdelbucleydespusdela
ultimavolvemosapreguntarprolacondicin.Enelmomentoenelquelacondicinsea
falsanossalimosdelbucleyejecutamoslasiguientecondicinalbucle.

PGINA28/184

Alevaluarselacondicinantesdeentrarenelbuclealprincipio,silacondicin
alserevaluadalaprimeravezesfalsa,noentraremosnuncaenelbucle,elbuclepuede
queseejecute0veces,portantousaremosobligatoriamenteestetipodebucleenelcaso
dequeexistalaposibilidaddequeelbuclepuedaejecutarse0veces.
Repetirhasta:
Sintaxis:
FLUJOGRAMA:

DIAGRAMASNS:

acciones
<acc>
No
Si
Cond

Repetir<cond>hasta

FLUJOGRAMA:
Repetir

<acciones>
hasta<condicin>

Funcin:
Serepiteelbuclehastaquelacondicinseaverdadera.Serepitemientrasla
condicin sea falsa. La condicin se evala siempre al final del bucle, si es falsa
volvemosaejecutarlasacciones,siesverdadsesaledelbucle.
Como la condicin seevala al final, incluso aunque la primera vez ya sea
verdadera,habremospasadoalmenosunavezporelbucle.
Es decir que cuando un bucle se tenga que ejecutar como mnimo una vez,
podremosusarunaestructurarepetiromientras,lanicadiferenciaquehabrentrelas
dos,esqueparahacerlomismo,lascondicionestienenquesercontrarias.
Leer3nmerosydarsusuma:
Cont0
Cont0
Suma0
suma0
Mientrascont<>3
repetir
Sumasuma+num
leernum
Leernum
sumasuma+num
Contcont+1
contcont+1
Finmientras
hastacont=3
Desde:
Estetipodebuclesseutilizacuandosesabeyaantesdeejecutarelbucleel
nmeroexactodevecesquehayqueejecutarlo.Paraelloelbuclellevaraasociadouna
variable quedenominamos variable ndice,alaqueleasignamos unvalorinicialy
determinamoscualvaasersuvalorfinalyademssevaaincrementarodecrementar
encadaiteracindebucleenunvalorconstante,peroestosevaahacerdemanera
automtica,elprogramadornosetienequeocupardeincrementarodecrementaresta
variable en cada iteracin, sino que va a ser una operacin implcita (lo hace por
defecto).
Por tanto en cada iteracin del bucle, la variable ndice se actualiza
automticamenteycuandoalcanzaelvalorquehemospuestocomofinalseterminala
ejecucindelbucle.

PGINA29/184

Sintaxis:
PSEUDOCDIGO:
Desde<varndice>=<valorinicial>hasta<valorfinal>
<acciones>
findesde
FLUJOGRAMAS:

DIAGRAMASNS:

VVi
Desdev=vihastav1
V<>V1<sentencias>
sentencias

vv+1

Bucleconsalidainterna:loop
iterar.

Permitelasalidadelbucledesdeunpuntointermediodelmismosiemprequese
cumplalacondicionqueaparece,entoncesnossalimosalasiguienteinstruccin
delbucle.
Iterar
<sent1>
salirsi<cond>NUNCASEUSA
<sent2>
finiterar

7.ESTRUCTURASANIDADAS:
Tantolasestructurasselectivascomolosbuclessepuedenanidarunosdentrode
otros.
Anidacindecondicionales:
Laventajadeanidarsentenciascondicionales,esquecuandounasecumpleno
hayporquemiraralasqueestandebajo.Tenemosquetrataranidarlacondicionenla
partesino(else)envezqueenlaparteentonces.
Si<condicion1>
Entonces<sentencia1>

PGINA30/184

Sinosi<condicion2>
Entonces<sentencia2>
Sinosi<condicion2>
Entonces<sentencia3>
Finsi
Finsi
Finsi
Elcasesiempreequivaleaunaanidacindecondicionales,peronoalreves.
Buclesanidados:
Aligualquepodemos colocarunasexpresionesdentrodeotras,unosbucles
puedenestardentrodeotros,peronuncapuedencruzarse.Alanidarbucleshayque
tenerencuentaqueelbuclemasinternofuncionacomounasentenciamasdelbloque
masexternoyportantoencadaiteracindelbuclemasexternosevanaejecutartodas
lasiteracionesdelbuclemasinternoporcadaiteracindelmasexterno.
Sielbuclemasexternoserepitenvecesyelmasinternoserepitemveces,si
por cada iteracin del mas externo se repite el mas interno, el nmero total de
iteracionesserm*n.
Losbuclesqueseanidanpuedensedeigualodistintotipo.
Desdei=1hasta8
Desdej=1hasta5
EscribirProfesoriintroduzcasuasignaturanj
Leerasignatura
Findesde
Findesde
8.CONTROLDEDATOESDEENTRADA:
1.Cuandoexisteunvalorcentinelaquedeterminaelfindelbucle:
Elbuclesevaarepetirmientrasnoseleaundeterminadovalor.Laprimera
lecturasevaarealizarfueradelbucle,ysilaprimeravezqueloleoyaencuentroese
valorcentinelanopodemosentrarenelbucleyseguiracontinuacin,sinoentramos
enelbucle.
SevautilizarunaestructuraMientras.
2.Lecturasecuencialdeunfichero:
Tendremosqueleerdelprimeroalltimoregistrodelfichero.Habrqueusarun
Mientras,aunquehaydosposibilidades:Leerfueradelbucleyalfinaldebucle,oleer
dentroalprincipiodelbucle.Seusaunauotradependiendodellenguaje.
3.Cuandoenunbuclesabemoselnmeroexactodevecesqueserepiteelbucle:
UsamoselDesde...Hasta.
4.Controldedatosparanopermitirdatoserroneos:
Nodejarseguiralusuariohastaquenointroduzcadatoscorrectos.Hayqueusar
unRepetir...Hasta.
Repetir
Leerdatos

Repetir
leerop
PGINA31/184

Hasta(datoscorrectos)

hasta(op>=1)y(op<=3)

PGINA32/184

EJERCICIOS:TEMA4
1.Alfinaldecursodeseamossabercualhasidoelalumnodeprimeroconmejornota
media.Sesabequeesteaoentraron150alumnosyqueenprimerotodostienen5
asignaturas.Darelnombreylanotamedia.
Algoritmonota_media
Const
Alumnos=150
Asignaturas=5
Var
Nombre,mejor_alum:cadena
Nota,suma,media,acum:real
I,j:entero
Inicio
Acum0
Desdei=1hastaalumnoshacer
Suma0
EscribirIntroduzcaelnombredelalumno
Leernombre
Desdej=1hastaasignaturashacer
EscribirIntroduzcalanotadelaasignatura
Leernota
Sumasuma+nota
Findesde
Mediasuma/asignaturas
Simedia>acum
Entoncesacummedia
Mejor_alumnombre
Finsi
Findesde
EscribirElmejoralumnoesmejor_alum
EscribirSunotamediaesacum
Fin

PGINA33/184

2. Calcular la suma de los divisores de cada nmero introducido por teclado.


Terminaremoscuandoelnmeroseanegativoo0.
Algoritmodivisores
Var
Numero,i,suma:entero
Inicio
EscribirIntroduceunnmero,yparaacabarunonegativo
Leernmero
Mientrasnumero>0
Suma0
Desdei=1hastanumero/2
Sinumeromodi=0
Entoncessumasuma+i
Finsi
Findesde
Sumasuma+numero
EscribirLasumadelosdivisoresdelnmeroessuma
Leernumero
Finmientras
Fin
3.SecolocauncpitalC,auninteresI,duranteMaosysedeseasaberencuantose
habrconvertidoesecapitalenmaos,sabiendoqueesacumulativo.
Algoritmointeres
Var
I,j,m:entero
C,temporal:real
Inicio
repetir
EscribirIntroduceelcapital,elinteresyeltiempo
Leerc,i,m
Hasta(c>0)y((i<=0)y(i<=100))y(m>=0)
Desdej=1hastam
Cc*(1+I/100)
Findesde
EscribirTienescpts
Fin

PGINA34/184

4.Dadaunafechaenformatodia/mes/aodeterminarelnmerodedasyelnombredel
mesdedichafecha,ysacarporpantallalafechaconvertidaaformatodediademes
deao.
Algoritmofecha
Var
Dia,mes,ao,n_dias:entero
N_mes:cadena
Inicio
Repetir
EscribirIntroducelafechaenformatodiamesao
Leerdia,mes,ao
Segnseames
1,01:n_mesenero
n_dias31
2,02:n_mesfebrero
siaomod4=0
entoncesn_dias29
entoncesn_dias28
3,03:n_mesmarzo
n_dias31
4,04:n_mesabril
n_dias30
5,05:n_mesmayo
n_dias31
6,06:n_mesjunio
n_dias30
7,07:n_mesjulio
n_dias31
8,08:n_mesagosto
n_dias31
9,09:n_messeptiembre
n_dias30
10:n_mesoctubre
n_dias31
11:n_mesnoviembre
n_dias30
12:n_mesdiciembre
n_dias31
finsegnsea
hasta(dia<=n_dias)y((mes>=1)y(mes<=12))y(ao>=0)
PGINA35/184

escribirElmesden_mestienen_diasdias
escribirLafechaes:n_diasden_mesdeao
fin

5.Dadalasiguientefrmula:
n

X=

((a b)

3) + n

i =1
n 1

(2 + a * (i 1))
i= 2

Averiguarelvalordexpidiendoalusuariolosvaloresden,a,b.
Algoritmoecuacion
Var
N,a,b,primer,segn,i,j:entero
X:real
Inicio
Primer0
Segn1
Repetir
EscribirIntroduceelvalorden,a,b
Leern,a,b
Hastan>=0
Desdei=1hastan
Primer(((ab)^i3)+n)+primer
Findesde
Desdej=2hastan1
Segn((2*a*(i1))*segn)
Findesde
Xprimer/segn
Escribirx
Fin

PGINA36/184

6.Dadalasiguienteseriematemtica:
a1=0
a2=0
an=an1+(2*an2)paran>=3
Determinarcualeselvaloryelrangodelprimertrminocuyovalorseamayoroiguala
2000.
Algoritmoserie
Var
A1,a2,an,cont:entero
Inicio
A11
A20
Ana1+(2*a2)
N3
Mientrasan<2000
A2a1
A1an
Ana1+(2*a2)
Contcont+1
Finmientras
EscribirElrangoescontyelresultadoesan
fin

PGINA37/184

SUBPROGRAMAS:PROCEDIMIENTOSYFUNCIONES.
TEMA5
1.
2.
3.
4.
5.

Introduccinalossubprogramasosubalgoritmos.
Funciones.
Procedimientos.
mbitos:variableslocalesyglobales.
Comunicacinentresubprogramas:Pasodeparmetros.
- Tiposymtodosdepasodeparmetros.
- Pasodeparmetrosporcopia.
- Pasodeparmetrosporreferencia.
- Pasodeparmetrospornombre.
6. Funcionesyprocedimientoscomoparmetros.
7. Efectoslaterales.
8. Recursividad.
1.INTRODUCCINALOSSUBPROGRAMASOSUBALGORITMOS:
La programacin modular es una de las tcnicas fundamentales de la
programacin. Se apoya en el diseo descendente y en la filosofa de divide y
vencers,esdecirsetratadedividirelproblemadado,enproblemasmssimplesen
quecadaunodeloscualesloimplementaremosenunmduloindependiente.Acada
unodeestosmdulosesaloquellamamossubalgoritmososubprogramas.
Siempreexistirunmdulooprogramaprincipalqueesconelquecomienzala
ejecucindetodoelprograma,yapartirdeliremosllamandoalresto.
Cadavezquesellamaaunsubprogramaselepasalainformacinquenecesita
enlallamada,acontinuacincomienzaaejecutarseelsubprogramallamado,ycuando
terminesuejecucin,devuelveelcontrolalasiguienteinstruccinaladellamadaenel
programaquelollam.
En cuanto a la estructura de un subprograma es igual a la estructura de un
programa,vaatenerunainformacindeentradaqueeslaquelepasamosalhacerla
llamada y que se coloca junto al nombre del subprograma. Despus va a tener un
PGINA38/184

conjuntodeacciones,declararotrasvariablespropiasdelsubprograma,yalterminarla
ejecucinpuedequedevuelvaonoresultadosalprogramaquelollam.
Haydostiposfundamentalesdesubprogramas:Funcionesyprocedimientos.
2.FUNCIONES:
Desdeelpuntodevistamatemtico,unafuncinesunaoperacinquetomauno
ovariosoperandos,ydevuelveunresultado.Ydesdeelpuntodevistaalgortmico,es
unsubprogramaquetomaunoovariosparmetroscomoentradaydevuelvealasalida
unnicoresultado.
Pascal:Enlasfuncionessepuededevolvermsdeunnicoresultadomediante
parmetros.
C:Sedevuelvetodoporparmetros.
Estenicoresultadoirasociadoalnombredelafuncin.Haydostiposde
funciones:
- Internas:Sonlasquevienendefinidaspordefectoenellenguaje.
- Externas:Lasdefineelusuarioylesdaunnombreoidentificador.
Para llamar a una funcin se da su nombre, y entre parntesis van los
argumentosoparmetrosquesequierenpasar.
Declaracindeunafuncin:
Laestructuradeunafuncinessemejantealadecualquiersubprograma.Tendr
unacabecera(conelnombreylosparmetros)yuncuerpo(conladeclaracindelos
parmetrosdelafuncinylasinstrucciones).
Sintaxis:
Funcion<nombre_funcion>(n_parametro:tipo,n_parametro:tipo):tipofuncion
Var<variableslocalesfuncion>
Inicio
<acciones>
retorno<valor>
fin<nombre_funcion>
Lalistadeparmetroseslainformacinqueseletienequepasaralafuncin.
Losparmetros luegodentrodelafuncinlospodemosutilizar igualquesifueran
variables locales definidas en la funcin y para cada parmetro hay que poner su
nombreytipo.
Elnombredelafuncinlodaalusuarioytienequesersignificativo.
Enlasvariableslocalessedeclaranlasvariablesquesepuedenusardentrodela
funcin.
Entrelasaccionestendrqueexistirentreellasunadeltipo retorno<valor>.
Estasentenciapondrfinalaejecucindelafuncinydevolverelvalordelafuncin,
es decir, como valor asociado al nombre de mismo tipo que el tipo de datos que
devuelvealafuncin,estevalorportantotienequeserdelmismotipoqueeltipode
datosquedevuelvelafuncin,queeselquehabremosindicadoaldeclararlafuncinen
lapartefinaldelacabecera.
Nosepermitenfuncionesquenodevuelvannada.

PGINA39/184

Los parmetros que aparecen en la declaracin de la funcin se denominan


parmetros formales, y los parmetros que youtilizo cuando llamo a la funcin se
denominanparmetrosactualesoreales.
Invocacindeunafuncin:
Parallamaraunafuncinseponeelnombredelafuncin,yentreparntesislos
parmetrosreales,quepodrnservariables,expresiones,constantes,...perosiempredel
mismotipoquelosparmetrosnormalesasociados
<nombre_funcion>(parmetrosreales)
Lafuncinpuedeserllamadadesdeelprogramaprincipalodesdecualquierotro
subprograma.
Parallamaralafuncindesdecualquierparte,implicaelconocimientopreviode
questafuncinexiste.
Atravsdelosparmetrosrealesdelallamadaseproporcionaalafuncinla
informacin que necesita, para ello, al hacer la llamada lo que se produce es una
asociacinautomticaentreparmetrosrealesyparmetrosformales.Estaasociacinse
realizasegnelordendelaaparicinydeizquierdayderecha.
Sielparmetroformalyrealnosondelmismotipo,enPascalseproduceun
error,yenCsetransformanlostipossiesposible.
Lallamadaaunafuncin, siemprevaaformarpartedeunaexpresin,de
cualquierexpresinenlaqueenelpuntoenlaquesellamaalafuncin,pudierair
colocadocualquiervalordeltipodedatosquedevuelvelafuncin,estosedebeaqueel
valorquedevuelveunafuncinestaasociadoasunombre.

Pasosparahacerlallamadaaunafuncin:
1. Alhacerlallamadaycederelcontrolalafuncin,seasocia(asignaelvalor)de
cada parmetro real a cada parmetro formal asociado, siempre por orden de
aparicinydeizquierdaaderecha,porloquesiemprequenocoincidanlostiposy
elnmerodeparmetrosformalesyreales,seproduceunerror.
2. Sitodohaidobien,seejecutanlasaccionesdelafuncinhastaquelleguemosauna
de tipo retorno <valor> que pondr fin a la ejecucin. Pueden existir varias
sentencias de retornoenla misma funcin,pero encada llamada solosepodr
ejecutaruno.
3. Seleasociaalnombredelafuncinelvalorretornadoysedevuelveelcontrolal
subprogramaquehizolallamadaperosustituyendoelnombredelafuncinporel
valordevuelto.
Otraformadeespecificarelretornodeunafuncin:
Seleasignaelvalordevueltoalnombredelafuncin.
N_funcionvalor
Ejemplodefuncin:
Unafuncinquecalculelamitaddelvalorquelepasoparmetro.Suponemos
queesunvalorentero.
Funcionmitad(n:entero):real
Varm:real
Inicio
Mn/2
Retornom

PGINA40/184

Finmitad
Algoritmocalc_mitad
Varnum:entero
Inicio
EscribirIntroduceunnmeroparahallarsumitad
Leernum
EscribirLamitaddenumesmitad(num)
Fin
*Lafuncinsolopuedeserllamadadesdeunaexpresin.
3.PROCEDIMIENTOS:
Elinconvenientedeunafuncinesquesolopuededevolverunnicovalor,por
loquesnosinteresadevolver0oNvalores,aunquepuedousarloparadevolverunsolo
valor,debousarunprocedimiento.

Un procedimiento es un subprograma o un subalgoritmo que ejecuta una


determinadatarea,peroquetrasejecutaresatareanotienenningnvalorasociadoasu
nombrecomoenlasfunciones,sinoquesidevuelveinformacin,lohaceatravsde
parmetros.
Alllamaraunprocedimiento,selecedeelcontrol,comienzaaejecutarsey
cuandoterminadevuelveelcontrolalasiguienteinstruccinaladellamada.
Diferenciasentrefuncionesyprocedimientos:
1. Unafuncindevuelveunnicovaloryunprocedimientopuededevolver0,1oN.
2. Ningunodelosresultadosdevueltosporelprocedimientoseasocianasunombre
comoocurraconlafuncin.
3. Mientrasquelallamadaaunafuncinformasiemprepartedeunaexpresin,la
llamada a un procedimiento es una instruccin que por s sola no necesita
instrucciones.
Estallamadaconsisteenelnombredelprocedimientoyvaentreparntesisvanlos
parmetrosqueselepasan.Enalgunoslenguajes(comoelC),seponedelantela
palabraLlamara(Call)procedimiento(parmetro).
Sintaxis:
Procedimiento<nombre_proc>(<tipo_paso_par><nombre_par>:tipo_par,...)
Var<variableslocales>:tipo
Inicio
<sentencias>
fin<nombre_proc>
Lacabeceravaaestarformadaporelnombredelprocedimientoqueserun
identificadoryquedebedesersignificativo,yluegoentreparntesislosparmetrosola
informacinqueselepasaalprocedimiento.Paracadaparmetrohayqueindicarel
tipodepasodeparmetro.Haydostiposfundamentalesdepasodeparmetros,por
valoryporreferencia,sinoponemostipodepasodeparmetros,setomaeltipode
pasodeparmetrosporvalor.
Enelcuerpodelprocedimientodondevanlassentenciasyanohabrningunade
tipo<retornovalor>,ahorabien,sielprocedimientodevuelveresultadosatravsdesus
parmetros,cosaquesolopodrhaceratravsdelosparmetros quesepasan por
PGINA41/184

referencia,tendrnqueexistirsentenciasdeasignacindevaloresaestosparmetros
pasadosporreferencia,atravsdeloscualessevanadevolverlosresultados.
Comosellamaaunprocedimiento:
[llamara(Call)]nombre_proc(par_reales)
Pasosparahacerlallamadaaunprocedimiento:
1. Secedeelcontrolalprocedimientoalquesellamayloprimeroquesehaceal
cederle el control es sustituir cada parmetro formal de la definicin por el
parmetroactualorealdelallamadaasociadoal.Estaasociacinentreparmetros
formalesyrealessehacedeizquierdaaderechaporordendecolocacinyparaque
sepuedaproducirestaasociacintienenqueexistirelmismonmerodeparmetros
formalesquereales,yademseltipotienequecoincidirconeldelparmetroformal
asociado,sinosecumplealgunadeestascondicioneshayunerror.
2. Si la asociacin ha sido correcta comienzan a ejecutarse las instrucciones del
procedimiento hasta llegar a la ltima instruccin. Al llegar a la instruccin se
vuelven a asociar los parmetros formales que devuelven los resultados a los
parmetrosformalesasociadosenlallamada,esdecir,deestamaneraalgunosde
losparmetrosrealesdelallamadayacontendrnlosresultadosdelprocedimiento.
3. Finalmentesecedeelcontrolalasiguienteinstruccinalaquesehacelallamada,
peroteniendoencuentaqueenestainstruccinyenlassiguientespuedousaryalos
parmetrosrealesenlosquesedevolvieronlosresultadosdelprocedimientopara
trabajarconellos.

Procedimientomitad(num:entero,entsalM:real)
Inicio
Mnum/2
Finmitad
Algoritmocalc_mitad
Var
N:entero
Mit:real
Inicio
EscribirIntroduceunnmero
Leern
Mitad(n,mit)
EscribirLamitadesmit
fin
4.MBITOS:VARIABLESLOCALESYGLOBALES:
Queselmbitodeunidentificador?:
Elmbitodeunidentificador(variables,constantes,funciones,...)eslapartedel
programaenlaqueseconoceyportantosepuedeusarunidentificador.
PGINA42/184

Segnelmbitohay2tiposdevariables,localesyglobales:
1. Local:Aquellaqueestdeclaradaydefinidadentrodeunsubprogramaluegosu
mbitocoincidirconelmbitodelsubprogramaenlaqueestedefinida.
Estoquieredecirquelavariablenotieneningnsignificado,noseconoceynose
puede acceder a ella desde fuera del subprograma y que tiene una posicin de
memoriadistintaaladecualquierotra,inclusosiesdeunavariablequetieneel
mismonombreperoqueestdefinidafueradelsubprograma.
Lasvariableslocalesaunsubprogramasedefinenenlapartedeladefinicinde
variablesdelmismo.Losparmetrosformalesqueseleponenaunsubprogramase
comportandentrodelcomosifuerantambinvariableslocalesal.
2. Globales:Sonlasqueestndefinidasaniveldelprograma,esdecir,sumbitoesel
programaoalgoritmoprincipalytodoslossubprogramasquevanjuntoconl.
A esta variable podemos acceder desde cualquiera de los subprogramas y el
programa principal, salvo que alguno de esos subprogramas tenga definida una
variablelocalconelmismonombrequelavariableglobal,enestecasosiutilizoel
nombredeesavariablemereferiralalocal,nuncaalaglobal(yaquetienen2
zonasdememoriadistintas).
Lugarenelquesedefinenlasvariablesglobales:
Enalgunoslenguajessedefineenelprogramaprincipal,yesavariableserglobal,
enotroslenguajessedefinenfueradelprogramaprincipalyfueradecualquierotro
subprograma(antes deempezarelprogramaprincipal). Mtodoquevamos a
usar.
Elproblemadeusarvariablesglobalesesquecomotodoslossubprogramaslas
puedenmodificar,puedeserposiblequehayausosindebidoscuandounsubprograma
utilizaunavariableglobalsinsaberqueotrolahamodificado,poresaraznnunca
usaremosparapasarinformacinentrelossubprogramasvariablesglobales,sinoque
usaremosvariablesdeentradasalida,salvoquenonosquedemsremedio.

Procedimientosanidados:
Laanidacindeprocedimientosnosepermiteentodosloslenguajesyconsiste
enquedentrodeunprocedimientopodamosdefinirometerelcdigodeotros.
Silaanidacindeprocedimientosestpermitida,seplanteanmsproblemasen
cuantoalmbito,desdeestepuntodevista,sedicequeunavariablelocalseconoceen
elprocedimientoenelqueestdefinidayentodoslosprocedimientosanidadosalque
sonlosquecomponenelmbitodedichoprocedimiento,salvoqueenalgunodeesos
procedimientosanidadosestedefinidaunavariablelocalconelmismonombreencuyo
casodentrodeeseprocedimientosiemprenosreferiremosalavariablelocaldefinidaen
lporquesiempreseconsideraelmbitomsrestringido.
PP
VarA,B
P1
A,C,D
P2
A
P3
PGINA43/184

D,E
P4D,F
P5
P6F,A

VARIABLES
AdelPP
BdelPP
AdelP1
CdelP1
DdelP1
AdelP2
DdelP3
EdelP3
DdelP4
FdelP4
FdelP6
AdelP6

MBITOSUBPROGRAMA
P4,P5
P1,P2,P3,P4,P5,P6
P1,P3
P1,P2,P3
P1,P2,P3
P2
P3
P3
P4,P5,P6
P4,P5
P6
P6

5.COMUNICACINENTRESUBPROGRAMAS:PASODEPARMETROS.
Lamejorformaparallevaracabolacomunicacinentesubprogramas,esel
pasodeparmetros.Trataremosdeevitarsiemprequeseaposibleelusodevariables
globales.
Cuandollamamosaunafuncinoprocedimiento,lepasamosatravsdelos
parmetros la informacin que necesita, y en el caso de un procedimiento tambin
devolvemosatravsdesusparmetroslosresultados.Paraellodefiniremoseltipodel
parmetro aprincipio del subprograma, que es lo queconocemos comoparmetros
formales, y al hacer la llamada pasamos la informacin a travs de los parmetros
reales.
Cmoseefectalacorrespondenciaentreparmetrosformalesyreales?:
Existen2mtodos:
1. Correspondencia posicional: En este caso se emparejan los parmetros
formalesyrealesporlaposicinqueocupan(ordendedeclaracin)yde
izquierdaaderecha.Paraquesepuedarealizarestaasociacin,tieneque

PGINA44/184

haberelmismonmerodeparmetrosformalesyreales,yconelmismo
tipo.
F(x:entero,y:real)
Vara:real
F(3,A)
2. Correspondenciapornombreimplcito:Ahoraenlallamadaalsubprograma
seponeexplcitamenteaqueparmetroformalcorrespondecadareal.
Ahoraenlallamadaponemoselnombredelparmetroformal,separadopor
dospuntos(:)yelnombredelparmetrorealquelepasamos,conlocualya
noimportalaposicinenlaquecoloquemoslainformacin.
F(x:3,y:A)
F(y:A,x:3)
UnlenguajequepermiteestoesADA.
Usaremossiempreelprimermtodo(posicional).
Pasodeparmetros:
Delmododepasodeparmetrosvaadependerelresultadoqueseobtenga.
1.Tiposdeparmetros:Segnseusenparameterdatosoparaobtenerresultados.
Existen3tipos:
1. De entrada: Son parmetros que solo aportan informacin de entrada al
subprogama en el que pertenecen como parmetros. Aporta el valor que
tienencomoentradaalsubprograma.Enelcasodeunafuncin,todossus
parmetrossondeestetipo.
Como solo sirven como entrada, solo pueden ser ledos, pero no
modificados,yaunquesemodificasendentrodeunsubprograma,fuerano
vaatenerefectoesamodificacin.
2. Desalida:Seusansoloyexclusivamenteparadevolverresultadosatravs
deellos.Suvaloralhacerlallamadaalsubprogramanonosimporta,sino
queesevalorsolovaatenerimportanciacuandoterminalaejecucindel
programa.Unparmetrodeestetipotericamentenuncasepuedeleer,solo
sevaactualizar.

De entrada y salida: El valor del parmetro tiene importancia tanto a la


entradacomoalasalidadelsubprograma,nosaportainformacincuando
llamamos al subprograma y por otra parte devolvemos a travs de l
resultadoscuandoterminamoselsubprograma,enestecaso,tienesentido
tantoleercomoactualizarelparmetro.
SoloADAesunlenguajequevaasoportarlos3tiposdepasodeparmetro.Se
ponencomoIn,Out,InOut.
Elrestodeloslenguajessolopermitendostiposdeparmetros,deentrada(solo
paraleerdatos)ydeentradasalida(paradevolverresultados,aunquetambinse
puedeusarparaleerdatos).
3.

2.Mtodosdepasodeparmetros:

PGINA45/184

Pasodeparmetrosporcopia:
Porvalor.
Porresultado.
Porvalorresultado.
- Pasodeparmetrosporreferencia.
- Pasodeparmetrospornombreonominal.
Pasodeparmetrosporcopia:
Lacaractersticafundamentaldeestemtododepasodeparmetrosesqueel
parmetroformalsiempreseconsideraquetieneasociadaunadireccindememoriaen
laqueestalmacenadoyqueportantosecomportaigualqueunavariablelocaldel
subprogramaenqueaparece.
Enestemtodoloqueimportaeselvalordelparmetroactual.
1.
Porvalor:

Nosinteresaelvalordelparmetroactualalaentrada,paraelloeste
valorsecopiaenladireccindememoriadelparmetroformalasociado.Eneste
casoelparmetrorealpuedeseunaconstante,expresinovariable,ynuncasevaa
usarparadevolverresultadoatravsdel,poresaraznprecisamentepuedeseruna
constante o una expresin, porque al no devolver resultados a travs de l no
necesitatomarningunazonadememoriaenlaqueestealmacenado,esms,incluso
sielparmetroactualfueraunavariableylamodificsemosdentrodelsubprograma
(algo que no deberamos hacer), fuera del subprograma no tendra ninguna
repercusinestamodificacin,esdecir,esavariableserviravaliendolomismoen
elprogramadesdeelquesehacelallamadadespusyantesdehacerla.
Elfuncionamientoseraelsiguiente:
- Alhacerlallamadaalsubprogramaseevalaelvalordelparmetroreal,y
eseeselqueseasocia,esdecir,elqueseguardaoasignaalparmetro
formalasociado.
- Comenzamosaejecutarelsubprogramaysiporcasualidadseproducealgn
cambioenelparmetroformal,elparmetroactualnoseverafectado,es
decir,suvalorseguirsiendoelmismoenelsubprogramadesdedondese
llamaqueantesdehacerlallamadaalsubprograma.
-

AlgoritmoEj
VarA:entero336
InicioAdelPPXdeP
A3
P(A)
EscribirA
Fin
ProcedimientoP(x:entero)
Inicio
PGINA46/184

Xx*2
Escribirx
Finp
ElvalordeAsera3yeldeXsera6.
2.
Por
valorresultado: En el valorresultado nos interesa el valor del parmetro
actualtantoalaentradacomoalasalidadelaejecucindelsubprograma.
Estoquieredecirquesecambiaelvalordelparmetroformalcambiartambinel
valordesuparmetrorealasociado,cosaquenoocurraantes,yestosuponeportanto
queahoraelparmetrorealtienequetenerasociadaobligatoriamenteunadireccinde
memoria, por lo quesiempre tendr que seruna variable (nouna constante ni una
expresin).
Elprocesoseraelsiguiente:
Alhacerlallamadaalsubprogramaseevalaelparmetrorealysuvalorsecopia
enelparmetroformalasociadoyalterminarlaejecucinelvalordelparmetro
formalsevuelveacopiarenelparmetrorealasociado.
AlgoritmoEj
VarA:enteroSecopia
Inicio
A3
P(A)3636
EscribirAP.RealP.Formal
Fin
ProcedimientoP(x:entero)
InicioSedevuelve
Xx*2
Escribirx
Finp
ElvalordelaAylaXsera6.
3.
Porresultado:

Nosinteresaelvalordelparmetrorealsolamentealasalidaofin
de la ejecucin del subprograma en que aparece. Esto significa que al hacer la
llamadanosecopiaelvalordelparmetrorealenelparmetroformalasociado,sin
embargo a la salida se copia el valor del parmetro formal en la direccin del
parmetrorealasociado,estosignificaportanto,queelparmetrorealtieneque
tener asociada una expresin que tiene que ser una variable (no puede ser una
constanteounaexpresin).

AlgoritmoejNosecopia
VarA:entero
Inicio
A3P.RealP.Formal
P(A)

PGINA47/184

EscribirA
Fin
ProcedimientoP(x:entero)Secopiaalasalida
Inicio
X1
Xx*2
Escribirx
Finp
ElvalordeAydeXes2.
En la prctica la mayor parte de los lenguajes dentro del tipo de paso de
parmetroporcopiasolovanasoportareltipodepasodeparmetroporvalor,quese
usar cuando un parmetro solo lo quiero utilizar como entrada de informacin al
subprograma,peronoparadevolverresultadosatravsdel.
Losotrosdostiposdepasodeparmetros porcopia(porvaloryporvalor
resultado), no se implementan normalmente porque los efectos son prcticamente
iguales que el paso de parmetros por referencia, es decir, cuando quiero usar un
parmetronosoloparapasarinformacinatravsdelsinotambinparadevolver
resultados o si lo voy a usar slo para devolver resultados, utilizar el paso de
parmetrosporreferenciaquevamosaveracontinuacin.
Parasimbolizarqueeltipodepasodeparmetrosesporvalor,enladefinicin
delsubprogramanopongoningntipodepasodeparmetrosparaeseparmetro,es
decir,noponerningntiposignificaquepordefectoeltipodepasodeparmetroses
porvalor.
En el caso de las funciones como solamente pueden recibir informacin de
entrada pero nunca pueden devolver informacin por sus parmetros ya que lo
devuelvenatravsdelasentenciaretornoyasociadoasunombre.
Eltipodepasodesusparmetrosvaasersiempreporvalor.

Pasodeparmetrosporreferencia:
Ahoralacaractersticaprincipaldeestetipodepasodeparmetrosesqueel
parmetroformalvaatenertambinasignadaunadireccindememoriaenlaquese
almacena,peroenesadireccinNOSEGUARDASUVALOR,sinoquesealmacena
PGINA48/184

la direccin de suparmetro real asociado, es decir, el parmetro formal apunta al


parmetro real quetiene asociado y cualquier modificacin que seefecte sobre el
parmetroformaltendrunarepercusindirectaenelparmetrorealasociadoyaquelo
quemodificarserelvaloralmacenadoenladireccinqueindicaelparmetroformal
queesladesuparmetroformalasociado.
Elprocesoserportantoelsiguiente:
- Alhacerlallamadaalprocedimientoenelparmetroformalquesepasapor
referencia,sevaaguardarladireccindelparmetrorealasociadoparaque
apunteal.
- Durante la ejecucin cualquier referencia al parmetro formal se har
accediendoaladireccinapuntadapordichoparmetro,esdecir,accediendo
directamentealparmetrorealasociado,porloquecualquiercambioenel
parmetroformalafectardirectamentealparmetrorealasociado.Deesta
manerahabremospasadoelresultado.
Paraindicarqueeltipodepasodeparmetroesporreferencia,vamosautilizar
lapalabraclaveentsalprecediendoalparmetroquesepasaporreferencia.
Aestosparmetrostambinselesllamaparmetrosvariables(porquesuvalor
vara),poresoenPascalseusalapalabraclaveVarparaindicarlo.
EnotroslenguajescomoC,seusancomoparmetrospunterosparaindicarque
sondirecciones.
AlgoritmoEJ
VarAapunta
Inicio
A3
P1(A)3direccinA
Escribir(A)
FinAdelPPXdelP1
ProcedimientoP1(entsalx:entero)
Inicio
Xx*2
FinP1
Porvalorelparmetroactualnocambiadevalor.
Porreferenciaelparmetroactualpuedecambiar.
Pasodeparmetrospornombre:
En este caso, el parmetro formal se sustituye literalmente por el parmetro
actualasociado.Estasustitucinliteraldelparmetroformalporelparmetroactualno
seproducehastaquenoseusaelparmetroformal.
Laventajaesquesinousamosenningnmomentoelparmetroformaldentro
delsubprogramallamado(cosapocoprobable),nosetendrquehacerningntipode
substitucin.
Peroelgraninconvenienteesquesiseusaelparmetroformal,hayqueira
buscarenesemomentolaexpresindelparmetrorealasociado.
Elpasodeparmetropornombreesloqueseparecemsalasubstitucinde
parmetrosenunafuncinmatemtica.
F(x)=x+2
F(a+1)=a+1*2
PGINA49/184

F(x)=x+2
F(a+1)=a+12<>(a+1)*2
AlgoritmoEJ
VarA:entero
Inicio
A3
P1(A+1)
Escribir(A)
Fin
ProcedimientoP1(entsalx:entero)
Inicio
Xx*2
FinP1
Alfinalsolovamosausar2tiposdepasodeparmetros,quesonlosqueusan
casitodosloslenguajes:Porvaloryporreferencia.
Porvalor:Sololousamoscuandounparmetrosolosirveparainformacindeentrada,
no devolvemos nada con l. Por eso este paso puede ser una constante, variable o
expresin.Parasimbolizarloenladeclaracindevariablesnoponemosnada.
Por referencia: Lo usamos cuando un parmetro lo usamos como entrada de
informacinycomosalidaosolocomosalida.Porestaraznahorasquesevaavariar
elparmetroformalyporlotantonopodemosusarconstantesniexpresiones,solo
variables.Losimbolizamosconlapalabraentsal.

6.FUNCIONESYPROCEDIMIENTOSCOMOPARMETROS:
En la mayor parte de los lenguajes se permite tambin que una funcin o
procedimientopuedaserpasadocomoparmetrodeotrosubprograma.Enestecaso,es
decir,cuandoelparmetroformalesdetipofuncinoprocedimiento,pasaremoscomo
parmetrorealfuncionesoprocedimientosquetenganlamismadefinicinqueelque
hemospuestocomoparmetroformal,yennuestrocasoparaindicarquesepasacomo
parmetrorealunafuncinoprocedimiento,bastaconponersunombre.
Desde el subprograma al que se pasa como parmetro esa funcin o
procedimiento podemos llamar en cualquier momento a esa funcin pasada como
parmetro que en cada momento podr ser una distinta dependiendo del parmetro
formalasociado.
Funcion<nombre_f>
(par:tipo;funcion<n_f>(x:entero,y:carcter):entero
Prodedimiento<nombre_f>procedimiento(x:tipo,...);...

PGINA50/184

AlgoritmoEJ
Varv1,v2:entero
Inicio
V11
V22
P(v1,f1,v2)
P(v1,f2,v2)
Fin
ProcedimientoP(x:entero;funcionF(A:entero;B:carcter):entero;entsaly:entero)
Inicio
X2
YF(x,a)
FinP
FuncionF1(x:entero;y:carcter):entero
Inicio
Escribiry
Retorno(x+1)
Fin
FuncionF2(A:entero;B:carcter):entero
Inicio
EscribirHolaB
RetornoA
FinF2
Elpasodefuncionesyprocedimientoscomoparmetros,nosvaapermitirque
desde un subprograma podamos llamar a otros, pero teniendo en cuenta que el
subprogramallamadonovaaserunodeterminado,sinoquevaadependerencada
momentodelsubprogramapasadocomoparmetroreal,deestamaneraelsubprograma
puede llamar a un conjunto de n subprogramas que cumplan unas determinadas
caractersticas,perosolounoencadamomento.
Nohayqueconfundirelpasodeunafuncincomoparmetroconlallamadaa
unafuncincuandoaparececomoparmetrorealenlallamadaaunsubprograma.Para
diferenciarlo, cuando pasouna funcin como parmetro solo pondrsunombre, en
cambiocuandollamoaunafuncinparapasarelvalorquedevuelvecomoparmetro
pondrelnombredelafuncinyconsusargumentosparaindicarqueahsepuede
hacerlallamada.Estosepuedehacerporquelallamadaaunafuncinpuedeaparecer
en cualquier expresin en la que apareciese cualquier valor del tipo de datos que
devuelve.
ProcedimientoP(A:entero)
Inicio
EscribirA
FinP
FuncionF(x:entero):entero
Inicio
Retorno(x*2)
FinF

PGINA51/184

AlgoritmoEJ
VarI
Inicio
I2
P(F(I))Estonoespasarunafuncincomoparmetro
Fin
7.EFECTOSLATERALES:
Unefectolateralescualquiermodificacinqueunsubprograma(seafuncino
procedimiento), realiza en elementos situados fuera de l pero sin hacer esas
modificacionesatravsdelpasodeparmetros.
Losefectoslateralessiemprehayqueevitarlosporquenosomosconscienteso
nocontrolamosquesehanproducido.
Pararealizarcomunicacinentresubprogramassoloseharatravsdelpasode
parmetroparaevitarlosefectoslaterales.
Losefectoslateralesnormalmenteseproducenporelusodevariablesglobaleso
variables locales que abarcan varios procedimientos (esto solo es posible si hay
anidacin de subprogramas). Por lo tanto evitaremos su uso excepto que sea
imprescindible.
VarA:entero
AlgoritmoEJ
VarB:entero
Inicio
B1
A2
P(B)
EscribirA
Fin
ProcedimientoP(x:entero)
Inicio
Ax+2
FinP
8.RECURSIVIDAD:
Se dice que un subprograma es recursivo cuando se llama a s mismo. La
recursividad se va a poder usar en subprogramas que pueden definirse en trminos
recursivos, es decir, en termino de s mismo, como procesos de alguna manera
repetitivos.
Larecursividadtrataremosdeevitarlasiemprequeseaposible,esdecir,siempre
quelomismosepuedasolucionarconunbucle,yaquecadavezqueunsubprogramase
llamaasmismohayquealmacenarenlapiladelsistemaladireccinderetornodeese
subprograma,conlocualsihacemosmuchasllamadasrecursivamenteiremosllenando
lapiladelsistema,ysedesbordaraacabandoconlamemoria.

PGINA52/184

Todoprogramarecursivotienequeteneralgunacondicinquepongafinala
recursividad,esdecir,queelprogramadejedellamarseasmismocuandosecumplala
condicin,sinoseformaraunbucleinfinito.

Funcionpotencia(base:entero;exp:entero):real
VarP:real
I:entero
Inicio
P1
Desdei=1hastaexp
PP*base
Findesde
RetornoP
Fin
Funcionpotencia(base:entero;exp:entero):real
Inicio
Siexp=0entoncesretorno1
Sino
Retorno(base*potencia(base,exp1)
Finpotencia

PGINA53/184

TEMA5:EJERCICIOS
1.ImplementarunsubprogramaquerealicelaseriedeFibonacci,quees:
Fibonacci(1)=Fibonacci(2)=1
N>2Fibonacci(n)=Fibonacci(n1)+Fibonacci(n2)
Algoritmoserie_fibonacci
Var
I,n:entero
Inicio
EscribirIntroduceunnmero
Leern
Desdei=1hastan
EscribirLaseriedefibonaccideiesfibonacci(i)
Findesde
Fin
Funcionfibonacci(num:entero):entero
Inicio
Si(num=1)o(num=2)
Entoncesretorno1
Sino
Retorno(fibonacci(num1)+fibonacci(num2)
Finsi
Finfibonacci
2.Implementarunsubprogramaalquepasndolecomoparmetros2valoresenterosM
yN,mecalculeelcombinatorio
Algoritmocombinatorio
Var
M,n:entero
Inicio
Repetir
EscribirIntroduceelvalordeMyN
Leerm,n
Hastam>n
EscribirElcombinatorioesfactorial(m)div(factorial(n)*factorial(mn))
Fin
Funcionfactorial(num:entero):real
PGINA54/184

Inicio
Sinum=0
Entoncesretorno1
Sino
Retorno(num*factorial(num1))
Finsi
Finfactorial

3.Implementarunsubprogramaquemehallecualeslaprimerapotenciaenbase2
mayorqueunnmeroquepasamoscomoparmetro,devolviendoelvalordedicha
potenciayelexponentealqueestelevado.
Algoritmoelevar
Var
Numero,resp1,resp2:entero
Inicio
EscribirIntroduceunnmero
Leernumero
Comprueba(numero,resp1,resp2)
Escribir2^resp1=resp2>numero
Fin
Procedimientocomprueba(num:entero;entsaln:entero;entsalpot:entero)
Inicio
N1
Mientraspot<n
Potpot*2
Nn+1
Finmientras
Fincomprueba
4.Implementarunsubprogramaquecalculerecursivamenteencuantoseconvierteun
capitalCalfinaldeNaosyaunintersI.
Funcioncalculo(c:entero;i:entero;n:entero):real
Inicio
Sim=0
EntoncesretornoC
Sino
Retorno(c*(1+i/100)+calculo(c,i,n1)
Finsi
Fincalculo

PGINA55/184

5.CalcularelprimertrminodelasiguienteseriequeseamayoroigualaunvalorV
queselepasacomoparmetroymedevuelvaellugarqueocupaenlaserieyelvalor.
Ai=0
An=n+(An1)!
Funcionfactorial(num:entero):entero
Var
I,acum:entero
Inicio
Acum1
Desdei=1hastanum
Acumacum*i
Findesde
Retornoacum
Finfactorial
Procedimientoserie(v:entero;entsalan:entero;entsaln:entero)
Var
A1:entero
Inicio
A10
An0
N1
Mientrasan<=V
Nn+1
Ann+factorial(a1)
A1an
Finmientras
Finserie
6.CalcularelvalordelaseriedondeNesunvalorquesepasacomoparmetroal
subprogramaquehaceelclculo.
n 1

n
1
(
1
+
i
*
)

i =0
i =0 n
Funcionsuma(n:entero):real
Var

PGINA56/184

I,j:entero
X,y,acum1,acum2,suma1,suma2:real
Inicio
Acum10
Acum20
Desdei=0hastan
X1/n
Acum1acum1+x
Findesde
Desdej=0hastan1
Y1+i*acum1+y
Findesde
Retornoacum2
Finsuma
7.Quseescribeenpantallatraslasiguienteejecucin?
AlgoritmoEJ
Var
A,B,C:entero
Inicio
A1
B2
CA+3
P1(A,BC,C)
CCF(A)
P2(A,C)
P1(C,B,A)
EscribirA,B,C
Fin
ProcedimientoP1(entsalx:entero;y:entero;entsalz:entero)
Inicio
Xy+z
Yx+1
Zy*2
FinP1
ProcedimientoP2(entsalx:entero;y:entero)
Inicio
Xx+1y
Y3
FinP2
FuncionF(x:entero):entero
Inicio
Xx+3
Retorno(x1)
FinF

LasolucinesA=8;B=2;C=3

PGINA57/184

ESTRUCTURASDEDATOS:ARRAYS.
TEMA6
1.
2.
3.
4.
5.
6.
7.
8.

Introduccinalasestructurasdedatos.
Arraysunidimensionalesovectores.
Operacionesconarraysunidimensionalesovectores.
Arraysbidimensionalesomatrices.
Arraysmultidimensionales.
Almacenamientodearraysenmemoria.
Arrayscomoparmetrosdesubprogramas.
Arraysdepunteros.

1.INTRODUCCINALASESTRUCTURASDEDATOS:
Clasificacindelostiposdedatossegnsuestructura:
Simples:
Estndar(entero,real,carcter,booleano)
Noestndar(enumeracin,subrango)
Estructurados:
Estticos(arrays,cadena,registros,ficheros,conjuntos) Pilas
Dinmicos(punteros,listasenlazadas,rboles,grafos) Colas
Lostipossimplessoncuandocadadatorepresentaunnicoelemento:
Estndar:Estndefinidospordefectoporellenguaje.
Noestndar:Tipossimplesdefinidosporelusuario.
Los tipos de datos estructurados, son cundo un dato es una estructura que se
construyenapartirdeotroscomplementos.
- Estticos:Ocupanuntamaodememoriafijo,quetengoquedefinirantesde
declararlo.

PGINA58/184

Dinmicos:Laestructura noocupauntamaofijodememoria,sinoque
ocupalamemoriaqueocupaencadamomento.Sevanamanejaratravsdel
tipodedatopuntero.
Puntero:Esunavariablecuyocontenidoesunadireccindememoriayesa
direccin de memoria corresponde a la direccin de memoria de otra
variable,queeslavariableapuntada.
Segneltipodedatosdelavariableapuntadavariareltipodepuntero.A
travs de unavariable detipo puntero podemos establecer laconexin o
enlaceentreloselementosquevanaformarlaestructura,ysegnserealizan
estosenlacesvamosatenerdiferentestiposdeestructuras(listasenlazadas,
rboles,grafos).
Laspilasylascolasson2estructurasdedatosconunfuncionamientoespecial,que
puedenimplementarseconmemoriaestticaodinmica.
-

2.ARRAYSUNIDIMENSIONALES:VECTORES.
Unarrayunidimensional,olineal,ovector,esunconjuntofinitoyordenadode
elementoshomogneos.
Esfinitoporquetieneunnmerodeterminadodeelementos.Homogneoporque
todosloselementosalmacenadosvanaserdelmismotipo.Ordenadoporquevamosa
poderaccederacadaelementodelarraydemaneraindependienteporquevaahaberuna
formadereferenciarcadaelemento.Parareferenciarcadaelementodeunarrayvamosa
usarndices(valorquedirectaoindirectamentereferencialaposicindelarray).
Losndicestienenqueserdecualquiertipodedatosescalar(entrelosquese
puededefinirunorden,yqueentre2elementosconsecutivosnopuedehaberinfinitos
elementos),aunquenormalmentecomondicessevanautilizarnmerosenteros.
Parareferenciarunelementodeunarrayusaremoselnombredelarrayyentre
corchetes[]elndicequedeterminalaposicindeeseelementoenelarray.
Elrangoolongituddeunvectoroarraylinealesladiferenciaentreelndicede
valormximoyelndicedevalormnimodeesearray+1.Normalmentelosndices
comienzanaenumerarse,esdecir,elvalormnimodelndicees01,dependiendodel
lenguaje(enPascalcon1yenCcon0).Sinembargonadieimpidequecomiencenen
cualquierotrovalor.
Los arrays se almacenan siempre en posiciones consecutivas de memoria y
podemosaccederacadaelementodelarraydemaneraindependienteatravsdelos
ndices.Unndicenotieneporqueserunvalorconstante,sinoquepuedesertambin
unavariableounaexpresinquealserevaluadadevuelvaesendice.
Alahoradedefinirunarraysiemprehabrquedarelnombredelarray,elrango
desusndicesyeltipodelosdatosquecontiene,yparahaceresadeclaracin,seutiliza
lasiguientenomenclatura.
<nom_array>:array[LI..LS]de<tipo>
sueldo:array[1..8]dereal
sueldo:array[1990..1997]dereal
sueldo[1992]100000
I:entero
I1992
Sueldo[I]
Sueldo[I+2]

PGINA59/184

3.OPERACIONESCONARRAYSUNIDIMENSIONALESOVECTORES:
1.Asignacindeundatoaunaposicinconcretadelarray:
<nom_array>[indice]valor
1

2
3
4
Ventas[3]800000

10

11

12

2.Lecturayescrituradedatos:
leer<nom_array>[indice]
escribir<nom_array>[indice]
desdei=1hasta12
escribirIntroducelasventasdelmesi
leerventas[i]
findesde
desdei=1hasta12
escribirVentasdelmesi=ventas[i]
findesde

3.Recorridooaccesosecuencialdeunarray:
Consiste en pasar por todas las posiciones del array para procesar su
informacin.
Desdei=1hasta12
Ventas[i]ventas[i]+1000000
Findesde
4.Actualizacindeunarray:
1)Aadirdatos:
Esuncasoespecialdelaoperacindeinserccindeunelementoenunarray,
peroelelementolometemosdespusdelaltimaposicinquecontieneinformacin
vlidaenelarray.
ParaqueestosepuedahaceresnecesarioquesiactualmenteelarraytieneK
posicionesdeinformacinvlida,tengauntamaodealmenosK+1paraquepueda
aadirotroelementoacontinuacindeK.
<nom_array>[K+1]valor
2)Insercindedatos:
Consisteenintroducirunelementoenelinteriordeunarrayparalocualser
necesariodesplazartodosloselementossituadosaladerechadelquevamosainsertar
unaposicinaladerechaconelfindeconservarelordenrelativoentreellos.
Para que se pueda insertar un nuevo elemento en el array si ya existen N
elementosconinformacinenelarray,elarraytendrqueteneruntamaodecmo
mnimoN+1parapoderinsertarelelemento.
C
E
F
J
M
O

PGINA60/184

G
SiendoKlaposicinenlaquetengoqueinsertarelnuevoelementoyNel
nmero deelementos vlidos enel arrayen elmomento delainsercin ysiempre
suponiendodeN+1,elalgoritmodeinsercinser:
Desdei=NhastaK
A[I+1]A[I]
Findesde
A[K]valor
3)Borrardatos:
Paraeliminarunelementodeunarraysieseelementoestposicionadoalfinal
delarray,nohayningnproblema,simplementesieltamaodelarrayeraN,ahorahay
queconsiderarqueeltamaodelarrayesN1.
Si el elemento a borrar ocupa cualquier otra posicin entonces tendr que
desplazartodosloselementossituadosaladerechadelquequieroborrarunaposicin
hacialaizquierdaparaqueelarrayquedeorganizado.
C
E
F
J
M
O
BorrarJ.
SuponiendoqueelnmerodeelementosvalidosactualmenteesNyquequiero
borrarelelementodelaposicinK.
Desdei=KhastaN1
A[I]A[I+1]
Findesde
ParaindicarqueelnmerodeelementosvalidosesN,podramosindicarlocomo
NN1.
4.ARRAYSBIDIMENSIONALESOMATRICES:
Enunarrayunidimensionalovectorcadaelementosereferenciaporunndice,
enunarraybidimensionalcadaelementosevaareferenciarpor2ndices,yahorala
representacinlgicayanovaaserunvector,sinounamatriz.
UnarraybidimensionaldeM*NelementosesunconjuntodeM*Nelementos,
todosdelmismotipo,cadaunodeloscualessereferenciaatravsde2subndices.El
primersubndicepodrvariarentre1yMsihemosempezadoanumerarlosndicespor
1,yelsegundondicevariarentre1yN,sihemosempezadoanumerarlosndicespor
el1.
Ymsengeneralpodemosdefinirunarrayde2dimensionesdelasiguiente
manera.
<nom_array>:array[LI1..LS2,LI2..LS2]de<tipo>
<var_array>[I,J]
LI1<=I<=LS1
LI2<=J<=LS2
Eltamaodelarrayser(LS1LI1+1)*(LS2LI2+1)
Ventasdecadamesde1990a1995:
Ventas:array[1990..1995,1..12]dereal
6*12=72

PGINA61/184

La representacin lgica de un array bidimensional es una matriz de


dimensionesM*NdondeMeselnmerodefilasdelamatrizyNeselnmerode
columnas,esdecir,la1dimensinindicaralasfilasyla2dimensinindicaralas
columnas, es decir, al intentar acceder a un elemento I,J estaramos accediendo al
elementoqueocupalafilaIylacolumnaJ.
En memoria, sin embargo todos los elementos del array se almacenan en
posicionescontiguasperonosotroslovemoscomounamatriz.
123456789101112
1990
1991
1992
1993
X
1994
1995

Ventas[1993,3]
Enmemoriaestaraalmacenadotodoseguido:

Manejodematrices:
Paraponera0todosloselementosdelamatriz.
M:array[1..N,1..M]deentero
Vari,jentero
Desdei=1hastan
Desdej=1hastaM
M[i,j]0
Findesde
Findesde
Paraponera0sololoselementosdelafilaI:
Desdei=1hastaN
M[i,j]0
Findesde
5.ARRAYSMULTIDIMENSIONALES:
Unarraymultidimensionalesunarrayde3msdimensiones.Sitenemosun
arraydeNdimensiones,cadadimensindetamaod1,d2,..,dN,elnmerodeelementos

PGINA62/184

del array ser d1*d2*..*dN, y para acceder a un elemento concreto del array
utilizaremosNndices,cadaunodeloscualesreferenciaraunaposicindentrodeuna
dimensin,siempresegnelordendedeclaracin.
Enmemoria,elarraysesiguealmacenandoenposicionesconsecutivas.
Ladeclaracindeunarraymultidimensionalsera:
Nom_array:array[LI1..LS1,LI2..LS2,LI3..LS3,LIN..LSN]detipo
Nom_array[I1,I2,I3,IN]
LI1<=I1<=LS2
LIN<=I2<=LSN
6.ALMACENAMIENTODEARRAYSENMEMORIA:
Unarrayenmemoriasiempresealmacenaenposicionescontiguasapartirdela
direccinbasedecomienzodelarrayquemeladancuandoyodeclarounavariabledel
tipoarray.
Eltamaoqueocupaelarrayenmemoriaeselproductodelnmerodesus
elementosporeltamaodecadaunodeellos.
Array[1..100]decarcter
1byte*100elementos=100bytes
En el caso de un array bidimensional, tambin se seguir almacenando en
posicionescontiguasdememoria,ysutamaoserelproductodesuselementosproel
tamao.
Ahora,laformaenlaqueestnalmacenadosesoselementosvaadependerde
queelarraysealmacenefilaafilaocolumnaacolumna,quetambinseconocecomo
almacenamientoporordendefilamayoroporordendecolumnamayor.
C1
C2
.....
Cm C1
C2
...
Cm
F1
F2
F3

A:array[1..N,1..M]de<tipo>
Fila
1,1 1,2 1,3 ..... 1,M 2,1

2,2

2,3

....

2,M N,1 N,2 ...

N,m

Como hallar la direccin base en la que comienza a almacenarse un determinado


elementodeunarray:
Unidimensionales:
DIR(A[I])=Dir_Base+(I1)*Tamao
Nmeroelemento=3
Tamao=5
Dir_Base=100
A[3]comienzaenladireccin110
Bidimensionales:
- Ordendefilamayor
Dir(A[i,j])=Dir_Base+[((I1)*M)+(J1)]*Tamao
- Ordendecolumnamayor
Dir(A[i,j])=Dir_Base+[((J1)*N)+(I1)]*Tamao
PGINA63/184

7.ARRAYSCOMOPARMETROSDESUBPROGRAMAS:
Un array es tambin un tipo de datos estructurado, y se puede pasar como
parmetroaunsubprograma,peroelproblemaesquenosabemoscomoindicarsisu
pasoesporvaloroporreferencia.
Enprincipio,elpasodeunarraysiempretienesentidoqueseaporreferencia
(quesemodifiqueytengarepercusinenelexterior),ysiesporvalorsoloservirapara
leerinformacin.
Lamayorpartedeloslenguajesdeprogramacin,pasanlosarraysporreferencia
(sisemodificaelarraysenotaenelexterior).Nosotrostambinloharemosas.

Sipasoelarrayynoquieromodificarlo,connomodificarlobasta.
Esdistintopasarunarraycomoparmetroapasarunaposicindelarray,sipaso
el arrayentero como parmetro, el parmetro formal asociado serunarray con la
mismaestructuraqueelparmetroreal,perosiloquequieropasaresunelementode
unaposicinconcretadelarray,elparmetroformalasociadonoserdeltipoarray,
sinoqueserdeltipodedatosquecontengaelarray,porquecadaelementodeunarray
esunelementoindependientequesepuedeusarporseparado.
Enelcasodequepasemosunarrayenterocomoparmetro,elparmetroformal
asociado,tendrqueserunarraydelamismaestructuraquetieneelmismotipode
datosyelmismotamao.
EnC,elparmetroformalasociadotienequeserdelmismotipodedatos,pero
nohacefaltaqueseadelmismotamao.
Para pasar un array como parmetro real, utilizare el nombre del array, en
cambiosipasamosunaposicinconcreta,usarelnombreyelndice.
EnC,elnombredeunarrayindicasudireccindecomienzoenmemoria,ypor
esosiempresepasaporreferencia.
Siemprevamosapasarlosarraysporreferencia,sinlapalabraclaveentsal.
Comoenlasfuncionesnosepasanlosparmetrosporreferencia,lomejoresno
pasarlosarrayscomoparmetrosdelasfunciones.
Procedimiento<nombre_p>(<nom_par>:array[LI1..LS1]de<tipo>;...)
VarA:array[LI1..LS1]de<tipo>
Nom_p(array)Slosepasaelnombre.
8.ARRAYSDEPUNTEROS:
Enrealidadloquevamosaexplicarconesteconceptoeslaposibilidaddeque
desde un array se apunte a la posicin de otro array. Que unos arrays sirvan para
referenciaraotros.
Quesunpuntero?:
Unpunteroesunavariablequecontieneunadireccinenlaqueestalmacenado
unelementoquellamamosapuntado.
Desde este punto de vista, un ndice indirectamente tambin es un puntero
porqueindirectamenteindicaunaposicindelarray,peronoloesdirectamenteporque
noalmacenaunadireccin.
Desdeestepuntodevista,siunarraycontienevaloresdendices,esdecir,que
cadaposicindeesearrayloquehaceesapuntaralaposicindeotroarray,entonces
decimosqueesunarraydepunteros,aunqueenrealidadladefinicinmascorrectaes
queesunarraydendicesaotroarray.
PGINA64/184

Cundoestilusarunarraydendice?:
Imaginemosquetenemosunacompaaquequiereteneralmacenadoslosdatos
desusempleadosorganizadosporzonas.Imaginemosquehay4zonas.
Z1
X
A
Y

Z2
W

Z3
H
J

Z4
C
D
K
L

Podemosalmacenarestainformacindedistintasformas:
- Unarraybidimensional4*N,endonde4sonlaszonasyNeselnmero
mximodeempleadosquehayporzona.
Elinconvenienteeslaperdidadeespacio.
- Usarunarrayunidimensionalovectordondeestntodoslosdatosseguidos.
Elinconvenienteesquenotengolosempleadosordenadosporzonas.
- Usarunarrayunidimensional,yentrecada2zonasmeterenlaposicinque
vaentreellasunamarcaespecialparaindicarquepasodezona.
Elinconvenienteesqueparapasaraunazonatengoquepasarportodaslas
anteriores.
- Usarunarraydendices:
Unarrayconlainformacindelosempleados.
Otroarraydendicesquecontendrtantasposicionescomozonashaya.
Encadaposicindecadazonaalmacenarelndiceendondecomienzael
primerempleadodeesazonaenelarraydeempleados.

Zonas
Empleados
1
X
4
A
5
Y
7
W

H
J
C
D
K
L

PGINA65/184

*Listartodoslosempleadosdelazona3:
Desdei=zona[3]hastazona[4]1
EscribirEmpleados[i]
Findesde
*Nmerodeempleados:
Zona[4]Zona[3]

EJERCICIOS:TEMA6
1. Hayunosmulticinescon5salas,ycadasalacon100personasdistribuidasen20
asientosy5filas.
Siyopidoentradaparaunasala,implementarunprogramaquemedigasihaysitio
enlasala.
Algoritmocines
Const
Salas=5
PGINA66/184

Asientos=20
Filas=5
Var
N_salas,j,k:entero
Marca:boolean
A:array[1..salas,1..asientos,1..filas]deentero
Inicio
Pedir_datos(n_salas)
Mientrasn_salas<>0
Marcafalso
J0
K1
Repetir
Sij>asientos
Entoncesj1
Kk+1
Finsi
Si(j=asientos)y(k>=filas)
EntoncesescribirSalallena
Marcaverdadero
Sinosia[n_salas,j,k]=0
Entoncesa[n_salas,j,k]1
EscribirAsientojfilak
Marcaverdadero
Finsi
Finsi
Hasta(a[n_salas,j,k]=1)y(marca=verdadero)
Pedir_datos(n_salas)
Finmientras
Fin
Procedimientopedir_datos(entsals:entero)
Inicio
Repetir
EscribirEnqusalaquieresentrar?
Leers
Hasta(s>=0)y(s<=salas)
Finpedir_datos
2.Quescribeesteprograma?
AlgoritmoPrin
Var
Datos:array[1..10]deentero
i:entero
inicio

PGINA67/184

desdei=1hasta10
datos[i]i
findesde
P1(datos,datos[3])
Desdei=1hasta10
Escribirdatos[i]
Findesde
Fin
ProcedimientoP1(a:array[1..10]deentero;entsalx:entero)
Inicio
X0
Desdei=1hasta10
Xx+a[i]
Findesde
FinP1
*Solucin:1,2,55,4,5,6,7,8,9,10.
3.DadaunamatrizAdeM*Nelementos,actualizarlatalquelamatrizresultante
tenga divididos a los elementos de la diagonal principal por la suma de los
elementosquenoformanpartedeella.
Algoritmodiv_matriz
Var
A:array[1..M,1..N]dereal
Suma:real
Inicio
Pedir_datos(a)
Sumar(a,suma)
Escribir(a)
Fin
Procedimientopedir_datos(matriz:array[1..M,1..N]dereal)
Var
I,j:entero
Inicio
Desdei=1hastaM
Desdej=1hastaN
EscribirIntroduceelelementoi,j
Leera[i,j]
Findesde
Findesde
Finpedir_datos
Procedimientosumar(matriz:array[1..M,1..N]dereal;entsals:real)
Var
I,j:entero
Inicio
S0
PGINA68/184

Desdei=1hastaM
Desdej=1hastaN
Sii<>j
Entoncesss+matriz[i,j]
Finsi
Findesde
Findesde
Finsumar
Procedimientoescribir(matriz:array[1..M,1..N]dereal;s:real)
Var
I,j:entero
Inicio
Desdei=1hastaM
Desdej=1hastaN
Sii=j
Entoncesescribira[i,j]/s
Sinoescribira[i,j]
Finsi
Findesde
Findesde
Finescribir
4.Tengoguardadoenunaestructuralosalumnosdenuestraescuela,sabiendoque
hay 3 cursos, M alumnos por curso y N asignaturas por alumno, determinar
mediantesubprogramas:
1. Cualeslanotamediadeundeterminadocurso.
2. Cuantosaprobadosysuspensoshayenunadeterminadaasignatura.
3. Cualeselalumnodelaescuelaconmejornotamedia.
Algoritmoescuela
Const
Cursos=3
Alumnos=M
Asignaturas=N
Tipo
Dato=array[1..cursos,1..alumnos,1..asignaturas]dereal
Var
Nota:dato
Inicio
Pedir_datos(nota)
Media_curso(nota)
Ap_susp(nota)
Media_alum(curso)
Fin
Procedimientopedir_datos(n:datos)
Var
I,j,k:entero
PGINA69/184

Inicio
Desdei=1hastacursos
Desdej=1hastaalumnos
Desdek=1hastaasignaturas
Repetir
EscribirNotadelalumnojasignaturakcursoi
Leern[i,j,k]
Hasta(n[i,j,k>=0)y(n[i,j,k]<=10)
Findesde
Findesde
Findesde
Finpedir_datos
Procedimientomedia_curso(n:dato)
Var
J,k,resp:entero
Media,suma:entero
Inicio
Suma0.0
Repetir
EscribirDequcursoquiereshacerlamedia?
Leerresp
Hasta(resp<=1)y(resp<=cursos)
Desdej=1hastaalumnos
Desdek=1hastaasignaturas
Suma:=suma+n[resp,j,k]
Findesde
Findesde
Mediasuma/alumnos*asignatura
EscribirLanotamediadelcursorespesmedia
Finmedia_curso

Procedimientoap_susp(n:dato)
PGINA70/184

Var
Susp,ap,i,j:entero
Inicio
Susp0
Ap0
Repetir
EscribirQuasignaturaquieresver?
Leerasig
Hasta(asig>=1)y(asig<=asignaturas)
Desdei=1hastacursos
Desdej=1hastaalumnos
Sin[i,j,asig]>=5
Entoncesapap+1
Sinosuspsusp+1
Finsi
Findesde
Findesde
EscribirEnlaasignaturaasighayapaprobados
EscribirEnlaasignaturaasighaysuspsuspensos
Finap_susp
Procedimientomedia_alum(n:dato)
Var
I,j,alum,curs:entero
Suma,media,mayor:real
Inicio
Mayor0.0
Desdei=1hastacursos
Desdej=1hastaalumnos
Suma0.0
Desdek=1hastaasignaturas
Sumasuma+n[i,j,k]
Findesde
Mediasuma/asignaturas
Simedia>mayor
Entoncesmayormedia
Cursi
Alumj
Finsi
Findesde
Findesde
EscribirElalumnoconmayormediaeselalumdelcursocurs
Escribirysunotaesdemayor
Finmedia_alum

PGINA71/184

5.Multiplicar2matricesdedimensionesM*NyP*Q.
Algoritmomultiplicar_matrices
Tipo
Matriz1=array[1..M,1..N]deentero
Matriz2=array[1..P,11..Q]deentero
Resultado=array[1..M,1..Q]deentero
Var
Mat1:matriz1
Mat2:matriz2
R:resultado
Inicio
Pedir_datos(mat1,mat2)
Multiplicar(mat1,mat2,r)
Visualizar(r)
Fin
Procedimientopedir_datos(m1:matriz1;m2:matriz2)
Var
I,j:entero
Inicio
Desdei=1hastaM
Desdej=1hastaN
EscribirIntroduceelelementoi,jdelamatriz1
Leerm1[i,j]
Findesde
Findesde
Desdei=1hastaP
Desdej=1hastaQ
EscribirIntroduceelelementoi,delamatriz2
Leerm2[i,j]
Findesde
Findesde
Finpedir_datos
Procedimientomultiplicar(m1:matriz1;m2:matriz2;entsalresul:resultado)
Var
Fila,i,j,acum:entero
Inicio
Desdefila=1hastaN
Desdei=1hastaP
Resul[fila,i]0
Desdej=1hastaQ
Resul[fila,i]resul[fila,i]+m1[fila,j]*m2[j,i]
Findesde
PGINA72/184

Findesde
Findesde
Finmultiplicar
Procedimientovisualizar(resul:resultado)
Var
I,j:entero
Inicio
Desdei=1hastaM
Desdej=1hastaQ
Escribirresul[i,j]
Findesde
Findesde
Finvisualizar
6.Resolverlasiguienteserie:
m

X =

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

j =1

n 1

b[ n, j ]
j =2

Algoritmoserie
Tipo
Matriz1=array[1..M,1..N]deentero
Matriz2=array[1..N,1..N]deentero
Var
Suma1,suma2,suma3:entero
X:real
Inicio
Sumas(suma1,suma2,suma3)
Resultado(suma1,suma2,suma3,x)
EscribirElresultadoesx)
Fin
Procedimientosumas(s1:entero;s2:entero;s3:entero)
Var
I,j:entero
Inicio
Desdei=1hastaM
S20
Desdej=1hastaN
S2s2+a[i,j]*j
Findesde
S1s1+I*s2
Findesde
S30
PGINA73/184

Desdej=2hastaN1
S3s3+b[n,j]
Findesde
Finsumas
Procedimientoresultado(s1:entero;s2:entero;s3:entero;entsaly:real)
Inicio
Ys1*s2/s3
Finresultado
7.Unaempresaconstade5departamentoscon20empleadoscadadepartamento,si
tengotodaslasventasenunaestructura,determinar:
- Ventasdeundeterminadodepartamentoenundeterminadomes.
- Ventasdeundeterminadoempleadoenundeterminadodepartamento.
- Cualeseldepartamentoconmsventas.
Algoritmoempresa
Const
D=5
E=20
M=12
Tipo
Matriz=array[1..d,1..e,1..m]dereal
Var
Ventas:matriz
Cantidad:real
Departamentos:entero
Inicio
Pedir_datos(ventas)
Dep_mes(ventas)
Dep_empleado(ventas)
Mejor_dep(ventas)
Fin
Procedimientopedir_datos(a:matriz)
Var
I,j,k:entero
Inicio
Desdei=1hastaD
Desdej=1hastaE
Desdek=1hastaM
EscribirVentasdeldepartamentoiempleadojmesk
Leera[i,j,k]
Findesde
Findesde
Findesde
Finpedir_datos
PGINA74/184

Procedimientodep_mes(a:matriz)
Var
Dep,j,mes:entero
V:real
Inicio
V0.0
Repetir
EscribirDepartamento
Leerdep
Hasta(dep>=1)y(dep<=d)
Repetir
EscribirMes
Leermes
Hasta(mes>=1)y(mes<=12)
Desdej=1hastaE
VV+a[dep,j,mes]
Findesde
EscribirLasventasdeldepartamentodepenelmesmessonv
Findep_mes
Procedimientodep_empleado(a:matriz)
Var
Dep,empleado,k:entero
V:real
Inicio
V0.0
Repetir
EscribirEmpleado
Leerempleado
Hasta(empleado>=1)y(empleado<=E)
Repetir
EscribirDepartamento
Leerdep
Hasta(dep>=1)y(dep<=d)
Desdek=1hastaM
VV+a[dep,empleado,k]
Findesde
EscribirLasventasdelempleadoempleadodeldepartamentodepsonv
Findep_empleado

PGINA75/184

Procedimientomejor_dep(a:matriz)
Var
I,j,k,dep:entero
Mayor,v:real
Inicio
Mayor0.0
Desdei=1hastaD
V0
Desdej=1hastaE
Desdek=1hastaM
VV+a[i,j,k]
Findesde
Findesde
Siv>mayor
Entoncesmayorv
Depi
Finsi
Findesde
EscribirElmejordepartamentoeseldepconmayor
Finmejor_dep

8.DadounarrayAdeM*Nelementosdondeloselementossonnmerosenteros,hallar
ladireccindecomienzodelelemento4delarraysabiendoquesealmacenaapartirde
ladireccin1200yqueennuestramquinalosenterosocupan2bytes.
DirA(1,4)=1200+3*2=1206
9.Dadounarrayde4*5elementosquecontienecaracteres,sabiendoquesealmacena
apartirdelaposicin500,enqueposicincomienzaaalmacenarseelelementoA[3,5].
DirA[3,5]=500+(2*5+4)*1=514Enordendefilamayor
DirA[3,5]=500+(4*4+2)*1=518Enordendecolumnamayor

PGINA76/184

LASCADENASDECARACTERES
TEMA7
1.
2.
3.
4.

Juegodecaracteres.
Cadenadecaracteres.
Datosdetipocarcter.
Operacionesconcadenas.

1.JUEGODECARACTERES:
Enprincipioseprogramabatodocon0y1,perocomoestocostabamucho,
aparecilanecesidaddecrearunlenguajesemejantealhumanoparaentendernosms
fcilmenteconlacomputadora,yparaelloaparecenlosjuegosdecaracteres.
Eljuegodecaracteresesunaespeciedealfabetoqueusalamquina.
Hay2juegosdecaracteresprincipales:
- ASCII:Elquemsseusa.
- EBCDIC:CreadoporIBM.
Hay2tiposdeASCII,elbsicoyelextendido.
EnelASCIIbsico,cadacarctersecodifica con7bits,porloqueexisten
2^7=128caracteres.
EnelASCIIextendido,cadacarcterocupa8bits(1byte)porloqueexistirn
2^8=256caracteres,numeradosdel0al255.
EnelEBCDIC,cadacarcterocupatambin8bits.
Encualquieradelos2juegos,existen4tiposdecaracteres:
- Alfabticos:Letrasmaysculasyminsculas.
- Numricos:Nmeros.
- Especiales:Todoslosquenosonletrasynmeros,quevienenenelteclado.
- Control:Nosonimprimiblesytienenasignadoscaracteresespeciales.Sirven
paradeterminarelfindelnea,findetexto.Vandel128al255.
Unjuegodecaracteresesunatablaqueacadanmerotieneasociadounnmero.
2.CADENADECARACTERES:
Esunconjuntode0mscaracteres.Entreestoscaracterespuedeestarincluido
elblanco.

PGINA77/184

Enpseudocdigo,elblancoeselb.Lascadenasdecaracteressedelimitancon
doblescomillas,peroenalgunoslenguajessedelimitancon.
Lascadenasdecaracteressealmacenanenposicionescontiguasdememoria.
Lalongituddeunacadenaeselnmerodecaracteresdelamisma.Sihubiese
algn carcter que se utilizara como especial para sealar el fin de cadena, no se
consideraraenlalongitud.
Siunacadenatienelongitud0,lallamamoscadenanulaporloquenotiene
ningncarcter,peroestonoquieredecirquenotenganingncarctervlido,porque
puedehaberalgncarcterespecialnoimprimiblequeformepartedelacadena.
Unasubcadenaesunacadenaextradadeotra.

3.DATOSDETIPOCARCTER:
1. Constantes: Una constante de tipo cadena es un conjunto de 0 o ms
caracteresencerradosentre.
Sidentrodelacadenaquieroponercomopartedelacadenalas,laspongo
2veces.Estodependedellenguaje.
HolaAdiosHolaAdios
Enalgunoslenguajeshayuncarcterdeescape.EnC,elcarcterdeescape
esla\.
Unaconstantedetipocarcteresunsolocarcterencerradoentrecomillas
simples.
2. Variables:Hayquedistinguirentreunavariabledetipocarctery
unavariabledetipocadena,elcontenidodeunavariabledetipo
cadenaesunconjuntode0mscaracteresencerradosentre,
mientras que una variable de tipo carcter es un solo carcter
encerradoentre.
Formasdealmacenamientodecadenasenmemoria:
1. Almacenamientoesttico:
Lalongituddelacadenasetienequedefinirantesdeserusadaysiempreva
ateneresalongitud,almacenndoseenposicionescontiguasdememoria.
Silacadenanoocupatodoelespacio,elrestoserellenaconblancos,yesos
blancosseconsideranpartedelacadena.
Estoesmuydeficienteynoseusacasienningnlenguaje.
2. Almacenamientosemiesttico:
Antesdeusarlacadena,hayquedeclararlalongitudmximaquepuede
tener y ese es el espacio que se reserva en memoria para almacenar la
cadena,siempreenposicionescontiguas.
La longitud real de la cadena durante la ejecucin puede variar aunque
siempretienequesermenorqueelmximodelacadena.

PGINA78/184

Puesto que la cadena no tiene porque ocupar la longitud mxima, para


determinar que parte ocupa realmente esa cadena, se pueden utilizar
diferentesmtodos.
Pascalloquehaceesreservarlos2primerosbytesdelazonadememoriaen
queguardamoslacadenaparaindicarelprimerolalongitudmximaque
puedetenerlacadenayelsegundolalongitudactual.
10 4 H O L A
12345678910
OtroslenguajescomoC,utilizanuncarcterespecialqueindicaelfinde
cadenatalqueloscaracteresqueutilizanpartedelacadenasontodoslos
almacenadoshastaencontraresecarcterespecial.
H O L A \O
0123456789
Ladiferenciaentrealmacenarunsolocarcterenuntipocarcteroenuntipo
cadena,seralasiguiente:
Ca
Ca

3. Almacenamientodinmico:
Nohayquedefinirlalongituddelacadenaantesdeusarla,nisiquierala
mxima. Para esto, se utiliza la memoria dinmica, y para establecer el
nmerodeelementosdelacadenausaremoslistasenlazadasenlasquecada
nododelalista contarauncarcter dela cadenayseenlazara mediante
punteros.
La informacin no tiene que estar almacenada en posiciones contiguas de
memoria.
HOLA
4.OPERACIONESCONCADENAS:
Aligualqueconcualquiertipodedatos,podemoshaceroperacionesdeentrada
ysalida(leeryescribir).
Varcad:cadena
Leer(cad)
Escribir(cad)
Apartedeestasinstrucciones,lamayorpartedeloslenguajespermitenrealizar
operacionesespecialesconlasvariablesdetipocadena.
Lamayorpartedeloslenguajestienenoperacionesdetratamientodecadenas,y
esasoperacionesvienenenlibrerasexternas.
Lasoperacionesmsusadasson:
Longituddeunacadena:

PGINA79/184

Esunafuncinalaqueselepasaunacadenacomoparmetroycomoresultado
devuelvesulongitud.
Funcionlongitud(c:cadena):entero
Comparacindecadenas:
Lascadenassepuedencompararentresiusandolossmbolosdecomparacin.
EstosepuederealizarporqueloquevoyacompararsonlosvaloresASCIIasociadosa
cadacarcter.
Enelcasodequesecomparen2cadenasdediferentelongitudtalquelacadena
demenorlongitudtieneNcaracteresyestosNcaracterescoincidenconlosNprimeros
caracteresdelacadenamslarga,seconsideramayorlacadenamslarga.
PEPE>PAPA
PEPES>PEPE
Enlamayorpartedeloslenguajes,hayunafuncinquehacelacomparacin.
EnCeslafuncinstrcmp(C1,C2).
Funcioncomparacion(C1:cadena;C2:cadena):entero
Estafuncindevuelve:
- 0siC1=C2
- UnpositivosiC1>C2
- UnnegativosiC1<C2

Concatenacin:
Loquepermiteesunirvariascadenasenunasola,manteniendoelordendelos
caracteresqueseunen.
Enpseudocdigoseusaelsmbolo&:C1&C2
C1=Hola
C2=Adios
C3=C1&C2=HolaAdios
Procedimientoconcatenacion(entsalC1:cadena;C2:cadena)
- SedevuelveenC1laconcatenacinC1&C2.
Subcadenas:
Extraepartedeunacadena.
Sepuedenusar3procedimientos:
Procedimientosubcadena(c:cadena;inicio:entero;longitud:entero;entsals:cadena)
- Si inicio es negativo, o es mayor que longitud, se devuelve la
cadenanula.
- Siinicio+longitudesmayorqueeltamaodelacadena,devuelvo
desdeiniciohastadefindelacadena.
Procedimientosubcadena(c:cadena;inicio:entero;fin:entero;entsals:cadena)
- Sifinesmenorqueinicio,devuelvelacadenanula.

PGINA80/184

Sifinesmayorquelalongituddelacadena,sedevuelvedesde
iniciohastaelfindelacadena.
Procedimientosubcadena(c:cadena;inicio:entero;entsals:cadena)
- Svadesdeeliniciohastaelfinaldelacadena.
-

Insercin:
Consiste en meter una cadena dentro de otra a partir de una determinada
posicin.
Procedimientoinsertar(entsalC1:cadena;C2:cadena;inicio:entero)
C1=Pepe
C2=Nuria
Insertar(C1,C2,3)=PeNuriape
- SiinicioesmayorquelalongituddeC1oinicioesmenorque0,
noseinsertanada.
Borrado:
Consisteenborrardeunacadenaunasubcadenaqueformapartedeella.Hay
quedarlaposicindeinicioyfinaldelasubcadenaquequieroborrar.
Procedimientoborrar(entsalC1:cadena;inicio:entero;fin:entero)
- Sifinesmenorqueinicio,oinicioesmayorquelalongituddela
cadena,noseborranada.
Procedimientoborrar(entsalC1:cadena;inicio:entero;fin:entero)
C1=Casaazul
Borrar(C1,3,5)
C1=Caazul

Intercambio:
Consisteensubstituirlaaparicindeunasubcadenadentrodeunacadena,por
otrasubcadena.Paraesolaprimerasubcadenatienequeaparecerenlaotra.
Procedimientointercambio(entsalC1:cadena;S1:cadena;S2:cadena)
C1=Casaazul
S1=asa
S2=asita
C1=Casitaazul
SiS1noestenC1,nosecambianada.
Conversindecadenasanmeros:
Esunafuncinqueselepasaunacadenacaracteresnumricosydevuelveel
nmeroasociado.
Funcionvalor(c:cadena):entero
I=234
Vari:entero

PGINA81/184

I=valor(C1)devuelve234.
Conversindenmerosacadenas:
Esunprocedimientoalqueselepasaunnmeroyloconvierteaunacadena.
Procedimientoconv_cad(n:entero;entsalc:cadena)
I=234
Conv_cad(i,C1)devuelve234
FuncinquedevuelveelcarcterASCIIdeunnmero:
Funcionconv_car(n:entero):carcter
FuncinquedevuelveelnmeroasociadodeuncarcterASCII:
FuncionASCII(c:carcter):entero
Lascadenasvanaestaralmacenadasenarraysdecaracteresdondeelcarcterde
findecadenaesel$.

EJERCICIOS:TEMA7
-

Los ejercicios de este tema van a consistir en implementar funciones y


procedimientosrelacionadosconelmanejodelassubcadenas.

Funcionnumero(c:carcter):entero
Inicio
SegnseaC
0:retorno0
1:retorno1
2:retorno2
3:retorno3
4:retorno4

PGINA82/184

5:retorno5
6:retorno6
7:retorno7
8:retorno8
9:retorno9
finsegnsea
finnumero
Funcioncaract(n:entero):carcter
Inicio
SegnseaC
0:retorno0
1:retorno1
2:retorno2
3:retorno3
4:retorno4
5:retorno5
6:retorno6
7:retorno7
8:retorno8
9:retorno9
finsegnsea
fincaract
Funcionlongitud(c:cadena):entero
var
l:entero
Inicio
L0
Mientrasc[L+1]<>$
LL+1
Finmientras
RetornoL
Finlongitud

FuncionValor(c:cadena):entero
Var
Cif,num,i:entero
Inicio
Ciflongitud(c)
Sicif>0
Entoncesnum0
Desdei=1hastaCif
Numnum+numero(c[i]*10^(cifi)
Findesde
Retorno(num)
PGINA83/184

Sinoretorno(1)
Finsi
Finvalor
Procedimientoconv_cad(n:entero;entsalc:cadena)
Var
Cif,aux:entero
Inicio
Cif1
AuxN
Mientras(aux>10)
Auxauxdiv10
Cifcif+1
Finmientras
Desdei=cifhasta1
C[i]caract(nmod10)
Nndiv10
Findesde
C[cif+1]$
Finconv_cad
Procedimientoborrar(entsalc:cadena;inicio:entero;fin:entero)
Var
I,f:entero
Inicio
Si(inicio>0)y(inicio<=fin)y(inicio<=longitud(c))
Entoncesiinicio
Ffin+1
Mientras(i<=fin)y(c[f]<>$)
C[i]c[f]
Ii+1
Ff+1
Finmientras
C[i]$
Finsi
Finborrado

Procedimientosubcadena(c1:cadena;inicio:entero;longitud:entero;entsalc2:cadena)
Var
I,k:entero
Inicio
Si(inicio<=0)o(inicio>longitud(c1))
Entoncesc2[1]$
Sinoiinicio
K1
PGINA84/184

Mientras(i<=inicio+longitud)y(c1[i]<>$)
C2[k]c1[i]
Kk+1
Ii+1
Finmientras
C2[k]$
Finsi
Finsubcadena
Funcioncomparacion(c1:cadena;c2:cadena):entero
Var
I:entero
Inicio
I1
Mientras(c1[i]=c2[i])y(c1[i]<>$)y(c2[i]<>$)
II+1
Finmientras
Sic1[i]=c2[i]
Entoncesretorno(0)
Sinoretorno(ascii(c1[i])ascii(c2[i]))
Finsi
Fincomparacion

Funcionbusqueda(c:cadena;s1:cadena):entero
Var
I,pos,k:entero
Encontrado:booleano
Inicio

PGINA85/184

I1
Encontradofalso
Mientras(c[i]<>$)y(encontrado=falso)
Sic[i]=s[i]
Entoncesposi
K1
Mientras(c[i]=s[k])y(c[i]<>$)y(s[k]<>$
II+1
Kk+1
Finmientras
Sis[k]=$
Entoncesencontradoverdadero
SinoIpos+1
Pos0
Finsi
SinoII+1
Finsi
Finmientras
Retorno(pos)
Finbusqueda
Procedimientoborrar(entsalc:cadena;ini:entero;fin:entero)
Var
I,j:entero
Inicio
Iini
Ffin+1
Mientrasc[f]<>$
C[i]c[f]
Ii+1
Finmientras
C[i]$
Finborrar

Procedureinsertar(entsalc:cadena;s:cadena;pos:entero)
Var
PGINA86/184

P,j,i:entero
Inicio
Ppos
J1
Mientrass[j]<>$
Desdeilongitud(c)+1hastaP
C[i+1]c[i]
Findesde
C[p]s[j]
Jj+1
Pp+1
Finmientras
Fininsertar
Procedimientointercambio(entsalc:cadena;c2:cadena;c3:cadena)
Var
I,pos:entero
Inicio
I1
Mientrasc1[i]<>$
Sic1[i]=c2[i]
Entoncesposbuscar(c1,c2)
Sipos<>0
Entoncesborrar(c1,pos,pos+longitud(c2)1)
Insertar(c1,c3,pos)
Ipos+longitud(c3)
SinoIi+1
Finsi
SinoII+1
Finsi
Finmientras
Finintercambio

PGINA87/184

FICHEROSOARCHIVOS:
TEMA8
1.
2.
3.
4.
5.
6.
7.
8.

Eltiporegistrodedatos.
Nocindearchivo.
Terminologadearchivos.
Tiposdesoporte.
Tiposdeorganizacionesdeficheros.
Operacionessobreficheros.
Tratamientodeficherossecuenciales.
Ficherosdetexto.

1.ELTIPOREGISTRODEDATOS:
Eltiporegistrodedatosesuntipoestructuradodedatos.Untiporegistrovaa
estarformadopordatosquepuedenserdediferentestipos.
Acadaunodeesosdatoslodenominamoscampos,yeltipodeestoscampos
puedenserunoestandarounodefinidoporelusuario,quepuedesercualquiercosa.
Lasintaxisqueusaremosparadefiniruntiporegistroeslasiguiente:
Tipo<nom_tipo_registro>=registro
<campo1>:<tipo>
<campo2>:<tipo>

<campo3>:<tipo>
finregistro
Una vez definida una estructura de tipo registro, ya puede pasar a declarar
variablesdeesetipo.
Var
<nom_var>:<nom_tipo_registro>
tipoalumno=registro
DNI:array[1..8]decaracteres
Nombre:array[1..100]decaracteres
Nota:real
Finregistro
Var
A1,A2:alumno

Paradeclararunavariabledeuntiporegistro,bastaconponer:
Var
<nom_var>:<nom_tipo_reg>
Paraaccederauncampoconcretodeunavariabledetiporegistro,utilizamosel
operadorpunto.
<nom_var>.<nom_campo>
c.nombrePepe

PGINA88/184

Y con ese valor puedo trabajar igual que trabajara con cualquier valor del
mismotipoqueesecampo.

Tipocliente=registro
DNI:array[1..8]decaracteres
Nombre:Cadena
Saldo:Real
Finregistro
Var
C:cliente
Borrar(c.nombre,3,5)
C.saldo5+3*8000
Almacenamientoderegistrosenmemoria:
Eltamaoqueocupaunavariabledetiporegistroenmemoriaeselqueresulta
delasumadeltamaodecadaunodesuscampos,yesainformacintambinestar
almacenadademaneracontiguaysegnelordenenquehayamosdeclaradoloscampos.
2.NOCINDEARCHIVO:
Lasestructurasanterioressealmacenabanenmemoriaprincipal,yelproblema
esquelainformacinsepierdealapagarelordenador.Laventajaesquelosaccesos
son ms rpidos. Para resolver esto estn los dispositivos de almacenamiento
secundario.
Fichero: Esunconjuntodedatosestructuradosenunacoleccindeunidades
elementalesdenominadasregistros,quesondeigualtipoyqueasuvezestnformados
porotrasunidadesdenivelmsbajodenominadoscampos.Todossondelmismotipo.
3.TERMINOLOGACONFICHEROS:
- Campo:Esunaunidadelementaldeinformacinquerepresentaunatributo
deunaentidad.Sedefineconunnombre,untamaoyuntipodedatos.
- Registrolgico: Esunconjuntodecamposrelacionadoslgicamenteque
puedensertratadoscomounidadenelprograma.
Desdeelpuntodevistadeprogramacinsimplementeesunaestructurade
tiporegistro.
- Archivo o fichero: Es un conjunto de registros del mismo tipo y
organizadosdetalformaqueesosdatospuedenseraccedidosparaaadir,
borraroactualizar.
- Clavedeunfichero: Esuncampooconjuntodecamposquesirvepara
identificarunregistroydistinguirladelrestodelfichero.
- Registrofsicoobloque:Eslacantidaddedatosquesetransfierenenuna
operacindeE/Sentreeldispositivoexternoylamemoria.
Desde este punto de vista, un registro fsico puede estar compuesto por
0,1,2,...registroslgicos.Elnmeroderegistroslgicosquehayporcada
registrofsico,esdecir,quesetransfiereenunaoperacindeE/S,esloque
sedenominafactordebloqueo.
PGINA89/184

Esefactordebloqueopuedeser<1,=1,>1:
Sies<1,quieredecirqueelregistrolgicoocupams queel
fsico,setransfieremenosdeunregistrolgicoencadaoperacinde
E/S.
Sies=1,significaqueeltamaodelregistrolgicoyelfsicoes
elmismo,ysetransfiereunregistrolgicoencadaoperacindeE/S.
Sies>1,lomsnormal,encadaoperacindeE/Ssetransfiere
msdeunregistrolgico.
Cmonosinteresaqueseaelfactordebloqueo?:
Desdeunpuntodevista,cuantomayorseaelfactordebloqueomsregistros
lgicos se transferirn, menos operaciones habr que hacer y se tardar menos en
procesarelfichero.Segnestocuantomayorseamejor.
Porotraparte,cadavezquesetransfiereinformacindeE/S,sedejaenuna
zonadememoria especial llamada buffer.Cuantomayorseaeltamaodebloqueo,
mayorserelbufferymenosmemoriamequedarparaelrestodelainformacin.
Alfinalhayquelograrunequilibrioparadeterminareltamaoidneo.
-

Bases de datos: Es un conjunto de datos relacionados almacenados


internamenteenunconjuntodeficheros.

4.TIPOSDESOPORTE:
Los soportes de almacenamiento secundario son en los que almaceno la
informacin,ypuedenserde2tipos:
- Secuenciales:Paraaccederaunregistroodatoconcretodentrodel,tengo
quepasarpreviamenteportodoslosregistrosanterioresal.Elejemploes
unacintamagntica.
- Direccionables:Esposibleaccederdirectamenteaunadireccinconcretade
soporte.Elejemploesundisco.
5.TIPOSDEORGANIZACIONESDEFICHEROS:
Organizacindearchivos:
Vienedeterminadapor2caractersticas:
- Mtododeorganizacin:Tcnicaqueutilizoparacolocarlainformacinde
losregistrosdentrodeldispositivo.
- Mtododeacceso:Conjuntodeprogramasquemepermitenacceder ala
informacinquepreviamentehealmacenadoyvanadependermuchodel
mtododeorganizacin:
Accesodirecto:Paraaccederaunaccesoconcretonohayque
pasarporlosanteriores.Elsoportetienequeserdireccionable.
Accesosecuencial:Paraaccederaunregistrohayquepasarpor
todoslosanteriores,yestoesposiblesielsoporteessecuencial,aunque
tambinpuedohacerloenunodireccionable.
Mtodosdeorganizacin:
Hay3tiposdeorganizacin:
- Secuencial

PGINA90/184

Directa
Secuencialindexada

Secuencial: Los registros se van grabando en un dispositivo unos detrs de otros


consecutivamente,sindejarhuecosysegnelordenenquesongrabadosoguardados.
AlfinalparadeterminarelfindeficheroseusalamarcaEOF(EndOfFile).
Directa:Sepuedeaccederaunregistrodirectamente.Paraellosonnecesarias2cosas:
1)Quecadaregistrotengaasociadaunaclavequeloidentifique.
2)Tienequeexistirunafuncinespecialllamadafuncindedireccionamiento
queseacapazdeconvetirlaclaveaunadireccinfsicarealeneldispositivo,
queesalaqueaccederemosparalocalizarlainformacinbuscada.

Enlaprcticaenrealidadhayunpasointermedioentrelaclaveyladireccin
fsicaqueesladireccinrelativaaregistro.
Suponiendounficherodenregistroslgicosnumeradosde0an1,estevalor
asociadoalregistroesloqueserasudireccinrelativaaregistro,esdecir,queloque
tienequeexistiresunafuncinqueconviertalaclaveadireccinrelativaaregistro,y
luegounafuncinqueconviertaladireccinrelativaaregistroadireccinfsica,donde
ladireccinfsicatendrVolumen,Cilindro,PistayRegistro,yestafuncinpuedeser
porejemploelprocedimientodedivisionessucesivas.
Pararealizaresteprocedimiento,primerohayquedecirelnmerodevolmenes,
elnmerodecilindros,elnmerodepistasyelnmeroderegistrosquehay.
Despushayquerealizarsucesivasdivisiones:
DRRnregistros
R1

C1npistas

Registros

R2C2ncilindros
Pistas
R3
C3
CilindrosVolumen

Volumen:C3
Cilindro:R3
Pista:R2
Empezandoacontardesde0.
Registros:R1
Tenemosundispositivocon5volmenes,3cilindrosporvolumen,4pistaspor
cilindroy20registrosporpista.Dndeestelregistro1001?
100120
1504
2123
04
Solucin40214022,segnempecemosanumerarpor0opor1.

PGINA91/184

Elproblemaestencomoconvertirlaclavedeunregistroadireccinrelativaa
registro,sienunsoportecomomximopodemosalmacenarnregistrosladireccin
relativaaregistroirde0an1luegohabrqueconvertirlaclaveaunodeestos
valores.Encualquiercasosueleocurrirqueelrangodeclaves(conjuntodetodaslas
clavesposiblesquesepuedendar)esmenorquen,yaqueenlaprcticaelespacio
reservadoesmenorqueelrangodenporquenousamostodoelespacio.
Segn esto puede ocurrir que a diferentes claves les correspondan la misma
direccinrelativaaregistroyportantolamismadireccinfsicaparaalmacenarse.A
estosregistrosselesdenominasinnimos,ycuandoestoocurrehabrquealmacenara
losregistrosquetienenlamismaposicinenunlugarapartereservadoparaguardarlos
sinnimos.
Elreareservadasepuedecolocarenvariossitiosdentrodeundispositivo.
Porejemplosielrangodeclavesvade0a999,ylaclavees11919943una
formadealmacenarla,seracogiendolos3ltimosnmeros943.
En cualquier caso la funcin que convierta una clave a direccin relativa a
registrosertalqueproduzcaelmenornmerodecolisionesdesinnimosposibles.
Secuencialindexada:Enestaorganizacintambinsepuedeaccederaunregistro
directamente,peroahoraloharmedianteinvestigacinjerrquicadendices.
Paraquesepuedaaplicarestaorganizacin,obligatoriamentelosregistrostienen
quetenerasociadosunaclave.
Enunarchivoconestaorganizacinsedistinguen3reas:
- Areadedatos
- Areadendices
- Areadeexcedentes
Cuandosecreaelficherolainformacinsevaguardandoenelreadedatosyal
mismotiemposevancreandondicesenelreadendicesparapoderluegolocalizar
esosdatos.Despusdelacreacindelficherolainformacinsealmacenaenelreade
excedentesysevaactualizandotambinelreadendices.
Tiposdendices:
- Indicedepista:Eseldemsbajonivelyesobligatorio.Hayunndicede
pistaporcadapistadelcilindro,yestendicecontiene2entradasovalores.
Elprimerodeterminacualeselvalordelaclavemsaltaalmacenadaenesa
pista, y el segundo determina cual es la clave del primer registro de
excedentedeesapista.
- Indicedecilindro:Eseldesiguientenivelytambinesobligatorio.Tiene
unaentradaporcadacilindroyenesaentradacontendrlaclavemsaltade
losregistrosalmacenadosenesecilindro.
- Indicemaestro:Noesobligatorio.Soloseusacuandoelndicedecilindro
ocupa ms de 4 pistas. Tiene una entrada por cada pista del ndice de
cilindrosycontendrlaclavemsaltadelosregistrosalosquereferencian
todosloscilindrosdeesapista.
Ej:2pistas/cilindroy2registros/pista

PGINA92/184

Pista1Pista2

Areadendices123560

8121520354260

Areadedatos2810121420303538425060
C1C2C3
Areadeexcedentes151716
Parabuscarelregistro30,hayqueirmirandosi30es<=queelregistroconel
quelocomparamos.
Sillegael15,lometemosenelreadeexcedentesporquenocabe.
6.OPERACIONESCONFICHEROS:
1.Creacinocargadeunfichero:
Consisteenmeterlosdatosporprimeravezenunficheroquenoexiste.Para
ellohayquedeterminarelespacioquehayquereservarparaelficheroyelmtodode
acceso.
2.Reorganizacindeunfichero:
Consiste en crear un fichero nuevo a partir de uno que ya existe. Conviene
reorganizarlocuandoyaresultaineficientesuusoporquehaydemasiadascolisionesde
sinnimosomuchosregistrosqueyanoexisten.
3.Clasificacindeunfichero:
Consisteenordenarlosregistrosporunoovarioscampos.Enlossistemasgrandes,
el propio sistema operativo ya soporta operaciones que realizan la organizacin
(SORT).
4.Destruccindeunfichero:
Destruccindeunfichero:Significaeliminartodalainformacinquecontieneel
fichero.
5.Reuninofusindeunfichero:
Crearunficheroapartirdevarios.
6.Roturaoestallidodeunfichero:
6 Apartirdeunficherocrearvarios.
7.Gestindeunfichero:
Paratrabajarconunficheroloprimeroquetengoquehacerescrearlo.Paracrear
unficherotengoquedarunnombrequeesconelquelevaaguardareneldispositivo.
Peroparamanejareseficherodentrodeunprogramatendrqueasignarleunavariable
detipodeficheroqueluegotendrqueasociarconelnombrefsicodelficheropara
podertrabajarconl.

PGINA93/184

Apartedeesto,tambinpuedodareltamaodelfichero,suorganizacinyel
tamaodesubloqueoregistrofsico,aunqueestos3ltimosparmetros,soloser
necesariodarlosparasistemasgrandes.
Antesdecrearelficherotengoquedefinirlaestructuradesuregistroparaluego
aldefinirlavariablequevaareferenciarelficherodeterminarqueficherovaacontener
esetipoderegistro.
Un fichero se crea cuando realizamos la operacin de apertura del mismo,
aunquehaylenguajesenlosquehayqueespecificar2cosas(creacinyapertura),yen
otrossialabrirloexistesecrea.
Alcrearunficherosiyaexiste,vaadependerdellenguaje,enunosdaerroryen
otrossemachacaloqueyaexiste.
Enlaoperacin deaperturasiyaexistedefichero,dependedelaforma de
apertura que esefichero queyaexista seamachacado opermanezca. Decualquier
formaenlaoperacindeabrirtenemosqueindicarlavariabledetipoficheroquenos
vaaservirparatrabajarconeseficheroenelprograma,acontinuacinyentreel
nombre real deesefichero enel dispositivo, yfinalmente elmodode apertura del
fichero.
Abrir(<nom_fich>,nom_real,<modo_apert>)
Losmodosdeapertura,dependendellenguajedeprogramacinydelmodode
organizacin.Sedistinguen3modosdeapertura:
- Mododeentradaolectura.
- Mododesalidaoescritura.
- Mododeentrada/salidaolectura/escritura.
APPEND:Existeenalgunoslenguajes.
Paradeclararunavariabledetipofichero,hayqueusarunavariabledetipo
ficheroquees:Ficherode<tipo_reg>.
Tipoalumno:registro
Cod_alum:entero
Direccion:cadena[30]
Nota:real
Finregistro
Varf:ficherodealumno
Abrir(F,c:\estudiantes.dat,<modo>)
- Mododeentrada:Eseficherolovoyausarparaleerinformacindelpero
nolovoyamodificar.Paraqueunficheroseabraenestemodopreviamente
tienequeexistirysinoesas,nosdarunerror.
- Mododeescritura:Utilizounficheroparaescribirinformacinenl. Al
abrirlonohacefaltaqueexista,siyaexistiese,dependedellenguaje,pero
normalmentesemachacaloquehay(loquevamosahacer).
- Mododeentrada/salida:Voyahaceroperacionesdeconsultayactualizacin
delainformacin.
- ModoAPPEND: Enpseudocdigonolovamos ausar.Appendsignifica
aadir,yseutilizaparaescribirenunficheroperoaadiendolainformacin
alfinaldelmismo.

PGINA94/184

EnalgunoslenguajestambinexistelaoperacinRESET,queloquemehacees
posicionarmealprincipiodelfichero.
Reset(<var_fich>)
Entodomomento,existirunpunteroquemeindicaenqueposicindelfichero
estoysituado.Alabrirunficheronormalmenteseacualseaelmododeaperturamevoy
aquedarsituadoalcomienzodelfichero,salvoqueuseelmododeaperturaAppend,qu
meposicionara alfinal delfichero.Amedida quevoyhaciendo operaciones en el
fichero,estevalorsevaactualizando.
Cerrar un fichero: Quiere decir deshacer la conexin entre la variable del
programaqueestoyusandoparamanejarelficheroyelficherorealqueestenel
dispositivo.
Cerrar(<var_fich>)
Siemprequeseacabedetrabajarconunficherooquequeramoscambiar el
mododetrabajarconesefichero,primerolocerraremosysiqueremosvolveratrabajar
conl,lovolvemosaabrir.
NUNCAHAYQUEDEJARUNFICHEROABIERTO.
Enalgunos lenguajes existe laoperacinborrarunficheroyloquehace es
eliminarfsicamenteelfichero.
Apartedetodoestotambinexistenotrasrelacionadasconsuactualizacin,que
sonlasaltas,lasbajasylasmodificaciones.
Lasconsultassonunaoperacindemantenimientodelfichero.

Alta:
Consisteenaadirunregistroalfichero.Sienelficherolosregistrostienen
algncampoclave,loprimeroquehayquecomprobaraldarunaaltaesquenoexista
yaotroregistroconlamismaclave.
Baja:
Consisteeneliminarunregistrodelfichero.Labajapuedeserfsicaolgica.
- Fsica:Cuandoeliminofsicamenteelregistrodelfichero.
- Lgica:Cuandoalregistrolomarcdeunamaneraespecialparaindicarque
yanoesvlidoperonoloeliminofsicamente.Arasgosdeltratamientodela
informacinescomosiyanoexistiera.
Enficherossecuencialesnosepermitelamodificacindelainformacintalque
paradardebajaaunregistrodeunfichero,loquehayquehacerescrearotrofichero
contodoslosregistrosmenoselquequeremoseliminar.
Enelrestodelasorganizaciones normalmentesedalabajalgica(conuna
marca) y cuando tengo muchos registros marcados como baja lgica reorganizo el
fichero(bajafsica).
Silosregistroscontienenclaveparadardebajaaunregistrotendrquedarsu
clavemirarloprimerosiexisteysoloenesecasolopodrborrar.
Reglasimportantisimas:
- Paradarlaaltaaunregistroconclave,primerohayqueversinohayningn
registroconesaclave.
- Paradarlabajaaunregistro:

PGINA95/184

1. Hayquebuscarsielregistroexiste.
2. Mostrar la informacin por pantalla y pedir la confirmacin del
usuario.
Modificacin:
Modificarunregistroconsisteencambiarlainformacinquecontiene,esdecir,
cambiarelvalordeunoomsdesuscampos.
En el caso de la organizacin secuencial como no se pueden modificar
directamente,loquehayquehaceresapartirdelainformacinqueyaexistecrearotro
ficherocontodoslosregistrosmenoselquequieromodificar,quelograbarconla
informacinquequiera.
Algunoslenguajesquesoportanlaorganizacinsecuencialspermitenhacerla
modificacindelregistroenelmismofichero(comoelC).
Cuandosemodificanregistrosdeunficheroconcamposclaveenelregistro,
hayquetenerencuentaqueloquejamassepuedemodificareselvalordelcampo
clave,porquehaceresoescomohacerunalta.
Consultas:
Lasconsultaslonicoquehaceesleerinformacindelficheroymostrarmela
informacin.
Parahacerunaconsultahayquedar2cosas:
- Criterio con el que consulto: Contendr el campo o campos por los que
quieroconsultaryelvalorquetienenqueteneresoscampos.
- Informacinquequieromostrar:Alahorademostrarlainformacin,decir
quecamposquieromostrar.
7.TRATAMIENTODEFICHEROSSECUENCIALES:
Operacionesbsicas:
1. Definirlaestructuradelfichero.
2. Aperturadelfichero.
3. Tratamientodelosregistros.
Escribir(<var_fich>,<var_reg>)
Leer(<var_fich>,<var_reg>)
Losficherossecuencialesnosepuedenmodificarenunaposicinconcreta,poresa
razncadavezquesequieredarunalta,bajaomodificacindeunregistro,comonose
puedehacerdirectamente,tendrqueusarunficheroauxiliartalquesiesunalta,enel
nuevoficherotendrtodalainformacindelficheroantiguomselnuevoregistro,sies
dardebaja,copioenelnuevoficherotodoloquehabaenelanteriorficheromenosel
registroquequieroborrar,ysiquieromodificarunregistro,copiotodalainformaciny
alllegaralregistroamodificar,locopioyamodificado.
Consultas:
Todotratamientodeficheros,lovoyahacerenunbucle,yelfinaldeficherolo
sealalamarcaEOF.
Laprimeralecturalavoyahacerfueradelbucle,ylassiguientesalfinaldel
bucle,yelbucleterminarcuandoseleelamarcaEOF.
PGINA96/184

Normalmente,encualquierlenguajeexisteyaimplementadaunafuncinque
diceshemosllegadoalfinaldelficheroperoqueloquehaceesbuscarlamarcaEOF.
Abrir(<var_fich>,nom,entrada/Salida)
Leer(<var_fich>,<var_reg>)
Mientrasnoeof(<var_fich>)
<procesoconregistro>
leer(<var_fich>,<var_reg>)
Finmientras
EnPascallamarcadefindeficheroestfsicamenteenelfichero,mientrasque
enC,secomparaeltamaodelficheroconladelpunterodelfichero,ysicoinciden
quieredecirqueeselfindelfichero.
Problemasquepodemosencontrar:
1. Sielficheroestclasificado por2campos yvoyahaceruntratamiento del,
normalmentetendrquehacer2buclesanidadosyaprovecharqueestnclasificados
porcampos.
2. Sielficheroestclasificadoporuncampo,parabuscarlosficherosporesecampo,
hacemosunsolobucleaprovechandoqueestnclasificadosporesecampo.
3. Si enfrento 2 ficheros, si uno est clasificado y otro no, leer en el bucle ms
externo el que no est clasificado, y en el ms interno el que est clasificado,
aprovechandoqueestnordenados.
4. Siningunoestclasificado,daigualelordendelosbucles,porqueenlos2tendr
quebuscarhastaelfinal.
5. Siloquemepidenessacarinformacinatravsdeuncampoquenoeselcampode
clasificacinperoquesesabeelnmerodevaloresconcretosquepuedetomarese
campo,utilizaremosunaestructuradeltipoarray.
Tenemosunficherocondatosdealumnos clasificadosporcurso ynmerode
alumno,teniendoencuentaquelosalumnosseempiezananumerarpor1.
Lainformacinporalumnoescurso,nmero,nombreynota.Determinarcuantos
alumnosaprobadoshayencadacurso.
Tipoalumno:registro
Curso:entero
Num_al:entero
Nom:cadena
Nota:real
Finregistro
Algoritmoclase
Var
F_al:ficherodealumno
R_al:alumno
Aprob:entero
Cur:entero
Inicio
Abrir(f_al,alumnos.dat,entrada)
Leer(f_al,r_al)
PGINA97/184

Mientrasnoeof(f_al)
Aprob0
Curr_al.curso
Mientrascur=r_al.curso
Si(r_al.nota>=5)y(noeof(f_al))
Entoncesaprobaprob+1
Finsi
Leer(f_al,r_al)
Finmientras
EscribirEnelcursocurhanaprobadoaprob
Finmientras
Cerrar(f_al)
Fin

Tenemosunficherodeempleadosclasificadoporelnmerodeempleadoyun
ficherodebajasnoclasificadoquecontienelosnmerosdelosempleadosquesehan
dadodebaja.Obteneruntercerficheroquecontengaalosempleadosquerealmentehay
enlaempresa.

Tipoempleado:registro
Num_emp:entero
Nombre:cadena
Sueldo:real
Finregistro
Algoritmobaja
Var
F_e_ini,f_e_fin:ficherodeempleado
F_baja:ficherodeentero
R_e_ini,r_e_fin:empleado
R_b:entero
Inicio
PGINA98/184

Abrir(f_e_ini,Empleado1.dat,entrada)
Abrir(f_e_fin,Empleado2.dat,salida)
Leer(f_e_ini,r_e_ini)
Mientrasnoeof(f_e_ini)
Abrir(f_b,Bajas.dat,entrada)
Leer(f_b,r_b)
Mientrasr_b<>r_e_ini.num_emp)ynoeof(f_b)
Leer(f_b,r_b)
Finmientras
Sieof(f_b)
Entoncesescribir(f_e_fin,r_e_fin)
Finsi
Cerrar(f_b)
Leer(f_e_ini,r_e_ini)
Finmientras
Cerrar(f_e_ini)
Cerrar(f_e_fin)
Fin

Tenemosunficherodeclientesnoclasificadosylaclavedelficherodeclientes
eselD.N.I.yunficherodemorososquecontiene elD.N.I.yqueestclasificado.
Queremosobtenerunlistadodelosclientesnomorosos.
Leer(f_c,r_c)
Mientrasnoeof(fc)
Abrir(fm,Morosos.dat,entrada)
Leer(f_m,r_m)
Mientrasr_c.DNI>r_mynoeof(f_m)
Leer(f_m,r_m)
Finmientras
Sir_c.DNI<>r_m
Entoncesescribirr_c.nombre
Finsi
Cerrar(f_m)
Leer(f_c,r_m)
PGINA99/184

Finmientras
Tenemosunficherodeventasquetieneelnmerodeventa,totaldeventay
nmero de vendedor, sabemos que en nuestra empresa trabajan 5 vendedores
numeradosdel1al5.
Queremossabereltotalvendidoporcadavendedor.
Tipoventa:registro
Cod_venta:entero
Total:real
Vendedor:entero
Finregistro
Algoritmoventas
Var
F_v:ficherodeventa
R_v:venta
Vend:array[1..5]dereal
I:entero
Inicio
Desdei=1hasta5
Vend[i]0
Findesde
Abrir(f_v,ventas.dat,entrada)
Leer(f_v,r_v)
Mientrasnoeof(f_v)
Vend[r_v.vendedor]vend[r_v.vendedor]+r_v.total
Leer(f_v,r_v)
Finmientras
Cerrar(f_v)
Desdei=1hasta5
EscribirElvendedorihavendidovend[i]
Findesde
Fin

Accesodirectoenarchivossecuenciales:
Existen lenguajes que tienen funciones que simulan el acceso directo a un
registrodentrodeunficherosecuencial(enPascal Seek;enC fseek),aestas
funcionesleindicamoselnmeroderegistro(enPascal)oelnmerodebytes(enC),y
nosaccedendirectamenteaesaposicin.
Sin embargo es simulado, porque internamente esa funcin va a hacer una
bsquedasecuencialhastaquehayallegadoalnmeroderegistrooalnmerodebytes.
Mantenimientodeficherosconorganizacindirecta:
- Alta:Primerohayqueverquenoexisteelregistro,ysinoexistesedade
alta.Paraversiexisteonoexiste,apartirdelaclavedelregistroquequiero
dardealta,calculoconlafuncindedireccionamientolaposicinenlaque

PGINA100/184

tendraquemetereseregistro.Siesaposicinestocupada,nolodoydealta
ysinolometoall.
Baja:Paraversiexiste,hagoigualqueantes.Siexistelomarcocomobaja
lgica,ycuandosereorganiceelfichero,lodoycomobajafsicareal.
Modificacin:Paraversiexiste,hagoigualqueantes.Siexistelomodificoy
lovuelvoagrabarenlamismaposicin.
Consultas:Tienensentidolasconsultasderegistrosenparticularconuna
determinadaclave(atravsdelafuncindedireccionamiento),peronolas
bsquedassecuenciales.

Mantenimientodeficherosconorganizacinsecuencialindexada:
Esigualqueenorganizacindirecta,peroalahoradelocalizarunregistro,en
vezdeaplicarunafuncindedireccionamientoasuclave,utilizamossuclavepara
investigaratravsdelosndicesendondevaaestarsituado.
Lasaltassilasdoycuandoelficherosecrea,segrabanenelreadedatos,ysi
elficheroyaexistasegrabanenelreadeexcedentes.
Enlasconsultastienensentidotantolasconsultasdeunregistroenparticular
comolasconsultassecuencialesatravsdeunaclaveporquevanaestartodasseguidas.
Nohayqueconfundirorganizacinsecuencialindexada,conficherosindexados
odendices,quesonuntipoespecialdeficherosasociadosaunficherosecuencialpero
independientedel,quemeagilizanlasbsquedasenelficherosecuencialenelque
estnindexados.Suelenutilizarseenbasesdedatosdomsticas.

8.FICHEROSDETEXTO:
Sonuntipodeficherosespeciales,encuantoaloquepodemosleerdeellosy
escribirsoncadenasdecaracteres.
Sinembargotienensignificadosdistintossegnellenguaje,ysuobjetivoesque
podemostrabajarconcadenasdecaracteres.
F:Ficherodetexto
C:Cadena
escribir(F,C)
leer(F,C)

PGINA101/184

EJERCICIOS:TEMA8
1. Tenemos unarray conlainformacin denuestros productos,porcada producto
almacenamossucdigo,descripcin,stockactualystockmnimo.
Setratadeobtenerotroarrayquecontengalosproductosdelosquehallaquehacer
pedidosporquesustockseainferioralmnimo,talquealproveedorletenemosque

PGINA102/184

dar como datos la identificacin del producto y la cantidad que pedimos, que
coincidirconelstockmnimo.
Normalmentetrabajamoscon100productos.
Tipoproducto=registro
Codigo:entero
Descripcin:cadena
Stock:entero
Stock_min:entero
Finregistro
Pedido=registro
Codigo:entero
Cantidad:entero
Finregistro
Lista_producto=array[1..100]deproducto
Lista_pedido=array[1..100]depedido
Algoritmoalmacen
Var
Prod:lista_producto
Ped:lista_pedido
I,j:entero
Inicio
J1
Desdei=1hasta100
Siprod[i].stock<prod[i].stock_min
Entoncesped[j].codigoprod[i].codigo
Ped[j].cantidadprod[i].stock_min
Jj+1
Finsi
Findesde
Fin

2. Dadounarrayquecontienelainformacindelosalumnosdeunaclasede100
alumnos,yteniendoencuentaquedecadaunodeellosalmacenamossunmerode
expediente,nombreynotamedia.Hallarlamediadetodoslosalumnosdeesaclase
ydarotraopcinquepidaelnombredeunalumnoymedesunotasiestealumno
existe.
PGINA103/184

Tipoalumno=registro
Expediente:entero
Nombre:cadena
Media:real
Finregistro
Lista=array[1..100]dealumno
Algoritmonotas
Var
Alum:lista
Op,i:entero
Marca:booleano
Inicio
Presentar(op)
Mientras(op<>0)
Segnseaop
1:escribirLamediadelaclaseesnota_media(alum)
2:escribirIntroduceunnombre
leernombre

marcafalso
i1
repetir
sicomparar(alum[i].nombre,nombre)=verdadero
entoncesmarca=verdadero
sinoii+1
finsi
hasta(i>100)o(marca=verdadero)
simarca=verdadero
entoncesescribirLanotadenombreesalum[i].media
sinoescribirElalumnonoexiste
finsi
finsegnsea
presentar(op)
finmientras
fin

3. Tenemosunarrayconlaindicacindecadaproducto,stock,descripcinyfecha.
Hallarunaopcinquenossirvaiterativamenteparahacerpedidosdeproductosy
queterminacuandopidamoselproducto0.

PGINA104/184

Porcadapedidosedaelidentificadordeproductoquesepide,ylacantidadde
producto,yloquenosdiceessihaycantidadsuficiente, respondiendoPedido
suministradoyactualizandoelstock,ysielproductosolicitadonoexisteonohay
suficientecantidad,mostrarunmensajedeerrorexplicandolacausa.
Tipot_fecha=registro
Dia:entero
Mes:entero
Anno:entero
Finregistro
Producto=registro
Codigo:entero
Descripicion:cadena
Stock:entero
Fecha:t_fecha
Finproducto
Lista=array[1..10]deproducto
Algoritmopedidos
Var
Prod:lista
Codigo,cantidad,i:entero
Marca:booleano
Inicio
EscribirIntroduceelcodigo
Leercodigo
EscribirIntroducelacantidad
Leercantidad
Mientrascodigo<>0
I1
Marcafalso
Repetir
Sicodigo=prod[i].codigo
Entoncesmarcaverdadero
Sinoii+1
Finsi
Hasta(marca=verdadero)o(i>100)
Simarca=falso
EntoncesescribirNoexisteelproducto
Sinosiprod[i].stock<cantidad

EntoncesescribirNohaycantidadsuficiente
Sinoprod[i].stockprod[i].stockcantidad
Escribirpedidosuministrado
Finsi
Finsi
Finmientras
Fin
funcionnota_media(a:lista):real
PGINA105/184

var
i:entero
acum:real
inicio
acum0
desdei=1hasta100
acumacum+a[i].nota
findesde
retorno(acum/100)
finnota_media
funcioncomparacion(c1:cadena,c2:cadena):booleano
var
i:entero
inicio
i1
mientras(c1[i]=c2[i])y(c1[i]<>$)y(c2[i]<>$)
ii+1
finmientras
sic1[i]=c2[i]
entoncesretornoverdadero
sinoretornofalso
finsi
fincomparacion
Procedimientopresentar(entsalopcion:entero)
Inicio
Repetir
Escribir0.Salir
Escribir1.Hallarnotamedia
Escribir2.Hallarlanotadeunalumno
EscribirIntroduceunaopcin
Leeropcion
Hasta(opcion>=0)y(opcion<=2)
Finpresentar

PGINA106/184

4. Tenemosunficherodefacturas.Enlafacturavieneelnmerodeclientealque
pertenece lafactura, elnmerodefactura,elimportedelafacturayuncampo
pagadoqueserbooleano.
Elficheroestclasificadopronmerodeclienteydefactura.
Disearunprogramaqueobtengaporpantallaparacadaclienteeltotalquenos
debe,yalfinalmedeltotaldeloquelaempresanohacobrado.
Tipofactura:registro
Num_cl:entero
Num_fact:entero
Importe:real
Pagado:boolean
Finregistro
Algoritmofacturas
Var
Fich:ficherodefactura
Fact:factura
Total,deuda:real
Cliente:entero
Inicio
Abrir(fich,facturas.dat,entrada)
Leer(fich,fact)
Total0
Mientasnoeof(fich)
Deuda0
Clientefact.num_cl
Mientras(cliente=fact.num_cl)ynoeof(fich)
Sifact.pagado=falso
Entoncesdeudadeuda+fact.importe

Totaltotal+fact.importe
Finsi
Leer(fich,fact)
Finmientras
EscribirElclienteclientedebedeuda
Finmientras
EscribirLaempresanohacobradototal
Fin

PGINA107/184

5. Tenemos un fichero de empleados que contiene el departamento, cdigo de


empleado,nombre,categoraysueldo.Hay12categorasnumeradasdel0al11.
Porcadadepartamentosacarelnmerototaldeempleadosquetieneyelsueldo
mediopordepartamento.Lomismohacerloporcategoras.
Elficheroestclasificadoporcdigodedepartamentoyempleado.
Tipoemp:registro
Cod_dep:entero
Cod_emp:entero
Nomb_emp:cadena
Categoria:entero
Sueldo:real
Finregistro
Cat:registro
Sueldo:real
Emp:entero
Finregistro
Algoritmoempleados
Var
F_emp:ficherodeemp
R_emp:emp
T_dep:real
N_dep,i,d:entero
C:array[0..11]decat
Inicio
Desdei=0hasta11
C[i].sueldo0
C[i].empleado0
Findesde
Abrir(f_emp,empleados.dat,entrada)
Leer(f_emp,r_emp)
Mientrasnoeof(f_emp)
Dr_emp.cod_dep
T_dep0
N_dep0
Mientras(d=r_emp.cod_dep)ynoeof(f_emp)
T_dept_dep+r_emp.sueldo
N_depn_dep+1
C[r_emp.categoria].sueldoc[r_emp.categoria].sueldo+r_emp.sueldo
C[r_emp.categoria].empc[r_emp.categoria].emp+1
Leer(f_emp,r_emp)
Finmientras
EscribirElsueldomediodeldepartamentodest_dep/n_dep
Finmientas
Desdei=0hasta11

PGINA108/184

EscribirElsueldodelacategoraiesc[i].sueldo/c[i].emp
Findesde
Cerrar(f_emp)
Fin

6. Paracontrolarlosstocksdeunalmacntenemos:
- Un fichero almacn, no clasificado que contiene las existencias de cada
productoenalmacn,ysabemosquehayunmximode750productos.Cada
registrotieneelcdigodeproducto(1..750),lacantidadenstockdeeseproducto
yelnombredelproducto
- Unficheropedidosquecontienetodoslospedidosquesesolicitanalalmacn.
Cadapedidocontieneelnmerodepedido,elcdigodeproductoquesepidey
lacantidadquesepide.Esteficheroestclasificadopornmerodepedido.
Obtenerunficherodestockactualizadoapartirdelospedidos,pudindosedar:
1. Elproductoquesepideexisteenelalmacnyquelacantidadquesepidesea
menoroigualalaquehay.Sloseactualizaelfichero.
2. Elproductoexiste,perolacantidadquenospidenesmayorquelaquehay.
Guardaremoslainformacindelpedidoenelficherodenegadosquetieneel
cdigodelproducto,lacantidadpedidaylacantidadquehabaenstock.
3. Elcdigodeproductonoexiste.Mostramosporpantallaunmensajequeponga
Cdigodeproductoerroneo.
Cadaproductoaparececomomximounavez.
Tipoalm:registro
Prod:entero
Stock:entero
Finregistro
Ped:registro
N_ped:entero
Prod:entero
Cant:entero
Finregistro
Den:registro
Prod:entero
Stock:entero
Cant:entero
Finregistro
Algoritmoalmacn
Var
F_a,f_al:ficherodealum
F_d:ficherodeden
F_p:ficherodepedidos
R_a:alm
R_p:ped
R_d:den
Inicio
Abrir(f_p,pedidos.dat,entrada)
Abrir(f_n,almacen_n.dat,salida)
PGINA109/184

Abrir(f_d,denegados.dat,salida)
Leer(f_p,r_p)
Mientrasnoeof(f_p)
Abrir(f_a,almacen.dat,entrada)
Leer(f_a,r_a)
Mientras(r_p.prod<>r_a.prod)ynoeof(f_a)
Leer(f_a,r_a)
Finmientras
Sir_p.prod=r_a.prod
Entoncessir_p.cantidad<r_a.stock
Entoncesr_an.prodr_a.prod
R_an.stockr_a.stockr_p.cantidad
Escribir(f_an,r_an)
Sinor_d.prodr_a.prod
R_d.cantr_p.cant
R_d.stockr_a.stock
Escribir(f_d,r_d)
Finsi
SinoescribirError.Noexisteelproductor_p.producto
Finsi
Cerrar(f_a)
Leer(f_p,r_p)
Finmientras
Cerrar(f_p)
Cerrar(f_d)
Cerrar(f_an)
Actualizar_almacen(f_a,f_an)
Fin
Procedimientoactualizar_almacen(f1:ficherodealmacen;f2:ficherodealmacen)
Var
R1,r2:alm
F3:ficherodealm
Inicio
Abrir(f1,almacen.dat,entrada)
Abrir(f3,alm.act,salida)
Leer(f1,r1)
Mientrasnoeof(f1)
Abrir(f2,almacen_n.dat,entrada)
Leer(f2,r2)
Mientras(r1.prod<>r2.prod)ynoeof(f2)
Leer(f2,r2)
Finmientras
Sir1.prod=r2.prod
Entoncesescribir(f3,r2)
Sinoescribir(f3,r1)
Finsi
Cerrar(f2)
PGINA110/184

Finmientras
Cerrar(f1)
Cerrar(f3)
Fin

ORDENACIN,BSQUEDAEINTERCALACININTERNA:
TEMA9

1. Introduccin.
2. Ordenacin:
- Mtododelaburbuja.
- Mtododeinsercin.
- Mtododeseleccin.
- MtododeQuickShort.
3. Bsqueda:
- Bsquedasecuencial.
- Bsquedabinaria.
- BsquedaporconversindeclavesoHashing.
4. Intercalacin.
1.INTRODUCCIN:
Alahoradetratardatos,muchasvecesnosconvienequeestnordenados.Estos
mtodosnospuedenresultareficientescuandohacemoslasbsquedas.
2.ORDENACIN:
Consisteenorganizarunconjuntodedatosenunordendeterminadosegnun
criterio.
Laordenacinpuedeserinternaoexterna:
- Interna:Lahacemosenmemoriaconarryas.Esmuyrpida.
- Externa: La hacemos en dispositivos de almacenamiento externo con
ficheros.
Para determinar lo bueno que es un algoritmo de ordenacin hay que ver la
complejidaddelalgoritmo(cantidaddetrabajodeesealgoritmo),semideenelnmero
deoperacionesbsicasquerealizaunalgoritmo.Laoperacinbsicadeunalgoritmoes
laoperacinfundamental,queeslacomparacin.
Mtododelaburbuja:
Lafilosofadeestemtodoesircomparandoloselementosdelarrayde2en2y
sinoestncolocadoscorrectamenteintercambiarlos,ashastaquetengamoselarray
ordenado.

PGINA111/184

Hayquecompararlaposicin1yla2ysinoestnordenadaslasintercambio.
Luegola2yla3yassucesivamentehastaquecomparolasltimasposiciones.
Conestaprimerapasadalograremosquequedeordenadoelltimoelementodel
array.
Tericamente,encadapasadairemoscolocandounelemento,ytendramosque
hacern1pasadas.Sienunapasadanosehacencambios,elarrayyaestordenado.

Procedimientoburbuja(datos:array[1..N]de<tipo>)
Var
Ordenado:booleano
I,J:entero
Aux:<tipo>
Inicio
Ordenadofalso
I1
Mientras(ordenado=falso)y(i<>n1)
Ordenadoverdadero
JI
Desdej=1hastan1
Sidatos[j]>datos[j+1]
Entoncesauxdatos[j]
Datos[j]datos[j+1]
Datos[j]aux
Ordenadofalso
Finsi
Findesde
II+1
Finmientras
Fin
Mtododeinsercin:
Sesuponequesetieneunsegmentoinicialdelarrayordenado,yhayqueir
aumentandolalongituddesegmentohastaquecoincideconlalongituddelarray.
Paraelloinsertaremos elsiguienteelemento enellugaradecuadodentro del
segmentoordenado.
Estosehacemoviendocadaelementodelsegmentoordenadoaladerechahasta
queseencuentreunomenoroigualalelementoquequeremoscolocarenelsegmentoo
hastaquenotenemoselementos,ylocolocoenesaposicin.

PGINA112/184

Paraarrancarestemtodosepartedequeelsegmentoordenadoinicialesteesla
primeraposicin.
Procedimientoinsercion(datos:array[1..N]de<tipo>)
Var
I,J:entero
Aux:<tipo>
Inicio
Desdei=2hastaN
Auxdatos[i]
Ji1
Mientras(j>0)y(aux<datos[j])
Datos[j+1]datos[j]
Jj1
Finmientras
Datos[j+1]aux
Findesde
Fin
Mtododelaseleccin:
Setratadebuscarelelementomspequeoycolocarloenlaprimeraposicin,
despus el segundo ms pequeo y colocarlo en la segunda posicin, y as
sucesivamentehastaqueelarrayesteordenado.
Paraellovamosarecorrerelarray,yporcadaelementobuscamosaladerecha
deesaposicincualeselmspequeo,ylointercambioconelelementoqueestoy
examinando.
Procedimientoselecccion(datos:array[1..N]de<tipo>)
Var
I,j,pos:entero
Aux:<tipo>
Inicio
Desdei=1hastaN1
Auxdatos[i]
Posi
Desdej=i+1hastaN
Sidatos[j]<aux
Entoncesposj
Auxdatos[j]
Finsi
Findesde
Datos[pos]datos[i]
Datos[i]aux
Findesde
Fin
MtododeordenacinrpidaoQuickShort:
PGINA113/184

Consiste en dividir la lista inicial en otras dos que ordenamos por separado
recursivamente.
Paraello,seeligeunelementodelalistaalquellamamospivote,talqueala
derechadelpivotevaaquedarlomsgrande,yalaizquierdalomspequeo,esdecir,
queelpivotequedarcolocadoensuposicin.
ProcedimientoQuickShort(ini:entero;fin:entero;datos:array[1..N]de<tipo>)
Inicio
Siini<fin
Entoncessublistas(ini,fin,pivote,datos)
Quickshort(ini,pivote1,datos)
Quickshort(pivote+1,fin,datos)
Finsi
Fin

Procedimientosublistas(ini:entero;fin:entero;entsalpivote:entero;
datos:array[1..N]de<tipo>)
Inicio
Pivoteini
Auxdatos[ini]
Desdei=pivote+1hastafin
Sidatos[i]<aux
Entoncespivotepivote+1
Aux2datos[i]
Datos[i]datos[pivote]
Datos[pivote]aux2
Finsi
Findesde
Datos[ini]datos[pivote]
Datos[pivote]aux
Fin
3.BSQUEDAS:
Hay2tiposdebsquedas,internasquesehacenenmemoriayexternasquese
hacenenficheros.Cuandobuscamosenunfichero,normalmentelohacemosatravsde
unaclave.
Dadoundeterminadovalor,setratadeversiexisteunelementoconesevaloren
elarraydeficherosdondesebusca,talquesedevuelvesiestono.
Existen3mtodosdebsqueda:
- Secuencial.
PGINA114/184

Binariaodicotnica.
PortransformacindeclavesoHashing.

Bsquedasecuencial:
Se puede aplicar para bsquedas internas y externas, y hay que ir pasando
secuencialmenteportodosloselementosdelaestructurahastaencontrarelelementoo
acabarlalista.
Procedimientob_secuencial(datos:array[1..N]de<tipo>;elem:<tipo>)
Var
I:entero
Inicio
I1
Mientras(i<=N)y(datos[i]<>elem)
II+1
Finmientras
Sidatos[i]=elem
EntoncesescribirElementoencontradoenlaposicini
SinoescribirElementonoencontrado
Finsi
Fin

Bsquedasecuencialconcentinela:
Se trata de optimizar encierto modo la bsqueda secuencial normal, lo que
hacemosesaadiralfinaldelarrayelelementoquequierobuscarporloquesiemprelo
encontrare.
SiencuentroelelementoenunaposicindistintadeN+1significaquenoest
enlaestructura.Laventajaesqueenlacondicindelmientrasnotengoquepreguntar
siseacabalaestructura,meahorrounacondicin,elinconvenienteesquetieneque
sobrarespacioalfinaldelarray.
Procedimientob_sec_centineal(datos:array[1..N+1]de<tipo>;elem:<tipo>)
Var
I:entero
Inicio
Datos[n+1]elem
I1
Mientrasdatos[i]<>elem
Ii+1
Finmientras
Sii<>n+1
EntoncesescribirElementoencontradoenlaposicini
SinoescribirElementonoencontrado
Finsi

PGINA115/184

Fin
Bsquedabinariaodicotnica:
Paraquesepuedaaplicaresquelalistaenlaquequeremosbuscarelelemento
estepreviamenteordenada.
Setratadedividirelespaciodebsquedaensucesivasmitadeshastaencontrarel
elementobuscadoohastaqueyanopuedahacermsmitades.
Primero hallamos el ndice de la mitad del array y miramos si el elemento
coincideconl,sinocoincideaveriguamosdondedeberaestarelelementobuscado,si
en la lista de la derecha o de la izquierda, y dentro de esa mitad hago lo mismo
sucesivamente.
Procedimientob_binaria(datos:array[1..N]de<tipo>;elem:<tipo>;ini:entero;
fin:entero)
Var
mit:entero
Inicio
mit(ini+fin)div2
mientras(ini<fin)y(elem<>datos[mit])
sielem<datos[mit]
entoncesfinmit1
sinoinimit+1
finsi
finmientras
siini<fin
entoncesescribirElementoencontradoenlaposicinmit
sinoescribirElementonoencontrado
finsi
fin
BsquedaportransformacindeclavesoHashing:
Esnecesarioqueloquesebusqueseaporundeterminadocampoclave.Setrata
de convertir ese campo clave en una direccin real, si estamos en un array, en un
posicindelarrayysiestamosenunfichero,enunregistrodelfichero.
Loquehacequeseconviertalaclaveenunadireccinrealeslafuncinde
direccionamiento.Existendiferentestiposdefuncionesdedireccionamiento:
- Lamsusadaeslafuncinmdulo,queconsisteendividirlaclaveentreel
nmero de elementos mximos de la estructura y coger el resto como
direccinrealdealmacenamiento(elndicesiesunarray,ounadireccin
relativasiesunfichero).
- Entruncamiento:Eslapartedelaclavecomondice.
- Plegamiento:Dividirlaclaveenpartesigualesdetamao,quevaaserigual
alnmerodecifrasdeltamaodelarray,luegosumarlasycogerlasltimas
cifrasdelasuma.
- Mitaddelcuadrado:Eselcuadradodelaclaveydespuscogerlascifras
centrales.
Elproblemadeestoscasos,esquecuandoelrangodeclavesesmayorqueel
nmerodeposicionesdelaestructura,estelproblemadequeadiferentesclavesles

PGINA116/184

correspondelamismaposicin,asquecuandoseproduceelsegundosinnimohayque
verdondesemanda.
Paraevitaresto,tratarquelafuncindedireccionamientoproduzcaelmenor
nmerodecolisionesposibles.
Parasolucionarelproblemadelossinnimos:
- Dejartantoespaciocomorangodeclaves.Esilgico.
- Sisetratadeunarray,queporcadaposicindejemosunaposicinms.
- Lamejorsolucineslatcnicadeencadenamiento,queconsisteenquede
cadaposicindelarraysalgaunpunteroaunalistaenlazadaqueenlacea
todosloselementosquedeberanirposicionadosenesaposicinondicedel
array.

4.INTERCALACIN:
Consisteenjuntarvariaslistasordenadasenunasolalistaquequedeordenada.
Procedimientofusion(a1:T1;a2:T2;a3:T3)
Var
I,j,k,l:entero
Inicio
I1
J1
K1
Mientras(i<=n)y(j<=m)
Sia1[i]<a2[j]
Entoncesa3[k]a1[i]
II+1
Sinoa3[k]a2[j]
JJ+1
PGINA117/184

Finsi
KK+1
Finmientras
Sii<n
EntoncesdesdeL=ihastam
Kk+1
A3[k]a2[l]
Findesde
SinodesdeL=jhastan
Kk+1
A3[k]a1[l]
Findesde
Finsi
Fin

ORDENACIN,BSQUEDAYFUSINEXTERNA:
TEMA10
1.
2.
3.
4.

Archivosordenados.
Fusinomezcladearchivosordenados.
Particindearchivos.
Clasificacindearchivos.

1.ARCHIVOSORDENADOS:
Unarchivosepuedeordenarporuncampoounconjuntodecampos.Lamayor
partedelossistemasdisponendeunafuncinSORTparaordenar.
2.FUSINOMEZCLADEARCHIVOSORDENADOS:
PGINA118/184

Dados2archivosAyBquetienenlamismaestructurayclasificadosporel
mismo campo o campos, se trata de obtener otro archivo C que tenga la misma
estructuradelos2anterioresyquetambinquedaclasificadoporelmismocriterio.
Procedimientofusion(A:t_fich;B:t_fich;C:t_fich)
Var
R1,r2:<tipo>
Inicio
Abrir(C,fich.sal,salida)
Abrir(A,fich1,entrada)
Abrir(B,fich2,entrada)
Leer(A,r1)
Leer(B,r2)
Mientrasnoeof(A)ynoeof(B)
Sir1.info<r2.info
Entoncesescribir(C,r1)
Leer(A,r1)
Sinoescribir(C,r2)
Leer(B,r2)
Finsi
Finmientras
Sieof(A)
Entoncesleer(B,r2)
mientrasnoeof(B)
Escribir(C,r2)
Leer(B,r2)
Finmientras
Sinoleer(A,r1)
mientrasnoeof(A)
Escribir(C,r1)
Leer(A,r1)

Finmientras
Finsi
Cerrar(A)
Cerrar(B)
Cerrar(C)
Fin
3.FUSINDEARCHIVOS:
Setratadedividirunarchivoenvarios.Haydiferentescriteriosdeparticin:
Particinporcontenido:
Se reparten los registros entre varios registros segn el valor de uno o ms
campos.
<V1F1
=V1F2
>V1F3
Procedimientopart_cont(fich:t_fich;entsalfich1,fich2,fich3:t_fich)
Var
R:<tipo>
PGINA119/184

Inicio
Abrir(fich,F,entrada)
Abrir(fich1,F1,salida)
Abrir(fich2,F2,salida)
Abrir(fich3,F3,salida)
Leer(fich,r)
Mientrasnoeof(fich)
Sir.info<V1
Entoncesescribir(f1,r)
Sinosir.info>V1
Entoncesescribir(f3,r)
Sinoescribir(f2,r)
Finsi
Finsi
Leer(fich,r)
Finmientras
Cerrar(fich)
Cerrar(f1)
Cerrar(f2)
Cerrar(f3)
Fin
Particinpornmerofijoderegistrosoporsecuenciasconclasificacininterna:
Setratadeobtenerapartirdeunficherovarios,talquetodostenganunnmero
fijoderegistrosexceptoelltimo.
SielficheroinicialtieneXregistrosyquieroobtenercomoresultadoYficheros,
cadaficherotendrX/Yregistros.
SetratadeirleyendosecuenciasdeX/YregistrosdelficheroFysevuelcanaun
array,clasificaresassecuenciasinternamente,ycuandoestnclasificadas,lasvuelcoa
otrofichero.
Elproblemaesqueseusaarraysparalaordenacininterna,yaveceselnmero
deficherosdependendeltamaomximodelarray.
F:395142301
F1:359
F2:21430
F3:1

Particinporsecuenciassinclasificacininterna:
Setratadeobtenerficherosapartirdeunodado,todosconelmismotamao,
perolosficherosnotienenporqueestarclasificados.
Nosotrosmarcamoseltamaodelbloquedondevayaaclasificarlainformacin.
Determinotambinelnmeromximodeficherosquequierotener.
Leersecuencias deNregistrosdelficheroinicialylosirgrabandoen los
ficherosresultantesdelaparticin.
4.CLASIFICACINDEARCHIVOS:
PGINA120/184

Esobligatorioqueexistaunaclave.Sielficherofuesepequeosellevantodos
losregistrosaunarrayylosclasifico,peroestonoeslomsusual,porloqueseusala
clasificacinexterna.
Clasificacinpormezcladirecta:
Vamos a usar 2 ficheros auxiliares F1 y F2. El fichero F lo organizamos
grabandoenFsecuenciasderegistrosordenadoscadavezmsgrandes.
PrimeroleemoslassecuenciasdeunregistrodeFylasgraboalternativamente
enF1yF2.
Luegoleolassecuenciasdeunregistro,unadeF1yotradeF2,ylasgrabo
ordenadasenF.
VuelvoaleerenFconeldobledesecuenciaqueantesylosgraboenF1yF2,y
repetimostodaslasfasesduplicandoencadapasadaeltamaodelasecuenciahastaque
eltamaoobtenidoseaigualqueeldelfichero.AcadatratamientodeFselellama
pasada,yelnmerodepasadasmximo,serI,talqueeltratamientoserepetirhasta
que2elevadoaI>=nmeroderegistros.
EncadapasadaparaclasificarlasecuenciaqueleemosdeF1yF2,utilizamosel
mtododefusinexterna.
F:3951423011210
F1:3/5/2/1/10
F2:9/14/30/12
F:3951423011210
F1:39/230/10
F2:514/112
F:3591412123010
F1:35914/10
F2:121230
F:12359121430/10
F1:12359121430
F2:10
F:1235910121430

Clasificacinpormezclasdesecuenciasequivalentes:
Se parece al mtodo anterior porque tambin se intenta coger secuencias de
registrosmsgrandes,peroahorausamos4ficherosauxiliaresyenvezdeempezar
leyendosecuenciasdeunregistro,hacemossecuenciasdeNregistros,quelaprimera
vezclasificamosinternamente,porloqueelvalordeNvendrlimitadoporeltamao
delarray.

PGINA121/184

PrimeroleemosdelarchivoinicialFsecuenciasdeNregistrosqueclasificamos
internamenteyquegrabamosalternativamenteenF1yF2.
DespusleosecuenciasdeNregistrosdeF1yF2alternativamente,yporcada
pardesecuenciasledaslasfusionoylasgraboalternativamenteyaordenadasenF3y
F4.
Las secuencias de 2N registros de F3 y F4 las fusiono y la secuencia 4N
obtenidayaordenadalagraboalternativamenteenF1yF2.
Repitoestohastaquetodoslosficherosestnvacosmenos1,ylainformacin
deeseficherolagraboalficheroinicial.
F:3951423011210
F1:359/11012
F2:21430
F1:Vacio
F2:Vacio
F3:23591430
F4:11012
F1:12359121430VuelcoF1alficheroinicialF.
F2:Vacio
F3:Vacio
F4:Vacio

ESTRUCTURASDINMICASLINEALESDEDATOS:
LISTASENLAZADAS.PILASYCOLAS:
TEMA11
PGINA122/184

1.
2.
3.
4.
5.
6.
7.
8.
9.

Introduccinalasestructurasdinmicasdedatos.
Listas.
Listasenlazadas.
Procesamientodelistasenlazadassimples.
Listascircularesconcabecera.
Listasdoblementeenlazadas.
Pilas.
Colas.
Doblescolasobicolas.

1.INTRODUCCINALASESTRUCTURASDINMICASDEDATOS:
Lasventajasdelasestructurasdinmicasdedatosson:
1. Nohayquedefinireltamaoantesdeusarla,sinoquelavoyutilizando
segnlanecesito.
2. Los elementos que forman est estructura no estn situados en forma
contigua en memoria, y esos elementos se relacionan entre s mediante
camposenlaceopuntero,yacadaunodeesoselementoslollamamosnodo
delaestructura.
Unpunteroesundatocuyocontenidoesunadireccindememoriaqueesen
laqueestalmacenadoeldatoalqueapunta.

Lasestructurasdinmicaspuedenserlinealesonolinealessegnquedesdeun
elementosepuedaaccedersolamenteaotrooavarios.
Declaracindelospunterosendistintoslenguajes:
EnC:<tipo>*<var_p>
Int*p
EnPascal:<var_tipo_puntero>:^<tipo>
P:^integer
Enpseudocdigo:<var_tipo_puntero>:punteroa<tipo>
P:punteroaentero
Accederauncampodeunregistro:
EnC:Pnombre
EnPascal:p^.nombre
Enpseudocdigo:pnombre

PGINA123/184

2.LISTAS:
Unalistaesunacoleccinlinealdeelementos.Hay2formasdealmacenarla.
Conarrays(usandomemoriaesttica),endondelarelacindeloselementosdelalista
vienedadaporqueocupaposicionescontiguasdememoria.
Deformaenlazadaconmemoriadinmica.Seconocecomolistasenlazadas,yla
relacin entre los elementos de la lista se mantiene mediante campos de enlace o
punteros.
3.LISTASENLAZADAS:
EsunacoleccinlinealdeelementosllamadosNODOS,dondeelordenentrelos
nodosseestablecemediantepunteros,yporsersimple,ademsdesdeunnodosolo
puedoaccederalsiguientedirectamente.
Unalistaenlazadatiene2partes:
- Losnodosqueformanlalista.Cadanodovaatenerdoscampos.Unode
informacinqueserdeltipodeloselementosquecontienelalistayun
campodeenlacequeesdetipopuntero,yquecontendrladireccinde
memoriaenlaqueestalmacenadoelsiguientenodo.
AlprimercampodeinformacinlollamamosINFO,yelnodolollamamos
SIG.
- Lasegundapartedelalistaserunavariabledetipopunteroalosnodosde
lalistaquecontieneladireccindelprimernododelalista.Poresarazna
esavariablelapodemosllamarCOMienzo.
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Var
Com:punteroanodo
Elltimonododelalistatendrensucampodeenlaceelvalornodo(Null,Nil),
quequieredecirquenoapuntaaningunadireccinygrficamentesesimbolizacon:

Tiponodo:registro
Info:carcter
Sig:punteroanodo
Finregistro
Losnodosdelalistapuedenestarencualquierzonadememoria,notienenque
estarenposicionesconsecutivas.

PGINA124/184

4.PROCESAMIENTODELISTASENLAZADASSIMPLES:
Parapoderprocesarunalista,senecesitalaestructuradesusnodosylavariable
decomienzo.
Operaciones:
- Insertarunelemento.
- Borrarunelemento.
- Recorrerlalista.
- Buscarunelemento.
Laformamsnormalderepresentarlistasenlazadasesusarmemoriadinmica.Una
listaenlazadatambinsepuedesimularusandoarrays(memoriaesttica),peroespoco
eficiente.
Paraelloutilizara2arraysdelmismotamaoyconlamismanumeracinde
ndices,talqueenunarrayguardaraloscamposdeinformacindelalista,yparacada
campo de informacin en la posicin correspondiente en el otro array guardara el
ndicedelsiguienteelementoaesenodo.
Esdecirenesesegundoarrayguardaraloscamposenlacemediantevaloresde
ndice.

Ademsdelos2arrays,tengoquetenerunavariablequecontengaelndicedel
primerelementodelalista.Elltimoelemento,tieneenelcampodeenlaceelvalor0.

Info
Sig
1
2

3H5
4
5.
6
A
7
I

8
9

10
Z

3
10

PGINA125/184

Recorridoeunalistaenlazada:
Consisteenparasportodossusnodosyprocesarlos.
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Algoritmorecorrido
Var
Com:punteroanodo
Inicio
Recorrer(com)
Fin
Procedimientorecorrer(prin:punteroanodo)
Var
Ptr:punteroanodo
Inicio
Siprin=Nil
EntoncesescribirListavacia
Sinoptrprin
Mientrasptr<>nil
ptrsig<>nil
{procesarptrinfo}
ptrptrsig
finmientrasposicionarmeenelltimonodo
finsi .
fin
Busquedadeunnodo:
Se trata de localizar un nodo que cumpla una determinada condicin (por
ejemploquesucampodeinformacinvalgaunvalordeterminado).
Alahoradehacerlasbsquedastendremosencuentasilalistaestordenadao
no,ysiestordenadaporelcriteriodebsquedatendrqueaprovecharlo.
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Algoritmobusqueda
Var
P,com:punteroanodo
Elem:<tipo>
Inicio
Buscar(com,elem,p)

PGINA126/184

Fin
Procedimientobuscar(prin:punteroanodo;e:<tipo>;entsalpos:punteroanodo)
Inicio
Posprin
Mientras(posinfo<>E)y(pos<>NIL)
Pospossig
Finmientras
Fin
Bsquedadeunnodoordenadoascendentemente:
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Algoritmobusqueda
Var
P,com:punteroanodo
Elem:<tipo>
Inicio
Buscar(com,elem,p)
Fin
Procedimientobuscar(prin:punteroanodo;e:<tipo>;entsalpos:punteroanodo)
Inicio
Posprin
Mientras(e>posinfo)y(pos<>NIL)
Pospossig
Finmientras
Siposinfo<>e
EntoncesposNIL
Finsi
Fin
Tratamientodelamemoriadinmica:
Siempre quesehaceunainsercinenunaestructuradinmica, tenemos que
coger de memoria tantos bytes de memoria dinmica como ocupa el nodo de la
estructuradinmica,ycuandoborramosunelemento,tendremosqueliberarlamemoria
ocupada por ese elemento. Para conseguir este manejo, todos los lenguajes de
programacintienen2instruccionesquepermitenreservarmemoriayliberarmemoria
dinmica,yasignarenelcasodelareservalamemoriaaunpuntero,yenelcasodela
liberacinseliberalamemoriaasignadaaunpuntero.
Pascal:NEW,DISPOSE
C:MALLOC,FREE
C++:NEW,DELETE
Lainstruccindereservadememoriallevaraunnicoargumento,queserel
tipodedatosparaelquesehacelareservadememoria,ysegneltamaodeesetipo,
esainstruccinsabrelnmerodebytesquetienequereservar.Yloquedevuelveesun

PGINA127/184

punteroalcomienzodelazonaquesehareservado.Estevalordevueltoserelque
tenemosqueasignaraunpunteroaltipodedatosparaelquesehacelareserva.
Lafuncinliberarmemoriallevaunnicoargumentoqueeseltipopuntero,ylo
quehaceesliberarlamemoriaasignadaaesepuntero,paralocualesimprescindible
queaesepunteropreviamenteselehayahechounaasignacindememoriadinmica
conalfuncindereserva.
Varp:punteroa<tipo>
P=res_mem(<tipo>)
Lib_mem(<var_puntero>)

Nosotrosvamosasimulareltratamientodelamemoriadinmicadelasiguiente
forma:Vamosasuponerquetodaslasposicioneslibresdememoriaestnenlazadas
entresatravsdeunalistaenlazada,alaquevamosallamarDISP(listadememoria
disponible),dondelaprimeraposicindeesalistavieneapuntadaporlavariableDISP.
Cada vez que queremos hacer una insercin en una estructura dinmica,
cogeremos la primera posicin de DISP, y se la asignaremos al puntero que va a
conteneraeseelemento.
Ycuandoqueramosborrarunelementodeunaestructuradinmicaparaindicar
queliberamoslamemoriautilizadaporeseelemento,loqueharemosserinsertarloen
elDISP,perosiemprealcomienzo.
Segnesto,todoborradoenelDISPequivaldraunainstruccindereservade
memoriaencualquierlenguaje,ytodainsercinenelDISP,equivaldralainstruccin
deliberarmemoriaencualquierlenguaje.
OverflowyUnderflow:
Lamemoria delordenadortiene untamaolimitado, porloquelamemoria
dinmicatambintendruntamaolimitado,esdecir,quepuedeserquesenosagote.
Estasituacin,seconocecomoOVERFLOW.
Siempre quesehagaunainstruccindereservadememoria, tendremos que
comprobarantessinosquedamemorialibre.Esoencualquierlenguajeocurrecuando
lainstruccindereservardememoriadevuelveelvalorNIL.
SiDISP=Nil
EntoncesescribirNohaymemoria
Igualsehaceparaborrarunelementodeunaestructuradinmica,paraborrarlo,
esa estructura tiene que tener al menos un elemento. Si no lo tiene e intentamos
borrarlo,seproduceunUNDERFLOW.
Poresto,loprimero quetenemos queprobarenunaestructuradinmica, es
preguntarsitienealgo.
Sicomienzo=Nil
EntoncesescribirListaVacia
Sislomanejounaestructuradinmica,preguntoporDISP,sitrabajoconvarias
estructuras dinmicas cada una de un tipo, habr tantas DISP como estructuras
dinmicas.
Insercinenunalistaenlazada:

PGINA128/184

Antesderealizarcualquierprocesodeinsercin,tendrqueversimequeda
memoria disponible. Si es posible hacer la insercin, lo primero ser reservar la
memoria para el elemento que quiero reservar. Para nosotros ser coger el primer
elementodeDISP.
Ensegundolugar,asignaremoslosvalorescorrectosalelementoquevamosa
insertar, esdecir,asignaremos alcampodeinformacin delnuevoelemento con la
informacin,ydespusactualizamoselcampodeenlace.

Alahoradeasignarunvaloralcampodeenlace,loprimeroserlocalizarla
posicinenlaquetenemosquelocalizarelsiguienteelemento,ysepuedendarlos
siguientescasos:
1. Insercin al comienzo de la lista: Se modifica el valor de la variable
comienzo.
2. Insercinencualquierotrolugardelalista,incluidoelfinal:Enestecaso,
tendremosqueconocertambinelnodoquevaaestardelantedelaposicin
deinsercin,yaquealahoradeinsertaresenuevoelemento,vaaocurrir
que el nodo de la posicin anterior a la de insercin apunte al nuevo
elemento,yqueelnuevoapuntealnododelaposicinalaqueinsertamos.
Alahoradelocalizarlaposicindeinsercindependerdelaaplicacinen
particular.
Como ejemplo de insercin, vamos a dar la insercin en una lista ordenada
ascendentementeporelcampodeinformacin:
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Procedimientoinsercion(entsalcom:punteroanodo;elem:<tipo>)
Var
Lug,Lugp,nuevo:punteroanodo
Inicio
SiDISP=Nil
EntoncesescribirNohaymemoriadisponible
SinonuevoDISP
DISPDISPSIG
Nuevoinfoelem
Si(com=Nil)o(elem<cominfo)
EntoncesnuevosigCom
Comnuevo
Sinolugpcom
Lugcomsig

PGINA129/184

Mientras(elem>luginfo)y(lug<>Nil)
Lugplug
Luglugsig
Finmientras
Nuevosiglug
Lugpsignuevo
Finsi
Finsi
Fin

Borradoenunalistaenlazada:
Setratadeborrarunnodoquecontengaunadeterminadainformacindeuna
listaenlazadasimple,aunqueelcriteriodeborradopodraserotroenlugardelcampo
deinformacin.
Siempre que se hace un borrado de una estructura dinmica, en general, lo
primero es comprobar quela estructura noestvaca, yuna vezdeterminado esto,
tendrquelocalizarelnodoaborrar.
Sepuedendar2casos:
- Elnodoaborrarseaelprimero.
- Queelnodoaborrarocupecualquierotraposicin.
Sieseldelcomienzo,cambiarlavariabledecomienzodelalistaporqueahora
tendr que apuntar al siguiente elemento, al de comienzo. Si el elemento ocupa
cualquier otra posicin, tendr que localizar la posicin del elemento y de su
predecesor,porqueparadesenlazarlodelalista,elpredecesortendrqueapuntaral
elementoquelesiguealnodoaborrar.
Finalmente, una vez desenlazado el nodo, habr que liberar la memoria que
ocupaba.Esoencualquierlenguajeequivaleahacerlaoperacindeliberarmemoria,y
enpseudocdigoserainsertarelelementoalprincipiodeDISP.
Procedimientoborrar(entsalcom:punteroanodo;elem:<tipo>)
Var
Lug,lugp:punteroanodo
Inicio
Sicom=Nil
EntoncesescribirListavacia
Sinolugpnil
Lugcom
Mientras(elem>luginfo)y(lug<>Nil)
Lugplug
PGINA130/184

Luglugsig
Finmientras
Sielem<>luginfo
EntoncesescribirNoexisteelnodoaborrar
SinoSilugp=Nil
Entoncescomcomsig
Sinolugpsiglugsig
Finsi
LugsigDISP
DISPlug
Finsi
Finsi
Fin

5.LISTASCIRCULARESCONCABECERA:
Unalistaconcabecera,engeneralesunalistaenlazadasimplenormal,peroen
laqueelprimernodoesunnodoespecialquenosirveparaguardarinformacinvlida,
sinosolamenteparamarcarqueeselprimernodo.

Cabecera
Haydostiposdelistasenlazadasconcabecera:
- Listasenlazadasconcabeceraytierra:Elprimernodovaaserlacabecera,y
elltimoapuntaanil.Noseutilizaporqueperdemosunnodoynotienen
ventajas.
- Listas circulares con cabecera: Se caracterizan porque tienen un nodo
cabecera,yademselltimonodoapuntaalnodocabecera.

Encualquierlistaenlazadaconcabeceraelprimernodoconinformacintiles
elsiguienteacomienzo(Comsig).
Enunalistacircularconcabecera,laventajaquepresentarespectoaunanormal,
esqueenlasinsercionesyborradosnohayquesuponerningncasoespecial,pues
todoslosnodos,incluidoelprimerotil,tienenunpredecesor.
PGINA131/184

Al recorrer la lista completa, empezaremos buscando la informacin por el


siguiente a comienzo, y sabemos que hemos llegado al final de la lista cuando el
siguientealpunteroquerecorrelalistaseacomienzo.
Bsquedaenunalistacircularconcabecera:
Procedimientobusqueda(com:punteroanodo;elem:<tipo>)
Var
Ptr:punteroanodo
Inicio
Ptrcomsig
Mientras(ptrinfo<>elem)y(ptr<>com)
Ptrptrsig
Finmientras
Siptrsig=com
EntoncesescribirElementonoencontrado
Finsi
Fin

Insercinenunalistacircularconcabecera:
Procedimientoinsercion(com:punteroanodo;elem:<tipo>)
Var
Lug,lugp,nuevo:punteroanodo
Inicio
SiDISP=Nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPsig

NuevoinfoElem
Lugpcom
Lugcomsig

Mientras(elem>luginfo)y(lug<>com)
Lugplug
Luglugsig
Finmientras
Nuevosiglug
Lugpsignuevo
Finsi
Fin
Borradoenunalistacircularconcabecera:
Procedimientoborrado(com:punteroanodo;elem:<tipo>)
Var

PGINA132/184

Lug,lugp:punteroanodo
Inicio
Sicom=comsig
EntoncesescribirListavacia
Sinolugpcom
Lugcomsig
Mientras(luginfo<>elem)y(lug<>com)
Lugplug
Luglugsig
Finmientras
Silug=com
EntoncesescribirElementonoencontrado
Sinolugpsiglugsig
LugsigDISP
DISPlug
Finsi
Finsi
Fin

6.LISTASDOBLEMENTEENLAZADAS:
Laslistasenlazadassimplessecaracterizanporquedesdeunnodosolopuedo
accederalsiguienteaesenodo,porloquesolopuedoaccederalsiguienteaesenodo,
porloquesolopuedorecorrerlalistaenunsentido,deprincipioafin.
Las listas dobles se caracterizan porque desde un nodo podemos acceder
directamente tanto al siguiente como al anterior a ese. Es decir, por cada nodo
tendremos2camposenlace,unoparaenlazarunnodoconelsiguiente,yotropara
enlazaraunnodoconelnodoanterioral.
Deestamanera,lalistalapodemosrecorrerenlos2sentidos,deprincipioafin,
movindonosconelenlacealnodosiguienteodefinaprincipiomovindonosconel
enlacealnodoanterior.Paraquesepuedahacerestesegundorecorrido,ademsdeuna
variablecomienzoparacadalista,quecontieneladireccindelprimernododelalista,
necesitaremostambinotravariableespecialquedenominaremosfinofinal,queapunta
alltimonododelalista.
Segnesto,laestructuradeunalistadoblementeenlazada,serlasiguiente:
- Cada lista tendr 2 variables, comienzo y final, del tipo puntero a nodo
doble,quecontendrnrespectivamenteladireccinalprimeryltimonodo
delalista.
- Laestructuradecadanodoser:
Tiponodo_doble:registro
Info:<tipo>
PGINA133/184

Sig:punteroanodo_doble
Ant:punteroanodo_doble
Finregistro

INFO
antsig
ElcamposiguientedelltimonodotendrvalorNIL,yelcampoanteriordel
primernodotambintendrvalorNIL,paraindicarquenohaynadaantesdelprimer
nodo.

Lacaractersticadeunalistadoblementeenlazadavacaesqueelcomienzoyel
finalsonigualesyapuntanaNIL.
Si(com=final)y(com=Nil)

Listadoblementeenlazadaconunsoloelemento:
Si(com=final)y(com<>Nil)

Paraimplementarlainsercinyelborradodeunalistadoblementeenlazada,
vamos a suponer que la lista de espacio disponible tiene la forma de una lista
doblementeenlazada.
PGINA134/184

Recorridodeunalistadoblementeenlazada:
Parapasarportodoslosnodosdelalista,podemoshacerloigualqueunalista
enlazadasimple,soloqueahoralapodemosrecorrerlalistahaciadelanteconelcampo
SIG,yhaciaatrsconelcampoANT.
Recorridohaciadelante:
Procedimientorecorrido_adelante(com:punteroanododoble)
Var
Ptr:punteroanododoble
Inicio
PtrComienzo
Mientras(ptr<>Nil)
{ProcesarPTR.INFO}
ptrptrsig
finmientras
fin

Recorridohaciaatrs:
Procedimientorecorrido_adelante(com:punteroanododoble)
Var
Ptr:punteroanododoble
Inicio
PtrFinal
Mientras(ptr<>Nil)
{ProcesarPTR.INFO}
ptrptrant
finmientras
Fin
Bsquedaenunalistadoblementeenlazada:
Esexactamenteigualqueenunalistaenlazadasimple,soloqueahorapuedo
buscarelelementobuscadodesdeelcomienzoymovindomeconSIGodesdeelfinal
ymovindomeconANT.
Sitengounaideadepordondevaaestarelelemento,empezarepordondesea
mejor.
Procedimientobusqueda(com:punteroadoblenodo;final:punteroadoblenodo;
elem:<tipo>;entsallug:punteroadoblenodo)
Var
Ptr,lug:punteroadoblenodo
Inicio
Lugnil
Ptrfinal
Mientras(ptr<>nil)y(elemento>ptrinfo)
Ptrptrant
Finmientras
PGINA135/184

Si(ptr<>nil)y(elementoptrinfo)
Entonceslugptr
Finsi
Fin
Insercinenunalistadoblementeenlazada:
Loprimeroesversimequedaespaciodisponibleenmemoriadinmica,sime
queda,reservomemoriaparaunnuevoelementoymetolainformacinquequieroensu
campodeinformacin,ylosiguienteesactualizarsuscamposdeenlace.
Casosparticulares:
- Insercinalcomienzosilalistaestvaca.
- Insercinalcomienzosilalistanoestvaca.
- Insercinalfinal.
- Insercinenmediodelalista.

Procedimientoinsercion(entsalcom:punteroanodo_doble;entsalfinal:punteroa
nodo_doble;elem:<tipo>)
var
lug,nuevo:punteroanodo_doble
Inicio
siDISP=Nil
entoncesescribirNohaymemoria
sinonuevoDISP
DISPDISPSig
Nuevoinfoelem
Sicom=nil

EntoncesnuevosigNIL
NuevoantNIL
Comnuevo
PGINA136/184

Finalnuevo
Sinosielem<cominfo
Entoncesnuevosigcom
Nuevoantnil
Comantnuevo
Comnuevo
Sinolugcomsig
Mientras(elem>luginfo)y(lug<>Nil)
Luglugsig
Finmientras
Silug<>nil
Entoncesnuevosiglug

Nuevoantlugant
Lugantsignuevo
Lugantnuevo
Sinonuevosignil
Nuevoantfinal
Finalsignuevo
Finalnuevo
Finsi

Finsi

Finsi
Finsi
Fin
Borradoenunalistadoblementeenlazada:
Primerohayqueversilalistatienealgnelemento,ysitienealgnelemento,
habrquebuscarsielelementoquequeremosbuscarexisteenlalista,ysiexiste,busco
enqueposicinseencuentra.
Casosparticulares:
- Borradodelprimernodo.
- Borradodelltimonodo.
- Borradodecualquiernodo.
Despusdetodoesto,habrqueliberarlamemoriadelnodo.
Procedimientoborrado(entsalcom:punteroanodo_doble;entsalfinal:punteroa
nodo_doble;elem:<tipo>)
var
lug:punteroanodo_doble
inicio
sicom=Nil
entoncesescribirListavacia
sinolugcom
mientras(luginfo<>elem)y(lug<>nil)
luglugsig
PGINA137/184

finmientras
silug=Nil
entoncesescribirNoencontrado
sinosilug=com
entoncescomcomsig
sicom=Nil
entoncesfinalnil
sinocomantnil
finsi
sinosilug<>final
entonceslugantsiglugsig

lugsigantlugant
sinolugantsignil
finallugant
finsi
finsi
lugsigDISP
DISPlug
finsi
finsi
fin
7.PILAS:
Unapilaesunaestructuralinealdedatosconlacaractersticaespecialdeque
ahora,nopodemoshacerlasinsercionesylaseliminacionesencualquierlugar,sinoque
obligatoriamente las tenemos que hacer porun extremo dela lista. Ese extremo lo
llamamoscimadelapila.
Estosuponequeseprocesenloselementos delapilaenordeninverso asu
entradaenlaestructura,esdecir,elprimerelementodelapilaqueusareserelltimo
quehaentrado(LIFO).
Conuna pilapodemos hacerdos operaciones bsicas, PUSH (meter) y POP
(sacar).
Apartedeestasdosfuncionessepuedendefinirotrascomoladepilavacao
top,quemedicecualeselementoqueestenlacimadelapilaperosinsacarlo.
Sepuedeimplementarconmemoriaesttica(arrays)oconmemoriadinmica
(listasenlazadas).
Siutilizounarray,tendrquedefinircualeseltamaomximodelarray,que
ser el de la pila, y aparte tendr definida una variable cima que tendr en cada
momentoelndicequecorrespondealelementodelarrayqueestenlacimadelapila.
Pila=array[1..max_pila]de<info>
Cima:entero
Para sealar que la cima est vaca, cima es igual a 0 porque no tiene que
apuntaraningnelemento.
Implementacindeunapilaconmemoriaesttica:
Algoritmoprin_pila
PGINA138/184

Const
Max_pila=<max_pila>
Var
P:array[1..max_pila]de<info>
C:entero
Elem:<info>
Inicio
C0
Leer(elem)
Sipila_vacia(C)=verdadero
EntoncesescribirPilavacia
Sinosacar(pila,c,elem)

EscribirElementosacadoelem
Finsi
Fin
Funcionpila_vacia(cima:entero):booleano
Inicio
Sicima=0
Entoncesretornoverdadero
Sinoretornofalso
Finsi
Fin
Procedimientometer(entsalpila:array[1..max_pila]de<info>;cima:entero;
elem:<info>)
Inicio
sicima=max_pila
entoncesescribirPilallena
sinocimacima+1
pila[cima]elem
finsi
Fin
Funcioncima_pila(pila:array[1..max_pila]de<info>;cima:entero):<info>
Inicio
Retornopila[cima]
Fin

Procedimientosacar(entsalpila:array[1..max_pila]de<info>;cima:entero;
entsale:<info>)
Inicio
Ecima_pila(cima,pila)
Cimacima1
PGINA139/184

Fin
Implementacindeunapilaconmemoriadinmica:
Tiponodo:registro
Info:<tipo>
Sig:punteroanodo
Finregistro
Algoritmomanejo_pila
Var
Cima:punteroanodo
Elem:<tipo>
Inicio
Cimanil
Meter(cima,elem)
Sipila_vacia(cima)
EntoncesescribirNohaymemoria
Sinosacar(cima,elem)
EscribirElementosacadoelem
Finsi
Fin
Funcionpila_vacia(cima:punteroanodo):booleano
Inicio
Sicima=nil
Entoncesretornoverdadero
Sinoretornofalso
Finsi
Fin
Procedimientoponer(entsalcima:punteroanodo;elem:<tipo>)
Var
Nuevo:punteroanodo
Inicio
SiDISP=nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPsig
Nuevoinfoelem

Nuevosigcima
Cimanuevo
Finsi
Fin

Funcioncima_pila(cima:punteroanodo):<tipo>
Inicio

PGINA140/184

Retornocimainfo
Fin
Procedimientosacar(entsalcima:punteroanodo;entsalelem:<tipo>)
Var
Borrado:punteroanodo
Inicio
Elemcima_pila(cima)
Borradocima
Cimacimasig
BorradosigDISP
DISPborrado
Fin
Aplicacionesdelaspilas:
Unejemplotpicodeusodepilas,esenlasllamadasentrefunciones.Eneste
caso,elsistemaoperativoutilizaunapilaendondevaguardandoladireccinderetorno
decadaunadeestasllamadas.
8.COLAS:
Unacolatambinesunalistalinealdeelementos,enlaquelasinsercionesse
hacenporunextremodelalista,ylosborradosporotro.Lasinsercionessehacenporel
finalylosborradosporelprincipio.
EstosignificaqueesunaestructuradeltipoFIFO.
Seacualsealaimplementacin,siempretendrnqueexistir2variables,frentey
final,queapuntenalcomienzoyalfindelacolarespectivamente.
Podemosimplementarunacolaconmemoriaesttica(arrays)yconmemoria
dinmica(listasenlazadas).
Siimplementamos lacolaconarrays,tendremos unarrayllamado cola, que
contieneeltipodeinformacinquecontienelacola,yapartedosvalores,frenteyfinal,
cuyovalorservircomoelndicequeindicaqueelementoestalfrenteyalfinaldela
cola.
Lacolaestarvacacuandofrenteyfinalnoapuntenaningnndicedelarray,y
estosercuandofrenteyfinalvalgan0sielarrayseempiezaanumerarapartirdel1.
Apartedelafuncinquemedicesilacolaestvaca,tendrqueimplementar
funcionesdesacarymeterunelemento.
Parainsertarunelementoenunacola,habraqueincrementarelvalorenla
variablefinal,ydespusintroducirenlacoladelfinalelelemento.
Paraeliminarunelementodeunacola,bastaraprimeroverqueelementoestal
frentedelacola,yparaeliminarloaumentarelfrenteenunaunidad.
Si solo consideramos esta posibilidad, es decir, manejar el array solo
incrementando,noloestaramosutilizandoeficientemente,porquepodramosllegaral
casoenquehabiendoposicioneslibresalcomienzodelarraynopudisemos usarlas
cuandoelfinalalcanzaseelmximondicedelarray.

PGINA141/184

Paraevitaresto,elarrayqueimplementalacola,lovamosatratarcomounarray
circular(suponemosquedespuesdelaposicinNdelarray,vienelaposicin1).Esto
quieredecirquesilacolanoestllena,despusdefinal=Max,vienefinal=1,yal
sacarelelementodelacola,sinoestvaca,despusdefrente=N,vendrfrente=1,y
sidespusdesacarelelementolacolaquedavaca,actualizaremosfrenteyfinala0.
Sifrenteesigualafinalysondistintosde0antesdesacarunelemento,quiere
decirqueeseelementoeselltimo.
Antesdeinsertarunelemento,tendrqueversilacolaestllena(frente=1y
final=Maxofrente=final+1).
Implementacindecolasconmemoriaesttica:
Tipodatos:array[1..max_cola]de<tipo>
Algoritmomanejo_cola
Var
Cola:datos
Frente,final:entero
Elem,result:<tipo>
Inicio
Frente0
Final0
Meter_cola(frente,final,cola,elem)
Sicola_vacia(frente,final)=verdadero
EntoncesescribirColavaca
Sinosacar_cola(frente,final,cola,result)
EscribirElementosacadoresult
Finsi
Fin
Funcioncola_vacia(frente:entero;final:entero):boolean
Inicio
Si(frente=0)y(final=0)
Entoncesretornoverdadero
Sinoretornofalso
Finsi
Fin

PGINA142/184

Procedimientometer_cola(entsalcola:datos;entsalfrente:entero;entsalfinal:entero;
Elem:<tipo>)
Inicio
Si((frente=1)y(final=Max_cola))ofrente=final+1
EntoncesescribirColallena
Sinosicola_vacia(frente,final)=verdadero

Entoncesfrente1
Final1
Sinosifinal=Max_cola
Entoncesfinal1
Sinofinalfinal+1
Finsi

Finsi

Cola[final]elem
Finsi
Fin
Procedimientosacar_cola(entsalcola:datos;entsalfrente:entero;entsalfinal:entero;
Elem:<tipo>)
Inicio
Elemcola[frente]
Sifrente=final
Entoncesfrente0

Final0
Sinosifrente=Max_cola
Entoncesfrente1
Sinofrentefrente+1
Finsi
Finsi
Fin
Implementacindecolasconmemoriadinmica:
Funcioncola_vacia(com:punteroanodo_doble):booleano
Inicio
Sicom=nil
Entoncesretornoverdadero
Sinoretornofalso
Finsi
Fin

PGINA143/184

Procedimientometer_cola(entsalcom:punteroanodo_doble;
entsalfinal:punteroanodo_doble;elem:<tipo>)
var
nuevo:punteroanodo_doble
Inicio
SiDISP=nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPsig
Nuevoinfoelem
Nuevoantfinal
Nuevosignil
Finalsignuevo
Finalnuevo
Sicola_vacia(frente)=verdadero
Entoncesfrentenuevo
Finsi
Finsi
Fin
Procedimientosacar_cola(entsalcom:punteroanodo_doble;
entsalfinal:punteroanodo_doble;result:<tipo>)
var
ptr:punteroanodo_doble
Inicio
Resultcominfo
Ptrcom
Comcomsig
Sicom=nil
Entoncesfinalnil
Sinocomantnil
Finsi
PtrsigDISP
DISPptr
Fin
Aplicacionesdelascolas:
Las colas se suelen utilizar en los procesos por lotes y en la utilizacin de
recursosdelsistema.
Cuandounprocesoquiereusarunrecursoyotroloestusando,tendrque
ponerseenlacola,yseirasignandoelrecursosegnelordenenquesehapedido.
PGINA144/184

Aveces,lautilizacinderecursosporpartedelosprocesos,nosinteresaque
ciertosprocesostenganmayorprioridadqueotros,inclusoaunquelleguenmstarde,y
paraelloutilizaramoslascolasdeprioridades.
Cadaelementodelacola,tendrotrocampoqueindiquesuprioridad,talquea
lahoradesacarunelementodelacola,sacoeldelfrente,yalahoradeinsertarun
elementoenlacola,tendrencuentalaprioridaddelelementoquequieroinsertar,y
paraelloseinsertaenlacolaporordendeprioridad,ysihaymaselementosquetienen
lamismaprioridadqueelquequeremosinsertar,losprocesamossegnsuordende
llegada,esdecir,quelocolocamoscomoelltimodeloselementosconesaprioridad.
DOBLESCOLASOBICOLAS:
Unabicolaesunalistalinealdeelementosenlaquelasinsercionesyborrados
espuedenhacerporcualquieradesusextremos.
Vaahaber2variables,izquierdayderecha,queapuntanasusextremos.
Hay2tiposespecialesdebicolas:
- De entrada restringida: Que permite inserciones solo por un extremo y
borradosporlosdos.
- De salida restringida: Que permite inserciones por cualquier extremo y
borradosoloporuno.
Sepuedenimplementarconmemoriaestticaodinmica.

PGINA145/184

EJERCICIOS:TEMA11
1. Disear un algoritmo que coloque el primer nodo de una lista enlazada como
penltimo,perocambiandosololoscamposenlace.Lalistaesunalistaenlazada
doble.
Procedimientoresultado(entsalcom:ptr_anodo;entsalfinal:ptr_anodo)
Var
Prin:punteroanodo
Inicio
Si(com=final)o(comsig=final)
EntoncesescribirNosepuedehacerelcambio
Sinoprincom
Comsigfinal
Comantfinalant
Finalantsigcom
Finalantcom
Comprinsig
Comantnil
Finsi
Fin
2. DadaunacadenadecaracteresC1,enunarraydelongitudmximaN,yconelfin
decadena$,ydadaotracadenaC2almacenadaenunalistaenlazadasimple,que
cadanododelalistacontieneunaletra.Setratadequepasandoleaunsubprograma
2cadenas,determinarcuantasvecesapareceC1enC2.
Funcioncompara(c1:cadena;c2:ptr_anodo):entero
Var
Ini,p:punteroanodo
I,res:entero
Inicio
Res0
PC2
Mientras(p<>nil)
Si(pinfo=c1[i])
EntoncesiniP

PGINA146/184

I1
Mientras(pinfo=c1[i])y(c1[i]<>$)y(p<>nil)
Ii+1
Ppsig
Finmientras
Sic1[i]=$
Entoncesresres+1
Sinopinisig
Finsi
Sinoppsing
Finsi
Finmientras
Fin

3. Dadaunalistadoblementeenlazadaquecontieneencadanodoundgitodecimal
(0..9),determinarelvalorqueseobtienesiconsideramoslainformacindecada
nododelalistacomolostrminosdeunpolinomio,dondeeltrminodemenor
gradoeselltimonodoyeldemximogradoeseldelcomienzo,evaluandoel
polinomioparaunvalorqueselepasacomoparmetro.
Funcionpot(base:entero;exp:entero):real
Var
I:entero
Acum:real
Inicio
Acum1
Desdei=1hastaexp
Acumacum*base
Findesde
Retornoacum
Fin
Funcionpolinomio(fin:ptr_anodo_doble;x:entero):real
Var
Res:real
P:punteroanodo_doble
Inicio
Exp0
Res0
Pfinal
Mientrasp<>nil
Resres+(cinfo*pot(x,exp)
Ppant
Expexp+1
Finmientras
Retornores
Fin
PGINA147/184

4. Tenemosalmacenadoenunficherodeproductoselstockdecadaunodeellosenel
almacn.Cadaregistrotieneidentificador,nombre,stockactualystockmnimo.
Iterativamente,hastaqueseintroduzcaunidentificadordeproductoiguala0,se
irnhaciendopedidosoentregaspidindonoselidentificador,lacantidadysies
pedido o entrega, y con ellos iremos actualizando la cantidad de productos en
almacn.Alfinalquierotenerelficheroactualizado.Paraello,utilizaremosunalista
enlazadacomoestructuraauxiliar.
Tipoproducto:registro
Indentificador:entero
Nombre:cadena
Stock_act:entero
Stock_min:entero
Finregistro
Nodo:registro
Info:producto
Sig:punteroanodo
Finregistro
Var
Com,ptr:punteroanodo
Reg:producto
Fich:ficherodeproducto
Id,cant:entero
Car:carcter
Inicio
Comnil
Abrir(fich,datos.dat,entrada)
Leer(fich,reg)
Mientrasnoeof(fich)
Insertar(com,reg)
Leer(fich,reg)
PGINA148/184

Finmientras
Cerrar(fich)
EscribirIdentificador
Leer(id)
Mientrasid<>0
EscribirCantidad
Leercant
EscribirPedido/Entrega
Leercar
Modifica(com,id,cant,car)
EscribirIdentificador
Leerid
Finmientras
Abrir(fich,datos.dat,salida)
Ptrcom

Mientrascom<>nil
Escribir(fich,cominfo)
Comcomsig
PtrsigDISP
DISPptr
Ptrcom
Finmientras
Cerrar(fich)
Fin
Procedimientoinsertar(entsalcom:punteroanodo;elem:producto)
Var
Lug,lugp,nuevo:punteroanodo
Inicio
SiDISP=Nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPSig
Nuevoinfoelem
Sicom=nil
Entoncesnuevosigcom
Comnuevo
Sinolugpcom
Lugcomsig
Mientras(elem.identificador>luginfo)y(lug<>nil)
Lugplug
Luglugsig
PGINA149/184

Finmientras
Nuevosiglug
Lugpsignuevo
Finsi
Finsi
Fin

Procedimientomodifica(prim:ptr_anodo;d:entero;c:entero;caract:carcter)
Var
Ptr:punteroanodo
Inicio
Siprin=nil
EntoncesescribirListavacia
Sinoptrprin
Mientras(ptr<>nil)y(id<>ptrinfo.identificador)
Ptrptrsig
Finmientras
Siptr=nil
EntoncesescribirElproductonoexiste
Sinosi(caract=P)o(caract=p)
Entoncesptrinfo.cantidadptrinfo.cantidad+c
Sinosiptrinfo.cantidad>=c
Entoncesptrinfo.cantidadptrinfo.cantidadc

SinoescribirNohaycantidadsuficiente
Finsi
Finsi
Finsi
Finsi
Fin

PGINA150/184

5. Dadas2listasenlazadassimples,L1yL2,ordenadasenascendente,actualizarlas2
listasdemodoqueL2quedevacayL1contengaatodosloselementosdeL2,
menosalosrepetidos.Noborrarelementos,hayqueenlazarlos.
Procedimientojuntar(entsalcom1:ptr_anodo;entsalcom2:ptr_anodo)
Var
P1,a1,aux,borrado:punteroanodo
Inicio
Sicom2<>nil
Entoncessicom1=nil
Entoncescom1com2
Sinosi(com2info<com1info)y(com2<>nil)
Entoncesauxcom2
Com2com2sig
Auxsigcom1
Com1aux
Sinoa1com1

P1com1sig
Mientras(p1<>nil)y(com2<>nil)
Si(com2info<p1info)
Entoncesa1p1
P1p1sig
PGINA151/184

Sinosi(com2info=p1info)
Entoncesborradocom2
Com2com2sig
BorradosigDISP
DISPborrado
Sinoauxcom2
A1sigcom2
Com2sigP1
Com2auxsig
A1a1sig
Finsi

Finsi
Finmientas
Sicom2<>nil
Entoncesa1sigcom2
Com2nil
Finsi
Finsi

Finsi
Finsi
Fin

6. Implementarunacolausandolistasenlazadassimples:
Procedimientometer(entsalcom:ptr_anodo;entsalfinal:ptr_anodo;e:<tipo>)
Var
Nuevo:ptr_anodo
Inicio
SiDISP=nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPsig
NuevosigNil
Sicom=nil
Entoncescomnuevo
Finalnuevo
Sinofinalsignuevo
Finalnuevo
Finsi
Finsi

PGINA152/184

Fin
Procedimientosacar(entsalcom:ptr_anodo;entsalfinal:ptr_anodo;entsale:<tipo>)
Var
Borrado:punteroanodo
Inicio
Ecominfo
Borradocom
Comcomsig
Sicom=nil
Entoncesfinalnil
Finsi
BorradosigDISP
DISPborrado
Fin

7. Implementarunacoladeprioridadesconlistasenlazadassimples:
Procedimientometer(entsalcom:ptr_anodo;e:<tipo>;p:entero)
Var
Lugp,lug,nuevo:punteroanodo
Inicio
SiDISP=nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPsig
Nuevoinfoe

Nuevoprioridadp
Lugpnil
Lugcom
Mientras(lug<>nil)y(p>=lugprior)
PGINA153/184

Lugplug
Luglugsig
Finmientras
Silugp=nil
Entoncesnuevosigcom
Comnuevo
Sinolugpsignuevo
Nuevosiglug
Finsi
Finsi
Fin
Procedimientosacar(entsalcom:ptr_anodo;entsale:<tipo>)
Var
Borrado:punteroanodo
Inicio
Ecominfo
Borradocom
Comcomsig
BorradosigDISP
DISPborrado
Fin

8. Implementarunacoladeprioridadescomolistadelistas:
Tiponodo_prior:registro
Prior:entero
Prinp:ptr_anodo_info
Sig:ptr_anodo_pr
Finregistro
Nodo_info:registro
Info:<tipo>
Enl:ptr_anodo_info
Finregistro

PGINA154/184

Procedimientometer(entsalcom:ptr_anodo_prior;elem:<tipo>;p:entero)
Var
Nuevoi,lugi:punteroanodo_info
Nuevop,ptr,ptra:punteroanodo_prior
Inicio
Si(DISPP=nil)y(DISPI=nil)
EntoncesescribirNohaymemoria
SinonuevoiDISPI
DISPIDISPIenl
Nuevoiinfoelem
NuevosigNIL
Ptranil
Ptrcom
Mientras(ptr<>nil)y(p>ptrprior)
Ptraptr
Ptrptrsig
Finmientras
Si(p=ptrprior)
Entonceslugiptrprinp
Mientras(lugisig<>nil)
Lugilugienl
Finmientas
Lugisignuevo
SinonuevopDISPP
DISPPDISPPsig
Nuevoppriorp
Nuevopsigptr
Nuevopprinpnuevoi
Si(ptra=nil)

Entoncescomnuevop
Sinoptrasignuevop
Finsi
Finsi
Finsi
Fin

Procedimientosacar(entsalcom:ptr_anodo_prior;entsale:<tipo>)
Var
Bori:ptr_anodo_info
Borp:ptr_anodo_prior
Inicio
Ecomprinpinfo
Boricomprinp
PGINA155/184

Comprinpcomprinpenl
BorienlDISPI
Sicomprinp=nil
Entoncesborpcom
Comcomsig
BorpsigDISPP
DISPPborp
Finsi
Fin

RBOLESYGRAFOS:
ESTRUCTURASDEDATOSNOLINEALES:
TEMA12

PGINA156/184

1.
2.
3.
4.
5.
6.
7.

rboles.
rbolesbinarios.
rbolesbinariosdebsqueda.
Aplicacionesdelosrbolesbinarios.
Grafos.
Operacionescongrafos.
Aplicacionesdelosgrafos.

1. RBOLES:
Losrbolesestndentrodelasestructurasdedatosnolineales,queconsistenen
quedesdeunnodotengoaccesoavarioselementos.
Unrbolesunconjuntofinitodeelementosllamadosnodos,queguardanentre
sunarelacinjerrquicatalquesiemprevaaexistirunnodorazdiferenciadodel
resto,ylosrestantespartendel,formandoconjuntosdisjuntoscadaunodeloscuales
esasuvezotrorbol.Acadaunodeesosrbolesselesllamasubrbolesdelraz.
Unrbolvacoesaquelquenotieneningnnodo(Raiz=NIL).
A
B
C

Terminologadelosrboles:
- Raz: Nodo esencial de que parten todos los dems. Es el nico que no tiene
antecesor.
- Nodo:Cadaunodeloselementosdelrbol.
- Hojaonodoterminal:Nodoquenotieneningnotrosubrboldebajodel.
- Hijo:Cadanodoquenoeshojatienedebajodelaotrossubrboles.
- Padre: Todo nodo excepto el raz, que tiene asociado un predecesor del que
desciende.
- Hermano:Relacinentrelosnodoshijosdelmismopadre.
- Nodointerno:Elquetienealgnhijo.
- Nivel:Cadanododeunrboltieneasociadounnmerodenivel.Eldelrazesel0,
yapartirdeahsevaaumentandode1en1.
- CaminoentreAyB:Sucesindeenlacesonodosporlosquehayquepasarpara
llegardeAaB.
- Rama:Caminoqueterminaenunahoja.
- Profundidaddeunrbol:Eselnmeromximodenodosdelaramamslargadel
rbol.Equivalealnmeromximodeniveles+1.
- Peso:Nmerodehojasquetieneunrbol.
- Bosque:Coleccinde2omsrboles.

PGINA157/184

2.RBOLESBINARIOS:
Sonunconjuntofinitodeelementosllamadosnodosquecontienenunnodoraz
ydondecadanodopuedetener0,1,2hijos.Acadasubarbolseledenominasubarbol
izquierdoysubarbolderecho.
Terminologa:
- Dosrbolesbinariossonsimilaressitienenlosnodoscolocadosigual.
- rbolesbinariosequivalentesocopias:Tienenlamismaestructuraylosmismos
contenidos.
- rbolesbinariosequilibrados:Aquellosqueenlaalturaentresurbolizquierdoy
derechosediferenciancomomximoenunaunidad.
- rbolesbinarioscompletos:Aquellosenquecadanododelrboltiene02hijos,
elnmeromximodehijosdeundeterminadoniveliser2elevadoai.
- rbollleno:Cuandotodoslosnivelesestncompletos.
Representacinderbolesbinarios:
Sepuedenrepresentarconmemoriaestticaodinmica.Conmemoriadinmica
laestructuradeunnodovaatenerelcampoinfoyotros2nodosquereferncienalhijo
izquierdoyderechodecadanodo.
Representacinderbolesbinariosconpunteros:
Cadanodovaatenerunregistroquecontieneelcampodeinformacin y2
camposdetipopuntero.
INFO
IZQ

DER

Tiponodo_arbol:registro
Info:<tipo>
Izq,der:ptr_anodo_arbol
Finregistro
Apartedelosnodos,losrbolestienenunavariableespecialllamadaraz,que
esdetipopunteroanodo_arbolyapuntaalnodoqueestalcomienzodelrbol.
Raiz

PGINA158/184

DISP_ARvaaserunalistaenlazadasimpleenlaquelasinsercionesyborrados
loshacemosporelcomienzoycomocampodeenlacevamosausarelnodoizquierdo.
Recorridodelosrbolesbinarios:
Espasarportodossusnodos.Pararecorrerunrbollopodemoshacerde3
formas,segnelmomentoenelqueprocesemoselnodoraz.Las3formassellaman:
Preorden,Inorden,Posorden.
Encualquieradelastres,siempreserecorreprimeroelsubrbolizquierdo,y
luegoelderecho,ysediferencianenelmomentoenelquerecorremoselraz.
- Preorden:Larazseprocesaprimero,luegoelizquierdoyluegoelderecho.
- Inorden:Primerolaraz,luegoelizquierdoyluegoelderecho.
- Posorden:Primeroelizquierdo,luegoelderechoyluegolaraz.
Preorden:A,B,D,E,G,C,F
Inorden:D,B,E,G,A,F,C
Posorden:D,G,E,B,F,C,A
Recorridodeunrbolbinario:
Losarbolessonestructurasrecursivas,porloquelosalgoritmosmseficientes
conrbolessonlosrecursivos.
Procedimientopreorden(raiz:ptr_anodo_ar)
Inicio
Siraiz<>nil
Entonces{procesarraizinfo)
Preorden(raizizq)
Preorden(raizder)
Finsi
Fin
Procedimientoinorden(raiz:ptr_anodo_ar)
Inicio
Siraiz<>nil
Entoncesinorden(raizizq)
{procesarraizinfo)
inorden(raizder)
Finsi
Fin
Procedimientoposorden(raiz:ptr_anodo_ar)
Inicio
Siraiz<>nil
Entoncesposorden(raizizq)
Posorden(raizder)
{procesarraizinfo)
Finsi
PGINA159/184

Fin

Tambinsepuederecorrerunrbolbinarioconunalgoritmonorecursivo:
Algoritmoinorden
Var
Pila:array[1..Max]depunteroanodo_ar
Cima:entero
Raiz,ptr:punteroanodo_ar
Inicio
Cima1
Pila[cima]Nil
Ptrraiz
Mientras(ptr<>nil)
Cimacima+1
Pila[cima]ptr
Ptrptrizq
Finmientras
Ptrpila[cima]
Cimacima1
Mientras(ptr<>nil)
{procesarptrinfo}
siptrder<>nil
entoncesptrptrder
mientrasptr<>nil
cimacima+1
pila[cima]ptr
ptrptrizq
finmientras
finsi
ptrpila[cima]
cimacima1
finmientras
Fin

3.RBOLESBINARIOSDEBSQUEDA:
Sonuntipoespecialderbolesbinariosquesecaracterizaporqueloselementos
delrbolsontodosdistintosyademsestncolocadosdetalmaneraqueelrecorridoen
Inordendeeserboldalugaraqueloselementos seprocesenordenadossegnun
determinadocampodeinformacin,paraelloesnecesarioquetodoslosnodosdelrbol
cumplanlasiguienteregla:Quetodoloqueestalaizquierdadeunnodotengaun
valormenorqueelrestodelnodo,ytodoloqueestaaladerechatengaunvalormayor.

PGINA160/184

25
1835

12223038

111521323740

1416

Recorridoinorden:11,12,14,15,16,18,21,22,25,30,32,35,37,38,40.
Bsquedadeunelemento:
Dadounelemento,mirarsiseencuentraonoenelrbol,voyadevolverun
punteroaeseelementoyasupadre.
Procedimientobuscar(raiz:ptr_anodo_ar;entsalact:ptr_anodo_ar;
entsalpad:ptr_anodo_ar;e:<tipo>)
Inicio
PadNil
Actraiz
Mientras(act<>nil)y(actinfo<>e)
Padact
Si(e<actinfo)
Entoncesactactizq
Sinoactactder
Finsi
Finmientras
Siact<>nil
EntoncesescribirElementoencontrado
SinoescribirElementonoencontrado
Finsi
Fin
Insercinenunrbolbinario:
Primerohayqueverquenohayaotroelementoigualenelrbol,ydespus
habrquecolocarelelementoalaizquierdadesupadresiesmenorqueloalderecha
siesmayor.
Algoritmonorecursivo:
Procedimientoinsercion(entsalraiz:ptr_anodo_ar;elem:<tipo>)
Var
Ptr,pad,nuevo:ptr_anodo_ar
Inicio
Buscar(raiz,ptr,pad,elem)
Siptr<>nil
EntoncesescribirElelementoyaexiste
SinosiDISP=Nil
EntoncesescribirNohaymemoria
SinonuevoDISP
DISPDISPIZQ
PGINA161/184

Nuevoinfoelem
Nuevoizqnil
Nuevodernil
SiPAD=nil
Entoncesraiznuevo
Sinosielem<padinfo
Entoncespadizqnuevo
sino Paddernuevo
finsi
finsi
finsi
finsi
Fin
Algoritmorecursivo:
Procedimientoinsercion(entsalptr:ptr_anodo_ar;elem:<tipo>)
Inicio
Siptr<>nil
Entoncessielem<ptrinfo
Entoncesinsercion(ptrizq,elem)
Sinosielem>ptrinfo
Entoncesinsercion(ptrder,elem)
SinoescribirElelementoyaexiste
Finsi
Finsi
SinoptrDISP
DISPDISPizq
Ptrinfoelem
Ptrizqnil
Ptrdernil
Finsi
Fin
Borradoenunrbolbinario:
Sielnodoaborrarslotieneunhijo,losustituimosporeseyyaseacabo.Pero
sielnodoaborrartiene2hijos,hayquebuscarcualeselsucesordeesenodo(estara
laderechadelmsalaizquierda)yelpadredeesesucesor.Sustituirelnodoaborrar
por su sucesor. Al final hay que poner como hijos del sucesor (que es el que ha
sustituidoalnodoborrado)aloshijosdelnodoborrado.
Algoritmonorecursivo:
Procedimientoborrar(entsalraiz:ptr_anodo_ar;elem:<tipo>)
Var
Ptr,pad:ptr_anodo_ar
Inicio
Buscar(raiz,ptr,pad,elem)

PGINA162/184

Siptr=nil
EntoncesescribirElelementonoexiste
Sinosi(ptrizq<>nil)y(ptrder<>nil)
Entoncesborrar_2_h(raiz,ptr,pad)
Sinoborrar_01_h(raiz,ptr,pad)
Finsi
PtrizqDISP
DISPizqptr
Finsi
Fin

Procedimientoborrar_2_h(entsalraiz:ptr_anodo_ar;entsal:ptr_anodo_ar;
pad:ptr_anodo_ar)
Var
Suc,padsuc,hijosuc:ptr_anodo_ar
Inicio
Padsucptr
Sucptrder
Mientrassucizq<>nil
Padsucsuc
Sucsucizq
Finmientras
Hijosucsucder
Sipadsucizq=suc
Entoncespadsucizqhijosuc
Sinopadsucderhijosuc
Finsi
Sipad=nil
Entoncesraizsuc
Sinosipadizq=ptr
Entoncespadizqsuc
Sinopaddersuc
Finsi
Finsi
Sucizqptrizq
Sucderptrder
Fin
Procedimientoborrar_01_h(entsalraiz:ptr_anodo_ar;entsalptr:ptr_anodo_ar;
Pad:ptr_anodo_ar)

PGINA163/184

Var
Hijo:ptr_anodo_ar
Inicio
Siptrizq<>nil
Entonceshijoptrizq
Sinohijoptrder
Finsi
Sipad=nil
Entoncesraizhijo
Sinosiptr=padizq
Entoncespadizqhijo
Sinopadderhijo
Finsi
Finsi
Fin

Algoritmorecursivo:
Procedimientoborrar(ptr:ptr_anodo_ar;elem:<tipo>)
Inicio
Siptr<>nil
Entoncessielem<ptrizq
Entoncesborrar(ptrizq,elem)
Sinosielem>ptrder
Entoncesborrar(ptrder,elem)
Sinosiptrizq=Nil
Entoncesptrptrizq
Sinosiptrder=Nil
Entoncesptrptrizq
Sinoeliminar(ptrder,ptr)
Finsi
Finsi
Finsi
PtrizqDISP
DISPptr
Finsi
SinoescribirElnodonoexiste
Finsi
Fin
Procedimientoeliminar(entsalsuc:ptr_anodo_ar;entsalptr:ptr_anodo_ar)

PGINA164/184

Inicio
Sisucizq<>nil
Entonceseliminar(sucizq,ptr)
Sinoptrinfosucinfo
Ptrsuc
Finsi
Fin
4.APLICACIONESDELOSRBOLESBINARIOS:
- Unadelasaplicacionesmsimportantesesdentrodelainteligenciaartificial,yms
concretamenteenelreadereconocimientodepatrones.
Setratadeutilizarlosrbolespararealizarclasificaciones.Laclaveestenasignar
acadanododelrbolunsignificadoyacadarama,unarespuestaquenosayudea
determinarelsentidodelabsqueda.
- Transformacin de una notacin algebraica a otra: Prefija, infija, posfija
(+ab,a+b,ab+).Paraellolarazdelrboldebedeserunsignoyparalasramaso
subrboles,otraexpresinounoperando.
- ParaimplementarelalgoritmodeHodmandecompresinycodificacin.

5.GRAFOS:
El grafo es una estructura de datos no lineal, tal que ahora desde un nodo
podemosapuntaravarios,peroasuvezunnodopuedeserapuntadodesdeotros.
Terminologadelosgrafos:
UngrafosecomponeporunconjuntoVdevrticesyunconjuntoAdearistas.
Cadaaristaseidentificaconunpardevrticesqueindicanlosvrticesalosqueunela
arista.Losvrticesdeunaaristasonentresnodosadyacentes.
- Gradodeunnodo:Nmerodearistasquecontieneaesenodo.
- Gradodeungrafo:Nmerodevrticesdeesegrafo.Sielgradodeunnodoes0,se
dicequeesunnodoaislado.
- Camino:UncaminoCdelongitudNdeunnodoV1aunnodoV2,sedefinecomo
lasecuenciadenodosporlosquehayquepasarparallegardelnodoV1aV2.La
longituddeesecaminoeselnmerodearistasquecomprendeesecamino.
Elcaminoescerradosiempiezayterminaenelmismonodo.Elcaminoessimplesi
todoslosnodosdedichocaminosondistintosaexcepcindelosdelosextremos
quepuedenseriguales.
2

13
4
6

C(1,6)
1,4,6Caminossimples
1,4,5,6

PGINA165/184

1,4,3,4,5,6

Aristasespeciales:
- Bucles:Esunaaristacuyosextremossonidnticos.
- Aristamltiple:Dosomsaristasqueconectanlosmismosnodos.
Tiposdegrafos:
- Grafoconectadooconexo:Existeuncaminosimpleentre2cualesquieradesus
nodos.
- Grafodesconectado:Aquelenqueexistennodosquenoestnunidosporningn
camino.
- Grafodirigido:Cadaaristatieneasignadaunadireccin(identificadaporunpar
ordenado).
- Grafonodirigido:Laaristaestdefinidaporunparnoordenado.
- Grafosencillo:Aquelquenotienenibuclesniaristasmltiples.
- Grafomltipleomultigrafo:Permitelaexistenciadearistasmltiplesobucles.
- Grafocompleto:Cadanododelgrafoesadyacenteatodoslosdems.
- Grafoetiquetadoconpesoponderado:Aquelenelqueacadaaristadelgrafova
asociadounvalorqueesloquellamamospesodelalista.Seusaparaindicaralgo,
comolalongituddelaaristaolaimportanciadelaarista,...
- Pesodeuncamino:Lasumadelospesosdelasaristasdelcamino.

Representacindelosgrafos:
Hay2formasderepresentarlosgrafos,conmemoriaestticayconmemoria
dinmica:
Conmemoriaesttica:
- Matrizdeadyacencia:EsunamatrizMdeN*NelementosdondeNeselnmerode
nodosdelgrafo,dondecadaposicinM(i,j)ndicasihayunaconexinonoentreel
nodo que aparece asociado a la posicin I de la matriz y el nodo que aparece
asociadoalamatrizJ.
Si lo que quiero es representar un grafo ponderado en vez de poner 0 y 1,
pondremos0sinoestaconectadoyelvalordelaaristasiexisteconexin.
Sielgrafonoesdirigidoresultaunamatrizsimetrica.
Las potencias de la matriz de adyacencia M elevado a K nos indican en las
posicionesquetienevalor1queexisteuncaminodelongitudKentrelosnodos
asociadosalasposicionesI,Jdeesamatriz.
Destino

1
2

1
0
0

2
0
0

3
0
0

4
1
0

5
0
0

6
0
0

PGINA166/184

3
4
5
6

1
0
0
0

1
0
0
0

0
0
0
0

1
0
1
0

0
0
1
0

0
0
1
0

Origen
2
3
1
4

5
6

Conmemoriadinmica:
Vamosautilizar2listasenlazadas,unaeslalistadenodos(formadaportodos
losvrticesyaristasdelgrafo.
Cadanododeesalistatendrlasiguienteinformacin:
- Info:Informacindelnodo.
- Sig:Punteroqueenlazaconelsiguientenododelalistadenodos.
- Ady:Apuntaalprimerelementodelalistadeadyacencia.
Lalistadeadyacenciacontieneoenlazaatodaslasaristasquepartendeese
nodo.Elconjuntodetodaslaslistasdeadyacencia,formanunalistadelistas.
Lalistadeadyacenciaseimplementacomootralistaenlazadaenlaquecada
nododeesalistacontiene2campos:
- Des(destino):Esuncampopunteroalnododestinodelalista.
- Enl(enlace):Esuncampopunteroqueapuntaalsiguientenodooarista
delalistadeadyacenciadeesenodo.

1
SigAdyDesEnl
2
2
3
4

3
4
Tipovertice:registro
Info:<tipo>
PGINA167/184

Sig:ptr_avertice
Ady:ptr_aarista
Finregistro
Tipoarista
Des:ptr_avertice
Enl:ptr_aarista
(*Elpesodelaaristairaaqu*)
Finregistro
Paramanejarlamemoriadisponiblevamosatener2listas:
- ADISP:Apuntaalprimernodoqueenlazaalosnodosdetipoaristadisponible.
- NDISP: Apunta la primer nodo que enlaza a los nodos de tipo vrtices. Nos
movemosconelcamposig.
6.OPERACIONESCONGRAFOS:
Bsquedadeunnodo:
Lo que se trata es de localizar un nodo que contiene una determinada
informacin,paraellolepasamoslainformacinalprocedimientoynosdevuelvela
posicinsiloencuentraoNilsinoloencuentra.
ProcedimientoBuscar_nodo(elem:<tipo>;entsalptr:ptr_avertice;prin:ptr_avertice)
Inicio
Ptrprin
Mientras(ptrinfo<>elem)y(ptr<>nil)
Ptrptrsig
Finmientras
Fin

Bsquedadeunaarista:
Setratadebuscarunaaristadadossuscamposdeinformacinorigenydestino.
DevuelveunpunteroalalistadearistasqueapuntaaesaaristaoNilsinoexiste.
Procedimientobuscar_arista(prin:ptr_averitice;orig:<tipo>;des:<tipo>;
entsalptr:ptr_aarista;entsalp1:ptr_avertice;
entsalp2:ptr_avertice)
Inicio
Buscar_nodo(prin,orig,p1)
Sip1=nil
EntoncesescribirNoexisteelnodoorigen
Sinobuscar_nodo(prin,des,p2)
Sip2=nil

PGINA168/184

EntoncesescribirNoexisteelnododestino
Sinoptrp1ady
Mientras(ptr<>nil)y(ptrdes<>p2)
Ptrptrenl
Finmientras
Finsi
Finsi
Fin
Insercindeunnodo:
Primerodebemosmirarsinoexisteunnodoquecontengaesainformaciny
parainsertarelnodoloinsertamosporelprincipio.
Procedimientoinsertar_nodo(entsalprin:ptr_avertice;elem:<tipo>
Var
Nuevo:ptr_avertice;
Inicio
SiNDISP=Nil
EntoncesescribirNohaymemoria
SinonuevoNDISP
NDISPNDISPSig
Nuevoinfoelem
NuevoadyNil
Nuevosigprin
Prinnuevo
Finsi
Fin

Insercindeunaarista:
Primerohayquecomprobarsiexistenlosnodosorigenydestino,luegohayque
comprobarquenoexisteunaaristaigualenesadireccinyparainsertarla,comoel
ordennoimportaseinsertaporelprincipio.
Procedimientoinsertar_arista(prin:ptr_avertice;orig:<tipo>;dest:<tipo>;
entsalp1:ptr_avertice;entsalp2:ptr_avertice)
Var
Nuevo,pa:ptr_aarista
PGINA169/184

Inicio
SiADISP=Nil
EntoncesescribirNohaymemoria
Sinobuscar_arista(prin,orig,des,pa,p1,p2)

Sipa<>nil
EntoncesescribirLaaristayaexiste
SinoNuevoADISP
ADISPADISPSig
Nuevodestp2
Nuevoenlp1ady
P1adynuevo
Finsi
Finsi
Fin
Borradodeunaarista:
Procedimientoborrar_arista(prin:ptr_avertice;orig:<tipo>;des:<tipo>;
p1:ptr_avertice;p2:ptr_avertice)
Var
Act,ant,pa:ptr_aarista
Inicio
Buscar_arista(prim,or,dest,pa,p1,p2)
Sipa=nil
EntoncesescribirLaaristayaexiste
Sinoantnil

Actp1ady
Mientras(actdest<>p2)y(act<>nil)
Antact
Actactenl
Finmientras
Antenlactenl
Siant=nil
Entoncesp1adyp1adyenl
Sinoantenlactenl
Finsi
ActenlADISP
ADISPact
Finsi
Fin
Borradodeunnodo:
Primerohayquecomprobarsiexisteelnodoydespus seborrantodas sus
aristas.
Procedimientoborrar_nodo(entsalprin:ptr_avertice;info:<tipo>)

PGINA170/184

Var
Ptr,p1,p2,act,ant:ptr_avertice
Pa,borrado:ptr_aarista
Inicio
Borrar_nodo(prin,elem,ptr)
Siptr=nil
EntoncesescribirNoexisteelnodoaborrar
Sinoactprin
Mientrasact<>nil
Borrar_arista(prin,actinfo,elem)
Actactsig
Finmientras
ActenlADISP
ADISPptradySOLOENPSEUDOCDIGO
PtradyNil
Borradoptrady
Mientrasborrado<>nil
Borrar_arista(prin,elem,borradodestinoinfo)ENCUALQUIER
Borradoborradoenl
LENGUAJE
Finmientras
Antnil
Actprin
Mientras(act<>nil)y(actinfo<>elem)
Antant
Actactsig
Finmientras
Siant=nil
Entoncesprinprinsig
Sinoantsigactsig
Finsi
ActsigNDISP
NDISPact
Finsi
Fin
7.APLICACIONESDELOSGRAFOS:
- Sepuedenrepresentartransformacionesdeestadoconlosgrafos.
- Sirvenendiversoscamposdeinvestigacinparaencontrarelmtodomscortoy
quecuestelomenosposible.
- Paraellgebraseutilizalamatrizdeadyacencia.

PGINA171/184

EJERCICIOS:TEMA12
1. Enunrbolbinariodebsqueda,dartodosloselementosinferioresaunodadocon
informacinelem.
Procedimientobuscar(raiz:ptr_anodo_ar;entsalptr:ptr_anodo_ar;elem:<tipo>)
Inicio
Ptrraiz
Mientras(ptrinfo<>elem)y(ptr<>nil)
Siptrinfo>elem
Entoncesptrptrder
Sinoptrptrizq
Finsi
Finmientras
Fin
Procedimientoinorden(ptr:ptr_anodo_ar)
Inicio
Siptr<>nil
Entoncesinorden(ptrizq)
Escribir(ptrinfo)
Inorden(ptrder)
Finsi
Fin
Procedimientoinferiores(raiz:ptr_anodo_ar;elem:<tipo>)
Var
Ptr:ptr_anodo_ar
Inicio
Buscar(raiz,ptr,elem)
Siptr=nil
EntoncesescribirElelementonoexiste
Sinoinorden(ptrizq)
Finsi
Fin
2. Listar enordendescendente elvalordetodoslos nodosdeunrbolbinario de
bsqueda.
Procedimientodecreciente(p:ptr_anodo_ar)
Inicio
Sip<>nil
Entoncesdecreciente(pder)
Escribirpinfo
Decreciente(pizq)
Finsi
Fin

PGINA172/184

3. Encontrarelmximovalordeunrbolbinariodebsqueda.
Procedimientobusca_max(raiz:ptr_anodo_ar)
Var
Ptr:ptr_anodo_ar
Inicio
Ptrraiz
Mientrasptrder<>nil
Ptrptrder
Finmientras
Escribirptrinfo
Fin
4. Borrarelelementomenordeunrbolbinariodebsqueda.
Procedimientoborrar_min(entsalraiz:ptr_anodo_ar)
Var
Pad,ptr:ptr_anodo_ar
Inicio
Siraiz=nil
Entoncesescribirrbolvacio
Sinopadnil
Ptrraiz
Mientrasptrizq<>nil
Padptr
Ptrptrizq
Finmientras
Sipad=nil
Entoncesraizptrder
Sinopadizqptrder
Finsi
PtrizqDISP
DISPptr
Finsi
Fin

PGINA173/184

5. Encontrarelsegundoelementomayordeunrbolbinariodebsqueda.
ProcedimientoDos_mayor(raiz:ptr_anodo_ar)
Var
Pad,max,max2:ptr_anodo_ar
Inicio
Siraiz=nil
Entoncesescribirrbolvacio
Sinopadnil
Maxraiz
Mientrasptrder<>nil
Padmax
Maxmaxder
Finmientras
Siptrizq=nil
Entoncessipad<>nil
EntoncesescribirElsegundomayorespadinfo
Finsi
Sinomax2ptrizq
Mientrasmax2der<>nil
Max2max2der

Finmientras
EscribirElsegundomayoresmax2info
Finsi
Finsi
Fin
6. Aadirunbucleenelnodoconinformacinelem.
Procedimientoins_bucle(prin:ptr_avertice;elem:<tipo>)
Var
Ptr:ptr_avertice
Nuevo:ptr_aarista
Inicio
Buscar_nodo(prin,elem,ptr)
Siptr=nil
EntoncesescribirNoexisteelnodo
SinonuevoADISP
ADISPADISPsig
Nuevoderptr
Nuevoenlptrady
Ptradynuevo
PGINA174/184

Finsi
Fin

7. Dadoungrafo,determinarsiunnodoconinformacinelemesunnodofuente(que
nolelleguenaristas)
Procedimientonodo_fuente(prin:ptr_avertice;elem:<tipo>)
Var
Ptr,pn:ptr_avertice
Fuente:boolean
Pa:ptr_aarista
Inicio
Buscar_nodo(prin,elem,ptr)
Siptr=nil
EntoncesescribirElnodonoexiste
Sinosiptrady=nil
EntoncesescribirNodosinaristasdeorigen
Sinofuenteverdadero
Pnprin
Mientras(pn<>nil)y(fuente=verdadero)
Papnady
Mientras(pa<>nil)y(fuente=verdadero)
Sipadest=ptr
Entoncesfuentefalso
Sinopapaenl
Finsi
Finmientras
Pnpnsig
Finmientras
Sifuente=verdadero
EntoncesescribirSiesunnodofuente
SinoescribirNoesunnodofuente
Finsi
Finsi
Finsi
Fin

PGINA175/184

8. Dadoungrafoenquecadaaristatieneunpesoasociado,determinarquearistasdel
gradopesanmsde100,dandolainformacindelnodoorigenydestino.
Tipoarista_peso:registro
Des:ptr_avertice
Enl:ptr_aarista_peso
Finregistro
Procedimientoar_peso(prin:ptr_avertice)
Var
Pn:ptr_avertice
Pa:ptr_aarista_peso
Inicio
Pnprin
Mientraspn<>nil
Papnady
Mientraspa<>nil
Sipapeso>100
EntoncesescribirOrigenpninfo
SinoescribirDestinopadesinfo
Finsi
Papaenl
Finmientras
Pnpnsig
Finmientras
Fin

PGINA176/184

TABLASDEDECISIN:
TEMA13
1.
2.
3.
4.

Quesunatabladedecisin.
Tiposdetablas.
Construccindetablas.
Conversindetablasaprogramas.

1.QUESUNATABLADEDECISIN:
Unatabladedecisinesunaherramientaquemevaaservirpararepresentarde
maneramsfcillalgicadeunproblemacuandoestesmasomenoscomplicada.
Paraellosetratadeidentificarenelproblemalasaccionesquehayqueejecutar
ylascondicionesquesetienenquecumplirparaejecutaresasacciones.Lasacciones
normalmentelasvamosaidentificaratravsdelosverbos,ylascondicionesvanaser
lascondicionales(si,...).
Latablavaatener4partes:
ConjuntodecondicionesEntradadecondiciones
oentradascombinacindecondiciones

ConjuntodeaccionesEjecucindeacciones
osalidassalidadeacciones
Conjuntodecondiciones:Sonlascondicionesqueintervienenenelproblema.
Entrada de condiciones: Son las combinaciones posibles entre los valores de las
condiciones.SI,NO,DAIGUAL.
Conjuntodeacciones:Abarcatodaslasaccionesquesetienenqueejecutarcuandose
cumplenunconjuntodadodecondiciones.
Salidadeejecucin:Sedeterminacuandoseejecutacadaaccin.

PGINA177/184

Quesunaregladedecisin?:
Esunacombinacindeunestadoenlaentradadecondicionesydeunaoms
accionesasociadasenlapartedelasalidadeaccionesasociadasenlapartedelasalida
de acciones siendo N el nmero de condiciones y considerndolas como binarias
(SI/NO)habrunnmeromximode2elevadoaNreglas.
Cadareglaequivaledesdeelpartedevistadeprogramacinaunaestructura
si..entonces,yencadamomentosolosepuedecumplirunaregla.
Lastablasdedecisinlaspodemosusarparacontrolarlalgicadecontroldeun
programa,enlosmanualesdeusuarioparacontrolarunprograma,parasabercuandose
actualizaunfichero,...

Ejemplo:
Simehacenfijomecomprouncorsa,simehacenfijoymesubenelsueldome
comprounfamiliar,ysimetocalaloteramecomprounBMW.
C1:Fijo/nofijoA1:Nocomprouncoche
C2:Salario/nosalarioA2:Comprouncorsa
C3:Lotera/noloteraA3:Comprounfamiliar
A4:ComprounBMW
Fijo
Salario
Lotera
Nocoche
Corsa
Familiar
BMW

S
S
S

S
S
N

S
N
S

S
N
N

N
S
S
X

N
S
N
X

N
N
S
X

N
N
N
X

X
X
X

2.TIPOSDETABLAS:
- Segnelplanteamiento:
Propias:Solotienenreglassimples,solohaySI/NO.
Impropias: Son las que tienen reglas compuestas
(SI/NO/INDIFERENCIA).
- Segnentradas:
Limitadas:CuandolasreglassonS/N//X(Siseejecutaparalas
acciones).
Extendidas:Cuandolosvaloresquetomanlascondicionessondiferentes
deSI/NO,ylasaccionessondistintasdesiseejecutaonoseejecuta.

PGINA178/184

En cualquier caso, siempre se puede traducir una tabla mixta a una tabla
limitada.Cadacondicindarigualatantascondicionessimplescomovalorespueda
tomar,yparacadaaccintantasaccionescomoestadospuedatomar.
Laventajadelastablasmixtasyextendidasesquesevemejoraprimeravista,
elinconvenienteesquesonmsdifcilesdeprogramar.
-

Segneltratamiento:
Abiertas:Cuandodesdeunatablasehacereferenciaaotratabla,pero
luegonosevuelvealainicial.
Cerradas:Lomismoquelaanterior,perosevuelvealaoriginal.
Bucles:Cuandounatablasellamaasmisma.

Tiposdereglas:
NormalmentelasreglasdeunatablaseconsiderancomoreglasAND,setienen
quecumplirtodoslosvaloresdelascondicionesparaqueseejecutelaopcinasociada
aesaregla.
SiseimplementacomoreglasOR,significaqueconquesecumplaunasola
regla,seejecutalaaccinasociada.
LasreglasELSEsehacencuandounconjuntodereglasdeunatabladantodas
lugaralamismaaccin,entoncesseasociantodascomounareglaELSE.

3.CONSTRUCCINDETABLAS:
Primerolocalizamoslascondicionesenelenunciado,despuslasaccionesylas
reglasentrelasaccionesylascondiciones.
Despuscomprueboquelatablaseacorrecta.Quenoocurran:
- Redundancias:Ponerlamismareglamsdeunavez.
- Completa:Quenofaltealgunaregla.
- Contradictoria:Quelamismaaccindelugaracosascontradictorias.
Despussemiraaversisepuedesimplificarlatabla,aadiendosiesposible
indiferencias(cadaunasustituyea2reglas).
Unatablasepuedesimplificarsihay2reglasquedanlugaralamismaaccino
conjuntodeaccionesysolosediferenciaenelestadoovalordeunadesuscondiciones,
entoncessustituyoesas2reglasporunasola,quetengaparaesacondicinelvalorde
indiferencia.
Fijo
Salario
Lotera
Nocoche
Corsa
Familiar
BMW

S
S
S

S
S
N

S
N
S

S
N
N

N
S
S
X

N
S
N
X

N
N
S
X

N
N
N
X

X
X
X

4.CONVERSINDETABLASAPROGRAMAS:
PGINA179/184

1.
2.

3.

4.

Primerohayqueversisepuedesimplificarlatabla.
Hay2formasdehacerlaconversin:
Programacindirecta:Quecadareglaequivaleaunasentenciacondicional.Esmuy
ineficiente.
Pasarlatabladedecisinaflujogramamedianteelsiguienteelmtodo:
Paracadareglaalfinaldesucolumnaponemoselnmerodereglassimplesalas
queequivale.Cadaindiferenciadeunareglaequivalea2reglassimples.
Paracadacondicinalfinaldesufilahallamosuncoeficientequeresultadelasuma
delosvaloresdelasreglasparalasqueesacondicinvalgaindiferente,cuanto
menorseaesevalor,msimportanteesesaregla,porquevaatenermenosreglas
paralasqueesacondicinesindiferente.
Elijolacondicinconmenorvalorensucoeficiente,sihayvariascondicionesque
tienenelmismovalorensucoeficienteyademseselmenor,hallounsegundo
coeficientequeseobtieneporladiferenciaenvalorabsolutodeladiferenciaentreel
nmerodeSIyNOenvalorabsolutodeesascondiciones,yelijolaquetengala
diferenciamayor,ysisiguehabiendoempatecojocualquieradeellas.
Paralareglaelegidaobtengootras2tablas,quesecaracterizanporquenocontienen
yaalacondicinporlaquehedivididolastablas,yunatablacontienelasreglas
paralasqueesacondicincontienevalorSI,ylaotracontienelasreglasparalas
quelacondicinesNO,yparalasreglasconcondicinindiferencialaspongoen
las2tablas,yconlas2tablasvuelvoahacerotravezlomismohastaquenose
puedadividirms,ycadavezquesehaceunadivisinpagolacondicinenel
flujograma.

Ejemploanterior:
Fijo
Salario
Loteria
Nocoche
Corsa
Familiar
BMW

S
S
N

S
N
N

0
6
4

X
X
X
2

S
N

N
N

2
0

FijoSI
Salario
Loteria
Nocoche
Corsa
Familiar
BMW

X
X
X
2

PGINA180/184

FijoNO
Salario
Loteria
Nocoche
Corsa
Familiar
BMW

SiFijoNo
SiNo
LoteriaNocoche
BMWSiSalarioNo
FamiliarCorsa

Sinofijo
EntoncesescribirNocoche
Sinosiloteria
EntoncesescribirBMW
Sinosisalario
EntoncesescribirFamiliar
SinoescribirCorsa
Finsi
Finsi
Finsi

PGINA181/184

EJERCICIOS:TEMA13
1. Dadounficherodeempleadosordenadopornmerodeempleadoconelformato,
nmerodeempleado,antigedad,sexo,categora,setratadehallarmediantetablas
dedecisinqueprimarecibecadaempleadosabiendoque:
A:Mujeresquesonjefes.
B:Mujeresempleadasconantigedadyhombresempleados.
C:Hombresquesonjefes.
D:Sinprima.Elresto.
Hacerlatabladedecisinyelflujograma.
Antiguedad
Mujer
Jefe
A
B

S
S
S
X

S
N
S

S
S
N

S
N
N

N
S
S
X

N
S
N

N
N
S

N
N
N
X

PGINA182/184

C
D
Antiguedad
Mujer
Jefe
A
B
C
D

JefeSI
Antiguedad
Mujer
A
B
C
D

JefeNO
Antiguedad
Mujer
A
B
C
D

X
X

S
S
X

N
S

N
S
N

N
N
N

4
2
0

X
2

S
X

4
0

X
1

X
2

N
S

N
N

0
2

X
2

X
1

Jefe

MujerAntiguedad
B
ACMujer
DB

Sijefe
Entoncessimujer
PGINA183/184

EntoncesescribirA
SinoescribirC
Finsi
Sinosiantigedad
EntoncesescribirB
Sinosimujer
EntoncesescribirD
SinoescribirB
Finsi
Finsi
Finsi

PGINA184/184