Algunas facilidades útiles provistas por Turbo Pascal

Anuncio
Elementos de Programación / UNS / Prof. Carlos Chesñevar
1
Algunas facilidades útiles provistas por Turbo Pascal
1. Uso de IOResult para manejo de archivos
El pequeño programa que se muestra abajo ilustra un uso interesante de ¨directivas¨ especiales del
compilador provisto por Turbo Pascal. Al escribir una sentencia S de entrada/salida entre las directivas
{$I-} y {$I+}, el resultado es que en caso de existir algún error en tiempo de corrida del programa, éste
no se detendrá. Existe una variable especial, denominada IOResult (provista por Turbo Pascal), cuyo
valor será 0 si la sentencia S fue ejecutada exitosamente, y será distinto de 0 si la ejecución no fue
exitosa.
Ejemplo: ejecutar
Assign(F,NomArch);
reset(F)
genera error si el archivo externo NomArch asignado a F no existe en el disco. En cambio, escribiendo:
{$I-}
Assign(F,NomArch);
reset(F);
{$I+}
writeln(IoResult)
no se producirá ningún tipo de error. Sin embargo, si el archivo NomArch existe, IOResult valdrá 0.
Caso contrario, tendrá un valor distinto de 0.
Program P;
{ Permite manejar varios archivos externos diferentes, asociados a distintos nombres en el
disco. El archivo logico utilizado siempre es F}
Type
TArchivoEnteros = file of integer;
TCadena = string;
Var
Opcion:char;
F:TArchivoEnteros; { F es un archivo de valores enteros}
{*********************************************************************************************}
Procedure MostrarArchivo(VAR F:TArchivoEnteros);
{ Muestra en pantalla un archivo F de enteros }
Var Elto:integer; NomArch:TCadena;
Begin
write('Ingrese nombre del archivo que quiere mostrar: ');
readln(NomArch);
{$I-}
Assign(F,NomArch); { Se asocia el nombre NomArch a F}
reset(F);
{$I+}
If IOResult <> 0 { Hubo algun problema ? Si lo hubo,es porque el archivo no podia abrirse}
then
writeln('Error. Archivo inexistente!')
else { Si IOResult vale 0, entonces se puede leer el archivo F con tranquilidad... }
Begin
While not eof(F)
do
begin
read(F,Elto);
write(Elto,' ');
end;
Elementos de Programación / UNS / Prof. Carlos Chesñevar
writeln; { Se muestran todos los eltos uno al lado del otro, separados por blancos}
end;
End;
{*********************************************************************************************}
Procedure GenerarArchivo(VAR F:TArchivoEnteros);
{Permite crear un archivo F en el disco. F estara asociado a un archivo externo NomArch,
donde NomArch es un nombre dado por el usuario }
Var
NomArch:TCadena; SeCreaArchivo:boolean; Rta:char; Elto:integer;
Begin
write('Ingrese nombre del archivo que quiere generar: ');
readln(NomArch);
{$I-}
Assign(F,NomArch); { Con esto verifico si NomArch no es un nombre que ya existe ...}
reset(F);
{$I+}
SeCreaArchivo:=false;
If IOResult = 0 {Si ya existia, entonces le aviso al usuario para que decida que hacer }
then
Begin
writeln(' Atencion! Ese archivo ya existe!!');
write(' Desea reemplazarlo por otro nuevo? (s/n)');
readln(Rta);
If Rta='s' {Se reescribira el archivo y se creara uno nuevo }
then
Begin
writeln(' Ok. El archivo preexistente sera borrado');
SeCreaArchivo:=true;
End
else
writeln(' Ok. Elija alguna otra opcion....')
End
else { IOResult no es 0,es decir, hubo error al hacer reset(F). Luego, F aun no existe}
SeCreaArchivo:=true;
If SeCreaArchivo
then
Begin
rewrite(F); { Se hace rewrite, y se ingresan los elementos de F...}
Repeat
writeln('Ingrese componentes, -1 = terminar');
readln(Elto);
If Elto<>-1
then write(F,Elto);
Until (Elto=-1);
Close(F);
End;
End; {GenerarArchivo}
{*********************************************************************************************}
Begin {programa principal}
Repeat
writeln('* * * Manejo de archivos de enteros * * *');
writeln('1 - Generar archivo de enteros ');
writeln('2 - Mostrar archivo de enteros ');
writeln('3 - Salir');
2
Elementos de Programación / UNS / Prof. Carlos Chesñevar
3
write('Su opcion:');
repeat
readln(Opcion);
until Opcion in ['1'..'3'];
Case Opcion of
'1': GenerarArchivo(F);
'2': MostrarArchivo(F);
End;
Until Opcion='3';
End.
2. Procedimientos y funciones útiles provistos por la unidad CRT
La unidad CRT.TPU, provista por los fabricantes de Turbo Pascal, brinda procedimientos y funciones
para manipular la pantalla (CRT = catodic ray tube = tubo de rayos catódicos). Dos de ellos son ClrScr
(=clear screen, borrar pantalla) y GotoXY.
El procedimiento ClrScr simplemente borra la pantalla. El procedimiento GotoXY tiene dos parámetros
x e y, correspondientes a una columna y una fila en la pantalla (la pantalla de la computadora puede
pensarse como una matriz cuyas columnas van de 1 a 80, y sus filas de 1 a 24). La invocación
GotoXY(3,4) posiciona el cursor, para que la próxima sentencia write imprima a partir de la columna 3
y fila 4. El siguiente programa borra la pantalla, e imprime en el centro (aproximadamente) un cartel:
Program P;
Uses Crt;
Begin
ClrScr;
GotoXY(30,10); write(' Esto esta ');
GotoXY(30,11); write(' Al medio de');
GotoXY(30,12); write(' la pantalla');
End.
Esto está
Al medio de
la pantalla.
También pueden utilizarse variables de tipo integer como parámetros para GotoXY, como se muestra en
el programa Escalera (ejemplo abajo). Otras funciones útiles provistas por Crt son la función booleana
Keypressed (devuelve TRUE si se pulsa una tecla, y false en caso contrario), y la función ReadKey,
que espera a que el usuario pulse una tecla, y devuelve el caracter correspondiente a la tecla pulsada. El
procedimiento DelLine (sin parámetros), borra la línea en la cual se encuentra ubicada el cursor
(recordemos que el cursor puede ser posicionado en un lugar cualquiera usando GotoXY). Ejemplos:
Program Escalera;
Uses Crt;
Var i:integer;
Begin
ClrScr;
For i:=1 to 10
do
Begin
GotoXY(i,i); write(i)
End;
End.
Program Urgente;
Uses Crt;
Begin
Repeat
write(´Pulsa algo!!´);
Until KeyPressed;
End.
Program LeerLetra;
uses Crt;
var C: Char;
begin
Writeln('Pulse una tecla');
C := Readkey;
Writeln(' Ud. apreto la ', C);
end.
Elementos de Programación / UNS / Prof. Carlos Chesñevar
Program Borrado;
Uses Crt;
Var i:integer;
Begin
ClrScr;
For i:=1 to 8
do writeln(i);
GotoXY(1,3);
(*se ubica el cursor en fila 3*)
DelLine;
End.
1
2
resultado:
4
5
6
7
8
4
Descargar