Super Manual de Algoritmia

345
PÁGINA 1 /176 ALGOR I TMOS Y PROGRAMAS: TEMA 1: 1. Sistemas de procesamiento de la información. 2. Concepto de algoritmo. 3. Lenguaje de programación. 4. Datos, tipos de datos y operaciones primitivas. 5. Constantes y variables. 6. Expresiones: tipos y operadores. 7. Funciones internas. 8. La operación de asignación. 9. Entrada y salida de la información. 1. SISTE M AS DE PROCESAM I ENTO DE LA INFORMACIÓN: Un ordenador es una máquina de procesamiento de información. Es una máquina porque tiene cables, chips,... , procesa porque es capaz de procesar cosas, e información porque maneja conjuntos ordenados de datos). Para procesar la información está el hardware (microprocesador, RAM,...), y el software (que sirve para manejar el hardware). 2. CONC E PTO DE ALGORITMO: El algoritmo trata de resolver problemas mediante programas. Fases: - Análisis p r eliminar o evaluación del problem a : Estudiar el problema en general y ver que parte nos interesa. - Definición o análisis d el problema : Ver que es lo que entra y que es lo que sale, las posibles condiciones o restricciones, ... - Diseño del algoritm o : Diseñar la solución. - El programa : Codificación del algoritmo en un lenguaje de programación. - Ejecución del programa y las pruebas : Ver si el programa hace lo que queríamos. ¿Qué es un algoritmo?: 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. Existen n algoritmos, hay que coger el más efectivo. Características: - Tiene que ser preciso. - Tiene que estar bien definido.

Transcript of Super Manual de Algoritmia

Fundamentos de programacin

ALGORITMOS Y PROGRAMAS: TEMA 1:1. Sistemas de procesamiento de la informacin.2. Concepto de algoritmo.3. Lenguaje de programacin.4. Datos, tipos de datos y operaciones primitivas.5. Constantes y variables.6. Expresiones: tipos y operadores.7. Funciones internas.8. La operacin de asignacin.9. Entrada y salida de la informacin.1. SISTEMAS DE PROCESAMIENTO DE LA INFORMACIN:Un ordenador es una mquina de procesamiento de informacin. Es una mquina porque tiene cables, chips,... , procesa porque es capaz de procesar cosas, e informacin porque maneja conjuntos ordenados de datos).Para procesar la informacin est el hardware (microprocesador, RAM,...), y el software (que sirve para manejar el hardware).2. CONCEPTO DE ALGORITMO:El algoritmo trata de resolver problemas mediante programas. Fases:-Anlisis preliminar o evaluacin del problema: Estudiar el problema en general y ver que parte nos interesa.-Definicin o anlisis del problema: Ver que es lo que entra y que es lo que sale, las posibles condiciones o restricciones, ...-Diseo del algoritmo: Disear la solucin.-El programa:Codificacindelalgoritmoenunlenguajede programacin.-Ejecucin del programa y las pruebas: Ver si el programa hace lo que queramos.Qu es un algoritmo?: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. Existen n algoritmos, hay que coger el ms efectivo.Caractersticas:-Tiene que ser preciso.-Tiene que estar bien definido.-Tiene que ser finito.La programacin es adaptar el algoritmo al ordenador.El algoritmo es independiente segn donde lo implemente.3. EL LENGUAJE DE PROGRAMACIN:Existen diferentes tipos, de bajo nivel y de alto nivel. Instrucciones en una computadora y sus tipos:Una instruccin es cada paso de un algoritmo, pero que lo ejecuta el ordenador. Un programa es un conjunto de instrucciones que ejecutadas ordenadamente resuelven un problema.Tipos de instrucciones:-E/S: Pasar informacin del exterior al interior del ordenador y al revs.-Aritmtico-lgicas: Aritmticas: +,-,*,... ; Lgicas: or, and, , ...-Selectivas: Permiten la seleccin de una alternativa en funcin de una condicin.-Repetitivas: Repeticin de un nmero de instrucciones un nmero finito de veces.Tipos de lenguajes:-Lenguaje mquina: Todo se programa con 1 y 0, que es lo nico que entiende el ordenador.Ventaja: No necesita ser traducido.Inconveniente: La dificultad, la confusin, para corregir errores, es propia de cada mquina.-De bajo nivel o ensamblador: Se utilizan mnemotcnicos (abreviaturas).Ventaja: No es tan difcil como el lenguaje mquina.Inconvenientes: Cada mquina tiene su propio lenguaje, necesitamos un proceso de traduccin.El programa escrito en ensamblador se llama programa fuente y el programa que se obtiene al ensamblarlo se llama programa objeto.-Lenguajes de alto nivel: Los ms cercanos al lenguaje humano.Ventaja: Son independientes de cada maquina (los compiladores aceptan las instrucciones estndar, pero tambin tienen instrucciones propias).Inconveniente: El proceso de traduccin es muy largo y ocupa ms recursos. Aprovecha menos los recursos internos.Proceso de traduccin y ejecucin de un programa escrito en un lenguaje a alto nivel:Usamos un editor y obtenemos el programa fuente, y el compilador es el que traduce el programa al lenguaje mquina. El compilador internamente ha sido diseado para traducir.El compilador obtiene el programa o el fichero objeto. El compilador tiene que buscar los errores.Normalmente no sale un ejecutable, sino que necesita elementos, libreras,...

Mediante un linkador juntamos el programa objeto y las libreras, y seforma un programa ejecutable.Cuando se ejecuta el programa, el cargador lleva al programa a memoria para que ste pueda ser ejecutable.Debbuger: Depura el programa ejecutndolo paso a paso, viendo la memoria paso a paso para encontrar el error.Programa fuente (Editor)CompiladorErrorPrograma objetoLibreriasLinkadorEjecutablesPara traducir puedo utilizar el compilador o un interprete, con el compilador cojo todo el programa al completo y el interprete lee cada instruccin y lo va ejecutando.El interprete es ms rpido, pero menos eficiente.Todos los lenguajes tienen compiladores, pero no todos tienen interpretes. LISP (Lenguaje de inteligencia artificial) : Slo tiene interpretes.4. DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS:- Dato: Es un objeto o elemento que tratamos a lo largo de diversas operaciones.Tienen 3 caracteristicas:-Un nombre que los diferencia del resto.-Un tipo que nos determina las operaciones que podemos hacer con ese dato.-Un valor que puede variar o no a lo largo de la operacin. Existen diferentes tipos de datos.- Caracteristicas de los tipos:-Cada tipo se representa o almacena de forma diferente en la computadora.Bit:1/0; Byte=8 bits.-Un tipo agrupa a los valores que hacen las mismas operaciones.-Si tiene definida una relacin de orden es un tipo escalar.-Cardinalidad de un tipo: Nmero de valores distintos que puede tomar un tipo.Pueden ser finitos (caracteres), y si son infinitos el ordenador los toma como finitos porque esta limitado por el tamao de los bytes en el que la cifra es almacenada.- Los datos pueden ser:-Simples: Un elemento.-Compuestos: Varios elementos.- Los tipos pueden ser:-Estandar: Que vienen en el sistema por defecto.-No estandar: Son los que crea el usuario.- Los tipos simples ms importantes son:-Numricos.-Lgicos.-Caracteres.Numricos:- Entero: Subconjunto finito del conjunto matemtico de los numros enteros. No tiene parte decimal. El rango de los valores depende del tamao que se les da en memoria.-Real: Subconjunto finito del conjunto matemtico de los nmeros reales.Llevan signo y parte decimal. Se almacenan en 4 Bytes (dependiendo de los modificadores). Si se utilizan nmeros reales muy grandes, se puede usar notacin cientfica que se divide en mantisa, base y exponente; tal que el valor se obtiene multiplicando la mantisa por la base elevada al exponente.Lgicos o booleanos:-Aquel que slo puede tomar uno de los dos valores, verdadero o falso(1/0).Carcter:- Abarca al conjunto finito y ordenado de caracteres que reconoce la computadora (letras, digitos, caracteres especiales, ASCII).Tipo de cadena o String: Conjunto de caracteres, que van a estar entre . El propio lenguaje puede aadir ms tipos, o se pueden aadir modificadores.Entero : Int Long intEn algunos lenguajes se definen tipos especiales de fecha y hora, sobre todo en los ms modernos.5. CONSTANTES Y VARIABLES:- Constantes: Tienen un valor fijo que se le da cuando se define la constante y que ya no puede ser modificado durante la ejecucin.- Variables: El valor puede cambiar durante la ejecucin del algoritmo, pero nunca varia su nombre y su tipo.Antes de usar una variable hay que definirla o declararla, al hacerlo hay que dar su nombre y su tipo. El nombre que le damos tiene que ser un nombre significativo, va a ser un conjunto de caracteres que dependiendo del lenguaje hay restricciones. Tiene que empezar por una letra, y el tamao depende del lenguaje.Identificador: Palabra que no es propia del lenguaje.El valor de la variable si al declararla no se la inicializa, en algunos lenguajes toma una por defecto. En cualquier caso el valor de la variable podemos darle uno incial o podemos ir variandolo a lo largo de la ejecucin.Las constantes pueden llevar asociados un nombre o no, si no lo llevan, se llaman literales. Su valor hay que darlo al definir la constante y ya no puede cambiar a lo largo de la ejecucin, y en cuanto al tipo, dependiendo de loslenguajes en algunos hay que ponerlo, y en otros no hace falta ponerlo porque toma el tipo del dato que se le asigna. Const PI=3,1416.Hay que inicializar todas las variables.< > Hay que poner algo obligatoriamente. [ ] Puede llevar algo o no llevarlo.La ventaja de usar constantes con nombre es que en cualquier lugar donde quiera que vaya la constante, basta con poner su nombre y luego el compilador lo sustituira por su valor.Las constantes sin nombres son de valor constante: 5, 6, a, hola. Cuando una cadena es de tipo carcter, se encierra entre a.Relacin entre variables y constantes en memoria:Al detectar una variable o una constante con nombre, automaticamente se reserva en memoria espacio para guardar esa variable o constante. El espacio reservado depende del tipo de la variable.En esa zona de memoria es en la que se guarda el valor asociado a la variable o constante y cuando el programa use esa variable, ira a esa zona de memoria a buscar su valor.6. EXPRESIONES: TIPOS Y OPERADORES:Una expresin es una combinacin de constantes, variables, signos de operacin, parntesis y nombres especiales (nombres de funciones estandar), con un sentido unvoco y definido y de cuya evaluacin resulta un nico valor.Toda expresion tiene asociada un tipo que se corresponde con el tipo del valor que devuelve la expresion cuando se evalua, por lo que habr tantos tipos de expresiones como tipos de datos. Habra expresiones numricas y lgicas. Numricas: Operadores aritmticos.Son los que se utilizan en las expresiones numricas (una combinacin de variables y/o constantes numricas con operadores aritmticos y que al evaluarla devuelve un valor numrico.+, -, *, /.Operacin resto: Lo que devuelve es el resto de una divisin entera.Mod: Pascal. 5 mod 3 = 2%: C.Divisin entera: Nos devuelve el cociente de una divisin entera (en la que no se sacan decimales).Div: Pascal. 5 div 3 = 1\: C. Potencia: ^ 5^2.Todos estos operadores son binarios (el operador se situa en medio), el menos tambien puede ser unario (lleva un nico operando) y significa signo negativo.Reglas de precedencia:El problema es cuando una expresin entera segn como la evalue pueda dar diferentes valores.7*3+4 25 49La solucin es aplicar prioridad entre los operadores, de modo que ante la posibilidad de usar varios siempre aplicaremos primero el de mayor prioridad.Cada lenguaje puede establecer sus propias reglas de prioridad o precedencia de operadores. Si no nos acordamos, siempre podemos poner ( ).1) ^2) * / div mod3) + -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 asociatividad a izquierdas (primero lo de la izquieda).Expresiones lgicas: Operadores relacionales y lgicos.Una expresin lgica es aquella que slo puede devolver dos valores (Verdadero o Falso). Los valores que pueden aparecer en una expresin lgica son de 2 tipos: lgicos y relacionales.La particularidad de las expresiones lgicas es que mientras en una expresin numrica por devolver un valor numrico los operandos solo pueden ser nmeros, en una expresin lgica los operandos no tienen porque ser booleanos aunque se devuelva un valor booleano. Esto es lo que ocurre cuando en la expresin lgica utilizamos operadores relacionales con lo cual se obtienen valores lgicos o booleanos a partir de otros que no lo son.En cambio cuando los operadores son lgicos los operandos obligatoriamente tambien tienen que ser lgicos.Operadores relacionales:

