Entrada y Salida. Comunicación. - Departamento de Electrónica

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicació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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
INPUT ⇒
PROCESO
write
⇒
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
<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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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:
writeln(output);
O más simplemente
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
La función end of line:
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:
readln(t);
Es equivalente a:
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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;
begin
while not eoln(f) do
begin read(f,ch); write(d,ch) end;{copia caracteres gráficos}
readln(f); writeln(d)
{copia eolm}
end;
begin
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
11.11. Sobre entrada estándar.
11.11.1. Lectura con eco.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
begin
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
begin
while not eoln do
begin
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
begin 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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
begin
S1;
while not eoln(t) do
begin 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;
begin
writeln; writeln('Escriba una frase terminada en punto');
open(t,'lista.txt',output);
read(ch);
while ch<>'.' do
begin
while ch<>' ' do
begin write(t,ch); read(ch) end;
Prof. Leopoldo Silva Bijit.
07-07-2003
154
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
writeln(t);
read(ch) {*}
end;
writeln(t,'.')
end.
Observaciones y notas:
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;
begin
blancos:=0; noblancos:=0;
open(t,'archivo.txt',input);
while not eof(t) do
begin
while not eoln(t) do
begin
Prof. Leopoldo Silva Bijit.
07-07-2003
155
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 11. Entrada y Salida. Comunicación.
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
Descargar