Los tipos de estos datos pueden ser cualesquiera, y no necesariamente de tipo char.

Documentos relacionados
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 2. Acciones Primitivas.

Asumiremos que se dispone de procedimientos para leer y escribir caracteres. Se desarrollan algunas funciones primitivas que nos serán útiles.

Dra. Jessica Andrea Carballido

Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

Enteros. Son los números que no contienen componentes fraccionarios y, por tanto, no contienen punto decimal.

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Resolución de Problemas y Algoritmos

1. ESTRUCTURA DE UN PROGRAMA PASCAL Todo programa escrito en lenguaje Pascal, del más simple al más complejo, tiene la siguiente estructura:

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Estructura de Datos: Archivos

FICHEROS EN PASCAL. Ficheros

'type' <nombre conjunto> '=' 'SET OF' <tipo base>

Resolución de Problemas y Algoritmos

Manual de turbo pascal

Índice. Definición Objetivos Estructura de una unidad Ejemplo de creación y uso FAQs Opciones de compilación Unidades estándar de TurboPascal

Departamento de Informática Universidad de Valladolid Campus de Segovia LABORATORIO: INTRODUCCIÓN A LAS UNIDADES EN TURBO PASCAL

Estudiemos el siguiente problema, propuesto por Wirth y desarrollado por Dijkstra: Una lista de las primeras secuencias que cumplen es:

Dra. Jessica Andrea Carballido

Dra. Jessica Andrea Carballido

n 6 Logro Conocimientos previos Tema: Datos y # Ficha de aprendizaje

6. Estructuras básicas de control 1. Pseudocódigo

28/10/2016. Procesamiento de Secuencias. Procesamiento de Secuencias. Procesamiento de Secuencias. Procesamiento de Secuencias

Primer Parcial. Programación 1 Instituto de Computación Año 2017

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Uno de los conceptos más útiles en ciencias de la computación es la pila.

Programas ejemplo. Lenguaje de Programación PASCAL. Miguel Murguía

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

8.1.- FUNCIONES Y PROCEDIMIENTOS DEFINIDOS POR EL USUARIO EN TURBO PASCAL.

Informática Ingeniería en Electrónica y Automática Industrial

Archivos en lenguaje C

Servicios del Sistema Operativo (SO)

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

APUNTES DE CÁTEDRA: ARREGLOS MULTIDIMENSIONALES

Principios de Computadoras II

Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7

2.2 Nombres, Ligado y Ámbito

UNIX. Curso de Modelado Molecular I INTRODUCCIÓN

Curso de Programación Avanzada en C

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

Academia técnica de computación A.T.C.

GUIA EXAMEN FINAL/EXTRAORDINARIO

INSTITUTO NACIONAL SUPERIOR DEL PROFESORADO TÉCNICO - TÉCNICO SUPERIOR EN INFORMÁTICA APLICADA - PROGRAMACIÓN I

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Tema 5. Soporte lógico de computadoras.

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

U nidad 6: A rreglos: U nidim ensionales y m ultidim ensionales

Objetivos. El alumno conocerá y aplicará el concepto de archivo para el almacenamiento y recuperación de datos persistentes.

Slide 1. ordenación de tres números en forma. creciente.

INFORMATICA TECNICATURA DE NIVEL SUPERIOR ALGUNOS EJERCICIOS DE SELECCIÓN E ITERACION

Ing. Rojas Córsico, Ivana

Fundamentos de Programación

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Conocimientos previos

ARQUITECTURA BÁSICA DEL ORDENADOR: Hardware y Software. IES Miguel de Cervantes de Sevilla

Datos en Turbo Pascal

Tema 13: Manejo de archivos en lenguaje C

FUNDAMENTOS DE OBJECT PASCAL

UTN FRR Ingeniería en Sistemas de Información Algoritmos y Estructuras de Datos Archivos Directos GUIA DE ESTUDIO: ARCHIVOS DIRECTOS

Elementos de un programa en C

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 21. Registros. Records.

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Estructura de Datos: Archivos. Programacion I Mgter. Vallejos, Oscar A.

FUNDAMENTOS DE INFORMÁTICA

Es la estructura que permite ejecutar los comandos solamente si se cumple una determinada condición. La sintaxis más usual:

Principios de Computadoras II

Curso Completo de Visual Basic 6.0

Esp. Alexis Olvany Torres ch. Datos de salida. Datos de salida. Datos de salida

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

