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