= en C: !=< Operando1> operador < Operando2>5>3 VerdaderoCmo se evalua una expresin relacional?:-Primero se evalua el primer operando y se sustituye por su valor.-Luego se evalua el seguno operando y se sustituye por su valor.-Finalmente se aplica el operador relacional y se devuelve el valor booleano correspondiente.((3*2)+1-5^2) < (2-1)-18B) C (0 24 mod 4) y FalsoC Falso y FalsoC Falso2.2. A C o no (3=5) y (8 3+B)A Falso o Verdadero y VerdaderoA Falso o VerdaderoA VerdaderoRESOLUCIN DE PROBLEMAS CON COMPUTADORA Y HERRAMIENTAS DE PROGRAMACIN:TEMA 21. Resolucin de problemas.2. Anlisis del problema.3. Diseo del algoritmo.4. Resolucin en la computadora.5. Flujogramas.6. Diagramas NS o de NASSI-SCHEDERMAN7. Pseudocdigo.1. RESOLUCIN DE PROBLEMAS:La resolucin de un problema desde el punto de vista algortmico tiene 3 fases:-Anlisis del problema: Comprensin.-Diseo del algoritmo: Resolucin algortmica.- Resolucin en computadora: Implantacin del algoritmo en un lenguaje de programacin.2. ANLISIS DEL PROBLEMA:El objetivo de sta fase es comprender el problema para lo cual como resultado tenemos que obtener la especificacin de las entradas y salidas del problema. Tiene que quedar claro que entra y que sale.3. DISEO DEL ALGORITMO:Una vez comprendido el problema se trata de determinar que pasos o acciones tenemos que realizar para resolverlo.Como criterios a seguir a la hora de dar la solucin algortmica hay que tener en cuenta:1. Si el problema es bastante complicado lo mejor es dividirlo en partes ms pequeas e intentar dividirlo en partes ms pequeas e intentar resolverlas por separado. Esta metodologa de divide y vencers tambin se conoce con el nombre de diseo descendente.2. Las ventajas de aplicar esto son:-Al dividir el problema en mdulos o partes se comprende ms fcilmente.- Al hacer modificaciones es ms fcil sobre un mdulo en particular que en todo el algoritmo.- En cuanto a los resultados, se probarn mucho mejor comprobando si cada mdulo da el resultado correcto que si intentamos probar de un golpe todo el programa porque si se produce un error sabemos en que mdulo ha sido.Una segunda filosofa a la hora de disear algoritmos es el refinamiento por pasos, y es partir de una idea general e ir concretando cada vez ms esa descripcin hasta que tengamos algo tan concreto para resolver. Pasamos de lo ms complejo a lo ms simple.La representacin de los algoritmos:Una vez que tenemos la solucin hay que implementarla con alguna representacin. Las representaciones ms usadas son los flujogramas, los diagramas NS y el pseudocdigo.Tambin la solucin se puede escribir en algunos casos en lenguaje natural pero no se hace porque es muy ambiguo, e incluso otras formas de expresin como frmulas matemticas.Escritura del algoritmo:Al escribir el algoritmo hay que tener en cuenta:-Las acciones o pasos a realizar tienen que tener un determinado orden.-En cada momento solo se puede ejecutar una accin.- Dentro de las sentencias del algoritmo pueden existir palabras reservadas (palabras propias del lenguaje de programacin que tienen para el compilador un determinado significado).-Si estamos utilizando pseudocdigo tenemos tambin que usar la identacin(aumenta la legibilidad del problema para que se pueda leer mejor).4. RESOLUCIN EN LA COMPUTADORA:Es hacer entender nuestro algoritmo a la computadora para que lo puedahacer.

1. Codificamos el algoritmo en un leguaje de programacin.2. Ejecutar el programa antes compilado.3. Comprobar los resultados y si no funciona, corregirlo.5. FLUJOGRAMAS:Es una notacin grfica para implementar algoritmos. Se basa en la utilizacin de unos smbolos grficos que denominamos cajas, en las que escribimos las acciones que tiene que realizar el algoritmo.Las cajas estn conectadas entre s por lneas y eso nos indica el orden en el que tenemos que ejecutar las acciones.En todo algoritmo siempre habr una caja de inicio y otra de fin, para el principio y final del algoritmo.Los smbolos:Lneas de flujo: Una lnea con una flecha que sirve para conectar los smbolos del diagrama y la flecha indica la secuencia en la que se van a ejecutar las acciones.Smbolo de proceso: Indica la accin que tiene que realizar la computadora. Dentro escribimos la accin.Representa las acciones de entrada y salida. Dentro colocaremos lasacciones de lectura y escritura.Condicin: Dentro se va a colocar una condicin. Sirve para representar estructuras selectivas y repetitivas y lo que se hace al encontrar ese signo es evaluar la condicin que hay dentro tal que segn la condicin sea verdadera o falsa iremos por caminos distintos.Principio y fin: Dentro del smbolo ira la palabra inicio o fin del algoritmo.Subprograma: Dentro se coloca el nombre del subprograma al que se llama.Conectores: Nos sirven cuando un flujograma no me cabe en una columna de la hoja y hay que seguir en otra columna:-Si es en la misma hoja:-Si es en hoja distinta:Los conectores se ponen uno donde termina la columna y otra donde empieza.Es una aclaracin para entender mejor el cdigo, pero no es parte del cdigo, no se ejecuta.Otros smbolos:- Pantalla: Cuando una salida es por pantalla.- Teclado: Para representar una entrada por teclado.- Impresora:- Entrada/Salida por disco:*Problema:Queremos hallar el producto de varios nmeros positivos introducidos por teclado y el proceso termina cuando se meta un nmero negativo.1. Iniciar la variable del producto.2. Leer el primer nmero.3. Preguntar si es negativo o positivo.4. Si es negativo nos salimos y escribimos el producto.5. Si es positivo, multiplicamos el nmero ledo y luego leemos un nuevo nmero, y se vuelve al paso 3.Inicio

P 1

Leer numNum >= 0Escribir PFinLeer num5. DIAGRAMAS N-S O DE NASSI-SCHEDERMAN:Es semejante al flujograma, peor sin flechas y cmabiando algo los smbolos de condicin y repeticin. Las cajas van unidas. Condiciones:CondicinSINO

Repetitivas:

Repetir hasta

Problema anterior:Inicio

P 1

Leer num

Mientras num >= 0

P p*num

Leer num

Escribir P

Fin