GENERACIÓN DE CÓDIGO ORIENTADO A OBJETOS

Objetivo específico: Maneja los elementos básicos de algoritmos utilizados para resolver un problema por computadora.

Lenguaje de Programación: C++ ARCHIVOS I/O

Introducción a Sistemas Operativos: Ficheros

Especificación IEEE-754, para representar valores decimales en punto flotante de simple precisión.

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Introducción a la Computación. Herramientas Informáticas. Omar Ernesto Cabrera Rosero Universidad de Nariño

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Analizador Léxico. Programación II Margarita Álvarez. Analizador Léxico - Funciones

Administración de Archivos

INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN (WIN-LOGO)

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

PERIODO 3 HOJA DE CÁLCULO CONCEPTOS INTERMEDIOS OPERACIONES CON CELDAS, FILAS Y COLUMNAS EN EXCEL SELECCIONAR COPIAR MOVER BORRAR

Capítulo 9 Archivos de sintaxis

Guías técnicas Grupo Danysoft: Creación de Componentes en Delphi (parte II)

ESTRUCTURA SECUENCIAL ESTRUCTURA SELECTIVA

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

Lenguajes de Programación Programación funcional

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

ING1310 Introducción a la Computación. Python. Conceptos Básicos. Carlos Reveco

PRÁCTICA FUNDAMENTOS DE ALGORITMOS I. Objetivos

Los tipos de datos primitivos

UTN FRRo Algoritmos y Estructuras de Datos Bibliotecas Un ejemplo : Gestión de Pantalla, Retardo y Sonido

PRINCIPIOS DE PROGRAMACIÓN. Mtro. en Ingeniería de Software. Especialidad en e-commerce Ismael Jiménez Hernández

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 27. Verificación analítica de programas.

2.1 METODOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS

Técnicas de Programación

PLN con Python. Alejandro Pimentel

Sistemas Operativos. Dr. Wenceslao Palma M.

Transcripción:

11. ENTRADA Y SALIDA. COMUNICACION 11.1. Introducción. La utilidad y éxito de los lenguajes de programación de alto nivel se apoyan en el principio de la abstracción, consistente en ocultar los detalles, pertenecientes al computador que se está empleando para ejecutar el programa, destacando las estructuras de datos y algoritmos expresados por el programa. Corrientemente las operaciones de entrada y salida son las de mayor nivel de abtracción. Su desarrollo no sólo está vinculado a los periféricos, y el computador que se esté empleando, sino también está fuertemente vinculado al sistema operativo. El alto nivel de abstracción no es sorprendente, ya que estas operaciones inherentemente están relacionadas con dispositivos periféricos; cuya estructura, funciones y operación difieren fuertemente entre las diversas clases y marcas. Todos estos aspectos deben ser convenientemente ocultados al programador. La mayoría de los lenguajes de alto nivel han incorporado instrucciones para leer y escribir datos, en forma secuencial, sin hacer referencia a los artefactos específicos. Debe distinguirse entre entrada y salida legible e ilegible. Normalmente la entrada y salida legible se emplean para comunicar el computador con el usuario, fundamentalmente sus componentes son elementos de tipo char; excepción de ésto son la entrada y salida gráfica por puntos o pixeles. Entradas de tipo legible provienen de teclados, lectoras de tarjetas y dispositivos similares; la salida legible se envía generalmente a pantallas de terminales (displays) e impresoras. Salidas y entradas ilegibles están asociadas a la comunicación entre computadores y dispositivos de almacenamiento secundario, tales como cintas, discos, tambores. En un ambiente de control automático, la comunicación con sensores y dispositivos actuadores, también puede clasificarse como comunicación ilegible; y en general serán de igual tipo todas aquellas comunicaciones del computador con máquinas digitales controladas por éste. Los tipos de estos datos pueden ser cualesquiera, y no necesariamente de tipo char. Prof. Leopoldo Silva Bijit. 07-07-2003 139

