FUNDS. INFORMÁTICA 1 TEMA 1. CONCEPTOS BÁSICOS ¾ Obtención de un programa. Fases: • Análisis → Solución del problema o algoritmo (razonamiento). • Codificación → Transcripción del algoritmo a un lenguaje de programación. • Resultado → Un programa. ¾ Algoritmo: • Consta de una descripción de la información asociada al problema y una descripción del modo de tratamiento de esta información. • Algoritmo: secuencia ordenada y finita de pasos, exenta de ambigüedades, que lleva a la solución de un problema dado. • Propiedades: 9 9 9 Generalidad Eficiencia Independencia de la máquina y del lenguaje • Programar: es la técnica (arte) de desarrollar algoritmos. • Programa: conjunto de instrucciones directamente comprensibles por un sistema de tratamiento de información que permite ordenar la ejecución de la secuencia de pasos elegida para resolver el problema dado. • Codificación: la tarea de expresar un algoritmo en términos de lenguaje comprensible por el computador. • Sistema operativo: conjunto de programas que facilitan la utilización del sistema informático permitiendo: 9 9 9 9 9 Edición, puesta a punto y ejecución de programas Gestión de ficheros Seguridad y protección Facturación y contabilidad Etc… Controla el funcionamiento de la máquina: 9 9 9 9 9 Gestión de memoria Control de periféricos Acceso a ficheros Asignación de recursos y ordenación de tareas Etc… ¾ Lenguajes de programación: Elementos de un lenguaje: 9 Léxica (palabras, símbolos, etc…) 9 Palabras clave (IF, DO, GOTO, ARRAY, etc…) 9 Identificadores 9 Operadores 9 Separadores 9 Sintaxis (unión de palabras y frases) 9 Semántica (significado) ¾ Ejecución de un programa: • Ejecución interpretada: 1) Obtención de la siguiente instrucción del programa 2) Análisis de la instrucción y determinación de las acciones a ejecutar 3) Ejecución de las correspondientes acciones • Ejecución compilada: 1) Traducción previa (compilación) del programa fuente a una versión equivalente en lenguaje máquina. Esta versión se denomina programa objeto 2) El programa objeto se une, eventualmente, con los subprogramas de biblioteca que utiliza para formar lo que se denomina el programa ejecutable, tarea ejecutable o aplicación. Esta operación se denomina edición de uniones (link) 3) El programa ejecutable puede ser cargado en la memoria del computador para ser ejecutado cuantas veces se desee, sin necesidad de volverlo a compilar FUNDS. INFORMÁTICA program p1 begin write(‘Hola’); end. Hola 0100110101110010 0100100101000110 0100101100101001 0001110011001001 COMPILADOR p1.p (nombre del fichero fuente) 2 p1.0 (nombre del fichero objeto) EJECUCIÓN ¾ Obtener un programa ejecutable: FASE ANÁLISIS EDICIÓN COMPILACIÓN EDICIÓN DE UNIONES (LINKING) EJECUCIÓN Se hace con... Papel y boli Editor de textos E.I.P. (I.D.E.) Compilador E.I.P. En merlin... ---------- Resultado Algoritmo(s) Tipo fichero ---------- nedit Programa fuente Fichero de texto pc ___ Programa objeto Fichero binario Sí Compilador E.I.P. pc___ Programa ejecutable Fichero binario ¿Errores? Programa ejecutable (<nombre programa>) Ejecución del El elegido programa para los datos elegidos E.I.P.: Entorno Integrado de Programación nedit: editor de textos pc: pascal compiler ¾ Errores: • Léxico-sintácticos: se detectan en fase de Compilación • Semánticos: son causados por errores en el Análisis y se detectan (a veces) en fase de Ejecución ¾ Estructura general de un programa: • Cabecera Algoritmo nombre_alg (lista de parámetros) • Declaraciones (Descripción del algoritmo) Principio (Pre: Descripción de los parámetros de entrada) 9 Instrucciones (Post: Descripción de los parámetros de salida) fin. Tipos Constantes y Variables Procedimientos y Funciones Asignaciones Instrucciones de entrada-salida Instrucciones de control Llamadas a procedimientos y funciones ... (Cabecera) (Declaraciones) (Instrucciones) TEMA 2. TIPOS DE DATOS. ACCIONES ELEMENTALES ¾ Dato: Abstracción de la realidad que se clasifica en tipos (predefinidos o no) • Abstracción • Asociado a un valor 9 Constante: valor inalterable 9 Variable: valor alterable No FUNDS. INFORMÁTICA 3 • Se opera • Representado internamente en un sistema informático ¾ Tipo de dato: Caracterizado por: • Dominio de posibles valores • Modo común de representación de sus valores (interno y externo) • Conjunto de operadores asociados ¾ Clasificación: • Estáticos (tamaño fijo) 9 Simples (un solo valor) 9 9 9 Escalares numerables 9 Definidos por enumeración 9 Entero 9 Booleano 9 Carácter Escalares no numerables 9 Real Puntero 9 Estructurados (varios valores) 9 9 9 9 Arrays (vectores, matrices, etc…) Registros Conjuntos Ficheros secuenciales • Dinámicos (tamaño variable) 9 Listas 9 Tablas 9 Árboles ¾ Tipos de datos escalares: Un tipo de datos escalar viene caracterizado por: • Un dominio finito de valores • Relación de orden total entre sus valores Admiten operadores binarios de relación (se obtiene como resultado un valor de tipo booleano): = igual que <> desigual que < menor que <= menor o igual que > mayor que >= mayor o igual que Funciones sucesor y predecesor (si y solo si el conjunto de valores del tipo de datos es numerable): sucesor (17) = 18 predecesor (5) = 4 sucesor (‘H’) = ‘I’ predecesor (‘n’) = ‘m’ Estas funciones no están definidas para el mayor y el menor elementos del dominio de valores con respecto a sucesor y predecesor respectivamente. • Tipos escalares numerables estándar: ENTERO, CARÁCTER, BOOLEANO Suelen estar predefinidos ¾ Tipo ENTERO: Está definido como un intervalo de valores enteros comprendidos entre dos valores constantes: minentero y maxentero. integer: enteros, 2 bytes, 4 bytes longint: enteros largos, 8 bytes Representación algorítmica 456 -3452 0 etc… Representación interna 2 bytes 0000 0000 0000 0000 (1er bit → signo) FUNDS. INFORMÁTICA 4 0 → 0000 0000 0000 0000 1 → 0……………… 0001 2 → 0……………… 0010 3 → 0……………… 0011 4 → 0……………… 0100 -1→ 1111 1111 1111 1111 Operaciones 9 Típicas (de relación, sucesor y predecesor) 9 Aritméticas + suma - resta * producto div división entera mod resto de la división entera 9 Ordinal ¾ Tipo CARACTER: char Comprende como mínimo • Caracteres alfabéticos: ‘A’, ‘B’, …, ‘Z’, ‘a’, ‘b’, …, ‘z’ • Caracteres numéricos o dígitos: ‘0’, ‘1’, …, ‘9’ • Otros caracteres imprimibles: ‘+’, ‘-‘, … Representación algorítmica Entre apóstrofos (‘’) Representación interna Códigos alfanuméricos (ASCII). Un dato de tipo carácter se almacena ocupando 1 byte (8 bits) ASCII: American Standard Code for Interchange of Information Operaciones 9 Relación 9 Ordinal y cardinal ord(‘A’) = 65 chr(65) = ‘A’ ord(‘o’) = 48 chr(48) = ‘o’ ord(‘ ‘) = 32 chr(32) = ‘ ‘ ¾ Tipo BOOLEANO: boolean Dominio del tipo booleano: falso, verdad Representación interna Sería suficiente con 1 bit, pero se emplean bytes Operaciones 9 Lógicas binarias OR ó lógico o unión lógica AND y lógico o intersección lógica 9 Lógicas unitarias NOT negación lógica TABLAS DE VERDAD v ≡ 1; f ≡ 0 A 1 1 0 0 ¾ Tipo REAL: real B 1 0 1 0 A and B 1 0 0 0 A or B 1 1 1 0 not A 0 0 1 1 FUNDS. INFORMÁTICA 5 Problema de precisión: R solo se puede representar con una determinada precisión. La precisión con límite de paso constante (de 0,1 en 0,1 p.e.) no es adecuada. Representación de tipo exponencial: para números pequeños la precisión es mayor y para números grandes la precisión es menor. Mantisa · Bexponente B: base (2 ó potencia de 2 Ojo con la comparación de números reales (a = b) Representación algorítmica 456.3 -3156.77 +456.5E-7 (E+n = 10n) -18.7E+8 22.222 -23.45E+3 Operaciones 9 Relación (como escalares) excepto predecesor y sucesor 9 Aritméticas + suma - resta * producto / cociente (no hay función potenciación) 9 De biblioteca abs(x) valor absoluto sqr(x) elevar al cuadrado sqrt(x) raíz cuadrada sin(x) seno de x (en radianes) cos(x) coseno de x (en radianes) arctan(x) arco tangente (resultado en radianes) ln(x) logaritmo neperiano exp(x) exponencial (ex) trunc(x) truncar “x” devolviendo el mayor valor entero “y” tal que y<=x ... round: redondear odd: impares ¾ ASIGNACIÓN INTERNA Una variable declarada (creada) tiene un valor indefinido Operador asignación := Sintaxis <variable> := <expresión> Semántica 1) Evaluar 2) Asignar El valor resultante de evaluar <expresión> debe pertenecer al mismo tipo de dato que <variable>; sino incompatibilidad. Ejemplos: x := x + 1; c := a * b + c / d respuesta := (a < b + c) and not (x > 10.5) Nivel de prioridad de operadores: Mayor prioridad NOT * / DIV MOD AND + OR Menor prioridad < <= = >= > <> IN En caso de conflicto de operadores de un mismo nivel, la expresión se evalúa de izda a dcha ¾ ASIGNACIÓN EXTERNA FUNDS. INFORMÁTICA 6 Datos introducidos desde el exterior Sintaxis leer(<variable>) read(<variable>) leerypasarlinea(<variable>) readln(<variable>) lecturamúltiple(<variables>) read(<variable1>,<variable2>,<...>) Semántica 1) Se busca el tipo de dato de <variable> 2) Se lee del dispositivo de entrada una secuencia de caracteres cuya sintaxis corresponda a la representación en notación algorítmica de un dato del tipo asociado a la variable 3) Se realiza la conversión 4) Se asigna el valor ¾ Instrucción para la SALIDA Salida de los datos por el dispositivo de salida (pantalla) Sintaxis escribir(<expresión>) write(<expresión>) escribirypasarlinea(<expresión>) writeln(<expresión>) escrituramúltiple(<expresiones>) write(<expresión1>,<expresión2>,<...>) Semántica 1) Se evalúa <expresión> obteniendo un resultado 2) Se realiza la conversión del valor obtenido desde su representación interna a su representación algorítmica equivalente 3) Se escribe el valor resultante en su forma algorítmica por el dispositivo de salida de datos Modificadores de formato Variable entero o carácter: write(a : 5) →deja 5 espacios totales para escribir la variable Variable real: write(b : 5 : 2) → deja 5 espacios totales de los cuales destina dos para decimales ¾ Tipo STRING: introducción. string[25] → longitud máxima entre corchetes (256 por defecto) Sirve para almacenar cadenas de caracteres TEMA 3. COMPOSICIÓN ¾ Tipos de composición: • Secuencial → secuencia de instrucciones • Iterativa → repetición de instrucciones • Condicional → ejecución condicional de una u otra instrucción • Recursiva ¾ Composición SECUENCIAL: Se necesita para establecer el orden en el que deben ser ejecutadas las acciones del algoritmo. Éste será determinado simplemente por el orden en el que aparecen las instrucciones en el algoritmo. ¾ Composición CONDICIONAL: Se establece una condición a través de la cual se seguirá la ejecución de un bloque de instrucciones u otro. Sintaxis if <condición> then <bloque1> else <bloque2> FUNDS. INFORMÁTICA 7 Semántica 1) Evalúa <condición> obteniendo un valor booleano (verdadero o falso) 2) Si es verdadero ejecuta <bloque1> y si es falso ejecuta <bloque2> Caso degenerado if <condición> then <bloque> Selección múltiple Se trata de una composición condicional en la que tenemos un número finito de acciones alternativas (se debe ejecutar una y sólo una de ellas en función del estado del algoritmo). No hay que dejar ningún caso sin especificar, es decir, debe cubrir todo el rango de valores posibles para <variable> case <variable> of <valor1> : <bloque1>; * En algunos lenguajes de <valor2> : <bloque2>; programación se utiliza ‘else’ o ‘others’ ... <valor-n> : <bloque-n>; otherwise* <bloque-otros-casos> end ¾ Composición ITERATIVA: • Tipo primero (iteración condicionada) Sintaxis while <condición> do <bloque> Semántica 1) Evalúa <condición> obteniendo un valor booleano (verdadero o falso) 2) Si es falso concluye la ejecución de la iteración, si es verdadero se ejecuta <bloque> y se vuelve al punto anterior Aplicación Método de inducción 1) Identificar el caso trivial y su solución 2) Ley de recurrencia 3) Condición para su resolución Resolución del problema en un caso trivial; {Solución de P0} i := 0 {“i” representa el índice del problema resuleto} while “no esté resuelto el problema” do begin i := i + 1; {actualización, sino bucle infinito} “Resolver el problema Pi a partir de la solución del problema Pi-1” end; Comprobaciones 1) 2) 3) 4) • ¿Funciona bien el caso trivial? ¿Funciona bien el caso general? → hacer la traza con un caso sencillo ¿Se actualiza la condición de salida? ¿Se ha ajustado la condición de salida? Tipo segundo (iteración condicionada) Sintaxis repeat <bloque> until <condición> Semántica 1) Ejecuta <bloque> 2) Evalúa <condición> 3) Si el valor anterior es falso vuelve al punto 1; sino concluye la iteración FUNDS. INFORMÁTICA • 8 Equivalencia con tipo primero Equivale a <bloque> while not <condición> do <bloque> Tipo tercero (iteración indexada) Sintaxis for <índice>: = <valor-inicial> to (o bien downto) <valor-final> do <bloque> Observaciones 1) Una vez ejecutado <bloque> el índice incrementa su valor de forma automática 2) <índice> es un identificador de variable perteneciente a un tipo escalar numerable 3) <valor-inicial> y <valor-final> son expresiones del mismo tipo 4) El valor de la variable <índice> no debe ser modificado 5) Después de ejecutar el bucle, el valor de <índice> queda indefinido TEMA 4. SUBALGORITMOS: PROCEDIMIENTOS Y FUNCIONES ¾ Procedimiento: es un algoritmo parametrizado que define una instrucción virtual y puede ser utilizado tantas veces como se desee ¾ Comunicación entre algoritmos: • Sólo entrada = transmisión por valor Sintaxis Cabecera del procedimiento procedure <nombre_procedimiento>(<nombre_n-variables> : <tipo_variables>; ...); {...} Llamada al procedimiento (desde el programa principal) <nombre_procedimiento>(<expresión1>,<expresión2>,...,<expresión-n>) Semántica 1) Se evalúan <expresión1>, ..., <expresión-n>, obteniendo n valores 2) Se asigna al parámetro i-ésimo del procedimiento <nombre_procedimiento> el valor resultante de evaluar <expresión-i> 3) Se ejecuta el algoritmo correspondiente al procedimiento <nombre_procedimiento> Los parámetros y las variables de un procedimiento son variables locales: Tienen un nombre Pertenecen a un tipo de dato Se les asigna un valor (parámetros sólo) en el momento de la llamada y puede ser alterado Su ámbito es el propio procedimiento El ámbito de un objeto (variable) se situará en el algoritmo en el cual esté definido e irá desde el punto de su definición hasta el fin del algoritmo A ALGORITMO A Definición de los objetos X, Y, Z ALGORITMO B Definición de los objetos Y, V Begin ... end; {de B} Begin ... end. {de A} Xa Ya Za B Yb Vb FUNDS. INFORMÁTICA 9 Comunicación mediante variables globales Problemas: 1) Los algoritmos no pueden ser diseñados independientemente del entorno 2) Falta de parametrización (utilización inadecuada de variables) 3) Efectos laterales La comunicación mediante transmisión de datos por valor permite una independencia del entorno y la introducción de parámetros de entrada. Se recomienda evitar la técnica de comunicación mediante variables globales. • Entrada y salida = transmisión por referencia Sintaxis Cabecera del procedimiento procedure <nombre_procedimiento> ( var <nombre_n-variables> : <tipo_variables>;...); {...} Llamada al procedimiento (desde el programa principal) <nombre_procedimiento> (<variable1>,<variable2>,...,<variable-n>) Observaciones 1) Tanto en la declaración como en la llamada los parámetros transmitidos por referencia deben ser identificadores de variables, no expresiones 2) Los parámetros quedan definidos en la declaración del procedimiento y no deben redefinirse en la lista local de variables 3) El número y el tipo de los parámetros deben coincidir en la declaración y en la llamada 4) Los identificadores de los parámetros de los procedimientos son “alias” locales de los identificadores de las variables que reciben 5) Los parámetros por valor se pueden representar mediante cajas a caballo del ámbito del procedimiento simbolizando la duplicación producida (se crea una nueva variable donde se almacenará el valor transmitido). En la llamada se pone el valor recibido en dicha caja 6) Los parámetros recibidos por referencia se representan poniendo su nombre a caballo del ámbito del procedimiento simbolizando que su nombre local se asocia al nombre de la variable que se transmita (no se duplica la variable). En la llamada, una línea o flecha pueden representar la asociación de ambas ¾ Funciones: Una función es un algoritmo, eventualmente parametrizado, que devuelve un valor. Relación de operandos, que pueden ser: 9 Constantes 0.5 9 Variables x 9 Funciones sin(x) 9 Subexpresiones (x + 0.5 * cos(y)) Se necesita: 9 El nombre 9 Los parámetros 9 El tipo del valor que devolverá Sintaxis function <nombre_función>(<variables-n> : <tipo_variables> ; ...) : <tipo-valor-devuelve> {...} ......... <nombre_función> : = <valor-obtenido> Semántica Llamada 1) Se evalúan los argumentos por valor y se asignan los valores 2) Se establece la correspondencia entre parámetros por referencia y sus argumentos 3) Se ejecutan las acciones de la función FUNDS. INFORMÁTICA 4) 10 Se retiene como valor “devuelto” por la función el “último” valor obtenido al ejecutar una acción devuelve TEMA 5. SECUENCIAS DE DATOS ¾ El problema es el siguiente: necesitamos recorrer una secuencia de datos y tratarla como convenga a nuestros fines. Para ello se proponen una serie de ejemplos ilustrativos. ¾ Contar el número de veces que aparecen las vocales en una frase algoritmo contar_vocales variables letra: carácter; {otras variables} principio “Resolución del problema trivial (secuencia vacia)” {Esquema iterativo} leer(letra); mientras que letra <> ‘.’ hacer “Tratamiento de una letra” leer(letra) fmq; “Salida de resultados” fin. ¾ Subsecuencias de dos elementos: contar el número de veces que aparece la subsecuencia ‘LA’ en una frase algoritmo cuenta_Las variables contador: entero; letra: carácter; principio {Resolución del problema trivial (secuencia vacia)} contador :=0; {Esquema iterativo} leer(letra); mientras que letra <> ’.’ hacer si letra = ‘L’ entonces leer(letra); si letra = ‘A’ entonces contador := contador + 1; leer(letra) fsi sino leer(letra) fsi fmq; {Salida de resultados} escribirlinea(contador, ‘Las’) fin. ¾ Contar palabras en una frase que acaba en punto algoritmo contar_palabras variables contador: entero; letra: carácter; principio {Resolución del problema trivial (secuencia vacía o cero palabras)} contador := 0; {Esquema iterativo} leer(letra); FUNDS. INFORMÁTICA 11 {Saltar espacios en blanco al principio} mientras que c <> ‘.’ hacer mientras que c = ‘ ‘ hacer leer(letra) fmq; {Contar palabras} si c <> ‘.’ entonces contador := contador + 1; leer(letra) fsi; {Saltar caracteres de una palabra} mientras que (c <> ‘.’) y (c <> ‘ ‘) hacer leer(letra) fmq; fmq; escribelinea(‘En la serie hay ‘,contador,’ palabras’); fin. ¾ Analizar la ordenación creciente de una secuencia de números enteros acabada en cero algoritmo comprueba_ordenación variables numero, siguiente: entero; estan_ordenados: booleano principio {Resolución del problema trivial (secuencia vacia)} estan_ordenados := verdad; {Esquema iterativo} leer(siguiente); numero := siguiente; mientras que (siguiente <> 0) y estan_ordenados hacer {Tratamiento de un elemento} si numero > siguiente entonces estan_ordenados := falso fsi; numero := siguiente; leer(siguiente) fmq; {Salida de resultados} si estan_ordenados entonces escribirlinea(‘Ordenados’) sino escribirlinea(‘No ordenados’) fsi; mientras que numero <> 0 hacer leer(numero) fmq fin. TEMA 6. VECTORES ¾ Un vector, v, es una aplicación de un conjunto de valores escalares, ordenados y consecutivos, llamado conjunto de índices del vector, en otro conjunto de datos variables de un mismo tipo. v: I → D i1 → d1 i2 → d2 ... i-n → d-n FUNDS. INFORMÁTICA 12 El conjunto de índices I (i1, i2, ..., i-n) es un tipo definido por enumeración (subrango de enteros o subrango de caracteres) Sintaxis de la declaración de tipo type <identificador> = array[<subrango-índices>] of <tipo_datos> Una variables de tipo vector es una estructura de datos. La componen un número fijo de componentes del tipo de base del vector. Sintaxis del acceso a un componente <nombre_vector>[<expresión>] ¾ Operaciones elementales: • Asignación en bloque de valores (vectores del mismo tipo) <nombre_vector> : = <dato_vector> • Recorrido for k := i1 to i-n do {Tratar el elemento v[i-k]} ¾ Vectores MULTIDIMENSIONALES: − 1 ... 3 M M Estructura de datos multiindexada: Matriz 2 ... 5 Sintaxis de la declaración de tipo Opción 1 type fila = array[<índicesfila>] of <tipo-datos>; matriz = array[<índicescolumna>] of fila Opción 2 type matriz = array[<índicesfila>,<índicescolumna>] of <tipo-datos> El acceso a un elemento de un vector multiindexado es igual que el de un vector normal pero hay que especificar todos los índices del elemento (en matrices 2 índices) TEMA 7. REGISTROS ¾ Un registro es una agrupación o estructura de datos. El número de datos agrupados es fijo, pero, a diferencia del vector, un registro puede agrupar datos de diferentes tipos Nombre Apellido_1 Apellido_2 Sexo Fecha_nacimiento Sintaxis de la declaración de tipo type <tipo_registro> = record <nombrecampo1> : <tipo1>; <nombrecampo2> : <tipo2>; ... <nombrecampo-n> : <tipo-n> end; Sintaxis del acceso a un campo <nombre_registro> . <nombrecampo-i> Campos FUNDS. INFORMÁTICA 13 • Operaciones con registros 9 Asignación en bloque de valores en registros del mismo tipo <nombre_registro> : = <dato_registro> TEMA 8. FICHEROS Dispositivo externo Buffer (variable) Memoria v pc.dat Fichero externo: se crea o se destruye o se utiliza ¾ Un fichero secuencial (o simplemente fichero) es una estructura de datos de tipo secuencia con un conjunto de operadores para acceder secuencialmente a sus componentes. Sintaxis de la declaración de tipo type <tipo_fichero> = file of <tipo-datos> Sintaxis del acceso a uno de los datos del fichero <nombre_fichero> ∧ (no definida en Turbo Pascal) Observaciones 1) Sólo se puede acceder de forma inmediata a uno de los componentes del fichero. Para ello es preciso haber accedido a todos los elementos anteriores 2) La creación (escritura) e inspección (lectura) no pueden mezclarse • * Operaciones 9 Escritura 9 Creación rewrite(<fich>) → abre <fich> para escritura (fichero interno, salvo si ya está abierto) rewrite(<fich>,’nombrefichero’) → asigna <fich> al fichero externo ‘nombrefichero’ y abre <fich> para escritura (NDTP*) assign(<fich>,’nombrefichero’); rewrite(<fich>) → ídem, para Turbo Pascal 9 Adición write(<fich>,<dato>) → escribe un dato y avanza <fich>∧ put(<fich>) → escribe el contenido de <fich>∧ y avanza <fich>∧ (Previamente f ∧ := dato) (NDTP) 9 Lectura 9 Iniciación reset(<fich>) → abre <fich> para lectura y posiciona la ventana sobre el primer dato de fichero (interno, salvo si ya está abierto) reset(<fich>,’nombrefichero’) → asigna <fich> al fichero externo ‘nombrefichero’, abre <fich> para lectura y posiciona la ventana sobre el primer dato del fichero (NDTP) assign(<fich>,’nombrefichero’); reset(<fich>) → ídem, para Turbo Pascal 9 Búsqueda read(<fich>,<dato>) → lee un dato (asigna a dato el contenido de <fich>∧) y avanza <fich>∧ NDTP: No Definida para Turbo Pascal FUNDS. INFORMÁTICA 14 get(<fich>) → avanza <fich>∧ (si se desea guardar el contenido dato := <fich>∧; get(<fich>∧) (NDTP) 9 Detección y cierre 9 Acabar las operaciones close(<fich>) → cierra el fichero (se hace automáticamente al salir del ámbito donde se abrió) 9 Final de fichero (función que devuelve un booleano) eof(<fich>) → si <fich>∧ está sobre la marca fin de fichero entonces eof(<fich>) = verdad sino eof(<fich>) = falso 9 Alternativas: • get(<fich>) ≡ read(<fich>,<variable>) • put(<fich>) ≡ write(<fich>,<expresión>) ¾ Búsqueda en ficheros secuenciales • Para los siguientes ejemplos predefinimos lo siguiente: tipo tpInfo = ...; tpDato = registro clave: entero; información: tpInfo freg; Fich_Datos = fichero de tpDato algoritmo Dato_Buscado(valor d: tpDato) devuelve: booleano; principio devuelve (expresión lógica que define el/los dato(s) a buscar) fin; algoritmo Tratar_Dato(valor d: tpDato); principio {Tratamiento asociado a los datos que verifican la condición de búsqueda} fin; algoritmo Fin_Búsqueda(valor d: tpDato) devuelve: booleano; principio devuelve (expresión lógica que define la condición de fin de la búsqueda) fin; • Algoritmo general de búsqueda: algoritmo Búsqueda(referencia elFichero: Fich_Datos); variable unDato: tpDato; HayQueBuscar: booleano; principio IniciaLectura(elFichero); HayQueBuscar := no FinFichero(elFichero); mientras que HayQueBuscar hacer leer(elFichero, unDato); si Dato_Buscado(unDato) entonces Tratar_Dato(unDato) fsi; HayQueBuscar := no FinFichero(elFichero) y no Fin_Busqueda(unDato) fmq; fin; FUNDS. INFORMÁTICA • Búsqueda exhaustiva (recorre todo el fichero): • algoritmo Busqueda_Lineal_Exhaustiva(referencia elFichero: Fich_Datos); variable unDato: tpDato principio IniciaLectura(elFichero); mientras que no FinFichero(elFichero) hacer leer(elFichero, unDato); si Verifican_Condición(unDato) entonces Tratar_Dato(unDato) fsi; fmq; fin; Búsqueda (hasta que encuentra el primer dato): 15 algoritmo Búsqueda_Lineal(referencia elFichero: Fich_Datos; referencia encontrado: booleano); variable unDato: tpDato; principio IniciaLectura(elFichero); encontrado := falso; mientras que no FinFichero(elFichero) y no encontrado hacer leer(elFichero, unDato); si Verifican_Condición(unDato) entonces Tratar_Dato(unDato); encontrado := verdad fsi; fmq; fin; ¾ Inserción, eliminación y mezcla: • Cualquier operación sobre un fichero que implique la modificación de uno de sus datos implica a su vez la creación de otro fichero nuevo • Inserción: No se pueden efectuar operaciones de lectura y escritura simultáneamente 1) Búsqueda del punto de inserción 2) Escritura del elemento a insertar en el nuevo fichero 3) Copia del resto de elementos algoritmo Inserción_Posición(referencia orig, nuevo: FichDatos; valor pos: entero; valor dato: tpDato); variable i: entero; x: tpDato; principio IniciaLectura(orig); IniciaEscritura(nuevo); i := 0; mientras que no FinFichero(orig) y (i < pos-1) hacer {Buscar punto de insercción} i := i + 1; leer(orig , x); escribir(nuevo , x) fmq; {Copiar el nuevo elemento} escribir(nuevo , dato); FUNDS. INFORMÁTICA 16 {Copiar el resto del fichero} mientras que no FinFichero(orig) hacer leer(orig , x); escribir(nuevo , x) fmq; fin; • algoritmo Inserción_Valor(referencia orig, nuevo: Fich_Datos; valor dato: tpDato); variable encontrado: booleano; datoleido: tpDato; principio IniciaLectura(orig) ; IniciaEscritura(nuevo); encontrado := falso; mientras que no FinFichero(orig) y no encontrado hacer leer(orig , datoleido); si ordenados(dato , datoleido) entonces encontrado := verdad; escribir(nuevo, dato) fsi; escribir(nuevo, datoleido) fmq; si no encontrado entonces escribir(nuevo , dato) sino {Copiar el resto del fichero} mientras que no FinFichero(orig) hacer leer(orig , datoleido); escribir(nuevo , datoleido) fmq; fsi; fin; Eliminación: Al igual que antes, debemos crear un nuevo fichero algoritmo Eliminación_Posición(referencia orig, nuevo: FichDatos; valor pos: entero; valor dato: tpDato); variable i: entero; x: tpDato; principio IniciaLectura(orig); IniciaEscritura(nuevo); i := 0; mientras que no FinFichero(orig) y (i < pos-1) hacer {Buscar punto de insercción} i := i + 1; leer(orig , x); escribir(nuevo , x) fmq; {Hay que saltar el elemento a eliminar} si no FinFichero(orig) entonces tomar(orig) fsi; {Copiar el resto del fichero} mientras que no FinFichero(orig) hacer leer(orig , x); escribir(nuevo , x) fmq; fin; algoritmo Eliminación_Valor(referencia orig, nuevo: Fich_Datos; valor dato: tpDato); variable encontrado: booleano; x: tpDato; principio IniciaLectura(orig) ; IniciaEscritura(nuevo); encontrado := falso; FUNDS. INFORMÁTICA 17 mientras que no FinFichero(orig) hacer leer(orig , x); si x <> dato entonces escribir(nuevo , x) fsi; fmq; fin; • Mezcla: Necesitamos obtener una secuencia ordenada partiendo de dos (mezcla binaria) o más (mezcla múltiple) secuencias ordenadas algoritmo Mezcla_Binaria(referencia Fich1, Fich2, Nuevo: Fich_Datos); algoritmo copiaResto(referencia f: Fich_Datos); principio mientras que no FinFichero(f) hacer Nuevo∧ := f∧; poner(Nuevo); tomar(f) fmq; fin; principio IniciaLectura(Fich1); IniciaLectura(Fich2); IniciaEscritura(Nuevo); mientras que no FinFichero(Fich1) y no FinFichero(Fich2) hacer si ordenados(Fich1∧, Fich2∧) entonces Nuevo∧ := Fich1∧; tomar(Fich1) sino Nuevo∧ := Fich2∧; tomar(Fich2) fsi; poner(Nuevo) fmq; copiaResto(Fich1); copiaResto(Fich2) fin; ¾ Ficheros de TEXTO: Los ficheros de textos son un tipo de ficheros predefinidos en lenguaje Pascal como text. Se organizan en líneas, cada una de las cuales se define como una secuencia de caracteres; por lo tanto, un fichero de texto es un fichero de datos de tipo carácter • Procedimientos 9 AcabarLinea(<fich_texto>) 9 EscribirLinea(<fich_texto>,<dato1>,<dato2>,...) 9 SaltarLinea(<fich_texto>) 9 LeerLinea(<fich_texto>,< variable1>,<variable2>,...) • Función 9 FinLinea(<fich_texto>) → eoln(<fich_texto>)