introducción a la programación con objectpascal-ok

152
Introducción a la programación con Object Pascal Free Pascal / Lazarus Escrito por: Motaz Abdel Azeem Editado por: Pat Anderson, Jason Hackney code.sd 30 Agosto 2012

Upload: eduardo-lopez

Post on 07-Nov-2015

66 views

Category:

Documents


50 download

DESCRIPTION

Tutorial para iniciar a programar con Object Pascal

TRANSCRIPT

  • Introduccin a laprogramacin

    conObject Pascal

    Free Pascal / Lazarus

    Escrito por: Motaz Abdel AzeemEditado por: Pat Anderson, Jason Hackney

    code.sd

    30 Agosto 2012

  • IntroduccinEste libro est escrito para los programadores que quieran aprender el lenguaje Object Pascal. Tambin es adecuado como primer libro de programacin para estudiantes nveles y no programadores. Adems del lenguaje Object Pascal, se tratan tcnicas de programacin en general.

    El lenguaje Object Pascal

    La primera aparicin del lenguaje Pascal que di apoyo a la programacin orientada a objetos fu realizado en 1983 por la compaa de computadoras Apple. Despus, Borland di soporte a la programacin orientada a objetos a su famosa lnea Turbo Pascal.

    Object Pascal es un lenguaje hbrido de propsito general (programacin orientada a objetos y estructurada). Puede ser utilizado para una amplia gama de aplicaciones tales como el aprendizaje, desarrollo de juegos, aplicaciones de negocios, aplicaciones de Internet, aplicaciones de comunicacin, el desarrollo de herramientas y ncleos del sistema operativo.

    Delphi

    Tras el xito de Turbo Pascal, Borland decidi portarlo a Windows e introdujo la tecnologa de componentes para ello. Delphi pronto se convirti en la mejor herramienta RAD (Rapid ApplicationDevelopment) herramienta de ese momento.

    La primera versin de Delphi fue lanzado en 1995 con un completo conjunto de componentes y paquetes que soportaban Windows y el desarrollo de base de datos en las aplicaciones

    Free Pascal

    Despus de que Borland abandon el soporte para la lnea Turbo Pascal , el equipo de Free Pascal comenz un proyecto de cdigo abierto para escribir desde cero un nuevo compilador compatible con Turbo Pascal y luego con Delphi. Esta vez, el compilador Free Pascal estaba apuntando a otras plataformas y sistemas operativos, como Windows, Linux, Mac, ARM, y WinCE.

    La versin 1.0 del compilador Free Pascal fue lanzado en julio de 2000.

    Lazarus

    Free Pascal es un compilador, y carece de un entorno de desarrollo integrado (IDE) similar al IDE de Delphi para Windows. El proyecto Lazarus se inici para proporcionar un IDE para Free Pascal. Proporciona un editor de cdigo fuente, un depurador, y contiene una gran cantidad de marcos, paquetes y libreras de componentes similares al IDE de Delphi.

    La versin 1.0 de Lazarus fu publicada en agosto de 2012, pero hay una gran cantidad de aplicaciones desarrolladas con las versiones anteriores (beta) de Lazarus. Una gran cantidad de voluntarios escribieron paquetes y componentes de Lazarus, y la comunidad sigue creciendo.

    I

  • Caractersticas de Object Pascal

    Object Pascal es un lenguaje muy sencillo y fcil de leer para los principiantes, sus compiladores son muy rpidos, y las aplicaciones que produce son fiables, rpidas y se pueden comparar con C y C + +. Se pueden escribir aplicaciones grandes y robustas con su IDE (Lazarus y Delphi) sin complejidad.

    Autor: Motaz Abdel Azeem

    Me gradu en la Universidad de Ciencia y Tecnologa de Sudn en 1999. y comenc a aprender Pascal como segunda lengua despus de BASIC. Desde entonces, lo he estado usando continuamente, y me parece una herramienta muy sencilla de usar y de gran alcance, especialmente despus de estudiar C y C + +. Luego me mud a Delphi. Desde entonces he estado usando Delphi y Lazarus para la mayora de mis aplicaciones. Yo vivo en Jartum. Mi trabajo actual es desarrollador de software.

    :CreditosPrimer Editor:

    Pat Anderson se gradu de la Western Washington State College en 1968 y en la Escuela de Derecho de Rutgers en 1975. Se desempea como Abogado de la Ciudad de Snoqualmie, Washington. Pat comenz a programar en un modelo de Radio Shack TRS-80 III en 1982 con intrprete BASIC incorporado, pero pronto descubri Turbo. l ha sido propietario de todas las versiones de Turbo Pascal desde la 4,0 a la 7,0, y todas las versiones de Delphi desde la 1,0 a la 4,0.Pat tom un descanso de la programacin a partir de 1998 hasta 2009, cuando se encontr con Free Pascal / Lazarus, que reaviv su pasin por la programacin.

    Segundo Editor

    Jason Hackney es un graduado de la Escuela de Aviacin de la Universidad de Western Michigan.l trabaja a tiempo completo como piloto profesional para una empresa de energa con sede en el sudeste de Michigan. Jason ha sido un ocasional programador desde su primer contacto con el Commodore 64 por el ao 1984. Una breve introduccin del Turbo Pascal en 1990, recientemente reaviv su latente inters por la programacin despus de descubrir Linux, Lazarus, y Free Pascal.

    Traductores: http://www.clubdelphi.com

    mightydragonlorFAUSTMAXIUMAL GONZALEZrretamarchampy

    Esta edicin:

    Eduardo O. Lpez Garca

    Licencia:

    II

  • CC by http://creativecommons.org/licenses/by/3.0/deed.es

    Entorno para los ejemplos del libro

    Vamos a utilizar Lazarus y Free Pascal para todos los ejemplos de este libro. Usted puede obtener elIDE Lazarus, incluyendo el compilador Free Pascal, desde este sitio: http://lazarus.freepascal.org

    Si est usando Linux, entonces usted puede conseguir Lazarus en el repositorio de software. En Ubuntu desde la consola se puede utilizar el comando:

    sudo apt-get install lazarus

    En Fedora puede usar el comando:

    yum install lazarus

    En Mandriva (o Mageia), puede usar el comando:

    urpmi lazarus

    Windows, Mac y BSD descargar desde:

    Compilador: http://sourceforge.net/projects/freepascalRAD/IDE: http://sourceforge.net/projects/lazarus/?

    Lazarus es una aplicacin gratuita y de cdigo abierto. Y est disponible en muchas plataformas. Las aplicaciones escritas en Lazarus se pueden volver a compilar en otra plataforma para producir ejecutables para la misma. Por ejemplo, si usted escribe una aplicacin que utiliza Lazarus en Windows, y desea producir un ejecutable de esa aplicacin para Linux, slo tiene que copiar el cdigo fuente a Lazarus en Linux, y compilarlo.

    Lazarus produce aplicaciones que son nativas (compiladas) de cada sistema operativo, y no requiereninguna librera adicional o mquinas virtuales. Por esa razn, es fcil de implementar y rpido en su ejecucin.

    Usando modo texto

    Todos los ejemplos en los primeros captulos de este libro sern las aplicaciones de consola (aplicaciones en modo texto / aplicaciones de lnea de comandos), ya que son estndares y fciles de entender. Las aplicaciones con interfaz grfica de usuario se introducirn en captulos posteriores.

    III

  • IndiceIntroduccin.........................................................................................................1Captulo Uno........................................................................................................1

    Lo bsico del lenguaje.........................................................................................1Nuestra primera Aplicacin..............................................................................2

    Otros ejemplos.............................................................................................4Variables..........................................................................................................6Subtipos.........................................................................................................10

    Bifurcaciones condicionales...........................................................................11La condicin If............................................................................................11

    Programa aire acondicionado:................................................................11Programa peso.......................................................................................13

    Declaracin Case .. of................................................................................15Programa restaurante............................................................................15

    Programa restaurante usando la condicin If ........................................15Programa grados de estudiantes............................................................16

    Programa teclado...................................................................................17Ciclos.............................................................................................................19

    El ciclo for..................................................................................................19Tabla de multiplicar usando el ciclo for .................................................20

    Programa factorial .................................................................................21Ciclo Repeat Until.......................................................................................22

    Programa restaurante usando el ciclo Repeat .......................................22Ciclo While.................................................................................................24

    Programa factorial usando el ciclo while ...............................................24Strings............................................................................................................25

    Funcin Copy..............................................................................................28Procedimiento Insert..................................................................................29

    Procedimiento Delete.................................................................................30Funcin Trim...............................................................................................30

    Funcin StringReplace................................................................................31Arreglos..........................................................................................................33

    Registros........................................................................................................36Archivos.........................................................................................................37

    Archivos de texto.......................................................................................38Leer un archivo de texto.........................................................................39

    Creando y escribiendo en un archivo de texto.......................................41Agregando en un archivo de texto.............................................................43

    Programa agregando en un archivo de texto.........................................43Archivos de acceso aleatorio......................................................................44

    Archivos con tipo........................................................................................44Programa de notas.................................................................................45

    Leyendo notas de estudiantes................................................................46Programa agregando notas de alumnos.................................................46

    Programa crear y agregar notas de alumnos.........................................48Programa base de datos de automoviles...............................................49

    Copiando archivos......................................................................................50Copiar archivos usando file of byte........................................................51

    Archivos sin tipo.........................................................................................53

    IV

  • Programa copiar archivos usando archivos sin tipo................................53Programa mostrar contenido de archivo................................................55

    Fecha y Hora..............................................................................................56Comparacin Fecha/Hora...........................................................................59

    Programa grabador de noticias..............................................................60Constantes.....................................................................................................61

    Programa consumo de combustible.......................................................61Tipos ordinales...............................................................................................62

    Conjuntos (Sets)............................................................................................63Manejo de excepciones..................................................................................66

    Declaracion Try except...............................................................................66Try finally....................................................................................................67

    Programa de divisin usando el mtodo try finally:................................68Elevando una excepcin............................................................................68

    Ejemplo:.................................................................................................69Captulo Dos......................................................................................................70

    Programacin Estructurada..............................................................................70Introduccin...................................................................................................71

    Procedimientos..............................................................................................71Parmetros.....................................................................................................72

    Programa de restaurante usando procedimientos..................................74Funciones.......................................................................................................75

    Usando funciones en el programa Restaurante......................................76Variables locales............................................................................................77

    Aplicacin: base de datos de noticias (News database).........................79Funciones como parmetros de entrada........................................................82

    Paramtros de salida en procedimientos o funciones....................................83Paso de parmetros por referencia................................................................85

    Unidades........................................................................................................87Unidades en Lazarus y Free Pascal................................................................91

    Unidades escritas por el programador.......................................................91Calendario Islmico Hejri........................................................................93

    Sobrecarga (overloading) de procedimientos y funciones.............................96Valores por defecto para los parmetros.......................................................97

    Ordenando datos (data sorting).....................................................................98Algoritmo de ordenacin por burbuja.........................................................98

    Ordenando la lista de estudiantes por sus calificaciones.....................100Algoritmo de ordenacin por seleccin................................................101

    Algoritmo de ordenacin Shell.............................................................103Ordenando cadenas (strings)...................................................................105

    Ordenando a los estudiantes por nombre............................................105Comparando los algoritmos de ordenacin.................................................106

    Captulo 3........................................................................................................110La interfaz grfica............................................................................................110

    Introduccin.................................................................................................111La primera aplicacin GUI............................................................................111

    Segunda aplicacin GUI...............................................................................117Aplicacin Lista de objetos..........................................................................118

    Aplicacin de edicin de texto.....................................................................119Aplicacin de noticias..................................................................................122

    V

  • Aplicacin con un segundo formulario.........................................................123Captulo 4........................................................................................................124

    Programacin Orientada a Objetos..................................................................124Introduccin.................................................................................................125

    Objeto = Cdigo + Datos.............................................................................125Primer ejemplo: Fecha y Hora..................................................................125

    Aplicacin de noticias en Pascal Orientado a Objetos..........................130Aplicacin Cola.....................................................................................136

    Archivo orientado a objetos.........................................................................140Copiar archivos usando TFileStream........................................................141

    Herencia.......................................................................................................142

    VI

  • Captulo Uno

    Lo bsico del lenguaje

    1

  • Nuestra primera Aplicacin

    Una vez que Lazarus est instalado y en funcionamiento, podemos empezar un nuevo programa en el men principal:

    Project/New Project/Program

    Podremos ver este cdigo en la ventana del editor de cdigo fuente:

    program Project1;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    {$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

    beginend.

    Podemos guardar este programa haciendo click en File/Save desde el menu principal, y entonces darle un nombre como por ejemplo, first.lpi.

    Entonces podemos escribir estas lneas entre las declaraciones begin y end:

    Writeln('Esto es Free Pascal y Lazarus'); Writeln('Presione la tecla Enter para cerrar'); Readln;

    El cdigo fuente completo ser:

    program first;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    {$IFDEF WINDOWS}{$R first.rc}{$ENDIF}

    begin Writeln('Esto es Free Pascal y Lazarus');

    2

  • Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    La declaracin Writeln muestra texto en la pantalla (consola de windows). Readln detiene la ejecucin para permitir al usuario leer el texto mostrado hasta que el/ella presione la tecla enter paracerrar la aplicacin y retornar al IDE Lazarus.

    Para ejecutar la aplicacin presione F9 o haga click sobre el botn:

    Despus de ejecutar el programa first, debemos obtener la siguiente salida:

    Esto es Free Pascal y LazarusPresione la tecla Enter para cerrar

    Si usamos Linux, nos encontraremos con un nuevo archivo llamado (first) en un directorio de programa y en Windows tendremos un archivo llamado first.exe. Ambos archivos se pueden ejecutar directamente haciendo doble clic con el ratn. El archivo ejecutable se puede copiar a otrosordenadores para funcionar sin la necesidad de la IDE de Lazarus.

    NotasSi la ventana de aplicacin de consola no aparece, podemos deshabilitar la depuracin en el men de Lazarus:

    Environment/Options/DebuggerEn Debugger type and path seleccione (None)

    3

  • Otros ejemplos

    En el programa anterior cambie esta lnea:

    Writeln('Esto es Free Pascal y Lazarus');

    por esta:

    Writeln('Este es un nmero: ', 15);

    Luego presione F9 para ejecutar la aplicacin.

    Debera obtener este resultado:

    Este es un nmero: 15

    Cambie la linea previa por la siguientes y ejecute la aplicacin cada vez:

    Cdigo:

    Writeln('Este es un nmero: ', 3 + 2);

    Salida:

    Este es un nmero: 5

    Cdigo:

    Writeln('5 * 2 = ', 5 * 2);

    Salida:

    5 * 2 = 10

    Codigo:

    Writeln('Este es un nmero real: ', 7.2);

    Salida:

    Este es un nmero real: 7.2000000000000E+0000

    Cdigo:

    Writeln('Uno, Dos, Tres : ', 1, 2, 3);

    4

  • Salida:

    Uno, Dos, Tres : 123

    Cdigo:

    Writeln(10, ' * ', 3 , ' = ', 10 * 3);

    Salida:

    10 * 3 = 30

    Podemos escribir diferentes valores en la declaracin Writeln cada vez y ver el resultado. Esto nos ayudar a entenderlo clramente.

    5

  • Variables

    Las variables son contenedores de datos. Por ejemplo cuando decimos que X = 5, , significa que X es una variable y el valor de su contenido es 5.

    Object Pascal es un lenguaje fuertemente tipapdo, esto quiere decir que deber declarar el tipo de variable antes de poder poner un valor dentro de ella. Si declaramos X como Integer, significa que slo podremos asignar nmeros enteros a X durante el tiempo de vida de la aplicacin.

    Ejemplos de declaracin y uso de variables:

    program FirstVar;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    var x: Integer;begin x:= 5; Writeln(x * 2); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Obtendremos 10 como valor de salida de la aplicacin.

    Note que usamos la palabra reservada var , la que indica que las lneas siguientes sern declaraciones de variables:

    x: Integer;

    Esto significa dos cosas:1. El nombre de variable es X; y2. el tipo de esta variable es Integer, que puede contener slo nmeros enteros sin fracciones.

    Tambin puede tener valores negativos y los valores positivos. .

    Y la declaracin:

    x:= 5;

    significa poner el valor 5 en la variable X.

    En el siguiente ejemplo hemos agregado la variable Y:

    6

  • var x, y: Integer;begin x:= 5; y:= 10; Writeln(x * y); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    La salida de la aplicacin previa es:

    50Presione la tecla Enter para cerrar

    50 es el resultado de la frmula (x * y).

    En el siguiente ejemplo introduciremos un nuevo tipo de dato llamado character:

    var c: Char;begin c:= 'M'; Writeln('Mi primera letra es: ', c); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Este tipo slo puede contener una letra o nmero tomado como caracter alfanumrico no como valor.

    En el siguiente ejemplo introducimos el nmero tipo real, que puede poseer parte decimal:

    var x: Single;begin x:= 1.8; Writeln('La capacidad del motor de mi auto es ', x, ' litros'); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Para escribir aplicaciones mas flexibles e interactivas, necesitamos aceptar ingresos del usuario. Porejemplo podramos pedirle al usuario que introduzca el nmero y a continuacin obtener este nmero mediante el uso del procedimiento Readln:

    var x: Integer;begin Write('Por favor introduzca un nmero:');

    7

  • Readln(x); Writeln('Ha introducido: ', x); Writeln('Presione la tecla enter para cerrar'); Readln;end.

    En este ejemplo, la asignacin del valor a X se realiza a travs del teclado en lugar de asignar un valor constante en la aplicacin.

    En el siguiente ejemplo se muestra una tabla de multiplicar para un nmero introducido por el usuario:

    program MultTable;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    var x: Integer;begin Write('Por favor introduzca un nmero:'); Readln(x); Writeln(x, ' * 1 = ', x * 1); Writeln(x, ' * 2 = ', x * 2); Writeln(x, ' * 3 = ', x * 3); Writeln(x, ' * 4 = ', x * 4); Writeln(x, ' * 5 = ', x * 5); Writeln(x, ' * 6 = ', x * 6); Writeln(x, ' * 7 = ', x * 7); Writeln(x, ' * 8 = ', x * 8); Writeln(x, ' * 9 = ', x * 9); Writeln(x, ' * 10 = ', x * 10); Writeln(x, ' * 11 = ', x * 11); Writeln(x, ' * 12 = ', x * 12); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Tenga en cuenta que en el ejemplo anterior todo el texto entre comillas simples (') se muestra en la ventana de la consola tl como es, por ejemplo:

    ' * 1 = '

    Las variables y expresiones que se escriben sin comillas simples se evalan y se escribe como valores.

    Vea las diferencias entre las dos declaraciones siguientes:

    8

  • Writeln('5 * 3'); Writeln(5 * 3);

    El resultado de la primera declaracin es:

    5 * 3

    El resultado de la segunda es evaluado y luego mostrado:

    15

    En el siguiente ejemplo, haremos operaciones matemticas con dos nmeros (x, y), y vamos a asignar el resultado en una tercera variable (Res):

    var x, y: Integer; Res: Single;begin Write('Ingrese un nmero: '); Readln(x); Write('Ingrese otro nmero: '); Readln(y); Res:= x / y; Writeln(x, ' / ', y, ' = ', Res); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Como la operacin de divisin, podra dar lugar a un nmero con una fraccin, hemos declarado la variable Resultado (Res) como un nmero real (Single). Single significa un nmero real con punto flotante de simple precisin.

    9

  • Subtipos

    Hay muchos subtipos para las variables, por ejemplo los subtipos de numeros enteros difieren en el nmero de bytes requeridos para almacenarse en memoria y los valores que son capaces de almacenar:

    La tabla siguiente contiene tipos enteros, rango de valores que admiten y los bytes que ocupan en memoria:

    Size in BytesMax ValueMin valueType

    12550Byte

    1127-128ShortInt

    232767-32768SmallInt

    2655350Word

    42147483647-2147483648Integer

    42147483647-2147483648LongInt

    442949672950Cardinal

    89223372036854775807-9223372036854780000Int64

    Podemos obtener los valores mximos y mnimos que cada tipo puede almacenar mediante las funciones Low, High respectivamente, y el tamao que ocupan en memoria mediante la funcin SizeOf , tl como se muestra en el siguiente ejemplo:

    program Types;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes;

    begin Writeln('Byte: Tamao = ', SizeOf(Byte), ', Valor mnimo = ', Low(Byte), ', Valor mximo = ', High(Byte));

    Writeln('Integer: Tamao = ', SizeOf(Integer), ', Valor mnimo = ', Low(Integer), ', Valor mximo = ', High(Integer));

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    10

  • Bifurcaciones condicionales

    Una de las caractersticas ms importantes de dispositivos inteligentes (como ordenadores, dispositivos programables) es que pueden tomar acciones acordes a diferentes condiciones. Esto se puede hacer mediante el uso de bifurcacin condicional. Por ejemplo, algunos coches cierran la puerta cuando la velocidad alcanza o supera los 40 K / h. La condicin en este caso ser:

    If velocidad es >= 40 and puertas estn desbloqueadas, then lock door.

    Automviles, lavadoras, y muchos otros dispositivos contienen circuitos programables como microcontroladores o procesadores pequeos como ARM. Tales circuitos pueden programarse usando Asembler, C o Free Pascal de acuerdo a su arquitectura.

    La condicin If

    La declaracin del condicional if es muy sencilla y clara. En el ejemplo siguiente decidiremos si se debe encender el aire acondicionado o n, de acuerdo a la temperatura ambiente introducida:

    Programa aire acondicionado:

    var Temp: Single;begin Write('Por favor ingrese la temperatura de esta habitacin:'); Readln(Temp); if Temp > 22 then Writeln('Por favor encienda el aire acondicionado') else Writeln('Por favor apague el aire acondicionado'); Write('Presione la tecla Enter para cerrar'); Readln;end.

    Hemos introducido la declaracin if then else , en este ejemplo: Si la temperatura es mayor que 22 entonces mostrar la primer sentencia

    Por favor encienda el aire acondicionado

    si no, (temperatura menor o igual a 22), entonces mostrar esta lnea:

    Por favor apague el aire acondicionado

    Podemos escribir mltiples condiciones tales como:

    11

  • var Temp: Single;begin Write('Por favor ingrese la temperatura de esta habitacin:'); Readln(Temp); if Temp > 22 then Writeln('Por favor encienda el aire acondicionado') else if Temp < 18 then Writeln('Por favor apague el aire acondicionado') else Writeln('Do nothing');

    Puede probar el ejemplo anterior con diferentes valores de temperatura para observar los resultados.

    Podemos hacer las condiciones mas complejas para que sea mas til:

    var Temp: Single; ACIsOn: Byte;begin Write('Por favor ingrese la temperatura de esta habitacin: '); Readln(Temp); Write(' Est el aire acondicionado encendido? (1 = Encendido,', '0 = Apagado')); Readln(ACIsOn);

    if (ACIsOn = 1) and (Temp > 22) then Writeln('No hacer nada, necesitamos seguir refrigerando') else if (ACIsOn = 1) and (Temp < 18) then Writeln('Por favor apague el aire acondicionado') else if (ACIsOn = 0) and (Temp < 18) then Writeln('No hacer nada, sigue haciendo fro') else if (ACIsOn = 0) and (Temp > 22) then Writeln('Por favor encienda el aire acondicionado') else Writeln('Por favor ingrese un valor vlido'); Write('Presione la tecla Enter para cerrar'); Readln;end.

    En el ejemplo anterior hemos usado la nueva palabra (and) que significa que si la primera condicines verdadera (ACIsOn = 1), y tambin lo es la segunda (Temp > 22), entonces ejecuta la declaracin Writeln. Si una o ambas de las condiciones es falsa saltar a la siguiente parte.

    Si por ejemplo, el aire acondicionado est conectado a una computadora mediante un puerto serial entonces podemos activarlo o desactivarlo desde esa aplicacin usandoutilizando procedimientos depuerto serie o componentes que lo realicen. En este caso necesitamos agregar parmetros adicionales para la condicin if, como por cuanto tiempo ha estado operando el aire acondicionado. Si excede el tiempo permitido (por ejemplo 1 hora) entonces se debe desactivar independientemente

    12

  • de la temperatura ambiente. Tambin podemos considerar la tasa de prdida de fro, si es muy lenta (por la noche), entonces podramos mantenerlo apagado por ms tiempo.

    Programa peso

    En este ejemplo, se solicita al usuario que introduzca su altura en metros, y el peso en Kilos. Entonces el programa calcular el peso adecuado para esa persona de acuerdo a los datos introducidos y, a continuacin, le dir a l/ella los resultados:

    program Weight;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    var Height: Double; Weight: Double; IdealWeight: Double;begin Write('Cul es su altura en metros ? (por ejemplo 1,8 metros):'); Readln(Height); Write(' Cul es su peso en kilos ?: '); Readln(Weight); if Height >= 1.4 then IdealWeight:= (Height - 1) * 100 else IdealWeight:= Height * 20;

    if (Height < 0.4) or (Height > 2.5) or (Weight < 3) or (Weight > 200) then begin Writeln('Valores no vlidos'); Writeln('Por favor, introduzca los valores adecuados'); end else if IdealWeight = Weight then Writeln('Su peso es adecuado') else if IdealWeight > Weight then Writeln('Usted est bajo de peso, usted necesita ', Format('%.2f', [IdealWeight - Weight]), ' Kilos mas') else Writeln('Usted tiene sobrepeso, necesita perder ', Format('%.2f', [Weight - IdealWeight]), ' Kilos');

    Write('Presione la tecla Enter para cerrar'); Readln;

    13

  • end.

    En este ejemplo hemos usado nuevas palabras clave:

    1. Double: que es similar a Single. Ambos son nmeros reales, pero Double es de punto flotante de doble precisicin, y ocupa 8 bytes en memoria, mientras que Single slo ocupa 4bytes.

    2. La segunda nueva palabra clave es (Or) y la hemos utilizado para comprobar si una de las condiciones se cumple o no. Si una de las condiciones se cumple entonces se ejecuta la instruccin. Por ejemplo: Si la primer condicin (Height < 0.4) devuelve verdadero (True) ,entonces la sentencia Writeln es llamada: Writeln('Valores no vlidos'); . Si la primera condicin devuelve falso (False) entonces comprobar la segunda, etc. Si todas las condiciones devuelven False ir a la proxima sentencia.

    3. Hemos utilizado las palabras clave begin end con la sentencia if para tomar varias declaracines como si fuese una, begin end agrupa mltiples sentencias que deben ser considerados como un bloque (declaracin), entonces varias sentencias podran ser ejecutadas por si condicin. Mire estas dos declaraciones

    Writeln('Valores invlidos'); Writeln('Por favor, introduzca los valores adecuados ');

    Estas han sido convertidas a una sola declaracin mediante el uso de begin end:

    if (Height < 0.4) or (Height > 2.5) or (Weight < 3) or (Weight > 200) then begin Writeln('Valores invlidos'); Writeln('Por favor, introduzca los valores adecuados '); end

    4. Hemos utilizado el procedimiento Format, que muestra los valores en un formato especfico.En este caso se necesita mostrar slo 2 dgitos despus del punto decimal. Tenemos que

    aadir la unidad SysUtils a la clusula uses para poder utilizar esta funcin.

    Cul es su altura en metros ? (por ejemplo 1,8 metros): 1.8 Cul es su peso en kilos ? : 60.2Usted est bajo de peso, usted necesita 19.80 Kilos mas

    Nota:Este ejemplo puede no ser fiable al 100%. Puede buscar en la web para el clculo del peso en detalle. Nosotros slo pretendemos explicar cmo el programador podra solucionar estos problemas y hacer un buen anlisis de la materia para producir aplicaciones confiables.

    14

  • Declaracin Case .. of

    Existe otro mtodo para la ramificacin condicional, que es la declaracin Case .. Of. Se ramifica ejecucin de acuerdo con el valor ordinal del caso. El programa del restaurante ilustra el uso de la declaracin case of :

    Programa restaurante

    var Meal: Byte;begin

    Writeln('Bienvenido al Restaurante Pascal. Por favor, seleccione su orden'); Writeln('1 - Pollo (10$)'); Writeln('2 - Pescado (7$)'); Writeln('3 - Carne (8$)'); Writeln('4 Ensalada (2$)'); Writeln('5 Jugo de naranja (1$)'); Writeln('6 Leche (1$)'); Writeln; Write('Por favor ingrese su eleccin: '); Readln(Meal);

    case Meal of 1: Writeln('Ud. ha ordenado pollo,', ' esto tardar 15 minutos'); 2: Writeln('Ud. ha ordenado Pescado, esto tardar 12 minutos'); 3: Writeln('Ud. ha ordenado Carne, esto tardar 18 minutos'); 4: Writeln('Ud. ha ordenado Ensalada, esto tardar 5 minutos'); 5: Writeln('Ud. ha ordenado Jugo de naranja,', ' esto tardar 2 minutos'); 6: Writeln('Ud. ha ordenado Leche, esto tardar 1 minuto'); else Writeln('Entrada errnea'); end; Write('Presione la tecla Enter para cerrar'); Readln;end.

    Si escribimos la misma aplicacion usando el condicionla if .. then se volver ms complicado y contendr duplicaciones:

    Programa restaurante usando la condicin If

    var

    15

  • Meal: Byte;begin Writeln('Welcome to Pascal restaurant, please select your meal'); Writeln('1 - Pollo (10$)'); Writeln('2 - Pescado (7$)'); Writeln('3 - Carne (8$)'); Writeln('4 - Ensalada (2$)'); Writeln('5 - Jugo de naranja (1$)'); Writeln('6 - Leche (1$)'); Writeln; Write('Por favor ingrese your selection: '); Readln(Meal);

    if Meal = 1 then Writeln('Ud. ha ordenado Pollo, esto tardar 15 minutos') else if Meal = 2 then Writeln('Ud. ha ordenado Pescado, esto tardar 12 minutos') else if Meal = 3 then Writeln('Ud. ha ordenado Carne, esto tardar 18 minutos') else if Meal = 4 then Writeln('Ud. ha ordenado Ensalada, esto tardar 5 minutos') else if Meal = 5 then Writeln('Ud. ha ordenado Jugo de naranja,' , ' esto tardar 2 minutos') else if Meal = 6 then Writeln('Ud. ha ordenado Leche, esto tardar 1 minute') else Writeln('Entrada errnea');

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    En el siguiente ejemplo, la aplicacin evalua las notas de los estudiantes y las convierte en categorias: A,B,C,D,E y F:

    Programa grados de estudiantes

    var Mark: Integer;begin Write('Por favor ingrese la nota del estudiante: '); Readln(Mark); Writeln;

    case Mark of 0 .. 39 : Writeln('El grado del estudiante es: F');

    16

  • 40 .. 49: Writeln('El grado del estudiante es: E'); 50 .. 59: Writeln('El grado del estudiante es: D'); 60 .. 69: Writeln('El grado del estudiante es: C'); 70 .. 84: Writeln('El grado del estudiante es: B'); 85 .. 100: Writeln('El grado del estudiante es: A'); else Writeln('Nota errnea'); end;

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    En el ejemplo previo hemos usado un rango, como (0..39), que indica que la condicin devolver True si la nota se encuentra en dicho rango.

    Note:La declaracin Case trabaja solo con tipos ordinales como Integer, char, pero no lo hace con otros tipos como string o nmeros reales.

    Programa teclado

    En este ejemplo, tomaremos un caracter desde el teclado y la aplicacin nos dir en que nmero de fila del teclado se encuentra ese caracter:

    var Key: Char;begin Write('Por favor, introduzca una letra inglesa: '); Readln(Key); Writeln;

    case Key of 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p': Writeln('Est en la segunda fila del teclado');

    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l': Writeln('Est en la tercera fila del teclado ');

    'z', 'x', 'c', 'v', 'b', 'n', 'm': Writeln('Est en la cuarta fila del teclado'); else Writeln('Letra desconocida'); end;

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    Tenga en cuenta que se ha utilizado una nueva tcnica en la condicin de case, que es un conjunto

    17

  • dewhich means execute case branch statement if the Key was one of these values set: valores:

    'z', 'x', 'c', 'v', 'b', 'n', 'm':

    lo que significa que ejecutara la sentencia si Key tiene uno de los valores del set declarado:z, x, c, v, b, n, m

    Tambin se puede mezclar rangos de valores definidos as:

    'a' .. 'd', 'x', 'y', 'z':

    que significa: ejecuta la sentencia si el valor esta entre a y d o es igual a x, y z.

    18

  • Ciclos

    Los cclos son usados para ejecutar ciertas partes de cdigo (sentencias) una cantidad especfica de veces, o hasta que una condicin sea satisfecha:

    El ciclo for

    Usted puede ejecutar la sentencia for un nmero determinado de veces usando un contador como eneste ejemplo:

    var i: Integer; Count: Integer;begin Write('Cuantas veces? '); Readln(Count); for i:= 1 to Count do Writeln('Hola'); Write('Presione la tecla Enter para cerrar'); Readln;end.

    Debemos utilizar tipos ordinales como Byte, Entero, y Char en las variables de bucle. Llamamos a esta variable a variable de bucle o bucle contador. El valor del contador de bucles puede ser inicializada con cualquier nmero, y tambin puede determinar el ltimo valor de contador de bucle. Por ejemplo, si tenemos que contar de 5 a 10, entonces podemos hacer esto:

    fori:=5to10do

    Podemos mostrar el contador de bucle en cada ciclo, como en el ejemplo modificado a continuacin:

    var i: Integer; Count: Integer;begin Write('Cuantas veces? '); Readln(Count); for i:= 1 to Count do begin Writeln('Ciclo nmero: ', i); Writeln('Hola'); end;

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    Tenga en cuenta que esta vez tenemos que repetir dos declaraciones, y por ello se ha utilizado el comenzar. . poner fin a las palabras clave para que sean un comunicado.

    19

  • Tabla de multiplicar usando el ciclo for

    La versin de for para el programa de tabla de multiplicar es ms fcil y ms concisa:

    program MultTableWithForLoop;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    var x, i: Integer;begin Write('Por favor ingrese un nmero: '); Readln(x); for i:= 1 to 12 do Writeln(x, ' * ', i, ' = ', x * i);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    En lugar de escribir la declaracin Writeln 12 veces, se escribe una vez dentro de un bucle que se ejecuta 12 veces.

    Podemos hacer la declaracin del ciclo para que itere de forma decreciente usando la palabra clave downto en lugar de la palabra clave to con esta sintxis:

    for i:= 12 downto 1 do

    20

  • Programa factorial

    Factorial en matemticas es la multiplicacin de un nmero por cada uno de sus antecesores hasta el nmero 1. Por ejemplo, 3! = 3 * 2 * 1 = 6.

    var Fac, Num, i: Integer;begin Write('Por favor ingrese un nmero: '); Readln(Num); Fac:= 1; for i:= Num downto 1 do Fac:= Fac * i; Writeln('El factorial de ', Num ,' es ', Fac);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    21

  • Ciclo Repeat Until

    A diferencia del ciclo for, que se repite para un nmero determinado de ciclos, El bucle Repeat no tiene contador. El ciclo se repite hasta que una determinada condicin se cumple (devuelve True), entonces se pasar a la sentencia siguiente al ciclo.

    Ejemplo:

    var Num : Integer;begin repeat Write('Por favor ingrese un nmero: '); Readln(Num); until Num

  • Price:= 10; end; '2': begin Writeln('Ud. ha ordenado Pescado, esto tardar 12 minutos'); Price:= 7; end; '3': begin Writeln('Ud. ha ordenado Carne, esto tardar 18 minutos'); Price:= 8; end; '4': begin Writeln('Ud. ha ordenado Ensalada, esto tardar 5 minutos'); Price:= 2; end; '5': begin Writeln('Ud. ha ordenado Jugo de naranja, esto tardar 2 minutos'); Price:= 1; end; '6': begin Writeln('Ud. ha ordenado Leche, esto tardar 1 minute'); Price:= 1; end; else begin Writeln('Entrada errnea'); Price:= 0; end; end;

    Total:= Total + Price;

    until (Selection = 'x') or (Selection = 'X'); Writeln('Precio total = ', Total); Write('Presione la tecla Enter para cerrar'); Readln;end.

    En el ejemplo anterior, hemos utilizado las siguientes tcnicas:

    1. Adicin de begin end en las selecciones del case para convertir mltiples sentencias a una sentencia.

    2. Inicializamos (dimos valor inicial a una variable) a la variable variable Total en cero, para acumular el importe total de los pedidos. Luego aadimos el precio seleccionado en cada ciclo a la variable Total:

    Total:= Total + Price;

    4. Pusimos dos opciones para terminar los pedidos, ya sea X mayscula o x minscula Ambos carcteres son diferentes en la representacin (de almacenamiento) en la memoria del ordenador.

    Nota:

    Podramos reemplazar esta lnea:

    23

  • until (Selection = 'x') or (Selection = 'X');

    Por este cdigo abreviado:

    until UpCase(Selection) = 'X';

    La funcin Upcase cambiar la variable de seleccin a maysculas si es una letra minscula, y la condicin devolver True en ambos casos (x o X).

    Ciclo While

    El ciclo while es similar a el ciclo repeat, pero difiere de l en los siguientes aspectos:

    1. En el ciclo while la condicin es comprobada antes de ingresar al ciclo, mientras que repeat entra al ciclo sin comprobacin alguna. Esto significa que repeat siempre ejecuta las sentencias al menos una vez, en tanto que while puede prevenir la ejecucin al no ingresar alciclo si la condicin no se cumple al inicio.

    2. El ciclo while necesita de begin/end si hay varias instrucciones que se deben ejecutar dentro del bucle, pero repeat no no necesita begin/end, su bloque (declaraciones repetidas) se iniciaa partir de la palabra clave repeat hasta la palabra clave until

    Ejemplo:

    var Num: Integer;begin Write('Ingrese un nmero: '); Readln(Num); while Num > 0 do begin Write('Desde el interior de bucle : Ingrese un nmero : '); Readln(Num); end; Write('Presione la tecla Enter para cerrar'); Readln;end.

    Programa factorial usando el ciclo while

    var Fac, Num, i: Integer;begin Write('Por favor ingrese un nmero: '); Readln(Num);

    24

  • Fac:= 1; i:= Num; while i > 1 do begin Fac:= Fac * i; i:= i - 1; end; Writeln('El factorial de ', Num ,' es ', Fac);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    El bucle while no tiene contador de ciclos, y por esa razn se ha utilizado la variable i para hacer de contador del bucle. El valor del contador de ciclos se inicia al valor del nmero del nmero del que necesitamos obtener su factorial, entonces tenemos que reducir su valor de forma manual en cada ciclo. Cuando el valor de i llegue a 1, el bucle finaliza.

    Strings

    El tipo String se utiliza para declarar variables que pueden almacenar una cadena de caracteres. Se puede utilizar para almacenar el texto, un nombre, o una combinacin de caracteres y dgitos como un nmero de matrcula de coches.

    En este ejemplo vamos a ver cmo podemos usar la variable de cadena para aceptar un nombre de usuario:

    var Name: string;begin Write('Por favor ingrese su nombre : '); Readln(Name); Writeln('Hola ', Name);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    En el siguiente ejemplo, se utilizan cadenas para almacenar informacin sobre una persona:

    var Name: string; Address: string; ID: string; DOB: string;begin Write('Por favor ingrese su nombre : '); Readln(Name); Write('Por favor ingrese su direccin : '); Readln(Address);

    25

  • Write('Por favor ingrese su nmero de identificacin : '); Readln(ID); Write('Por favor ingrese su fecha de nacimiento : '); Readln(DOB); Writeln; Writeln('Card:'); Writeln('----------------------------------------------'); Writeln('| Nombre : ', Name); Writeln('| Direccin : ', Address); Writeln('| Identificacin: ', ID); Writeln('| Nacimiento : ', DOB); Writeln('----------------------------------------------');

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Las cadenas pueden ser concatenadas para producir cadenas mas grandes. Por ejemplo, podemos concatenar FirstName, SecondName, y FamilyName en otra cadena llamada FullName, similar al ejemplo siguiente:

    var YourName: string; Father: string; GrandFather: string; FullName: string;begin Write('Por favor ingrese su primer nombre : '); Readln(YourName); Write('Por favor ingrese el nombre de su padre : '); Readln(Father); Write('Por favor ingrese el nombre de su abuelo : '); Readln(GrandFather); FullName:= YourName + ' ' + Father + ' ' + GrandFather; Writeln('Su nombre completo es: ', FullName);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Advierta que en este ejemplo hemos aadido un espacio ('') entre los nombres (como YourName + '' Father +) para hacer una separacin entre los nombres. El espacio es un carcter tambin.

    Podemos hacer muchas operaciones sobre cadenas, como la bsqueda de subtexto en una cadena, copiar una cadena a otra variable de cadena, o la conversin de caracteres de texto maysculas o minsculas como los ejemplos siguientes:

    Esta lnea convierte las letras en el valor de cadena FullName a maysculas:

    FullName:= UpperCase(FullName);

    Y esto la convierte a minsculas:

    FullName:= LowerCase(FullName);

    26

  • En el siguiente ejemplo, buscaremos la letra a en un nombre de usuario utilizando la funcin Pos. La funcin Pos devuelve la primera aparicin (ndice) de una subcadena en una cadena, o devuelve cero si el caracter o caracteres (subcadena) no existen en el texto buscado:

    var YourName: string;begin Write('Por favor ingrese su nombre : '); Readln(YourName); If Pos('a', YourName) > 0 then Writeln('Su nombre tiene letra a') else Writeln('Su nombre no tiene letra a');

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Si el nombre contiene una A mayscula, entonces la funcin Pos no apuntar a la misma, debido a que A es diferente de a como lo mencionamos anteriormente.

    Para solucionar este problema podemos convertir todas las letras del nombre de usuario a minsculas y entonces podemos hacer la bsqueda:

    If Pos('a', LowerCase(YourName)) > 0 the

    En la siguiente modificacin del cdigo, se mostrar la posicin de la letra a en un nombre de usuario:

    var YourName: string;begin Write('Por favor ingrese su nombre : '); Readln(YourName); If Pos('a', LowerCase(YourName)) > 0 then begin Writeln('su nombre tiene letra a'); Writeln('La posicin de la primer letra a en su nombre es: ', Pos('a', LowerCase(YourName))); end else Writeln('su nombre no contiene letra a');

    Write('Presione la tecla Enter para cerrar'); Readln;end.

    Podr notar que si el nombre contiene ms de una letra a, la funcin Pos devuelve el ndice de la primera aparicin de ella en el nombre de usuario.

    Puede obtener el nmero de caracteres de una cadena mediante la funcin Length:

    Writeln('Su nombre tiene ', Length(YourName), ' letters');

    27

  • Y puede conseguir la primera letra / carcter de una cadena usando el nmero de su ndice:

    Writeln('La primer letra de su nombre es ', YourName[1]);

    Y el segundo caracter:

    Writeln('La segunda letra de su nombre es ', YourName[2]);

    El ltimo caracter:

    Writeln('La ltima letra de su nombre es ', YourName[Length(YourName)]);

    Tambin puede mostrar una variable tipo string caracter por caracter usando el ciclo for:

    for i:= 1 to Length(YourName) do Writeln(YourName[i]);

    Funcin Copy

    Podemos copiar parte de una cadena mediante la funcin copy. Por ejemplo, si tenemos que extraer 'world' de la palabra ''Hola mundo'' de la cadena, lo podemos hacer si conocemos la posicin de esa parte, como lo hemos hecho en el siguiente ejemplo:

    var Line: string; Part: string;begin Line:= 'Hola mundo';

    Part:= Copy(Line, 7, 5);

    Writeln(Part);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Tenga en cuenta que se ha utilizado la funcin copy con esta sintaxis:

    Part:=Copy(Line,7,5);

    He aqu una explicacin de la declaracin anterior:

    28

  • Part:= Esta es la variable de tipo string en la cul se almacena el resultado de la funcin (subcadena 'world')

    Line Esta es la cadena origen, la que contiene la frase "Hola mundo". 7 Este es el punto de partida o el ndice de subcadena que hay que extraer, en este caso

    se trata del carcter w. 5 Esta es la longitud de la parte extrada. En este caso, representa la longitud de la

    palabra 'world'.

    En el ejemplo siguiente, se le pedir al usuario que introduzca un nombre de mes, como febrero, el programa escribir la versin corta de la misma, por ejemplo feb.

    var Month: string; ShortName: string;begin Write('Por favor, introduzca el nombre del mes completo, por ejemplo, enero: '); Readln(Month);

    ShortName:= Copy(Month, 1, 3);

    Writeln(Month, ' abreviado es : ', ShortName);

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Procedimiento Insert

    El procedimiento Insert, inserta una subcadena en una cadena. A diferencia del operador de concatenacin de cadenas (+) que une dos subcadenas, Insert agrega la subcadena a partir del ndiceindicado en la otra cadena.

    Por ejemplo, se puede insertar la palabra Pascal en la cadena 'Hola mundo', lo que resulta en "Hola mundo Pascal", como en el siguiente ejemplo:

    var Line: string;begin Line:= 'Hola mundo';

    Insert('Pascal ', Line, 7);

    Writeln(Line);

    29

  • Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Los parmetros del procedimiento Insert son:

    'Pascal' Esta es la subcadena a insertar dentro de la cadena de destino. Line Esta es la cadena de destino que contiene el resultado de la operacin. 7 Esta es la posicin para comenzar la insercin en la cadena de destino. En este caso,

    ser despus del sptimo carcter, que es el primer espacio de 'Hola mundo'.

    Procedimiento Delete

    Este procedimiento se utiliza para borrar un carcter o subcadena de una cadena. Es necesario conocer la posicin de inicio y la longitud de la subcadena que debe ser eliminada.

    Por ejemplo, si tenemos que eliminar los caracteres 'll' de la cadena 'Hola mundo' para que quede 'Heo World', podemos hacerlo as:

    var Line: string;begin Line:= 'Hola mundo'; Delete(Line, 3, 2); Writeln(Line); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Funcin Trim

    Esta funcin se utiliza para eliminar los espacios al comienzo y al final de las cadenas. Si tenemos una cadena que contiene el texto '' Hola ' ser 'Hola despus de usar esta funcin. No podemos mostrar espacios en una ventana de terminal a menos que pongamos caracteres entre ellos. Mire el siguiente ejemplo:

    program TrimStr;

    {$mode objfpc}{$H+}

    uses

    30

  • {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };var Line: string;begin Line:= ' Hola ';

    Writeln('');

    Line:= Trim(Line);

    Writeln('');

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    En el ejemplo anterior, hemos utilizado la unidad SysUtils, unidad que contiene la funcin Trim.

    Hay otras dos funciones que eliminan los espacios de slo un lado de una cadena, antes o despus. Estas funciones son: TrimRight, TrimLeft.

    Funcin StringReplace

    La funcin StringReplace reemplaza caracteres o subcadenas con otros caracteres o subcadenas en la cadena deseada.

    program StrReplace;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    var Line: string; Line2: string;begin Line:= 'Esta es una prueba de reemplazo de cadena'; Line2:= StringReplace(Line, ' ', '-', [rfReplaceAll]); Writeln(Line); Writeln(Line2); Write('Presione la tecla Enter para cerrar'); Readln;end.

    31

  • Los parametros de la funcin StringReplace son:

    1. Line: Es la cadena original que deseamos modificar.

    2. ' ': Es la subcadena que deseamos substituir.

    3. '-': Esta es la subcadena alternativa que queremos sustituir por la anterior en la cadena original.

    4. [rfReplaceAll]: Este es el tipo de sustitucin. En este caso especificamos que sustituya todoslos sucesos de la subcadena ' '.

    Podemos usar slo una variable de cadena y desechar la variable Linea2 como muestra el ejemplo modificado, pero vamos a perder el valor del texto original.

    var Line: string;begin Line:= 'Esta es una prueba de reemplazo de cadena'; Writeln(Line); Line:= StringReplace(Line, ' ', '-', [rfReplaceAll]); Writeln(Line); Write('Presione la tecla Enter para cerrar'); Readln;end.

    32

  • Arreglos

    Un arreglo es una cadena de variables del mismo tipo. Si tenemos que declarar un array de 10 variables Integer, podemos hacerlo as:

    Numbers: array [1 .. 10] of Integer;

    Podemos acceder a las variables simples en el arreglo mediante su ndice. Por ejemplo, para poner un valor en la primera variable del arreglo se puede escribir como:

    Numbers[1]:= 30;

    Para poner un valor en la segunda variable use el ndice 2:

    Numbers[2]:= 315;

    En el siguiente ejemplo, le pediremos al usuario que ingrese 10 notas de estudiantes y las pondremos en un arreglo. Luego vamos a ir a travs de ellos para extraer los resultados: aprueba y desaprueba.

    var Marks: array [1 .. 10] of Integer; i: Integer;begin for i:= 1 to 10 do begin Write('Ingrese la nota ', i, ' del estudiante: '); Readln(Marks[i]); end;

    for i:= 1 to 10 do begin Write('La nota numero ', i, ' del estudiante es: ', Marks[i]); if Marks[i] >= 40 then Writeln(' Aprob') else Writeln(' Reprob'); end;

    Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Podemos modificar el cdigo anterior para obtener las notas mxima y mnima de los estudiantes:

    var Marks: array [1 .. 10] of Integer; i: Integer; Max, Min: Integer;begin

    33

  • for i:= 1 to 10 do begin Write('Ingrese la nota ', i, ' del estudiante: '); Readln(Marks[i]); end;

    Max:= Marks[1]; Min:= Marks[1];

    for i:= 1 to 10 do begin // Controlar si la nota actual es la mxima o no if Marks[i] > Max then Max:= Marks[i];

    // Controlar si la nota actual es la mnima o no if Marks[i] < Min then Min:= Marks[i];

    Write('La nota numero ', i, ' del estudiante es: ', Marks[i]); if Marks[i] >= 40 then Writeln(' Aprob') else Writeln(' Reprob'); end;

    Writeln('La nota mxima es: ', Max); Writeln('La nota mnima es: ', Min); Writeln('Presione la tecla Enter para cerrar'); Readln;end.

    Tenga en cuenta que se considera la primera nota (Marks[1]) como la nota mxima y mnima, y luego vamos a compararlo con el resto de las notas.

    Max:= Marks[1]; Min:= Marks[1];

    Dentro del bucle se compara Max, Min con cada nota. Si nos encontramos con un nmero que es mayor que Max, vamos a sustituir el valor mximo de la misma. Si nos encontramos con un nmeroque es menor que Min, entonces vamos a sustituir Min con l.

    En el ejemplo previo hemos introducdo comentarios: // Controlar si la nota actual es la mxima o no

    Comenzamos la lnea con los caracteres / /, lo que significa que esta lnea es un comentario y no afectar el cdigo y no ser compilada. Esta tcnica se utiliza para describir partes de cdigo a otrosprogramadores o al programador mismo.

    / / Se utiliza para comentarios cortos. Si necesitamos escribir comentarios multilnea se puede rodear por {} o (**).

    Ejemplo:

    34

  • for i:= 1 to 10 do begin { Comprobar si la nota actual es mayor que Marks[i], si lo es, Marks[i] es el nuevo mximo } if Marks[i] > Max then Max:= Marks[i];

    (* Comprobar si la nota actual es menor que Marks[i], si lo es, Marks[i] es el nuevo mnimo *) if Marks[i] < Min then Min:= Marks[i];

    Write('La nota numero ', i, ' del estudiante es: ', Marks[i]); if Marks[i] >= 40 then Writeln(' Aprob') else Writeln(' Reprob'); end;

    Tambin puede desactivar parte del cdigo comentndolo:

    Writeln('La nota mxima es: ', Max); // Writeln('La nota mnima es: ', Min); Writeln('Presione la tecla Enter para cerrar'); Readln;

    En el cdigo anterior, queda desactivado el procedimiento que escribe la nota mnima de los estudiantes.

    Nota:

    Podemos declarar un arreglo basado en ndice cero al igual que en el lenguaje C:

    Marks: array [0 .. 9] of Integer;

    Este puede contener 10 elementos tambin, pero al primer elemento se accede mediante el ndice 0:

    Numbers[0]:= 30;

    Segundo elemento:

    Numbers[1]:= 315;

    Ultimo elemento:

    Numbers[9]:= 10;

    o

    Numbers[High(Numbers)]:= 10;

    35

  • Registros

    Mientras que los arreglos pueden contener muchas variables del mismo tipo, los registros pueden contener variables de tipos diferentes, y estas variables se denominan "campos".

    Este grupo de variables(campos) pueden ser tratados como una sola unidad o variable. Podemos utilizar los registros para almacenar informacin que pertenecen a un mismo objeto, por ejemplo la informacin de un automvil:

    1. Car type: cadena de caracteres2. Engine size: nmero real 3. Production year: nmero entero

    Podemos recoger estos diferentes tipos en un registro que representa un coche como en el ejemplo siguiente:

    program Cars;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { usted puede agregar unidades despues de aqu };

    type TCar = record ModelName: string; Engine: Single; ModelYear: Integer; end;

    var Car: TCar;begin Write('Ingrese la marca del auto: '); Readln(Car.ModelName); Write('Ingrese el tamao de cilindrada: '); Readln(Car.Engine); Write('Ingrese el modelo(ao): '); Readln(Car.ModelYear);

    Writeln; Writeln('Car information: '); Writeln('Marca : ', Car.ModelName); Writeln('Cilindrada : ', Car.Engine); Writeln('Modelo : ', Car.ModelYear);

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    36

  • En este ejemplo definimos un nuevo tipo (Record) usando la palabra reservada 'type':

    type TCar = record ModelName: string; Engine: Single; ModelYear: Integer; end;

    Hemos aadido la letra (T) a Car para indicar que se trata de un tipo y no una variable. Los nombres de variables pueden ser como: Coche, hora, nombre de usuario, pero los nombres de tipo debe ser como: TCar, thouse y TUserName. Esta es una convencin en el lenguaje Pascal.

    Cuando necesitamos utilizar este nuevo tipo, entonces debemos declarar una variable de ese tipo, por ejemplo:

    var Car: TCar;

    Si necesita almacenar un valor en una de sus variables(campos), debemos acceder a l de esta manera:

    Car.ModelName

    Losregistrosseutilizarnenlaseccindearchivosdeaccesoaleatoriodeestelibro.

    Archivos

    Los archivos son elementos importantes de los sistemas operativos y aplicaciones. Componentes delsistema operativo son representados como archivos y la informacin y los datos estn representadosen archivos tambin, como fotos, libros, aplicaciones y archivos de texto simples

    El sistema operativo controla la gestin de archivos tales como lectura, escritura, edicin y borrado.

    Files are divided into many types according to many perspectives. We can group files into two types: executable files, and data files. For example compiled binary Lazarus applications are executable files, while Pascal source code (.pas) are data files. Also PDF books, JPEG pictures, are data files.Los archivos se dividen en varios tipos de acuerdo con muchas perspectivas. Podemos agrupar los archivos en dos tipos: Los archivos ejecutables y archivos de datos. Por ejemplo los archivos binarios generados por la compilacin de Lazarus son archivos ejecutables. Mientras que los archivos de cdigo fuente (.pas) son archivos de datos, as como tambin los libros PDF, imgenes JPEG.

    37

  • Podemos dividir los archivos de datos en dos tipos de acuerdo con la representacin de su contenido:

    1. Archivos de texto: Son simples archivos de texto que pueden ser escritos o ledos usando cualquier herramienta simple incluyendo lneas de comandos del sistema operativo como loscomandos cat y vi en Linux, o comandos como type o copy con en Windows.

    2. Archivos de datos binarios: Estos son ms complejos y requieren aplicaciones especiales para abrirlos. Por ejemplo, los archivos de imagen no se pueden abrir utilizando sencillas herramientas de lnea de comandos, sino que debe abrirse con aplicaciones como GIMP, Kolour Paint, MS Paint, etc Si abrimos una imagen o archivos de voz, tendremos caracteres irreconocibles que no significan nada para el usuario. Ejemplos de archivos de datos binarios son archivos de base de datos, que deben ser abiertos con la aplicacin adecuada.

    Hay otra manera de clasificar los archivos, segn tipo de acceso:

    1. Archivos de acceso secuencial: Un ejemplo de un archivo secuencial es un archivo de texto, que no tiene ningn registro de tamao fijo. Cada lnea tiene su propia longitud, por lo que no podemos saber la posicin (en caracteres) para el inicio de la tercera lnea, por ejemplo. Por esa razn, hemos podido abrir el archivo de slo lectura o slo escritura, y tambin podemos aadir texto slo al final del archivo. Si necesitamos insertar texto en medio de un archivo, entonces debemos leer el contenido del archivo en la memoria, hacer las modificaciones, borrar todo el archivo desde el disco, y luego sobreescribe el archivo con el texto modificado

    2. Archivos de acceso aleatorio: Este tipo de archivo tiene un registro de tamao fijo. Un registro es la unidad ms pequea que se puede leer y escribir al mismo tiempo, y podra ser Byte, Integer, String, o un registro definido por el usuario. Podemos leer y escribir al mismo tiempo, por ejemplo, se poda leer el nmero de registro 3 y copiarlo en el nmero de registro 10. En este caso, podemos saber exactamente la posicin de cada registro en el archivo. Modificar registros es simple. En los archivos de acceso aleatorio, podemos sustituir o sobrescribir cualquier archivo sin afectar al resto del archivo.

    Archivos de texto

    Los archivos de texto son los ms simples, pero debemos escribir en ellos en una sola direccin (slo hacia adelante). No podemos volver al escribir en un archivo de texto. Tambin hay que definir el modo de funcionamiento antes de abrir el archivo: Read (lectura), Write(escritura o Append (agregar al final).

    En este ejemplo, se muestra el contenido de un archivo de texto seleccionado por un usuario. Por ejemplo, un usuario puede ingresar un nombre de archivo de texto como c:\test\first.pas en Windows o /home/usuario/first.pas en Linux:

    38

  • Leer un archivo de texto

    program ReadFile;

    {$mode objfpc}{$H+}uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, sysUtils { usted puede agregar unidades despues de aqu };

    var FileName: string; F: TextFile; Line: string;begin Write('Introduzca un nombre de archivo de texto : '); Readln(FileName); if FileExists(FileName) then begin // Enlazar la variable F con el nombre fsico del archivo AssignFile(F, FileName);

    Reset(F); // Poner el archivo en modo lectura, el archivo debe existir

    // Mientras el archivo tenga lineas para leer el bucle se ejecuta while not Eof(F) do begin Readln(F, Line); // Leer una lnea del archivo de texto Writeln(Line); // Mostrar esa lnea en pantalla end; CloseFile(F); // Liberar F y la conexin con el nombre de archivo end else // sino, if FileExists.. Writeln('El archivo no existe'); Write('Presione la tecla Enter para cerrar..'); Readln;end.

    En Linux podemos ingresar estos nombres de archivo: /etc/resolv.confor/proc/meminfo/proc/cpuinfo

    Hemos utilizado nuevos tipos, funciones y procedimientos para manipular archivos de texto que son:

    1. F: TextFile;

    39

  • TextFile es un tipo que se utiliza para declarar una variable de archivo de texto. Esta variable se puede vincular a un archivo de texto para su uso posterior.

    2. if FileExists(FileName) then

    FileExists es una funcin contenida en la unidad SysUtils, comprueba la existencia de un archivo. Devuelve verdadero (True) si el archivo existe en el soporte de almacenamiento.

    3. AssignFile(F, FileName);

    Despus de haber comprobado la existencia de un fichero, podemos utilizar el procedimiento AssignFile para vincular la variable de archivo (F) con el archivo fsico. Cualquier uso de la variable F representar el archivo fsico.

    4. Reset(F); // Poner el archivo en modo lectura, el archivo debe existir

    El procedimiento Reset, abre archivos de texto para lectura solamente, y coloca el puntero de lectura en el primer carcter del archivo.

    Si no hay permiso de lectura para ese archivo para el usuario actual, aparecer un mensaje de error, de acceso denegado(access denied).

    5. Readln(F, Line); // Leer una lnea del archivo de texto

    El procedimiento Readln se utiliza para leer una lnea completa del archivo y ponerlo en la variable Linea. Antes de leer una lnea del archivo de texto, debemos asegurarnos de que el archivo no se ha llegado al final. Podemos hacerlo con la siguiente funcin, Eof.

    6. while not Eof(F) do

    La funcin EOF devuelve verdadero(True) si el archivo ha llegado a su fin. Se utiliza para indicar que la operacin de lectura no podr usarse nuevamente y se ha ledo todo el contenido del archivo.

    7. CloseFile(F); // Liberar F y la conexin con el nombre de archivo

    Despus de terminar la lectura o escritura en un archivo, hay que cerrarlo para liberar el archivo, ya que el proceso de Reposicin se reserva el archivo en el sistema operativo y evita la escritura y borrado por otra aplicacin mientras el archivo est abierto.

    Debemos utilizar CloseFile slo cuando el procedimiento Reset logra abrir el archivo. Si Reset fallapor que el archivo no existe, o est siendo utilizado por otra aplicacin, etc, en ese caso no hay que cerrar el archivo.

    40

  • En el siguiente ejemplo vamos a crear un nuevo archivo de texto y poner algn texto en l:

    Creando y escribiendo en un archivo de texto

    var FileName: string; F: TextFile; Line: string; ReadyToCreate: Boolean; Ans: Char; i: Integer;begin Write('Ingrese un nuevo nombre de archivo: '); Readln(FileName);

    // Verificar si el archivo existe, avisar al usuario si es as if FileExists(FileName) then begin Write('El archivo existe, desea sobreescribirlo ? (s/n)'); Readln(Ans); if upcase(Ans) = 'S' then ReadyToCreate:= True else ReadyToCreate:= False; end else // File does not exist ReadyToCreate:= True;

    if ReadyToCreate then begin // Enlazar la variable F con el nombre fsico del archivo AssignFile(F, FileName);

    Rewrite(F); // Crear un nuevo archivo para escritura Writeln('Please input file contents line by line, ' , 'when you finish write % then press enter'); i:= 1; repeat Write('Line # ', i, ':'); Inc(i); Readln(Line); if Line '%' then Writeln(F, Line); // Escribir una lnea en el archivo de texto until Line = '%';

    CloseFile(F); // Liberar F y la conexin con el nombre de archivo end else // El archivo existe y el usuario no desea sobreescibir Writeln('Doing nothing'); Write('Presione la tecla Enter para cerrar..'); Readln;end.

    41

  • En este ejemplo hemos usado varias cosas importantes:

    1. Boolean type:

    ReadyToCreate: Boolean;

    Este tipo slo puede tener uno de dos valores: True o False. Estos valores se pueden utilizar directamente en una condicin if, bucle while o bucle repeat

    En el ejemplo previo usamos la condicin if de este modo:

    if Marks[i] > Max then

    que puede tomar el valor True or False.

    2. funcin UpCase:

    if upcase(Ans) = 'Y' then

    This statement is executed when the file exists. The program will warn the user about overwriting an existing file. If he/she wants to continue, then he/she should enter a lowercase y or capital Y. The UpCase function will convert the character into a capital letter if it is lowercase.Esta sentencia se ejecuta cuando el archivo existe.

    El programa avisar al usuario acerca de sobrescribir un archivo existente. Si desea continuar, entonces podra introducir una 'y' minscula o mayscula . La funcin UpCase convertir el carcter en mayscula si es minscula.

    3. Procedimiento Rewrite:

    Rewrite(F); // Crear un nuevo archivo para escritura

    El procedimiento Rewrite se utiliza para crear un nuevo archivo vaco. Si el archivo ya existe, ser borrado y sobreescrito Tambin abre el archivo para escritura slo en el caso de archivos de texto.

    4. Procedimiento Writeln(F, ..) :

    Writeln(F, Line); // Escribir una linea en el archivo

    Este procedimiento se utiliza para escribir variables de cadena en archivos de texto, que las aade con caracteres de fin de lnea retorno de carro y lnea abajo (CR / LF), representado como los caracteres cuyo valor numrico es 13 y 10 respectivamente.

    Estos caracteres no se puede mostrar en una ventana de la consola, sino que se mover el cursor de pantalla a una nueva lnea.

    42

  • 5. Procedimiento Inc:

    Inc(i);

    Este procedimiento incrementa una variable de tipo entera en uno.

    i:= i + 1;

    6. Procedure CloseFile:

    CloseFile(F); // Liberar F y la conexin con el nombre de archivo

    Como mencionamos anteriormente, el procedimiento CloseFile libera un archivo en el sistema operativo. Adems, tiene un trabajo adicional cuando se escribe en un archivo de texto,que es vaciarel bfer de escritura.

    El Buffering de archivos de texto es una caracterstica que hace el trato con archivos de texto sea ms rpido. En lugar de escribir una sola lnea o carcter directamente en disco o cualquier otro medio de almacenamiento (que es muy lento en comparacin con la escritura en la memoria), la aplicacin escribe estas entradas en un buffer de memoria. Cuando la memoria intermedia alcanza su tamao completo, que se vaciar forzado a escribir) dentro de medios de almacenamiento permanentes como un disco duro. Esta operacin hace que se escriba ms rpido, pero se aade el riesgo de perder algunos datos (en el buffer) si la energa se pierde repentinamente. Para minimizar la prdida de datos, se debe cerrar el archivo inmediatamente despus de terminar la escritura en l, o llamar al procedimiento Flush para vaciar el bfer de forma explcita.

    Agregando en un archivo de texto

    En este ejemplo, queremos abrir un archivo de texto existente para escribir al final del mismo, sin eliminar su contenido original utilizando el procedimiento Append.

    Programa agregando en un archivo de texto

    var FileName: string; F: TextFile; Line: string; i: Integer;begin Write('Input an existed file name: '); Readln(FileName); if FileExists(FileName) then begin // Enlazar la variable F con el nombre fsico del archivo

    43

  • AssignFile(F, FileName);

    Append(F); // Abrir archivo para agregar

    Writeln('Please input file contents line by line', 'when you finish write % then press enter'); i:= 1; repeat Write('Line # ', i, ' append :'); Inc(i); Readln(Line); if Line '%' then Writeln(F, Line); // Escribir una lnea en el archivo de texto until Line = '%'; CloseFile(F); // Release F and FileName connection, flush buffer end else Writeln('File does not exist'); Write('Presione la tecla Enter para cerrar..'); Readln;end.

    Despus de ejecutar esta aplicacin y entrar en un archivo de texto existente, lo podemos ver con los comandos cat / type, o haciendo doble clic en l en su directorio para ver los datos adjuntos.

    Archivos de acceso aleatorio

    As we mentioned earlier, the second type of file according to an access type perspective is Random access , or direct access. This type of file has a fixed size record, so that we can jump to any record for reading or writing at any time.

    There are two types of random access files: typed files and untyped files.Como mencionamos anteriormente, el segundo tipo de archivo de acuerdo desde el punto de vista de tipo de acceso, es el acceso aleatorio o acceso directo. Este tipo de archivo tiene un registro de tamao fijo, de modo que podemos ir a cualquier registro para leer o escribir en cualquier momento.

    Hay dos tipos de archivos de acceso aleatorio: Con tipo y sin tipo.

    Archivos con tipo

    Typed files are used for files that contain the same type of data that has the same size of records, for example, if a file contains records of Byte type, that means the record size = 1 byte. If the file contains real numbers (Single), that means all record sizes are 4 bytes, etc.Los archivos con tipo se utilizan para los archivos que contienen el mismo tipo de datos cuyos registros tienen el mismo tamao, por ejemplo, si un archivo contiene registros de tipo Byte, eso significa que el tamao del registro = 1 byte. Si el archivo contiene nmeros reales (Individual), eso

    44

  • significa que todos los tamaos de registro son 4 bytes, etc

    En el siguiente ejemplo, se muestra cmo utilizar un archivo de Byte:

    Programa de notas

    var F: file of Byte; Mark: Byte;begin AssignFile(F, 'marks.dat'); Rewrite(F); // Crear archivo Writeln('Please input students marks, write 0 to exit');

    repeat Write('Input a mark: '); Readln(Mark); if Mark 0 then // No escribir el valor 0 Write(F, Mark); until Mark = 0; CloseFile(F);

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    En este ejemplo usamos esta sintxis para definir el archivo con tipo:

    F: file of Byte;

    Que quiere decir:: el archivo contiene un registro de tipo de datos Byte, que puede contener valores de 0 a 255.

    Creamos el archivo y lo abrimos para escritura usando el procedimiento Rewrite Rewrite(F); // Crear archivo

    Tambin se ha utilizado la funcin Write en lugar de Writeln para escribir registros en el archivo proporcionado:

    Write(F, Mark);

    Writeln no es adecuado para los archivos de tipo, porque se aaden los caracteres CR / LF en cada lnea del texto escrito, pero Write almacena el registro como es, sin ninguna adicin. En este caso, sihemos entrado 10 registros (de Byte), el tamao del archivo ser de 10 bytes en el disco.

    En el siguiente ejemplo, vamos a mostrar cmo se muestra el contenido del archivo anterior: :

    45

  • Leyendo notas de estudiantes

    program ReadMarks;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    var F: file of Byte; Mark: Byte;begin AssignFile(F, 'marks.dat'); if FileExists('marks.dat') then begin Reset(F); // Abrir archivo while not Eof(F) do begin Read(F, Mark); Writeln('Mark: ', Mark); end; CloseFile(F); end else Writeln('Archivo (marks.dat) no encontrado');

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    En el siguiente ejemplo, vamos a mostrar cmo aadir nuevos registros sin eliminar los datos existentes:

    Programa agregando notas de alumnos

    program AppendMarks;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    46

  • var F: file of Byte; Mark: Byte;begin AssignFile(F, 'marks.dat'); if FileExists('marks.dat') then begin FileMode:= 2; // Poner en modo lectura/escritura Reset(F); // Abrir archivo Seek(F, FileSize(F)); // Ir hasta el ltimo registro Writeln('Por favor ingrese la nota de estudiante, escriba 0 para salir');

    repeat Write('Ingrese nota: '); Readln(Mark); if Mark 0 then // No escribir valor 0 en el archivo Write(F, Mark); until Mark = 0; CloseFile(F); end else Writeln('Archivo (marks.dat) no encontrado');

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    Despus de ejecutar este programa y entrar en nuevos registros, podemos ejecutarlo de nuevo para ver los datos agregados.

    Tenga en cuenta que hemos utilizado Reset para abrir el archivo para escribir en lugar del procedimiento Rewrite. Rewrite borra todos los datos de los archivos existentes, y crea un archivo vaco si el archivo no existe, mientras Reset abre un archivo existente sin borrar su contenido.

    Tambin hemos asignado 2 a la variable FileMode para indicar que hay que abrir el archivo para acceso de lectura/escritura. 0 en FileMode significa slo lectura, 1 significa slo escritura y 2 (por defecto) significa lectura/escritura.

    FileMode:= 2; // Poner en modo lectura/escritura Reset(F); // Abrir archivo

    Reset coloca el puntero de lectura/escritura en el primer registro, y por esa razn si empezamos a escribir los registros inmediatamente, vamos a sobrescribir los archivos antiguos, por lo que hemos utilizado el procedimiento Seek para mover el puntero de lectura/ escritura al final del archivo . Seek slo se puede utilizar con archivos de acceso aleatorio. Si se intenta acceder a una posicin de registro que no existe con el procedimiento Seek (por ejemplo, nmero de registro 100, mientras que slo existen 50 registros), obtendremos un error.

    Tambin hemos usado la funcin FileSize que devuelve el nmero de registros actuales en el archivo. Se utiliza en combinacin con el procedimiento Seek para saltar al final del archivo:

    Seek(F, FileSize(F)); // Ir hasta el ltimo registro

    47

  • Note that this example can be used if the Student marks file already exists; if not, then we should run the first program (Storing Student Marks) because it uses Rewrite which can create new files.Tenga en cuenta que este ejemplo se puede utilizar si el archivo de notas de alumnos ya existe. Si no, debemos ejecutar previamenteel primer programa (Programa de notas ), ya que utiliza Rewrite y puede crear un nuevo archivo.

    Podemos combinar los dos mtodos (Reset y Rewrite) en funcin de si el archivo existe, como lo hemos hecho en el ejemplo siguiente:

    Programa crear y agregar notas de alumnos

    program ReadWriteMarks;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    var F: file of Byte; Mark: Byte;begin AssignFile(F, 'marks.dat'); if FileExists('marks.dat') then begin FileMode:= 2; // Poner en modo lectura/escritura Reset(F); // Abrir archivo Writeln('File already exist, opened for append'); // Mostrar registros del archivo while not Eof(F) do begin Read(F, Mark); Writeln('Mark: ', Mark); end end else // Archivo no encontrado, crearlo begin Rewrite(F); Writeln('El archivo no exista, ha sido creado'); end;

    Writeln('Por favor ingrese la nota de estudiante, escriba 0 para salir'); Writeln('Puntero de archivo apuntando al registro # ', FilePos(f)); repeat Write('Ingrese una nota: '); Readln(Mark); if Mark 0 then // No escribir valor 0 Write(F, Mark);

    48

  • until Mark = 0; CloseFile(F);

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    Observe que en este ejemplo, no utilizamos el procedimiento Seek, en cambio, lemos todo el contenido de notas de alumnos primero. Esta operacin (leer todo el archivo) mueve el puntero al final del mismo.

    En el siguiente ejemplo, vamos a utilizar un archivo de registros para almacenar la informacin de Automviles

    Programa base de datos de automoviles

    program CarRecords;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    type TCar = record ModelName: string[20]; Engine: Single; ModelYear: Integer; end;

    var F: file of TCar; Car: TCar;begin AssignFile(F, 'cars.dat'); if FileExists('cars.dat') then begin FileMode:= 2; // Poner en modo lectura/escritura Reset(F); // Abrir archivo Writeln('Archivo existente, abierto para agregar'); // Mostrar registros del archivo while not Eof(F) do begin Read(F, Car); Writeln; Writeln('Car # ', FilePos(F), ' --------------------------'); Writeln('Model : ', Car.ModelName); Writeln('Year : ', Car.ModelYear); Writeln('Engine: ', Car.Engine); end end

    49

  • else // Archivo no encontrado, crearlo begin Rewrite(F); Writeln('El archivo no exista, ha sido creado'); end;

    Writeln('Por favor ingrese la informacin del auto, ', 'escriba x en el nombre de modelo para salir'); Writeln('Puntero de archivo apuntando al registro # ', FilePos(f));

    repeat Writeln('--------------------------'); Write('Ingrese marca del auto : '); Readln(car.ModelName); if Car.ModelName 'x' then begin Write('Ingrese el modelo(ao) : '); Readln(car.ModelYear); Write('Ingrese el tamao de cilindrada: '); Readln(car.Engine); Write(F, Car); end; until Car.ModelName = 'x'; CloseFile(F);

    Write('Presione la tecla Enter para cerrar..'); Readln;end.

    En el ejemplo anterior, declaramos el tipo TCar para definir la informacin del coche. El primer campo (ModelName) es una variable de cadena, pero limitamos su longitud mxima a 20 caracteres:

    ModelName: string[20];

    Debemos utilizar esta declaracin para variables de cadena antes de usarlos en los archivos, ya que las variables estndar ANSI cadena tiene un tipo diferente e ilimitado de almacenamiento en memoria, pero para los archivos con tipo, el tamao de cada tipo de dato debe definirse.

    Copiando archivos

    Todos los tipos de archivos, tales como archivos de texto, archivos binarios, se basan en unidades de byte, que es la ms pequea representacin de datos en la memoria del ordenador y en el disco. Cada archivo debe contener un byte, dos bytes, etc, o ningn byte en absoluto . Cada byte podra contener un nmero entero o un cdigo de caracteres 0 a 255. Podemos abrir todo tipo de archivos utilizando un archivo de tipo Byte o de tipo Char.

    Podemos copiar cualquier archivo a otro usando de archivos de Byte, y el resultado ser un nuevo archivo que es idntico al contenido del archivo de origen.

    50

  • Copiar archivos usando file of byte

    program FilesCopy;

    {$mode objfpc}{$H+}

    uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils { usted puede agregar unidades despues de aqu };

    var SourceName, DestName: string; SourceF, DestF: file of Byte; Block: Byte;begin Writeln('Copiar archivos'); Write('Igrese el nombre del archivo orgen: '); Readln(SourceName);

    Write('Ingrese el nombre del archivo destino: '); Readln(DestName); if FileExists(SourceName) then begin AssignFile(SourceF, SourceName); AssignFile(DestF, DestName);

    FileMode:= 0; // Modo solo lectura Reset(SourceF); // Abrir archivo origen Rewrite(DestF); // Crear archivo destino

    // Comenzar la copia Writeln('Copiando..'); while not Eof(SourceF) do begin Read(SourceF, Block); // Leer un Byte desde archivo origen Write(DestF, Block); // Escribir ese Byte en archivo destino end; CloseFile(SourceF); CloseFile(DestF);

    end else // Archivo origen no encontrado Writeln('El archivo de orgen no existe');

    Write('Copia de archivo finalizada, Presione la tecla Enter para cerrar.'); Readln;end.

    Despus de ejecutar el ejemplo anterior, podrn ingresar en el archivo origen existente y en el nuevoarchivo destino. En Linux podemos introducir nombres de archivos como estos:

    Input source file name: /home/motaz/quran/mishari/32.mp3

    51

  • Input destination file name: /home/motaz/Alsajda.mp3

    En Windows podramos ingresar algo como esto:

    Input source file name: c:\photos\mypphoto.jpgInput destination file name: c:\temp\copy.jpg

    Si el archivo origen existe en el mismo directorio que el programa FileCopy, podramos introducir slo el nombre del archivo de la siguiente manera:

    Input source file name: test.pasInput destination file name: testcopy.pas

    Si usamos este mtodo para copiar archivos de gran tamao, tomar un tiempo muy largo en comparacin con los procedimientos de copia del sistema. Eso significa que el sistema operativo utiliza una tcnica diferente para copiar archivos. Si desea copiar un archivo de 1 megabyte, esto significa que el bucle while se repetir alrededor de 1 milln de veces, lo que significa un milln de operaciones de lectura y un milln de operaciones de escritura. Si se reemplaza el archivo file of Byte por file of Word, se reducir a alrededor de 500.000 cicl