En general, se denomina entrada y salida binaria a la ilegible; y de texto a la legible. Un programa en ejecución, es un proceso que acepta datos desde un medio externo (input) a través de instrucciones específicas; luego los manipula de acuerdo al algoritmo; y finalmente produce resultados que se escriben, también mediante instrucciones específicas, hacia un medio externo (output). 11.2 Comunicación de Computadores con el Medio Ambiente. Una visión esquemática de los procesos de comunicación legibles, es la siguiente: read write INPUT PROCESO OUTPUT La visión abstracta anterior oculta: el transporte de los datos desde y hacia el computador; los protocolos entre dispositivos y hacia el computador; las transformaciones de las representaciones internas de los datos a secuencias de elementos pertenecientes al código que es capaz de manipular cada dispositivo. Una secuencia de caracteres es una estructura de datos, que será estudiada más adelante, denominada archivo (file) secuencial. Un archivo secuencial de caracteres (legible) suele denominarse archivo de texto. Las características básicas de un archivo son: posee componentes de igual tipo (char en caso de textos); el número de sus componentes no se conoce por adelantado (cardinalidad no acotada); el modo, puede ser lectura o escritura; sólo puede agregarse componentes al final, acción de escritura; en cada instante sólo una componente es accesible, la acción de obtener un elemento se denomina lectura. 11.3 Nombres de Dispositivos y Archivos. En un sistema computacional, los archivos suelen almacenarse en dispositivos de memoria secundaria, discos generalmente. Como un disco puede almacenar una gran cantidad de archivos, éstos suelen guardarse con un nombre. Existen procedimientos, en el sistema operativo, para asignarles nombres (crearlos), borrarlos, moverlos hacia otro dispositivo, copiar zonas de memoria hacia un espacio disponible en el disco (escribirlos). Los dispositivos Prof. Leopoldo Silva Bijit. 07-07-2003 140

periféricos, orientados al carácter (teclados, pantallas, impresoras) también son reconocidos por el sistema operativo con un nombre; por esta razón suelen denominarse archivos virtuales. Debe notarse que estos dispositivos cumplen las características básicas de un archivo, mencionadas anteriormente. Los lenguajes de alto nivel, suelen ocultar casi todos los detalles relacionados con el sistema operativo y que son pertinentes a la comunicación con el medio externo. Una forma de proporcionar valores a las variables, es mediante asignaciones. Esta forma de entrada implica modificaciones al texto si se desea efectuar el proceso con otros valores de entrada. La separación de los datos del programa es una idea fundamental en programación, y permite correr un mismo programa con diferentes datos de entrada. Esto se logra mediante la instrucción read. 11.4 Modo Batch. Los datos que serán empleados, pueden confeccionarse por adelantado y ser depositados en un archivo. También los resultados, producto de las computaciones, pueden ser almacenados en un archivo. De este modo se logra una alta eficiencia del uso del computador, ya que pueden organizarse grupos de tareas similares, para ser procesadas más adecuadamente. Por ejemplo, todas las compilaciones de un lenguaje pueden desarrollarse en sucesión, cargando en memoria sólo una vez el compilador respectivo. Este modo se denomina procesamiento por tandas (batch) y suele emplearse en la manipulación de grandes volúmenes de información. En este ambiente, existen procesadores especiales para generar los archivos de entrada, suelen ser más baratos que el computador; de este modo disminuyen los costos del ingreso de datos. También los resultados impresos pueden confeccionarse después que el programa haya terminado su ejecución, a partir del archivo de resultados. 11.5 Modo Interactivo. En este modo, cuando el programa está en ejecución, un usuario enfrentado a un terminal puede introducir datos a través del teclado; y observar, casi instantáneamente, los resultados en su pantalla. Para facilitar aún más la programación en este modo, los lenguajes de alto nivel, proveen dos archivos estándar de entrada y salida. La entrada, asociada al teclado, se asume un archivo abierto para lectura; la salida, asociada a la pantalla, se asume abierta para escritura. 11.6. Nombre Lógico y Físico. Prof. Leopoldo Silva Bijit. 07-07-2003 141