6. PSEUDOCDIGO:Es un lenguaje de especificacin de algoritmos, pero muy parecido a cualquier lenguaje de programacin, por lo que luego su traduccin al lenguaje es muy sencillo, pero con la ventaja de que no se rige por las normas de un lenguaje en particular. Nos centramos ms en la lgica del problema.El pseudocdigo tambin va a utilizar una serie de palabras clave o palabras especiales que va indicando lo que significa el algoritmo.1. Inicio y Fin: Por donde empieza y acaba el algoritmo.Begin /end : Pacal.{} : En C.2. S Entonces If then elseSino 3.Mientras /hacer while do4. Repetir / hasta repeat until5. Desde /hasta for .. to6. Segn sea CaseSwithLos comentarios van encerrados entre llaves.Hay que utilizar la identacin.Algoritmo Var: Inicio FinAlgoritmo ProductoVarP, num: enteroInicioP 1Leer numMientras num >=0 hacerP p*numLeer numFin mientrasEscribir pFinEJERCICIOS: TEMA 21. Realizar un programa que convierta los grados a radianes.Algoritmo convertirVarGrados, rad: realInicioEscribir Introduce los grados Leer gradosSi grados >= 360Entonces grados grados mod 360Fin siRad grados / 180Escribir rad radiantes Fin2. Realizar un algoritmo que pida un valor entero que equivale a un nmero de duros y me calcule a cuantos billetes de 5000, 1000, monedas de 200, 25, 1.Algoritmo cambioVarDuros: realInicioEscribir Introduce los duros Leer durosDuros duros * 5Escribir duros div 5000 billetes de 5000 Duros duros mod 5000Escribir duros div 1000 billetes de 1000 Duros duros mod 1000Escribir duros div 200 monedas de 200 Duros duros mod 200Escribir duros div 25 monedas de 25 Duros duros mod 25Escribir duros monedas de 1 Fin3. Realizar un programa que pida al usuario la velocidad en m/s y el radio de la circunferencia de la pista, y resultada el programa devuelve el tiempo que tarda el atleta en dar 2 vueltas a la pista, sabiendo que el atleta descansa 1 minuto cada1000 metros.Algoritmo recorridoVarVelocidad,radio,tiempo,longitud: enteroInicioEscribir Introduce la velocidad Leer velocidadEscribir Introduce el radio Leer radioLongitud 4 * 3.1416 * radioDescanso longitud div 1000Tiempo longitud div velocidad + descanso * 60Escribir tiempoFinESTRUCTURA GENERAL DE UN PROGRAMA TEMA 31. Concepto de programa.2. Instrucciones y tipos.3. Elementos bsicos de un programa.4. Estructura de algoritmos y programas.1. CONCEPTO DE PROGRAMA:Un programa es un conjunto de instrucciones que al ser ejecutadas resuelven un problema.Un programa tiene 3 partes:1. Entrada de datos: Normalmente se va a ejecutar a travs de instrucciones de lectura, y en lo que se le pide al usuario la informacin que el programa va a necesitar para ejecutarse y se hace a travs de lecturas.2. Acciones de un algoritmo: Parte en la que se resuelve el problema usando los datos de entrada.3. Salida: Mostrar en un dispositivo de salida los resultados de las acciones anteriormente realizadas. Son acciones de escritura.En la parte de las acciones a ejecutar se distinguirn dos partes:-Declaracin de variables.-Instrucciones del programa.2. INSTRUCCIONES Y TIPOS:Para que una instruccin se ejecute tiene que ser llevada a memoria. En cuanto al orden de ejecucin de las instrucciones, el programa puede ser de dos tipos:- Programas lineales: Se va ejecutando una instruccin ms otra y el orden de ejecucin es igual al orden de escritura.- Programas no lineales: Las instrucciones no se ejecutan en el mismo orden en el que aparecen escritas, sino que se realizan saltos que nos mandan de unas instrucciones a otras.Nunca se deben hacer saltos no lineales. Tipos de instrucciones:1. Inicio y fin.2. Asignacin: Dar un valor a una variable.3. Lectura / escritura: Introducir o sacar informacin por dispositivos E/S.4. Instrucciones de bifurcacin: Alternan el orden de ejecucin del programa.Salto a otra instruccin que no es la siguiente.4.1. Bifurcacin incondicional: El salto se produce siempre que el programa vaya a esa instruccin: Goto Ir a.4.2. Bifurcacin condicional: Se ejecutan un conjunto de instrucciones u otras dependiendo del valor devuelto al evaluar una condicin.Es la que vamos a usar.3. ELEMENTOS BSICOS DE UN PROGRAMA:Qu es la sintaxis de un lenguaje?:Conjunto de reglas que tenemos que seguir a la hora de escribir un programa en ese lenguaje tal que si no seguimos esas reglas de sintaxis el compilador da errores.Elementos del lenguaje de programacin:1. Palabras reservadas: Son un conjunto de palabras especiales que nos sirven para definir la estructura del programa, y solo se pueden usar para el fin para el que estn reservadas.2. Identificadores: Son los nombres que aparecen en el programa dados por el usuario. Son por tanto los nombres de variables, de constantes, de subprogramas y nombres de tipos creados por el usuario.3. Caracteres especiales: Sirven como separadores entre sentencias, por ejemplo el ;.4. Instrucciones: De 3 tipos, secuenciales, repetitivas y selectivas, y pueden aparecer elementos especiales (bucles, contadores, interruptores y acumuladores). Bucle: Un conjunto de instrucciones que se repiten un nmero finito de veces. Lleva asociado aparte de las instrucciones una condicin que es la que determina cuando se termina un bucle. Ejecucin de un bucle (iteracin). Los bucles se pueden anidar unos dentro de otros, y puede haber varios bucles al mismo nivel, pero nunca se entrelazan. Contador: Un elemento cuyo valor se incrementa o decrementa en un valor constante en cada iteracin de un bucle, y se utiliza para controlar la condicin del bucle. Acumulador: Es una variable que tambin se suele usar en los bucles y que se incrementa o decrementa en cada iteracin del bucle, pero no en una cantidad constante.Algoritmo ejemploVar cont, num, sum: enteroInicioCont 0Sum 0Mientras cont 3Leer numSum sum + numCont cont +1Fin mientras Escribir suma End Interruptor (marca, bandera o flag): Es una variable que sirve como indicador de una determinada informacin y que solo puede tomar uno de dos valores. El valor de la variable tiene asociado un signo y puede variar a lo largo de la ejecucin.Algoritmo ejemploVar cont, num, suma: enteroNeg: booleanInicioCont 0Sum 0Neg falsoMientras cont 3Leer numSi num < 0Entonces neg verdaderoFin siSum sum + numCont cont + 1Fin mientrasSi neg=verdaderoEntonces escribir (Se ha ledo negativos) Sino escribir (No negativos)Fin siFinSi es leer un nmero negativo o hasta 3 nmeros: Mientras (cont 3) y (neg = verdadero)4. ESCRITURA DE ALGORITMOS Y PROGRAMAS:En pseudocdigo el programa tiene dos partes, la cabecera y el cuerpo. La cabecera contiene el nombre del algoritmo, y el cuerpo contiene 2 partes.La primera es la zona de declaraciones de var y const, y la segunda es la zona de las instrucciones del programa.En la zona de instrucciones para que quede ms legible hay que usar la identacin y si es necesario hay que usar comentarios entre llaves.EJERCICIOS: TEMA 31. Cules y cuntos son los nmeros primos comprendidos entre 1 y 1000? Algoritmo n_primosConstPrimero=1Limite=1000Varcont, i, j: entero primo: booleanInicioCont 0Desde i= primero hasta limite primo verdaderoj 2mientras (i>j) y (primo =verdadero) Si i mod j = 0Entonces primo falsoSino j j + 1Fin siFin mientrasSi primo = verdaderoEntonces escribir i Cont cont + 1Fin siFin desdeEscribir Entre primero y limite hay cont n primos Fin2. Calcular el mximo de nmeros positivos introducidos por teclado, sabiendo que metemos nmeros hasta que introduzcamos uno negativo. El negativo no cuenta. Algoritmo maximoVarNum, max: enteroInicioMax 0Escribir Introduzca n positivos y para acabar introduzca uno negativo Leer numMientras num >=0Si num >maxEntonces max numFin siLeer numFin mientrasEscribir El mayor nmero es maxFin3. Determinar cuales son los mltiplos de 5 comprendidos entre 1 y N. Algoritmo multiplosVari: enteroInicioDesde i=1 hasta nSi i mod 5 =0Entonces escribir iFin siFin desdeFinINTRODUCCIN A LA PROGRAMACIN ESTRUCTURADA: TEMA 4:1. Tcnicas de programacin.2. Programacin modular.3. Programacin constructora.4. Estructura secuencial.5. Estructuras selectivas.6. Estructuras repetitivas.7. Anidacin de bucles y condicionales.8. Control de datos de entrada.1. TCNICAS DE PROGRAMACIN:El programar con flujogramas o diagramas NS resulta muy lioso en el momento en que el programa se complica, por eso vamos a utilizar siempre el pseudocdigo, en el que vamos a utilizar dos tcnicas de programacin que no se usan por separado, sino que son complementarios.Estas tcnicas son: Programacin modular: Consiste en dividir el programa en partes llamadas mdulos, e implementar cada uno de esos mdulos por separado. Programacin estructurada: Cuyo objetivo es hacer ms legible y lgico la estructura del programa utilizando para ello solamente tres tipos de estructuras: selectivas, secuenciales (condicionales) y repetitivas.2. PROGRAMACIN MODULAR:Se basa en dividir el programa en partes llamadas mdulos, que se analizan y codifican de forma independiente y que realizan una determinada tarea que ser en realidad una parte del problema total a resolver.En todo algoritmo o programa existir un mdulo o programa principal que es al que transfiere el control cuando comienza la ejecucin del programa, y luego desde l, se va llamando al resto de los subprogramas.Llamar a un subprograma quiere decir transferirle el control, es decir que se comienza a ejecutar y lo har desde el comienzo del subprograma hasta que setermine y al terminar devuelve el control al subprograma que lo llam. Dentro del subprograma a su vez tambin puedo llamar a otros pero en cualquier caso al final se devuelve el control al mdulo que hace la llamada. El control al programa llamado se devuelve a la instruccin siguiente a la que se hizo la llamada.Un mdulo solo tiene acceso a los mdulos a los que llama y a los submdulos a los que a su vez llaman stos. Los resultados producidos por un mdulo pueden ser utilizados por otros.No existe un criterio fijo para determinar el tamao, ni muy grandes ni muy pequeos, la idea fundamental es que realicen una nica cosa y muy concreta.Los mdulos o subprogramas reciben diferentes nombres segn el lenguaje de programacin y segn su tipo. Se llaman procedimientos y funciones (Pascal, C), subrutinas (basic, fortran), secciones (cobol),...3. PROGRAMACIN ESTRUCTURADA:La caracterstica fundamental es que se va a basar en el uso nicamente de tres estructuras de control. Para ello se apoya en las siguientes filosofas:1. Recursos abstractos: Son los recursos con los que no contamos a la hora de programar, pero en los que nos apoyamos a la hora de solucionarlos. Estos recursos se tienen que ir transformando en recursos concretos.2. Diseo descendente (top down): Se trata de ir descomponiendo el problema en niveles o pasos cada vez ms sencillos, tal que la salida de una etapa va a servir como entrada de la siguiente. En las primeras etapas tomamos el punto de vista externo, es decir, que entradas hay y que salidas hay, y a medida que vamos bajando de nivel, lo vamos viendo de modo interno (como lo hace por dentro).3. Estructuras bsicas de control: Para hacer cualquier programa siguiendo los anteriores pasos de razonamiento, al final codificamos el programa usando tres tipos de secuencias (repetitivas, alternativas y secuenciales).Al final todo programa va a tener una nica entrada y una nica salida. Desde la entrada tienen que existir caminos que nos permiten pasar portodas las partes del programa y llevarnos a la salida, y finalmente no se van a permitir los bucles infinitos.4. ESTRUCTURA SECUENCIAL:Es cuando una instruccin sigue a otra en secuencia, es decir, la salida de una instruccin es la entrada de la siguiente.FLUJOGRAMA:DIAGRAMAS NS:PSEUDOCDIGO: Leer numNum num*2Escribir num5. ESTRUCTURAS SELECTIVAS:Se evala la condicin y en funcin del resultado se ejecuta un conjunto de instrucciones u otro. Hay tres tipos de selectivas (simple, doble o mltiple):* Simple: Es la estructura :S entonces fin sEvaluamos la condicin y si es verdadera ejecutamos el conjunto de condiciones asociadas al entonces, y si es falso, no hacemos nada.FLUJOGRAMA:DIAGRAMA NS:

CondicinSINO

* Doble: Se evala la condicin y si es verdad se ejecutan el conjunto de acciones asociadas a la parte entonces, y si es falso se ejecutan el conjunto de acciones asociadas a la parte sino.FLUJOGRAMA:DIAGRAMAS NS:PSEUDOCDIGO: SiNoCondS Entonces

Acc1Acc2

Sino Fin siUna condicin se ejecuta una nica vez.* Alternativa mltiple: Se evala una condicin o expresin que puede tomar n valores. Segn el valor que la expresin tenga en cada momento se ejecutan las acciones correspondientes al valor. En realidad equivale a un conjunto de condiciones anidadas. En cualquier lenguaje, es Case o Swith.PSEUDOCDIGO:Segn sea : : ................................. [: ]fin segn-Otro: Las acciones asociadas al valor otro se ejecutan cuando la expresin no toma ninguno de los valores que aparecen antes. Otherwise, Else.El valor con el que se compara la expresin, va a depender de los lenguajes, de lo que sea ese valor. En general ese valor puede ser un valor constante, un rango de valores o incluso otra condicinFLUJOGRAMA: DIGRAMAS NS:

ExprV1V2V3V4 V5V6Hacer un programa que pueda dibujar una recta, un punto o un rectngulo. Algoritmo dibujoVar op: carcterEscribir (Introduce una opcin1. Punto2. Recta3. Rectngulo)Leer opSegn sea op1: leer x......... 2: leer x.......... 3: leer x..........otro: escribir opcin errneafin segnPara un rango de valores:Leer una nota y escribir en pantalla la calificacin: Var nota: enteroLeer notaSegn sea nota1..4: escribir suspenso5..6: escribir aprobado7..8: escribir Notable9: escribir Sobresaliente10: escribir Matricula de honorfin segnEn algunos lenguajes se permite poner una condicin: Segn sea notaNota >=1 y nota =1) y (op acumEntonces acum mediaPGINA 31/176Fin siFin desde

Mejor_alum nombreEscribir El mejor alumno es mejor_alumEscribir Su nota media es acumFin2. Calcular la suma de los divisores de cada nmero introducido por teclado. Terminaremos cuando el nmero sea negativo o 0.Algoritmo divisoresVarNumero, i, suma :enteroInicioEscribir Introduce un nmero, y para acabar uno negativo Leer nmeroMientras numero > 0Suma 0Desde i=1 hasta numero /2Si numero mod i =0Entonces suma suma + iFin siFin desdeSuma suma + numeroEscribir La suma de los divisores del nmero es sumaLeer numeroFin mientrasFin3. Se coloca un cpital C, a un interes I, durante M aos y se desea saber en cuanto se habr convertido ese capital en m aos, sabiendo que es acumulativo.Algoritmo interesVarI, j, m: enteroC, temporal: realInicioPGINA 32/176repetirEscribir Introduce el capital, el interes y el tiempo Leer c, i, mHasta (c>0) y ((i=0Desde i=1 hasta nPrimer (((a-b)^i 3)+n)+primerFin desdeDesde j=2 hasta n-1Segn ((2*a*(i-1))*segn) Fin desdeX primer / segnEscribir xFin6. Dada la siguiente serie matemtica:a1=0 a2=0an=an-1 + (2*an-2) para n>=3Determinar cual es el valor y el rango del primer trmino cuyo valor sea mayor o igual a 2000.Algoritmo serieVarA1, a2, an, cont: enteroInicioA1 1A2 0An a1 + (2*a2) N 3Mientras an < 2000A2 a1A1 anAn a1 + (2*a2) Cont cont + 1Fin mientrasEscribir El rango es cont y el resultado esan finSUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES.TEMA 51. Introduccin a los subprogramas o subalgoritmos.2. Funciones.3. Procedimientos.4. mbitos: variables locales y globales.5. Comunicacin entre subprogramas: Paso de parmetros.-Tipos y mtodos de paso de parmetros.-Paso de parmetros por copia.-Paso de parmetros por referencia.-Paso de parmetros por nombre.6. Funciones y procedimientos como parmetros.7. Efectos laterales.8. Recursividad.1. INTRODUCCIN A LOS SUBPROGRAMAS O SUBALGORITMOS: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, es decir se trata de dividir el problema dado, en problemas ms simples en que cada uno de los cuales lo implementaremos en un mdulo independiente. A cada uno de estos mdulos es a lo que llamamos subalgoritmos o subprogramas.Siempre existir un mdulo o programa principal que es con el que comienza la ejecucin de todo el programa, y a partir de l iremos llamando al resto.Cada vez que se llama a un subprograma se le pasa la informacin que necesita en la llamada, a continuacin comienza a ejecutarse el subprogramallamado, y cuando termine su ejecucin, devuelve el control a la siguiente instruccin a la de llamada en el programa que lo llam.En cuanto a la estructura de un subprograma es igual a la estructura de un programa, va a tener una informacin de entrada que es la que le pasamos al hacer la llamada y que se coloca junto al nombre del subprograma. Despus va a tener un conjunto de acciones, declarar otras variables propias del subprograma, y al terminar la ejecucin puede que devuelva o no resultados al programa que lo llam.Hay dos tipos fundamentales de subprogramas: Funciones y procedimientos.2. FUNCIONES:Desde el punto de vista matemtico, una funcin es una operacin que toma uno o varios operandos, y devuelve un resultado. Y desde el punto de vista algortmico, es un subprograma que toma uno o varios parmetros como entrada y devuelve a la salida un nico resultado.Pascal: En las funciones se puede devolver ms de un nico resultado mediante parmetros.C: Se devuelve todo por parmetros.Este nico resultado ir asociado al nombre de la funcin. Hay dos tipos de funciones:-Internas: Son las que vienen definidas por defecto en el lenguaje.-Externas: Las define el usuario y les da un nombre o identificador.Para llamar a una funcin se da su nombre, y entre parntesis van los argumentos o parmetros que se quieren pasar.Declaracin de una funcin:La estructura de una funcin es semejante a la de cualquier subprograma. Tendr una cabecera (con el nombre y los parmetros) y un cuerpo(con la declaracin de los parmetros de la funcin y las instrucciones).Sintaxis:Funcion (n_parametro: tipo, n_parametro: tipo): tipo funcionVar Inicio

retorno fin La lista de parmetros es la informacin que se le tiene que pasar a la funcin. Los parmetros luego dentro de la funcin los podemos utilizar igual que si fueran variables locales definidas en la funcin y para cada parmetro hay que poner su nombre y tipo.El nombre de la funcin lo da al usuario y tiene que ser significativo.En las variables locales se declaran las variables que se pueden usar dentro de la funcin.Entre las acciones tendr que existir entre ellas una del tipo retorno . Esta sentencia pondr fin a la ejecucin de la funcin y devolver el valor de la funcin, es decir, como valor asociado al nombre de mismo tipo que el tipo de datos que devuelve a la funcin, este valor por tanto tiene que ser del mismo tipoque el tipo de datos que devuelve la funcin, que es el que habremos indicado al declarar la funcin en la parte final de la cabecera.No se permiten funciones que no devuelvan nada.Los parmetros que aparecen en la declaracin de la funcin se denominan parmetros formales, y los parmetros que yo utilizo cuando llamo a la funcin se denominan parmetros actuales o reales.Invocacin de una funcin:Para llamar a una funcin se pone el nombre de la funcin, y entre parntesis los parmetros reales, que podrn ser variables, expresiones, constantes,... pero siempre del mismo tipo que los parmetros normales asociados (parmetros reales)La funcin puede ser llamada desde el programa principal o desde cualquier otro subprograma.Para llamar a la funcin desde cualquier parte, implica el conocimiento previo de que sta funcin existe.A travs de los parmetros reales de la llamada se proporciona a la funcin la informacin que necesita, para ello, al hacer la llamada lo que se produce es una asociacin automtica entre parmetros reales y parmetros formales. Esta asociacin se realiza segn el orden de la aparicin y de izquierda y derecha.Si el parmetro formal y real no son del mismo tipo, en Pascal se produce un error, y en C se transforman los tipos si es posible.La llamada a una funcin, siempre va a formar parte de una expresin, de cualquier expresin en la que en el punto en la que se llama a la funcin, pudiera ir colocado cualquier valor del tipo de datos que devuelve la funcin, esto se debe a que el valor que devuelve una funcin esta asociado a su nombre.Pasos para hacer la llamada a una funcin:1. Al hacer la llamada y ceder el control a la funcin, se asocia (asigna el valor) de cada parmetro real a cada parmetro formal asociado, siempre por orden de aparicin y de izquierda a derecha, por lo que siempre que no coincidan los tipos y el nmero de parmetros formales y reales, se produce un error.2. Si todo ha ido bien, se ejecutan las acciones de la funcin hasta que lleguemos a una de tipo retorno que pondr fin a la ejecucin. Pueden existir varias sentencias de retorno en la misma funcin, pero en cada llamada solo se podr ejecutar uno.3. Se le asocia al nombre de la funcin el valor retornado y se devuelve el control al subprograma que hizo la llamada pero sustituyendo el nombre de la funcin por el valor devuelto.Otra forma de especificar el retorno de una funcin:Se le asigna el valor devuelto al nombre de la funcin. N_funcion valorEjemplo de funcin:Una funcin que calcule la mitad del valor que le paso parmetro. Suponemos que es un valor entero.Funcion mitad (n: entero): realVar m: realInicioM n/2Retorno mFin mitadAlgoritmo calc_mitad Var num: entero InicioEscribir Introduce un nmero para hallar su mitad Leer numEscribir La mitad de num es mitad(num) Fin* La funcin solo puede ser llamada desde una expresin.3. PROCEDIMIENTOS:El inconveniente de una funcin es que solo puede devolver un nico valor, por lo que s nos interesa devolver 0 o N valores, aunque puedo usarlo para devolver un solo valor, debo usar un procedimiento.Un procedimiento es un subprograma o un subalgoritmo que ejecuta una determinada tarea, pero que tras ejecutar esa tarea no tienen ningn valor asociado a su nombre como en las funciones, sino que si devuelve informacin, lo hace a travs de parmetros.Al llamar a un procedimiento, se le cede el control, comienza a ejecutarse y cuando termina devuelve el control a la siguiente instruccin a la de llamada. Diferencias entre funciones y procedimientos:1. Una funcin devuelve un nico valor y un procedimiento puede devolver 0,1 oN.2. Ninguno de los resultados devueltos por el procedimiento se asocian a su nombre como ocurra con la funcin.3. Mientras que la llamada a una funcin forma siempre parte de una expresin, la llamada a un procedimiento es una instruccin que por s sola no necesita instrucciones.Esta llamada consiste en el nombre del procedimiento y va entre parntesis van los parmetros que se le pasan. En algunos lenguajes (como el C), se pone delante la palabra Llamar a (Call) procedimiento (parmetro).Sintaxis:Procedimiento ( : tipo_par,...) Var : tipoInicio

fin La cabecera va a estar formada por el nombre del procedimiento que ser un identificador y que debe de ser significativo, y luego entre parntesis los parmetros o la informacin que se le pasa al procedimiento. Para cada parmetro hay que indicar el tipo de paso de parmetro. Hay dos tipos fundamentales de paso de parmetros, por valor y por referencia, si no ponemos tipo de paso de parmetros, se toma el tipo de paso de parmetros por valor.En el cuerpo del procedimiento donde van las sentencias ya no habr ninguna de tipo , ahora bien, si el procedimiento devuelve resultados a travs de sus parmetros, cosa que solo podr hacer a travs de los parmetros que se pasan por referencia, tendrn que existir sentencias deasignacin de valores a estos parmetros pasados por referencia, a travs de los cuales se van a devolver los resultados.Como se llama a un procedimiento:[llamar a (Call)] nombre_proc (par_reales)Pasos para hacer la llamada a un procedimiento:1. Se cede el control al procedimiento al que se llama y lo primero que se hace al cederle el control es sustituir cada parmetro formal de la definicin por el parmetro actual o real de la llamada asociado a l. Esta asociacin entre parmetros formales y reales se hace de izquierda a derecha por orden de colocacin y para que se pueda producir esta asociacin tienen que existir el mismo nmero de parmetros formales que reales, y adems el tipo tiene que coincidir con el del parmetro formal asociado, sino se cumple alguna de estas condiciones hay un error.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 parmetros formales asociados en la llamada, es decir, de esta manera algunos de los parmetros reales de la llamada ya contendrn los resultados del procedimiento.3. Finalmente se cede el control a la siguiente instruccin a la que se hace la llamada, pero teniendo en cuenta que en esta instruccin y en las siguientes puedo usar ya los parmetros reales en los que se devolvieron los resultados del procedimiento para trabajar con ellos.Procedimiento mitad (num:entero,ent-sal M:real) InicioM num/2Fin mitadAlgoritmo calc_mitadVarN: enteroMit: realInicioEscribir Introduce un nmero Leer nMitad (n,mit)Escribir La mitad esmit fin4. MBITOS: VARIABLES LOCALES Y GLOBALES:Qu es el mbito de un identificador?:El mbito de un identificador (variables, constantes, funciones,...) es la parte del programa en la que se conoce y por tanto se puede usar un identificador.Segn el mbito hay 2 tipos de variables, locales y globales:1. Local: Aquella que est declarada y definida dentro de un subprograma luego su mbito coincidir con el mbito del subprograma en la que este definida.Esto quiere decir que la variable no tiene ningn significado, no se conoce y no se puede acceder a ella desde fuera del subprograma y que tiene una posicin de memoria distinta a la de cualquier otra, incluso si es de una variable que tiene el mismo nombre pero que est definida fuera del subprograma.Las variables locales a un subprograma se definen en la parte de la definicin de variables del mismo. Los parmetros formales que se le ponen a un subprograma se comportan dentro de l como si fueran tambin variables locales a l.2. Globales: Son las que estn definidas a nivel del programa, es decir, su mbito es el programa o algoritmo principal y todos los subprogramas que van junto con l.A esta variable podemos acceder desde cualquiera de los subprogramas y el programa principal, salvo que alguno de esos subprogramas tenga definida una variable local con el mismo nombre que la variable global, en este caso si utilizo el nombre de esa variable me referir a la local, nunca a la global(ya que tienen2 zonas de memoria distintas).Lugar en el que se definen las variables globales:En algunos lenguajes se define en el programa principal, y esa variable ser global, en otros lenguajes se definen fuera del programa principal y fuera de cualquier otro subprograma(antes de empezar el programa principal). Mtodo que vamos a usar.El problema de usar variables globales es que como todos los subprogramas las pueden modificar, puede ser posible que haya usos indebidos cuando un subprograma utiliza una variable global sin saber que otro la ha modificado, por esa razn nunca usaremos para pasar informacin entre los subprogramas variables globales, sino que usaremos variables de entrada-salida, salvo que no nos quede ms remedio.Procedimientos anidados:La anidacin de procedimientos no se permite en todos los lenguajes y consiste en que dentro de un procedimiento podamos definir o meter el cdigo de otros.Si la anidacin de procedimientos est permitida, se plantean ms problemas en cuanto al mbito, desde este punto de vista, se dice que una variable local se conoce en el procedimiento en el que est definida y en todos los procedimientos anidados a l que son los que componen el mbito de dicho procedimiento, salvo que en alguno de esos procedimientos anidados este definida una variable local con el mismo nombre en cuyo caso dentro de ese procedimiento siempre nos referiremos a la variable local definida en l porque siempre se considera el mbito ms restringido.PPVar A,B P1A,C,DP2A P3D,EP4 D,F P5P6 F,AVARIABLESMBITO SUBPROGRAMA

A del PPP4,P5

B del PPP1,P2,P3,P4,P5,P6

A del P1P1,P3

C del P1P1,P2,P3

D del P1P1,P2,P3

A del P2P2

D del P3P3

E del P3P3

D del P4P4,P5,P6

F del P4P4,P5

F del P6P6

A del P6P6

5. COMUNICACIN ENTRE SUBPROGRAMAS: PASO DE PARMETROS.La mejor forma para llevar a cabo la comunicacin ente subprogramas, es el paso de parmetros. Trataremos de evitar siempre que sea posible el uso de variables globales.Cuando llamamos a una funcin o procedimiento, le pasamos a travs de los parmetros la informacin que necesita, y en el caso de un procedimiento tambin devolvemos a travs de sus parmetros los resultados. Para ello definiremos el tipo del parmetro a principio del subprograma, que es lo que conocemos como parmetros formales, y al hacer la llamada pasamos la informacin a travs de los parmetros reales.Cmo se efecta la correspondencia entre parmetros formales y reales?: Existen 2 mtodos:1. Correspondencia posicional: En este caso se emparejan los parmetros formales y reales por la posicin que ocupan (orden de declaracin) y de izquierda a derecha. Para que se pueda realizar esta asociacin, tieneque haber el mismo nmero de parmetros formales y reales, y con el mismo tipo.F (x:entero,y:real) Var a:realF (3,A)2. Correspondencia por nombre implcito: Ahora en la llamada al subprograma se pone explcitamente a que parmetro formal corresponde cada real.Ahora en la llamada ponemos el nombre del parmetro formal, separado por dos puntos (:) y el nombre del parmetro real que le pasamos, con lo cual ya no importa la posicin en la que coloquemos la informacin.F (x:3,y:A) F (y:A,x:3)Un lenguaje que permite esto es ADA.Usaremos siempre el primer mtodo (posicional).Paso de parmetros:Del modo de paso de parmetros va a depender el resultado que se obtenga.1. Tipos de parmetros: Segn se usen para meter datos o para obtener resultados. Existen 3 tipos:1. De entrada: Son parmetros que solo aportan informacin de entrada al subprogama en el que pertenecen como parmetros. Aporta el valor que tienen como entrada al subprograma. En el caso de una funcin, todos sus parmetros son de este tipo.Como solo sirven como entrada, solo pueden ser ledos, pero no modificados, y aunque se modificasen dentro de un subprograma, fuera no va a tener efecto esa modificacin.2. De salida: Se usan solo y exclusivamente para devolver resultados a travs de ellos. Su valor al hacer la llamada al subprograma no nos importa, sino que ese valor solo va a tener importancia cuando termina la ejecucin del programa. Un parmetro de este tipo tericamente nunca se puede leer, solo se va actualizar.3. De entrada y salida: El valor del parmetro tiene importancia tanto a la entrada como a la salida del subprograma, nos aporta informacin cuando llamamos al subprograma y por otra parte devolvemos a travs de l resultados cuando terminamos el subprograma, en este caso, tiene sentido tanto leer como actualizar el parmetro. Solo ADA es un lenguaje que va a soportar los 3 tipos de paso de parmetro. Se ponen como In, Out, In-Out. El resto de los lenguajes solo permiten dos tipos de parmetros, de entrada (solo para leer datos) y de entrada-salida (para devolver resultados, aunque tambin se puede usar para leer datos).2. Mtodos de paso de parmetros:-Paso de parmetros por copia:-Por valor.-Por resultado.-Por valor-resultado.-Paso de parmetros por referencia.-Paso de parmetros por nombre o nominal. Paso de parmetros por copia:La caracterstica fundamental de este mtodo de paso de parmetros es que el parmetro formal siempre se considera que tiene asociada una direccin de memoria en la que est almacenado y que por tanto se comporta igual que una variable local del subprograma en que aparece.En este mtodo lo que importa es el valor del parmetro actual.1. Por valor: Nos interesa el valor del parmetro actual a la entrada, para ello este valor se copia en la direccin de memoria del parmetro formal asociado. En este caso el parmetro real puede se una constante, expresin o variable, y nunca se va a usar para devolver resultado a travs de l, por esa razn precisamente puede ser una constante o una expresin, porque al no devolver resultados a travs de l no necesita tomar ninguna zona de memoria en la que este almacenado, es ms, incluso si el parmetro actual fuera una variable y la modificsemos dentro del subprograma (algo que no deberamos hacer), fuera del subprograma no tendra ninguna repercusin esta modificacin, es decir, esa variable servira valiendo lo mismo en el programa desde el que se hace la llamada despus y antes de hacerla.El funcionamiento sera el siguiente:- Al hacer la llamada al subprograma se evala el valor del parmetro real, y ese es el que se asocia, es decir, el que se guarda o asigna al parmetro formal asociado.- Comenzamos a ejecutar el subprograma y si por casualidad se produce algn cambio en el parmetro formal, el parmetro actual no se ver afectado, es decir, su valor seguir siendo el mismo en el subprograma desde donde se llama que antes de hacer la llamada al subprograma.Algoritmo EjVar A:entero336InicioA del PPX de PA 3P (A) Escribir AFinProcedimiento P(x:entero) InicioX x*2Escribir xFin pEl valor de A sera 3 y el de X sera 6.2. Por valor-resultado: En el valor-resultado nos interesa el valor del parmetro actual tanto a la entrada como a la salida de la ejecucin del subprograma.Esto quiere decir que se cambia el valor del parmetro formal cambiar tambin el valor de su parmetro real asociado, cosa que no ocurra antes, y esto supone por tanto que ahora el parmetro real tiene que tener asociada obligatoriamente una direccin de memoria, por lo que siempre tendr que ser una variable (no una constante ni una expresin).El proceso sera el siguiente:- Al hacer la llamada al subprograma se evala el parmetro real y su valor se copia en el parmetro formal asociado y al terminar la ejecucin el valor del parmetro formal se vuelve a copiar en el parmetro real asociado.Algoritmo EjVar A:enteroSe copiaInicioA 3P (A)3636Escribir AP.RealP.FormalFinProcedimiento P(x:entero)InicioSe devuelveX x*2Escribir xFin pEl valor de la A y la X sera 6.3. Por resultado: Nos interesa el valor del parmetro real solamente a la salida o fin de la ejecucin del subprograma en que aparece. Esto significa que al hacer la llamada no se copia el valor del parmetro real en el parmetro formal asociado, sin embargo a la salida se copia el valor del parmetro formal en la direccin del parmetro real asociado, esto significa por tanto, que el parmetro real tiene que tener asociada una expresin que tiene que ser una variable (no puede ser una constante o una expresin).Algoritmo ejNo se copiaVar A:enteroInicioA 3P.RealP.FormalP (A) Escribir AFinProcedimiento P(x:entero)Se copia a la salidaInicioX 1X x*2Escribir xFin pEl valor de A y de X es 2.En la prctica la mayor parte de los lenguajes dentro del tipo de paso de parmetro por copia solo van a soportar el tipo de paso de parmetro por valor, que se usar cuando un parmetro solo lo quiero utilizar como entrada de informacin al subprograma, pero no para devolver resultados a travs de l.Los otros dos tipos de paso de parmetros por copia (por valor y por valor- resultado), no se implementan normalmente porque los efectos son prcticamente iguales que el paso de parmetros por referencia, es decir, cuando quiero usar un parmetro no solo para pasar informacin a travs de l sino tambin para devolver resultados o si lo voy a usar slo para devolver resultados, utilizar el paso de parmetros por referencia que vamos a ver a continuacin.Para simbolizar que el tipo de paso de parmetros es por valor, en la definicin del subprograma no pongo ningn tipo de paso de parmetros para ese parmetro, es decir, no poner ningn tipo significa que por defecto el tipo de paso de parmetros es por valor.En el caso de las funciones como solamente pueden recibir informacin de entrada pero nunca pueden devolver informacin por sus parmetros ya que lo devuelven a travs de la sentencia retorno y asociado a su nombre.El tipo de paso de sus parmetros va a ser siempre por valor.Paso de parmetros por referencia:Ahora la caracterstica principal de este tipo de paso de parmetros es que el parmetro formal va a tener tambin asignada una direccin de memoria en la que se almacena, pero en esa direccin NO SE GUARDA SU VALOR, sino que se almacena la direccin de su parmetro real asociado, es decir, el parmetro formal apunta al parmetro real que tiene asociado y cualquier modificacin que se efecte sobre el parmetro formal tendr una repercusin directa en el parmetro real asociado ya que lo que modificar ser el valor almacenado en la direccin que indica el parmetro formal que es la de su parmetro formal asociado.El proceso ser por tanto el siguiente:- Al hacer la llamada al procedimiento en el parmetro formal que se pasa por referencia, se va a guardar la direccin del parmetro real asociado para que apunte a l.- Durante la ejecucin cualquier referencia al parmetro formal se har accediendo a la direccin apuntada por dicho parmetro, es decir, accediendo directamente al parmetro real asociado, por lo que cualquier cambio en el parmetro formal afectar directamente al parmetro real asociado. De esta manera habremos pasado el resultado.Para indicar que el tipo de paso de parmetro es por referencia, vamos a utilizar la palabra clave ent-sal precediendo al parmetro que se pasa por referencia.A estos parmetros tambin se les llama parmetros variables (porque su valor vara), por eso en Pascal se usa la palabra clave Var para indicarlo.En otros lenguajes como C, se usan como parmetros punteros para indicar que son direcciones.Algoritmo EJVar A apuntaInicioA 3P1(A)3direccin A Escribir (A)Fin A del PP X del P1Procedimiento P1(ent-sal x:entero) InicioX x*2Fin P1Por valor el parmetro actual no cambia de valor. Por referencia el parmetro actual puede cambiar.Paso de parmetros por nombre:En este caso, el parmetro formal se sustituye literalmente por el parmetro actual asociado. Esta sustitucin literal del parmetro formal por el parmetro actual no se produce hasta que no se usa el parmetro formal.La ventaja es que si no usamos en ningn momento el parmetro formal dentro del subprograma llamado (cosa poco probable), no se tendr que hacer ningn tipo de substitucin.Pero el gran inconveniente es que si se usa el parmetro formal, hay que ir a buscar en ese momento la expresin del parmetro real asociado.El paso de parmetro por nombre es lo que se parece ms a la substitucin de parmetros en una funcin matemtica.F (x)= x+2F (a+1) = a+1*2F (x)= x+2F (a+1)= a +1 2 (a+1)*2Algoritmo EJ Var A: entero InicioA 3P1(A+1) Escribir (A)FinProcedimiento P1(ent-sal x: entero) InicioX x*2Fin P1Al final solo vamos a usar 2 tipos de paso de parmetros, que son los que usan casi todos los lenguajes: Por valor y por referencia.Por valor: Solo lo usamos cuando un parmetro solo sirve para informacin de entrada, no devolvemos nada con l. Por eso este paso puede ser una constante, variable o expresin. Para simbolizarlo en la declaracin de variables no ponemos nada.Por referencia: Lo usamos cuando un parmetro lo usamos como entrada de informacin y como salida o solo como salida. Por esta razn ahora s que se va a variar el parmetro formal y por lo tanto no podemos usar constantes ni expresiones, solo variables. Lo simbolizamos con la palabra ent-sal.6. FUNCIONES Y PROCEDIMIENTOS COMO PARMETROS:En la mayor parte de los lenguajes se permite tambin que una funcin o procedimiento pueda ser pasado como parmetro de otro subprograma. En este caso, es decir, cuando el parmetro formal es de tipo funcin o procedimiento, pasaremos como parmetro real funciones o procedimientos que tengan la misma definicin que el que hemos puesto como parmetro formal, y en nuestro caso para indicar que se pasa como parmetro real una funcin o procedimiento, basta con poner su nombre.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 formal asociado.Funcion (par:tipo;funcion(x:entero,y:carcter):enteroProdedimiento procedimiento (x:tipo,...);...Algoritmo EJVar v1,v2: enteroInicioV1 1V2 2P(v1,f1,v2)P(v1,f2,v2) FinProcedimiento P(x:entero;funcion F(A:entero;B:carcter):entero;ent-sal y:entero) InicioX 2Y F(x,a) Fin PFuncion F1(x:entero;y:carcter):enteroInicio Escribir y Retorno (x+1)FinFuncion F2(A:entero;B:carcter):enteroInicioEscribir Hola B Retorno AFin F2El paso de funciones y procedimientos como parmetros, nos va a permitir que desde un subprograma podamos llamar a otros, pero teniendo en cuenta que el subprograma llamado no va a ser uno determinado, sino que va a depender en cada momento del subprograma pasado como parmetro real, de esta manera el subprograma puede llamar a un conjunto de n subprogramas que cumplan unas determinadas caractersticas, pero solo uno en cada momento.No hay que confundir el paso de una funcin como parmetro con la llamada a una funcin cuando aparece como parmetro real en la llamada a un subprograma. Para diferenciarlo, cuando paso una funcin como parmetro solo pondr su nombre, en cambio cuando llamo a una funcin para pasar el valor que devuelve como parmetro pondr el nombre de la funcin y con sus argumentos para indicar que ah se puede hacer la llamada. Esto se puede hacer porque la llamada a una funcin puede aparecer en cualquier expresin en la que apareciese cualquier valor del tipo de datos que devuelve.Procedimiento P(A:entero) InicioEscribir A Fin PFuncion F(x:entero):enteroInicioRetorno (x*2) Fin FAlgoritmo EJ Var IInicioI 2P(F(I)) Esto no es pasar una funcin como parmetroFin7. EFECTOS LATERALES:Un efecto lateral es cualquier modificacin que un subprograma (sea funcin o procedimiento), realiza en elementos situados fuera de l pero sin hacer esas modificaciones a travs del paso de parmetros.Los efectos laterales siempre hay que evitarlos porque no somos conscientes o no controlamos que se han producido.Para realizar comunicacin entre subprogramas solo se har a travs del paso de parmetro para evitar los efectos laterales.Los efectos laterales normalmente se producen por el uso de variables globales o 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.Var A:entero Algoritmo EJ Var B:entero InicioB 1A 2P(B) Escribir AFinProcedimiento P(x:entero) InicioA x+2Fin P8. 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.La recursividad trataremos de evitarla siempre que sea posible, es decir, siempre que lo mismo se pueda solucionar con un bucle, ya que cada vez que un subprograma se llama a s mismo hay que almacenar en la pila del sistema la direccin de retorno de ese subprograma, con lo cual si hacemos muchas llamadas recursivamente iremos llenando la pila del sistema, y se desbordara acabando con la memoria.Todo programa recursivo tiene que tener alguna condicin que ponga fin a la recursividad, es decir, que el programa deje de llamarse a s mismo cuando se cumpla la condicin, sino se formara un bucle infinito.Funcion potencia (base:entero;exp:entero):realVar P:realI:enteroInicioP 1PGINA 50/176Desde i=1 hasta expP P*base Fin desde Retorno PFinFuncion potencia (base:entero;exp:entero):realInicioSi exp=0 entonces retorno 1SinoRetorno (base*potencia(base,exp-1) Fin potenciaTEMA 5: EJERCICIOS1. Implementar un subprograma que realice la serie de Fibonacci, que es: Fibonacci (1)= Fibonacci (2)=1N > 2 Fibonacci (n)= Fibonacci (n-1) + Fibonacci (n-2)Algoritmo serie_fibonacciVarI, n: enteroInicioEscribir Introduce un nmero Leer nDesde i=1 hasta nEscribir La serie de fibonacci de i es fibonacci (i) Fin desdeFinFuncion fibonacci (num: entero): enteroInicioSi (num=1) o (num=2) Entonces retorno 1SinoRetorno (fibonacci (num-1) + fibonacci (num-2) Fin siFin fibonacci2. Implementar un subprograma al que pasndole como parmetros 2 valores enteros M y N, me calcule el combinatorioAlgoritmo combinatorioVarM,n: enteroInicioRepetirEscribir Introduce el valor de M y N Leer m,nHasta m >nEscribir El combinatorio es factorial (m) div (factorial(n)*factorial(m-n)) FinFuncion factorial (num: entero): realInicioSi num=0Entonces retorno 1SinoRetorno (num * factorial (num-1)) Fin siFin factorial3. Implementar un subprograma que me halle cual es la primera potencia en base2 mayor que un nmero que pasamos como parmetro, devolviendo el valor de dicha potencia y el exponente al que est elevado.Algoritmo elevarVarNumero, resp1, resp2: enteroInicioEscribir Introduce un nmero Leer numeroComprueba (numero, resp1, resp2) Escribir 2^resp1=resp2 >numeroFinProcedimiento comprueba (num: entero; ent-sal n: entero; ent-sal pot: entero) InicioN 1Mientras pot < nPot pot *2N n+1Fin mientrasFin comprueba4. Implementar un subprograma que calcule recursivamente en cuanto se convierte un capital C al final de N aos y a un inters I.Funcion calculo (c: entero;i: entero; n: entero): realInicioSi m=0Entonces retorno C SinoRetorno (c*(1+i/100)+calculo (c,i,n-1) Fin siFin calculo5. Calcular el primer trmino de la siguiente serie que sea mayor o igual a un valor V que se le pasa como parmetro y me devuelva el lugar que ocupa en la serie y el valor.Ai=0An=n+(An-1)!Funcion factorial (num: entero): enteroVarI, acum: enteroInicioAcum 1Desde i=1 hasta numAcum acum * iFin desdeRetorno acumFin factorialProcedimiento serie (v: entero; ent-sal an: entero; ent-sal n: entero) VarA1: enteroInicioA1 0An 0N 1Mientras an 0Entonces num 0Desde i=1 hasta CifNum num+numero (c[i]*10^(cif-i) Fin desdeRetorno (num) Sino retorno (-1)Fin siFin valorProcedimiento conv_cad (n: entero; ent-sal c: cadena) VarCif,aux: enteroInicioCif 1Aux NMientras (aux >10) Aux aux div 10Cif cif + 1Fin mientrasDesde i=cif hasta 1C[i] caract(n mod 10) N n div 10Fin desdeC[cif+1] $ Fin conv_cadProcedimiento borrar (ent-sal c:cadena;inicio:entero;fin:entero) VarI,f: enteroInicioPGINA 80/176Si (inicio >0) y (inicio $) I I+1Fin mientrasSi c1[i]=c2[i]Entonces retorno (0)Sino retorno(ascii (c1[i])- ascii (c2[i])) Fin siFin comparacionFuncion busqueda (c: cadena;s1: cadena): enteroVarI,pos,k: enteroEncontrado: booleanoInicioI 1Encontrado falsoMientras (c[i] < >$) y (encontrado=falso) Si c[i] = s[i]Entonces pos iK 1Mientras (c[i]=s[k]) y (c[i] $) y (s[k]< >$ I I+1K k+1Fin mientrasSi s[k]=$Entonces encontrado verdaderoSino I pos +1Pos 0Fin siSino I I+1Fin siFin mientrasRetorno (pos) Fin busquedaProcedimiento borrar (ent-sal c:cadena;ini:entero;fin:entero) VarI,j: enteroInicioI iniF fin + 1Mientras c[f] $ C[i] c[f]I i + 1Fin mientrasC [i] $ Fin borrarProcedure insertar (ent-sal c:cadena;s:cadena;pos:entero) VarP,j,i: enteroInicioP posJ 1Mientras s[j]$Desde i longitud (c) +1 hasta P C[i+1] c[i]Fin desde C[p] s[j] J j+1P p+1Fin mientrasFin insertarProcedimiento intercambio (ent-sal c:cadena;c2:cadena;c3:cadena) VarI,pos: enteroInicioI 1Mientras c1[i] $ Si c1[i]=c2[i]Entonces pos buscar(c1,c2) Si pos 0Entonces borrar (c1,pos,pos+longitud(c2)-1) Insertar (c1,c3,pos)I pos + longitud(c3) Sino I i +1Fin siSino I I+1Fin siFin mientrasFin intercambioFICHEROS O ARCHIVOS: TEMA 81. El tipo registro de datos.2. Nocin de archivo.3. Terminologa de archivos.4. Tipos de soporte.5. Tipos de organizaciones de ficheros.6. Operaciones sobre ficheros.7. Tratamiento de ficheros secuenciales.8. Ficheros de texto.1. EL TIPO REGISTRO DE DATOS:El tipo registro de datos es un tipo estructurado de datos. Un tipo registro va a estar formado por datos que pueden ser de diferentes tipos.A cada uno de esos datos lo denominamos campos, y el tipo de estos campos pueden ser uno estandar o uno definido por el usuario, que puede ser cualquier cosa.La sintaxis que usaremos para definir un tipo registro es la siguiente: Tipo = registro: : : fin registroUna vez definida una estructura de tipo registro, ya puede pasar a declarar variables de ese tipo.Var: tipo alumno = registroDNI: array [1..8] de caracteres Nombre: array [1..100] de caracteres Nota: realFin registroVarA1,A2: alumnoPara declarar una variable de un tipo registro, basta con poner: Var : Para acceder a un campo concreto de una variable de tipo registro, utilizamos el operador punto..c.nombre PepeY con ese valor puedo trabajar igual que trabajara con cualquier valor del mismo tipo que ese campo.Tipo cliente = registroDNI: array [1..8] de caracteresNombre: CadenaSaldo: RealFin registroVarC: clienteBorrar (c.nombre,3,5) C.saldo 5+3*8000Almacenamiento de registros en memoria:El tamao que ocupa una variable de tipo registro en memoria es el que resulta de la suma del tamao de cada uno de sus campos, y esa informacin tambin estar almacenada de manera contigua y segn el orden en que hayamos declarado los campos.2. NOCIN DE ARCHIVO:Las estructuras anteriores se almacenaban en memoria principal, y el problema es que la informacin se pierde al apagar el ordenador. La ventaja es que los accesos son ms rpidos. Para resolver esto estn los dispositivos de almacenamiento secundario.Fichero: Es un conjunto de datos estructurados en una coleccin de unidades elementales denominadas registros, que son de igual tipo y que a su vez estn formados por otras unidades de nivel ms bajo denominados campos. Todos son del mismo tipo.3. TERMINOLOGA CON FICHEROS:- Campo: Es una unidad elemental de informacin que representa un atributo de una entidad. Se define con un nombre, un tamao y un tipo de datos.- Registro lgico: Es un conjunto de campos relacionados lgicamente que pueden ser tratados como unidad en el programa.Desde el punto de vista de programacin simplemente es una estructura de tipo registro.- Archivo o fichero: Es un conjunto de registros del mismo tipo y organizados de tal forma que esos datos pueden ser accedidos para aadir, borrar o actualizar.- Clave de un fichero: Es un campo o conjunto de campos que sirve para identificar un registro y distinguirla del resto del fichero.- Registro fsico o bloque: Es la cantidad de datos que se transfieren en una operacin de E/S entre el dispositivo externo y la memoria.Desde este punto de vista, un registro fsico puede estar compuesto por0,1,2,... registros lgicos. El nmero de registros lgicos que hay por cada registro fsico, es decir, que se transfiere en una operacin de E/S, es lo que se denomina factor de bloqueo.Ese factor de bloqueo puede ser 1:-Si es 1, lo ms normal, en cada operacin de E/S se transfiere ms de un registro lgico.Cmo nos interesa que sea el factor de bloqueo?:Desde un punto de vista, cuanto mayor sea el factor de bloqueo ms registros lgicos se transferirn, menos operaciones habr que hacer y se tardar menos en procesar el fichero. Segn esto cuanto mayor sea mejor.Por otra parte, cada vez que se transfiere informacin de E/S, se deja en una zona de memoria especial llamada buffer. Cuanto mayor sea el tamao de bloqueo, mayor ser el buffer y menos memoria me quedar para el resto de la informacin.Al final hay que lograr un equilibrio para determinar el tamao idneo.- Bases de datos: Es un conjunto de datos relacionados almacenados internamente en un conjunto de ficheros.4. TIPOS DE SOPORTE:Los soportes de almacenamiento secundario son en los que almaceno la informacin, y pueden ser de 2 tipos:- Secuenciales: Para acceder a un registro o dato concreto dentro de l, tengo que pasar previamente por todos los registros anteriores a l. El ejemplo es una cinta magntica.- Direccionables: Es posible acceder directamente a una direccin concreta de soporte. El ejemplo es un disco.5. TIPOS DE ORGANIZACIONES DE FICHEROS: Organizacin de archivos:Viene determinada por 2 caractersticas:- Mtodo de organizacin: Tcnica que utilizo para colocar la informacin de los registros dentro del dispositivo.- Mtodo de acceso: Conjunto de programas que me permiten acceder a la informacin que previamente he almacenado y van a depender mucho del mtodo de organizacin:- Acceso directo: Para acceder a un acceso concreto no hay que pasar por los anteriores. El soporte tiene que ser direccionable.- Acceso secuencial: Para acceder a un registro hay que pasar por todos los anteriores, y esto es posible si el soporte es secuencial, aunque tambin puedo hacerlo en uno direccionable.Mtodos de organizacin:Hay 3 tipos de organizacin:-Secuencial-Directa-Secuencial indexada- Secuencial: Los registros se van grabando en un dispositivo unos detrs de otros consecutivamente, sin dejar huecos y segn el orden en que son grabados o guardados. Al final para determinar el fin de fichero se usa la marca EOF (End Of File).- Directa: Se puede acceder a un registro directamente. Para ello son necesarias 2 cosas:1) Que cada registro tenga asociada una clave que lo identifique.2) Tiene que existir una funcin especial llamada funcin de direccionamiento que sea capaz de convetir la clave a una direccin fsica real en el dispositivo, que es a la que accederemos para localizar la informacin buscada.En la prctica en realidad hay un paso intermedio entre la clave y la direccin fsica que es la direccin relativa a registro.Suponiendo un fichero de n registros lgicos numerados de 0 a n-1, este valor asociado al registro es lo que sera su direccin relativa a registro, es decir, que lo que tiene que existir es una funcin que convierta la clave a direccin relativa a registro, y luego una funcin que convierta la direccin relativa a registro a direccin fsica, donde la direccin fsica tendr Volumen, Cilindro, Pista y Registro, y esta funcin puede ser por ejemplo el procedimiento de divisiones sucesivas.Para realizar este procedimiento, primero hay que decir el nmero de volmenes, el nmero de cilindros, el nmero de pistas y el nmero de registros que hay.Despus hay que realizar sucesivas divisiones: DRRn registrosR1C1n pistasRegistrosR2C2n cilindrosPistasR3C3CilindrosVolumenVolumen : C3Cilindro: R3Pista: R2Empezando a contar desde 0. Registros: R1Tenemos un dispositivo con 5 volmenes, 3 cilindros por volumen, 4 pistas por cilindro y 20 registros por pista. Dnde est el registro 1001?100120

1504

2123

04

Solucin 4021 4022, segn empecemos a numerar por 0 o por 1.El problema est en como convertir la clave de un registro a direccin relativa a registro, si en un soporte como mximo podemos almacenar n registros la direccin relativa a registro ir de 0 a n-1 luego habr que convertir la clave a uno de estos valores. En cualquier caso suele ocurrir que el rango de claves (conjunto de todas las claves posibles que se pueden dar) es menor que n, ya que en la prctica el espacio reservado es menor que el rango de n porque no usamos todo el espacio.Segn esto puede ocurrir que a diferentes claves les correspondan la misma direccin relativa a registro y por tanto la misma direccin fsica para almacenarse. A estos registros se les denomina sinnimos, y cuando esto ocurre habr que almacenar a los registros que tienen la misma posicin en un lugar aparte reservado para guardar los sinnimos.El rea reservada se puede colocar en varios sitios dentro de un dispositivo.Por ejemplo si el rango de claves va de 0 a 999, y la clave es 11919943 una forma de almacenarla, sera cogiendo los 3 ltimos nmeros 943.En cualquier caso la funcin que convierta una clave a direccin relativa a registro ser tal que produzca el menor nmero de colisiones de sinnimos posibles.- Secuencial indexada: En esta organizacin tambin se puede acceder a un registro directamente, pero ahora lo har mediante investigacin jerrquica de ndices.Para que se pueda aplicar esta organizacin, obligatoriamente los registros tienen que tener asociados una clave.En un archivo con esta organizacin se distinguen 3 reas:-Area de datos-Area de ndices-Area de excedentesCuando se crea el fichero la informacin se va guardando en el rea de datos y al mismo tiempo se van creando ndices en el rea de ndices para poder luego localizar esos datos. Despus de la creacin del fichero la informacin se almacena en el rea de excedentes y se va actualizando tambin el rea de ndices. Tipos de ndices:- Indice de pista: Es el de ms bajo nivel y es obligatorio. Hay un ndice de pista por cada pista del cilindro, y este ndice contiene 2 entradas o valores. El primero determina cual es el valor de la clave ms altaalmacenada en esa pista, y el segundo determina cual es la clave del primer registro de excedente de esa pista.-Indice de cilindro: Es el de siguiente nivel y tambin es obligatorio.Tiene una entrada por cada cilindro y en esa entrada contendr la clave ms alta de los registros almacenados en ese cilindro.- Indice maestro: No es obligatorio. Solo se usa cuando el ndice de cilindro ocupa ms de 4 pistas. Tiene una entrada por cada pista del ndice de cilindros y contendr la clave ms alta de los registros a los que referencian todos los cilindros de esa pista.Ej: 2 pistas / cilindro y 2 registros / pistaPista 1Pista 2Area de ndices123560812 1520354260Area de datos2810 1214 20303538 4250 60C1C2C3Area de excedentes151716Para buscar el registro 30, hay que ir mirando si 30 es = 5) y (no eof(f_al)) Entonces aprob aprob + 1Fin siLeer (f_al,r_al) Fin mientrasEscribir En el cursocurhan aprobadoaprobFin mientrasCerrar (f_al) FinTenemos un fichero de empleados clasificado por el nmero de empleado y un fichero de bajas no clasificado que contiene los nmeros de los empleados que se han dado de baja. Obtener un tercer fichero que contenga a los empleados que realmente hay en la empresa.Tipo empleado: registro Num_emp: entero Nombre: cadena Sueldo: realFin registro Algoritmo baja VarF_e_ini,f_e_fin: fichero de empleado F_baja: fichero de entero R_e_ini,r_e_fin: empleadoR_b: enteroInicioAbrir (f_e_ini,Empleado1.dat,entrada) Abrir (f_e_fin,Empleado2.dat,salida) Leer (f_e_ini,r_e_ini)Mientras no eof (f_e_ini)Abrir (f_b,Bajas.dat,entrada) Leer (f_b,r_b)Mientras r_b r_e_ini.num_emp) y no eof (f_b) Leer (f_b,r_b)Fin mientrasSi eof (f_b)Entonces escribir (f_e_fin,r_e_fin) Fin siCerrar (f_b)Leer (f_e_ini,r_e_ini) Fin mientrasCerrar (f_e_ini) Cerrar (f_e_fin)FinTenemos un fichero de clientes no clasificados y la clave del fichero de clientes es el D.N.I. y un fichero de morosos que contiene el D.N.I. y que est clasificado. Queremos obtener un listado de los clientes no morosos.Leer (f_c,r_c) Mientras no eof (fc)Abrir (fm,Morosos.dat,entrada) Leer (f_m,r_m)Mientras r_c.DNI > r_m y no eof (f_m) Leer (f_m,r_m)Fin mientrasSi r_c.DNI r_mEntonces escribir r_c.nombreFin siCerrar (f_m) Leer (f_c,r_m)Fin mientrasTenemos un fichero de ventas que tiene el nmero de venta, total de venta y nmero de vendedor, sabemos que en nuestra empresa trabajan 5 vendedores numerados del 1 al 5.Queremos saber el total vendido por cada vendedor. Tipo venta: registroCod_venta: entero Total: real Vendedor: enteroFin registro Algoritmo ventas VarF_v: fichero de ventaR_v: ventaVend: array [1..5] de realI: enteroInicioDesde i=1 hasta 5Vend[i] 0Fin desdeAbrir (f_v,ventas.dat,entrada) Leer (f_v,r_v)Mientras no eof (f_v)Vend[r_v.vendedor] vend[r_v.vendedor] + r_v.totalLeer (f_v,r_v) Fin mientras Cerrar (f_v) Desde i=1 hasta 5Escribir El vendedoriha vendidovend[i] Fin desdeFinAcceso directo en archivos secuenciales:Existen lenguajes que tienen funciones que simulan el acceso directo a un registro dentro de un fichero secuencial (en Pascal Seek; en C fseek), a estas funciones le indicamos el nmero de registro (en Pascal) o el nmero de bytes (en C), y nos acceden directamente a esa posicin.Sin embargo es simulado, porque internamente esa funcin va a hacer una bsqueda secuencial hasta que haya llegado al nmero de registro o al nmero de bytes.Mantenimiento de ficheros con organizacin directa:- Alta: Primero hay que ver que no existe el registro, y si no existe se da de alta. Para ver si existe o no existe, a partir de la clave del registro que quiero dar de alta, calculo con la funcin de direccionamiento la posicin en la que tendra que meter ese registro. Si esa posicin est ocupada, no lo doy de alta y si no lo meto all.- Baja: Para ver si existe, hago igual que antes. Si existe lo marco como baja lgica, y cuando se reorganice el fichero, lo doy como baja fsica real.- Modificacin: Para ver si existe, hago igual que antes. Si existe lo modifico y lo vuelvo a grabar en la misma posicin.- Consultas: Tienen sentido las consultas de registros en particular con una determinada clave (a travs de la funcin de direccionamiento), pero no las bsquedas secuenciales.Mantenimiento de ficheros con organizacin secuencial indexada:Es igual que en organizacin directa, pero a la hora de localizar un registro, en vez de aplicar una funcin de direccionamiento a su clave, utilizamos su clave para investigar a travs de los ndices en donde va a estar situado.Las altas si las doy cuando el fichero se crea, se graban en el rea de datos, y si el fichero ya exista se graban en el rea de excedentes.En las consultas tienen sentido tanto las consultas de un registro en particular como las consultas secuenciales a travs de una clave porque van a estar todas seguidas.No hay que confundir organizacin secuencial indexada, con ficheros indexados o de ndices, que son un tipo especial de ficheros asociados a un fichero secuencial pero independiente de l, que me agilizan las bsquedas en el fichero secuencial en el que estn indexados. Suelen utilizarse en bases de datos domsticas.8. FICHEROS DE TEXTO:Son un tipo de ficheros especiales, en cuanto a lo que podemos leer de ellos y escribir son cadenas de caracteres.Sin embargo tienen significados distintos segn el lenguaje, y su objetivo es que podemos trabajar con cadenas de caracteres.F : Fichero de textoC : Cadena escribir (F, C) leer (F, C)EJERCICIOS: TEMA 81. Tenemos un array con la informacin de nuestros productos, por cada producto almacenamos su cdigo, descripcin, stock actual y stock mnimo.Se trata de obtener otro array que contenga los productos de los que halla que hacer pedidos porque su stock sea inferior al mnimo, tal que al proveedor le tenemos que dar como datos la identificacin del producto y la cantidad que pedimos, que coincidir con el stock mnimo.Normalmente trabajamos con 100 productos.Tipo producto = registroFin registro

Codigo: entero Descripcin: cadena Stock: entero Stock_min: enteroPedido = registroCodigo: enteroCantidad: enteroFin registroLista_producto = array [1..100] de productoLista_pedido = array [1..100] de pedidoAlgoritmo almacenVarProd: lista_productoPed: lista_pedidoI,j: enteroInicioJ 1Desde i=1 hasta 100Si prod[i].stock < prod[i].stock_minEntonces ped[j].codigo prod[i].codigo Ped[j].cantidad prod[i].stock_min J j+1Fin siFin desdeFin2. Dado un array que contiene la informacin de los alumnos de una clase de 100 alumnos, y teniendo en cuenta que de cada uno de ellos almacenamos su nmero de expediente, nombre y nota media. Hallar la media de todos los alumnos de esa clase y dar otra opcin que pida el nombre de un alumno y me de su nota si este alumno existe.Tipo alumno = registroExpediente: entero Nombre: cadena Media: realFin registroLista = array[1..100] de alumnoAlgoritmo notasVarAlum: lista Op,i: entero Marca: booleanoInicioPresentar (op) Mientras (op 0)Segn sea op1: escribir La media de la clase esnota_media (alum)2: escribir Introduce un nombreleer nombre marca falso i 1repetirsi comparar (alum[i].nombre,nombre) = verdadero entonces marca = verdaderosino i i+1 fin sihasta (i > 100) o (marca=verdadero)si marca = verdaderoentonces escribir La nota denombreesalum[i].media sino escribir El alumno no existefin sifin segn sea presentar (op)fin mientras fin3. Tenemos un array con la indicacin de cada producto, stock, descripcin y fecha. Hallar una opcin que nos sirva iterativamente para hacer pedidos de productos y que termina cuando pidamos el producto 0.Por cada pedido se da el identificador de producto que se pide, y la cantidad de producto, y lo que nos dice es si hay cantidad suficiente, respondiendo Pedido suministrado y actualizando el stock, y si el producto solicitado no existe o no hay suficiente cantidad, mostrar un mensaje de error explicando la causa.Tipo t_fecha = registroDia: entero Mes: entero Anno: enteroFin registroProducto = registro Codigo: entero Descripicion: cadena Stock: enteroFecha: t_fechaFin productoLista = array[1..10] de productoAlgoritmo pedidosVarProd: lista Codigo,cantidad,i: entero Marca: booleanoInicioEscribir Introduce el codigo Leer codigoEscribir Introduce la cantidad Leer cantidadMientras codigo 0I 1Marca falsoRepetirSi codigo = prod[i].codigo Entonces marca verdadero Sino i i+1Fin siHasta (marca = verdadero) o (i > 100) Si marca = falsoEntonces escribir No existe el producto Sino si prod[i].stock < cantidadEntonces escribir No hay cantidad suficiente Sino prod[i].stock prod[i].stock cantidadEscribir pedido suministradoFin si

Fin siFin mientrasFinfuncion nota_media (a: lista): real vari: entero acum: realinicioacum 0desde i=1 hasta 100acum acum + a[i].nota fin desderetorno (acum/100)fin nota_mediafuncion comparacion (c1:cadena,c2:cadena): booleanovari: entero inicioi 1mientras (c1[i]=c2[i]) y (c1[i]$) y (c2[i]$)i i+1fin mientras si c1[i]=c2[i]entonces retorno verdadero sino retorno falsofin sifin comparacionProcedimiento presentar (ent-sal opcion: entero) InicioRepetirEscribir 0. SalirEscribir 1. Hallar nota mediaEscribir 2. Hallar la nota de un alumno Escribir Introduce una opcinLeer opcionHasta (opcion >=0) y (opcion datos [j + 1] Entonces aux datos [j]Datos [j] datos [j + 1] Datos [j] aux Ordenado falsoFin si Fin desde I I + 1Fin mientrasFinMtodo de insercin:Se supone que se tiene un segmento inicial del array ordenado, y hay que ir aumentando la longitud de segmento hasta que coincide con la longitud del array.Para ello insertaremos el siguiente elemento en el lugar adecuado dentro del segmento ordenado.Esto se hace moviendo cada elemento del segmento ordenado a la derecha hasta que se encuentre uno menor o igual al elemento que queremos colocar en el segmento o hasta que no tenemos elementos, y lo coloco en esa posicin.Para arrancar este mtodo se parte de que el segmento ordenado inicial este es la primera posicin.Procedimiento insercion (datos: array [1..N] de ) VarI, J: enteroAux: InicioDesde i = 2 hasta N Aux datos [i]J i 1Mientras (j > 0) y (aux < datos[j]) Datos[j + 1] datos[j]J j 1Fin mientrasDatos [j + 1] auxFin desdeFinMtodo de la seleccin:Se trata de buscar el elemento ms pequeo y colocarlo en la primera posicin, despus el segundo ms pequeo y colocarlo en la segunda posicin, y as sucesivamente hasta que el array este ordenado.PGINA 108/176Para ello vamos a recorrer el array, y por cada elemento buscamos a la derecha de esa posicin cual es el ms pequeo, y lo intercambio con el elemento que estoy examinando.Procedimiento selecccion (datos: array[1..N] de ) VarI,j,pos: enteroAux: InicioDesde i = 1 hasta N-1Aux datos[i] Pos iDesde j = i+1 hasta N Si datos[j] < auxEntonces pos jAux datos[j]Fin siFin desdeDatos[pos] datos[i] Datos[i] auxFin desdeFinMtodo de ordenacin rpida o QuickShort:Consiste en dividir la lista inicial en otras dos que ordenamos por separado recursivamente.Para ello, se elige un elemento de la lista al que llamamos pivote, tal que a la derecha del pivote va a quedar lo ms grande, y a la izquierda lo ms pequeo, es decir, que el pivote quedar colocado en su posicin.Procedimiento QuickShort (ini: entero; fin: entero; datos: array[1..N] de ) InicioSi ini < finEntonces sublistas (ini,fin,pivote,datos) Quickshort (ini,pivote-1,datos) Quickshort (pivote+1,fin,datos)Fin siFinProcedimiento sublistas (ini:entero;fin:entero;ent-sal pivote:entero;datos:array[1..N]de )InicioPivote iniPGINA 109/176Aux datos[ini]Desde i = pivote+1 hasta finSi datos[i] < auxEntonces pivote pivote + 1Aux2 datos[i]Datos[i] datos[pivote] Datos[pivote] aux2Fin siFin desdeDatos[ini] datos[pivote] Datos[pivote] auxFin3. BSQUEDAS:Hay 2 tipos de bsquedas, internas que se hacen en memoria y externas que se hacen en ficheros. Cuando buscamos en un fichero, normalmente lo hacemos a travs de una clave.Dado un determinado valor, se trata de ver si existe un elemento con ese valor en el array de ficheros donde se busca, tal que se devuelve si est o no.Existen 3 mtodos de bsqueda:-Secuencial.-Binaria o dicotnica.-Por transformacin de claves o Hashing.Bsqueda secuencial:Se puede aplicar para bsquedas internas y externas, y hay que ir pasando secuencialmente por todos los elementos de la estructura hasta encontrar el elemento o acabar la lista.Procedimiento b_secuencial (datos: array[1..N] de ; elem: ) VarI: enteroInicioI 1Mientras (i = nmero de registros.En cada pasada para clasificar la secuencia que leemos de F1 y F2, utilizamos el mtodo de fusin externa.F: 3 9 5 14 2 30 1 12 10F1: 3 / 5 / 2 / 1 / 10F2: 9 / 14 / 30 / 12F: 3 9 5 14 2 30 1 12 10F1: 3 9 / 2 30 / 10F2: 5 14 /1 12F: 3 5 9 14 1 2 12 30 10F1: 3 5 9 14 / 10F2: 1 2 12 30F: 1 2 3 5 9 12 14 30 / 10F1: 1 2 3 5 9 12 14 30F2: 10F: 1 2 3 5 9 10 12 14 30Clasificacin por mezclas de secuencias equivalentes:Se parece al mtodo anterior porque tambin se intenta coger secuencias de registros ms grandes, pero ahora usamos 4 ficheros auxiliares y en vez de empezar leyendo secuencias de un registro, hacemos secuencias de N registros, que la primera vez clasificamos internamente, por lo que el valor de N vendr limitado por el tamao del array.Primero leemos del archivo inicial F secuencias de N registros que clasificamos internamente y que grabamos alternativamente en F1 y F2.Despus leo secuencias de N registros de F1 y F2 alternativamente, y por cada par de secuencias ledas las fusiono y las grabo alternativamente ya ordenadas en F3 y F4.Las secuencias de 2N registros de F3 y F4 las fusiono y la secuencia 4Nobtenida ya ordenada la grabo alternativamente en F1 y F2.Repito esto hasta que todos los ficheros estn vacos menos 1, y la informacin de ese fichero la grabo al fichero inicial.F: 3 9 5 14 2 30 1 12 10F1: 3 5 9 / 1 10 12F2: 2 14 30F1: VacioF2: VacioF3: 2 3 5 9 14 30F4: 1 10 12F1: 1 2 3 5 9 12 14 30 Vuelco F1 al fichero inicial F. F2: VacioF3: VacioF4: VacioESTRUCTURAS DINMICAS LINEALES DE DATOS:LISTAS ENLAZADAS. PILAS Y COLAS: TEMA 111. Introduccin a las estructuras dinmicas de datos.2. Listas.3. Listas enlazadas.4. Procesamiento de listas enlazadas simples.5. Listas circulares con cabecera.6. Listas doblemente enlazadas.7. Pilas.8. Colas.9. Dobles colas o bicolas.1. INTRODUCCIN A LAS ESTRUCTURAS DINMICAS DE DATOS: Las ventajas de las estructuras dinmicas de datos son:1. No hay que definir el tamao antes de usarla, sino que la voy utilizando segn la necesito.2. Los elementos que forman est estructura no estn situados en forma contigua en memoria, y esos elementos se relacionan entre s mediante campos enlace o puntero, y a cada uno de esos elementos lo llamamos nodo de la estructura.Un puntero es un dato cuyo contenido es una direccin de memoria que es en la que est almacenado el dato al que apunta.Las estructuras dinmicas pueden ser lineales o no lineales segn que desde un elemento se pueda acceder sola