Un programador puede visualizar un archivo legible, como una secuencia de caracteres. La declaración de una variable de este tipo puede efectuarse según: var x:file of char; También puede emplearse un tipo estándar que es equivalente: var x: text; Se dice que x es el nombre lógico del archivo. Y es la entidad que el programador emplea en el texto de su programa. También es necesario asociar la variable, interna al programa, con el archivo depositado en el almacenamiento secundario. Este archivo reside en el directorio con un nombre y puede ser manipulado por el sistema operativo: es decir, puede ser copiado a otra zona del disco, cambiado de nombre, eliminado, mostrado en la pantalla, enviado a la impresora; y también podrá ser manipulado por editores de texto. Esta instancia del archivo se denomina "archivo físico". El archivo es uno solo, lógico y físico se refieren a diferentes visiones de la información. 11.7. Abrir y Cerrar Archivos. En cada implementación de Pascal, existen instrucciones especiales para efectuar la asociación entre el archivo físico y el archivo lógico. Una forma de efectuarlo, es la siguiente: open(x,'<nombre>',input); {modo input} Esta instrucción abre (open en inglés) el archivo, existente en el directorio, denominado <nombre>. Y queda accesible para lectura el primer caracter de la secuencia. Debe recordarse que la secuencia sólo puede leerse de izquierda a derecha y no puede volverse atrás. Cuando se desea escribir en un archivo, se emplea: open(x,'<nombre>',output); {modo output} Después de esta instrucción se borra del directorio el archivo denominado <nombre> y se crea un espacio en blanco para depositar la secuencia. También sólo puede escribirse de izquierda a derecha y no puede volverse atrás. Después de abrir el archivo, puede intercambiarse datos entre el programa y el archivo. Prof. Leopoldo Silva Bijit. 07-07-2003 142

El identificador del nombre del archivo debe cumplir las reglas del sistema operativo. Suele estar acotado el largo del nombre, y el de la extensión. No puede abrirse un archivo que ya está abierto. Tampoco puede cambiarse de modo sin previamente cerrar el archivo. Es decir, no puede escribirse en un archivo abierto para entrada; ni tampoco, puede leerse en un archivo abierto para escritura o salida. La instrucción: close(x) cierra el archivo. La acción de cerrar un archivo asegura que la totalidad de la información escrita queda permanentemente ligada al archivo. Esto es indispensable en archivos abiertos para escritura; y para archivos en los que sólo se ha leído, y luego se desea cambiar su modo (es decir, escribir). No obstante lo anterior, los sistemas suelen cerrar automáticamente los archivos al salir del bloque en que está declarada la variable lógica correspondiente. Otras implementaciones(por ejemplo: Turbo Pascal) usan: assign(x,<nombre>) Para relacionar el nombre físico con el lógico. Otras incluyen en las instrucciones reset y rewrite el nombre físico del archivo. 11.8. Entrada y Salida Estándar. En todas las implementaciones existen dos archivos predeclarados según: var: input, output: text; Los cuales pueden usarse, sin abrirlos ni cerrarlos, y ni siquiera declararlos. Suelen estar asociados al teclado y la pantalla, respectivamente; y se denominan entrada y salida estándares. 11.9. Sintaxis. La sintaxis de las instrucciones de entrada y salida son: Prof. Leopoldo Silva Bijit. 07-07-2003 143

<entrada> ::= 'read' '('[<nombre lógico> 'input'',']{<variable>* ','}')' <salida> ::= 'write' '(' [<nom. lógico> 'output' ','] {<p.escritura>* ','} ')' Si no se coloca nombre de archivo, se asume por omisión (o defecto), los archivos input o output. <parámetro de escritura> ::= <expresión> [':' <ancho> [ ':' <decimales>] ] En el archivo output o archivos de tipo texto la expresión puede ser de tipo char, boolean, integer, real; y también puede ser un string. Como se verá este último corresponde a un tipo llamado: packed array of char. Ancho y decimales deben ser expresiones enteras. Sólo se especifica decimales para números reales. En caso de no hacerlo el número se escribirá en formato exponencial. Si no se especifica el ancho, cada implementación define un ancho por defecto para cada tipo. Los cuales pueden determinarse a través del manual o programas simples. En el caso de lectura, la variable puede ser de tipo char, integer o real. Se leen el carácter o secuencias de dígitos de acuerdo a las reglas de composición léxica para cada tipo. Más adelante se verán ejemplos que aclaran este punto. La reglas para leer y escribir en archivos que no son de texto, difieren de las anteriores, y se verán más adelante. 11.10. Estructuras de Líneas. Readln, Writeln. 11.10.1. Texto de líneas. Prof. Leopoldo Silva Bijit. 07-07-2003 144

Un archivo de texto, o secuencia de caracteres, también puede visualizarse, como una secuencia de líneas. Una línea queda delimitada por un marcador de fin de línea (eolm). Entonces: <línea> ::= { <caracter gráfico> } <eolm> <texto > ::= { <línea > } <eofm> Una línea se dice vacía si no contiene caracteres; solo contiene un eolm. Igualmente, un archivo se dice vacío si sólo contiene un eofm. El largo de una línea, es el número de caracteres que la forman y puede ser variable. Nótese que, en archivos no vacíos, debe existir un eolm antes del marcador de fin de archivo, eofm. 11.10.2. Escribir marcadores de líneas. La instrucción: writeln(x) escribe un eolm en la variable archivo de texto, declarada con el nombre lógico x. Si el archivo es output, puede escribirse: O más simplemente writeln(output); writeln; En un terminal equivale a mover el cursor, desde su posición actual, a la primera columna de la línea siguiente. La secuencia: write(ep); writeln; Puede reemplazarse por: writeln(ep) Prof. Leopoldo Silva Bijit. 07-07-2003 145

La instrucción writeln es una abreviatura de write line (escriba línea). Al cerrarse un archivo, abierto para escritura, el sistema agrega, en forma automática, un eofm (marcador de fin de archivo) después del último carácter escrito por una instrucción de salida. En archivos de texto, estructurado en líneas, conviene escribir un eolm cómo el último carácter. Prof. Leopoldo Silva Bijit. 07-07-2003 146

11.10.3. Lectura marcadores de línea. Consideremos la lectura de un archivo externo de texto, declarado con nombre lógico t; cuando se lo abre, queda disponible el primer carácter de la primera línea. A medida que se efectúan instrucciones de lectura, se van consumiendo caracteres y la posición que contiene el carácter disponible va avanzando hacia el final del archivo. Siempre habrá, en cualquier instante, una posición bien definida que contiene el siguiente carácter disponible. La instrucción: readln(t); Avanza hasta encontrar un eolm; y deja la posición disponible como el primer carácter después del eolm. Readln es una abreviatura de read line (lea línea). Si el archivo es input: readln(input); Es equivalente a: readln; La secuencia: read(variable);readln; Puede reemplazarse según: readln(variable); Readln(t) también puede interpretarse como descartar todos los caracteres desde la posición actual, hasta el final de la línea corriente, incluyendo el eolm. 11.10.4. Funciones Eoln y Eof. Para los archivos de texto, considerando su estructura de líneas, la implementación estándar de Pascal, define dos funciones que entregan un resultado de tipo booleano. Para variable t declarada de tipo text: Prof. Leopoldo Silva Bijit. 07-07-2003 147

La función end of line: UNIVERSIDAD TECNICA FEDERICO SANTA MARIA eoln(t) Entrega un valor verdadero cuando la posición actual, de lectura, es un eolm; es decir, después de leer el último caracter gráfico de la línea. En caso contrario retorna un valor false. Una línea puede tener largo 0; es decir, sin caracteres gráficos. Esto corresponde a la secuencia:...<eolm> <eolm>... Y puede haberse generado mediante la secuencia: writeln(línea anterior); writeln... El eolm no está incluido en el tipo char. Por esta razón si eoln es verdadero y si se lee una variable de tipo char, será asignado un espacio (o blanco) a dicha variable. Además eoln tomará valor falso, excepto si la siguiente línea es de largo 0; en cuyo caso, permanecerá con valor verdadero. Cuando se leen números, se descartan los blancos o espacios entre los números y también los delimitadores de fin de línea y comentarios. Después de leer el último carácter gráfico de la última línea del texto, la función: eof(t) toma valor verdadero; en caso contrario es false. Entonces, si ch es de tipo char: Es equivalente a: readln(t); while not eoln(t) do read(t,ch); read(t,ch); Las sucesivas lecturas, reescriben el valor anterior de ch; lo que es equivalente a descartar los caracteres. La última lectura, después del while, es para descartar el eolm. Prof. Leopoldo Silva Bijit. 07-07-2003 148

La instrucción read(t,ch) en un archivo de texto estructurado en líneas puede explicarse según: if eol(t) then Begin read(t,ch); ch:=' ' end else read(t,ch) 11.10.5. Copiar archivos de texto. Desarrollar un programa para copiar un archivo de texto. Asumir que el archivo fuente se llama: fuente.txt, y el destino: destino.txt. Program copia(f,d); var ch:char; f,d:text; {nombres lógicos} Procedure copielinea; while not eoln(f) do read(f,ch); write(d,ch) end;{copia caracteres gráficos} readln(f); writeln(d) {copia eolm} end; open(f,'fuente.txt',input); {se abre para lectura} open(d,'destino.txt',output); {se abre en modo escritura} while not eof(t) do copielinea end. {al salir se cierran automáticamente el fuente y el destino} Como se verá más adelante, es posible leer un string (como un packed array of char, en Pascal estándar) y emplearlos en el comando open( no estándar); haciendo más general el utilitario de copia de archivos de texto. El programa no efectúa comentarios hacia el terminal; esto puede mejorarse, agregando un mensaje inicial, para avisar que se entró a ejecutar (o interpretar) el programa copie. Además podría, por ejemplo, escribirse en el terminal un punto '.', cada 10 líneas copiadas. Prof. Leopoldo Silva Bijit. 07-07-2003 149

11.11. Sobre entrada estándar. 11.11.1. Lectura con eco. UNIVERSIDAD TECNICA FEDERICO SANTA MARIA En muchas implementaciones de Pascal, el archivo input, está diseñado para copiar los caracteres, que se digiten en el teclado, en la pantalla. Esto se denomina lectura con eco. En Pascal estándar, se asume que la lectura es sin eco. Esto es bueno, conceptualmente, ya que separa las acciones de entrada y salida. Si la lectura es sin eco, y se desea tener una realimentación visual de lo digitado en el teclado, debe emplearse la secuencia: read(variable); write(variable) Esquema que puede verse, en los ejemplos que figuran en el Report y User Manual de Pascal. En la gran mayoría de los compiladores Pascal (pero no en todos) suele predefinirse un archivo de texto estándar de entrada sin eco. Y se le da el nombre de keyboard. En este caso, la lectura de un caracter sin eco, se codificaría según: read(keyboard, ch); Pero la secuencia read, write en un archivo input con eco, produce en la pantalla un efecto distorsionante y molesto. Ya que cada caracter digitado en el teclado, figura dos veces en la pantalla. Uno es debido al eco; el otro a la instrucción write. Entonces: read(keyboard,variable); write(variable); Implementa la lectura con eco; que figura en el libro mencionado antes. 11.11.2. Programas interactivos. Se dice que la entrada es interactiva si se emplean los archivos input y output. No es interactiva si se lee y escribe en archivos externos; es el caso del programa copia, visto antes. La entrada interactiva presenta dificultades, que le son propias. Fundamentalmente, el computador no puede saber que cosa tipeará a continuación el usuario. Prof. Leopoldo Silva Bijit. 07-07-2003 150

Un read(variable) se interpreta como un cursor fijo en la pantalla. Lo cual puede ocasionar pérdidas de tiempo, y errores de entrada. Una solución es: write('prompt'); read(variable); El string debe ser lo suficientemente claro. Por lo menos debe indicar al usuario qué desea leer: Tipo de variable y rango si lo hay o el algoritmo lo requiere. Lo anterior no evita las equivocaciones que pueden cometerse al digitar la secuencia de caracteres; por esta razón siempre es conveniente agregar código para la validación de los datos de entrada. Los errores pueden ser innumerables, más aún en instalaciones que inicialicen las variables por omisión. Si el valor inicial por defecto de un número es cero, y si cuando se espera leer un dígito, se presiona una letra (y si adicionalmente no se detectan incompatibilidades de tipo) se asignará el valor cero a la variable. Una forma de evitar esto es programar a la defensiva. Planeando cuidadosamente todos aquellos segmentos, en que el usuario debe poner alguno de sus diez dedos cerca del teclado. En lectura interactiva con eco, readln se interpreta según: descartar todos los caracteres digitados, hasta presionar la tecla return. 11.11.3. Ejemplos de lectura, según tipos. Se simboliza _ como un espacio en blanco, y <cr> simboliza el eolm. Se digita: _12_345 67<cr> 8 <cr> 11.11.3.1. Variables enteras. Si a, b, c y d son variables enteras: a) read(a,b,c); readln; read(d) La variables toman los siguientes valores: a=12; b=345; c=67; d=8 Prof. Leopoldo Silva Bijit. 07-07-2003 151

Los signos igual son algebraicos. La posición del carácter disponible, queda apuntando al primer blanco después del 8. b) readln(a); readln(b); read(c) La variables quedan: a=12; b=8 y el cursor queda en la primera columna de la tercera línea, esperando leer un entero. Entonces c aún no está definido. c) readln(a,b); read(c); readln; Queda: a=12; b=345; c=8 el cursor queda en la primera columna de la tercera línea. 11.11.3.2. Entradas mixtas. Si a y b son enteros; y c y d son char. a) read(a,b,c); readln; read(d) Quedan: a=12; b=345; c=' '; d='8' b) read(a,a,a); read(c); read(d) Quedan: a=67; c=' '; d='8' {cuando se lee eolm, retorna un blanco} c) readln(a,a,a); read(c); read(d) Quedan: línea. a=67; c='8'; d=' ' el cursor apunta al último carácter gráfico de la segunda Se recomienda visualizar la pantalla estructurada en líneas; y emplear readln, cuando se desee comenzar a leer una nueva línea. Además siempre ayuda el escribir prompts, para solicitar datos. 11.11.4. Ejemplo. De Consola a Disco. Se desea copiar todo lo que se escriba en el terminal en un archivo denominado imagen.txt. Program bitacora; var ch:char; salida:text; Prof. Leopoldo Silva Bijit. 07-07-2003 152

writeln; {asegura escribir en principio de línea} writeln('lo que escriba, quedara en IMAGEN.TXT'); open(salida,'imagen.txt',output); while not eof do while not eoln do read(ch); write(salida,ch) end; readln; writeln(salida) end end. 11.11.5. Fin de archivo input. En muchos sistemas se emplea ^Z (control-z) para el carácter de fin de archivo. Esto puede obligarse, si antes del primer while se efectúa: ch:=' ' y si se reemplaza eof por ch=chr(26) (que equivale a ^Z). También puede definirse otra variable tipo char, e iniciarla con un carácter; y detener la copia cuando el último leído sea igual al definido. Si se emplea uno gráfico; sólo se copiará hasta encontrar dicho carácter. 11.12. Proceso Secuencial de Textos. En muchas oportunidades se debe realizar un proceso secuencial con las componentes de un archivo externo. Si el archivo es de texto, y la acción que se desea realizar con cada caracter ch es S; entonces, puede describirse el proceso secuencial: while not eof(t) do read(t,ch); S end Si un archivo se abre para salida, y no se escribe nada en él, antes de cerrarlo; se dice que el archivo es vacío. El esquema anterior cubre la posibilidad de procesar un archivo vacío. Prof. Leopoldo Silva Bijit. 07-07-2003 153

Si se sabe que el archivo no es vacío, el esquema anterior puede plantearse: repeat read(t,ch); S until eof(t) 11.13. Procesamiento Secuencial de Textos por Líneas. Sean: S1 las acciones a realizar al comienzo de la línea. S2 las acciones a realizar con cada carácter gráfico de la línea. S3 las acciones a realizar al final de cada línea. El esquema general de proceso, para un archivo t y un carácter ch, puede describirse según:... while not eof(t) do S1; while not eoln(t) do read(t,ch); S2 end; S3; readln(t) end;... 11.14. Ejemplo. Líneas de texto, formadas por palabras. Leer una secuencia de palabras en el terminal, hasta encontrar un punto. Escribir en un archivo externo, cada palabra de la frase en una línea aparte; el punto debe quedar en la última línea. Evidentemente, deben descartarse los espacios entre palabras. Program listapalabras; var ch:char; t:text; writeln; writeln('escriba una frase terminada en punto'); open(t,'lista.txt',output); read(ch); while ch<>'.' do while ch<>' ' do write(t,ch); read(ch) end; Prof. Leopoldo Silva Bijit. 07-07-2003 154

writeln(t); read(ch) {*} end; writeln(t,'.') end. Observaciones y notas: UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Analizar qué sucede si se omite la instrucción de lectura, destacada con el asterisco. Estudiar qué pasa si se ponen dos o más espacios entre palabras; efectuar correcciones si no se cumplen las especificaciones. Determinar si debe existir un espacio antes del punto. Efectuar asociaciones entre el espacio y punto con eolm y eofm. Efectuar el mismo programa, pero no enviar la salida hacia la pantalla. Debe leerse sin eco. Desarrollar programa que lea lista.txt y escriba la frase, en una línea, en la pantalla. 11.15.- Ejemplos. 11.15.1. Contar caracteres. Estadísticas. Desarrollar un programa que cuente los caracteres diferentes del espacio, y los espacios. Deben ignorarse los marcadores de fin de línea. Program blancos(t,output); const espacio=' '; var t:text; ch:char; blancos, noblancos: integer; blancos:=0; noblancos:=0; open(t,'archivo.txt',input); while not eof(t) do while not eoln(t) do Prof. Leopoldo Silva Bijit. 07-07-2003 155

read(t,ch); if ch=espacio then blancos:=blancos+1 else noblancos:=noblancos+1 end; readln(t) {salta fines de línea} end; writeln; writeln('blancos=',blancos); writeln('no blancos=',noblancos) end. Variantes: Contar: letras mayúsculas y minúsculas; sólo dígitos y signos de puntuación. Cambiar un carácter por otro, o por una secuencia, este tipo de programas se denominan, en general, filtros. 11.15.2. Escribir un programa que cuente caracteres gráficos y las líneas de un archivo con nombre fuente.dat. Los resultados deben escribirse en un archivo result.dat. Solución PROGRAM CONTADOR; VAR c,l : INTEGER; {c cuenta caracteres; l cuenta líneas} CAR : CHAR; F,T : FILE OF CHAR; BEGIN c:=0; l:=0; OPEN(F,FUENTE.DAT,INPUT); {abre archivo de entrada} WHILE NOT(EOF(F)) DO {lee mientras no sea fin de archivo} BEGIN WHILE NOT EOLN(F) DO {lee hasta fin de línea} BEGIN READ(F,CAR); {lee caracter a caracter} IF CAR<>' ' THEN c:=c+1 {elimina espacios} END; {y cuenta los gráficos} READLN(F); {salta línea en archivo de entrada} l:=l+1 {cuenta líneas} END; Prof. Leopoldo Silva Bijit. 07-07-2003 156

CLOSE(F); {cierra archivo de entrada} OPEN(R,RESULT.DAT,OUTPUT); {abre archivo de salida} WRITELN(R,'NUMERO DE LINEAS DEL ARCHIVO FUENTE.DAT= ',l); WRITELN(R,'NUMERO DE CARACTERES GRAFICOS= ',c:4); CLOSE(R) {cierra archivo de salida} END. 11.15.3. Lectura según tipos: Se tiene la siguiente información digitada en un teclado: 3 2_4 5<eolm> Donde <eolm> es el marcador de fin de línea. _1_5_67_8<eolm> El espacio se ha representado por : _ 9 10_<eolm> <eolm> 2_3<eolm> <eofm> Asumiendo: var a,b,c: integer; m,n: char; Determinar valores de las variables después de efectuar: a) read(a);readln(b);read(b);readln(c); b) readln(m);readln(b);readln(n); c) readln;read(a,b);read(b,a);read(m); d) read(m);read(n);read(a); Solución a) read(a) --> a=3 read(b) --> b=2 y salta de línea. read(b) --> b=1 readln(c) --> c=5 y salta de línea. luego : a=3 ; b=1 ; c=5 b) readln(m) --> m='3' y salta de línea readln(b) --> b= 1 y salta de línea readln(n) --> n='9' y salta de línea Prof. Leopoldo Silva Bijit. 07-07-2003 157

c) readln --> salta de línea (empieza lectura en la segunda) read(a,b) --> a=1 y b=5 read(b,a) --> b=67 y a=8 (se pierden valores anteriores) read(m) --> m=' ' (no lee CR) luego b=67 ; a=8 ; m=' ' d) read(m) --> m='3' read(n) --> n=' ' read(a) --> a= 2 11.15.4. Escritura según tipos: Asumiendo: var a,b,c: integer; m,n: char; Con: a:=12; b:=13; c:=5; m:='*'; n:='5'; Determinar qué escriben las siguientes líneas: a) write(c,n);writeln(a:4);write(c:5); b) write(m:3);writeln;writeln(b);write(a); c) write('*',m,n,c,n);writeln(a:4;b:3); d) write(a,a,b,a);writeln;write(3*a,2*a:5;b*c:4); Solución a) write(c,n) escribe 55 writeln(a:4) escribe a continuación de lo anterior 55 12 y salta de línea. write(c:5) escribe 5 Finalmente: 55 12 <eolm> 5 b) write(m:3) escribe * writeln salta de línea, equivale a writeln(m:3) Prof. Leopoldo Silva Bijit. 07-07-2003 158

writeln(b) escribe 13 y salta de línea write(a) escribe 12 Lo que queda: * <eolm> 13 <eolm> 12 c) write('*',m,n,c,n) escribe **555 writeln(a:4,b:3) escribe en la misma línea 12_13 y salta de línea Finalmente: **555 12_13 <eolm> d) write(a,a,b,a);writeln equivale a writeln(a,a,b,a) 12121312 <eolm> write(3*a,2*a:5,b*c:4) calcula y luego escribe 36 24 65 Lo que queda: 12121312 <eolm> 36 24 65 Prof. Leopoldo Silva Bijit. 07-07-2003 159