Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pascal The Evolution PDF
Pascal The Evolution PDF
1. Introduccin
Pascal y Turbo Pascal
Pascal es un lenguaje de alto nivel y de propsito general (es aplicable a un gran nmero de aplicaciones diversas) desarrollado por el profesor suizo Niklaus Wirth como un lenguaje para ensear la programacin con un mtodo disciplinado y sistemtico. Wirth trat de eliminar las inconsistencias de otros lenguajes de programacin de su poca y adems que sirviera para ensear las tcnicas de programacin a sus alumnos. Una versin preliminar del lenguaje apareci en 1968 y a finales de 1970 apareci el primero compilador totalmente completo. Las diferentes versiones ofrecan interpretaciones ligeramente diferentes que impedan la compatibilidad entre ellas. Por estas razones, mediante diferentes proyectos, se logr la estandarizacin bajo las normas ISO (International Standards Organization), ANSI (American National Standards Institute) y IEEE (Institute of Electrical and Electronics Engineers). Sin embargo, las versiones ms populares conocidas como UCSD (Construida por Regents) y Turbo Pascal (de Borland) no estn estandarizadas. Esta ltima es la ms conocida y la ms utilizada.
Caractersticas principales Excelente para el aprendizaje de la informacin. Lenguaje de propsito general. Lenguaje procedimental (orientado a rdenes). Lenguaje estructurado (Permite while, for y repeat y no necesita el goto).
Lenguaje recursivo (Puede llamarse a s mismo una funcin o procedimiento). Riqueza en los tipos de datos.
Turbo Pascal Fue lanzado por la firma Borland International en 1983 a modo experimental. Fue todo un xito, pues adems de funcionar, compilaba y corra los programas ms rpido. Las versiones han evolucionado de la 1.0 hasta la 7.0 que cuenta con una biblioteca de objetos denominada Turbo Visin.
Las estructuras desde los dos puntos de vista se representan de la siguiente forma:
3. Programacin modular
La programacin modular es uno de los mtodos de diseo ms flexibles y potentes para mejorar la productividad de un programa. En programacin modular el programa se divide en mdulos (partes independientes), cada una de las cuales ejecuta una nica funcin o actividad y se codifican independientemente de otros mdulos. Cada uno de estos mdulos se analiza, codifica y pone a punto por separado. Cada programa contiene un mdulo denominado programa principal que controla todo lo que sucede; se transfiere el control a los submdulos o subprogramas. Estos ejecutan su funcin y una vez completada su tarea, devuelven el control al mdulo principal. Cada submdulo se puede descomponer en otros submdulos, dependiendo de la complejidad de la tarea a realizar y la subdivisin contina hasta que cada mdulo tenga una sola tarea para ejecutar.. Un submdulo puede realizar tareas de distinta naturaleza como: entrada, salida, manipulacin de datos, control de otros mdulos o una combinacin de stos. Un mdulo puede transferir temporalmente (bifurcar) el control a otro mdulo; sin embargo, cada mdulo debe eventualmente devolver el control al mdulo del cual recibi originalmente el control.
La asignacin de tipos a los datos persigue dos objetivos: Detectar errores de operaciones en programas. Determinar cmo ejecutar las operaciones.
Si se asigna un valor fuera del lmite de cada tipo, producir un mensaje de error: Error 76: Constant out of range Byte: Son los datos comprendidos entre 0 y 255. Integer: Enteros que estn entre -32.768 y 32.767. Longint: A partir de la versin 4.0 se ampla el rango de los enteros. Van desde: -2.147,483.647 hasta 2.147,483.647. Shortint: Son datos enteros comprendidos entre -128 y 127. Son utilizados cuando se debe trabajar con valores pequeos y se desea economizar memoria. Ocupan 1 byte de memoria. Word: Se utiliza cuando se desea representar nicamente valores positivos. Ocupan dos bytes de memoria y van de 0 a 65.535.
5. Identificadores y expresiones
Identificadores Representan los objetos de un programa (constantes, variables, tipos de datos, procedimientos, funciones, unidades, programas y campos de registros). Un identificador es una secuencia de caracteres de cualquier longitud, pero el lmite significativo es de 63 caracteres. Existen tres reglas bsicas para nombrar los identificadores: Debe comenzar con una letra (A a Z, maysculas o minsculas). No puede contener blancos. Los caracteres permitidos despus del primer carcter son letras, dgitos y el carcter de subrayado ( _ ). No se puede utilizar una palabra reservada como identificador. Las palabras reservadas son aquellos trminos que tienen un significado especial para Pascal y no se pueden utilizar para otros propsitos.
Algunas palabras reservadas son: absolute, and, array, begin, const, div, do, downto, else, if, in,label,mod,not,of, packed, procedure, record, set, shr, then,to, unit, uses, var, while, xor. Expresiones Una expresin es un conjunto de datos o funciones unidos por operadores aritmticos. Pascal soporta los siguientes operadores:
Reglas para la evaluacin de expresiones Todas las subexpresiones entre parntesis se evalan primero. Cuando existan subexpresiones con parntesis anidados se evalan de dentro hacia fuera. El parntesis ms interno se evala primero. Prioridad de operaciones. Dentro de una misma expresin o subexpresin, los operadores se evalan en el siguiente orden: 1 2 *,/, div, mod +, -
Regla asociativa izquierda. Los operadores en una misma expresin o subexpresin con igual nivel de prioridad ( *, / ) se evalan de izquierda a derecha.
4 + 10 14 b. 23 * 2 div 5 46 div 5 9 Prctica Evale las siguientes expresiones: 8 * 5 * (7+2 - (4 + 4)) (1 + 6) * 5 div 7 mod 4 + 1 3 + 4 - 14 /2 2 * (2 + 6 * 4) R/ R/ R/ R/ 40 2 0 52 (de izquierda a derecha, primero * y luego div)
6. Concepto de sentencia
Las sentencias son pasos que describen las acciones algortmicas que pueden ser ejecutadas. Se clasifican segn su operatividad en ejecutables y no ejecutables. Las ejecutables son aquellas que especifican operaciones de clculos aritmticos y entradas/salidas de datos y no ejecutables son las que no realizan ninguna accin concreta, sino que ayudan a la legibilidad el programa sin afectar su ejecucin. Las sentencias ejecutables son aquellas que aparecen en el cuerpo del programa luego de la palabra begin. Estructura de un programa en Pascal Program Nombre; Uses Crt,Printer; Var Cedula: Apellido1: Apellido2: String[16]; String[15]; String[15];
Write (`Digite la cdula: `); Readln (Cedula); Write (`Digite el primer apellido: ); Readln (Apellido1); Write (`Digite el segundo apellido: `); Readln (Apellido2); Write (`Digite el nombre: `); Readln (Nombre); Write (`Digite la edad: `); Readln (Edad); Write (`El empleado se llama `,Apellido1, `,Apellido2, `,Nombre, `,y tiene `,Edad, ` `,aos); End.
A := 16 (Se le asigna 16 a la variable A) Inicial := `LJ (Se asigna el texto LJ a la variable Inicial) N1 := N2 (El valor de la variable N1 se cambia por el valor de la variable N2). N1 := N1 + 5 (El valor de N1 se modifica incrementndose
en 5).
Begin Write (`El mayor es: `,Valor1); Readln End Else If Valor1< Valor2 then Begin Write (`El mayor es: `,Valor2); Readln End Else Begin
Write (`Son iguales); Readln End End; Begin Write (`Digite un valor: `); Readln (Valor1); Write (`Digite otro valor: `); Readln (Valor2); Elmayor End.
Los datos estructurados como arrays, registros o conjuntos, no se pueden leer globalmente y se suele recurrir a disear procedimientos especficos. Los procedimientos de lectura son: Read y ReadLn. Estos esperan a que se pulse la tecla ENTER antes de asignar un valor a la variable. 2.4.1.1 Ejemplo Program Suma; Uses Crt; Var i,j : integer; Begin
Clrscr; Write (`Introduzca el primer nmero: `); Readln (i); Write (`Introduzca el segundo nmero: `); Readln (j); WriteLn (`La suma es `,i+j); End. 2.4.2 Concepto de salida Los programas para ser tiles deben proporcionar informacin de salida (resultados). Esta salida toma informacin de la memoria y la sita o almacena en: la pantalla, en un dispositivo de almacenamiento (disco duro o flexible), o en un puerto de E/S (puertos serie para comunicaciones o impresoras). El procedimiento que se utiliza para visualizar o escribir la informacin es el Write o el WriteLn. Tanto el Write como el WriteLn cumplen la misma funcin, o sea desplegar informacin. La diferencia es que el WriteLn despliega la informacin y salta a la lnea siguiente. 2.4.2.1 Ejemplo Program Resultado; Uses Crt; Var Nombre : String[30]; Begin
End.
9. Prctica
1. Hacer un programa que lea su cdula, su nombre y su telfono y los imprima en pantalla. 2. Hacer un programa que lea tres nmeros, que calcule el mayor y el menor de esos nmeros y los imprima. 3. Hacer un programa que lea un cdigo de producto, su descripcin, su precio unitario, las unidades compradas y el precio total a pagar e imprima el resultado. 4. Hacer un programa que lea dos nmeros y que imprima el resultado de su suma, su resta, su multiplicacin y su divisin. 5. Hacer un programa que lea la cdula de un trabajador, su nombre y su salario. Debe calcular el 8% correspondiente al rebajo de la CCSS y el 1% del Banco Popular, el total de deducciones y el salario neto. Al final debe imprimir lo siguiente: "Estimado empleado: (nombre). En este mes su salario se desglosa as: Salario bruto: (Salario) 8% CCSS: (CCSS) 1% Banco Popular: (BP) Total de deducciones: (Totded) Salario Neto: (Salneto) 6. Escriba un programa que lea tres nmeros para tres variables a, b y c. Con base en los valores almacenados, calcule la expresin ((a+7*c)/(b+2-a)+2*b).
3.1.3 Operadores lgicos Las expresiones lgicas pueden combinarse para formar expresiones ms complejas. Esto se logra utilizando los operadores lgicos: and, or y not. La operacin and (y) combina dos condiciones simples y produce un resultado verdadero s y slo s los dos operandos de la expresin son verdaderos. La operacin or (o) es verdadera si uno de los dos operandos es verdadero. La operacin not (no) acta sobre una sola condicin simple u operando y simplemente niega o invierte su valor. Esto se puede demostrar ms fcilmente mediante las tabla de verdad para cada operador.
3.1.3.2 Operador or
Ejemplo: Program Numeros; Var Numero : Real; Begin Writeln (`Introduzca un nmero `); Read (Numero); If Numero > 0.0 Then Begin Writeln (`El nmero introducido es positivo); Readln End Else Begin
Writeln (`El nmero introducido es negativo); Readln End; End. 3.2.1 Sentencias IF anidadas La sentencia que sigue a la palabra reservada then o else puede ser cualquiera, incluso otra sentencia if - then - else. Cuando existe una sentencia if - then - else dentro de otra sentencia if - then - else, se dice que dichas sentencias estn anidadas. Ejemplo: Program Mayor; Uses Wincrt; Var A,B,C : Integer; Elmayor : Integer; Begin Writeln (`Digite tres nmeros enteros `);
Readln (A,B,C); If A > B Then If A > C Then Elmayor := A Else Elmayor := C Else If B > C Then Elmayor := B Else Elmayor := C; Writeln (`El nmero mayor es: `,Elmayor) End. 3.2.2 La sentencia CASE La sentencia CASE se utiliza para elegir entre diferentes alternativas. Una sentencia CASE se compone de varias sentencias simples. Cuando un CASE se ejecuta, una y slo una de las sentencias simples se selecciona y se ejecuta. Ejemplo: Program Cursor; (* Este programa mueve el cursor a travs de la pantalla mediante las teclas predefinidas, cuando se presiona otra tecla, emite un pitido de advertencia*) Uses Wincrt; Var X,Y : Integer; C : Char; Begin Clrscr; X := 40;
Y := 10; GotoXY (X,Y); Write (`*); Repeat C := Readkey; GotoXY (X,Y); Write (` `); Case C of `S : Y := Y - 1; `B : Y := Y + 1; `D : X := X + 1; `I : X := X - 1; `P : Exit Else Write (Chr(7) End; GotoXY (X,Y); Write (`*) Until C = `P End.
Program Primos; Var Primo Nmero Begin Primo: = Divisor := 2; WriteLn (`Introduzca un entero positivo: `); ReadLn (Numero); While (Divisor < Numero) and Primo do Begin If Numero mod Divisor = 0 then Primo := False; Divisor := Divisor + 1 End; If primo = True then Writeln (Numero,` ` , ` es primo) Else Writeln (Numero,` ` , ` no es primo) End. True; : bolean; : Integer;
13. Ciclos
Es una estructura de control que permite la repeticin de una serie determinada de sentencias. Se le llama tambin bucle o lazo. El cuerpo del ciclo o bucle contiene las sentencias que se repiten. Pascal proporciona tres estructuras o sentencias de control para especificar la repeticin: while, repeat, for. Nos ocuparemos de estudiar el ciclo FOR y el ciclo REPEAT. 3.4.1 La sentencia FOR En numerosas ocasiones se puede desear un bucle que se ejecute un nmero determinado de veces, y cuyo nmero se conozca por anticipado. Para aplicaciones de este tipo se utiliza la sentencia FOR.
La sentencia FOR requiere que conozcamos por anticipado el nmero de veces que se ejecutan las sentencias que se encuentran dentro del ciclo. El ciclo for se incremente automticamente. Sintaxis: For variable := valor inicial to valor final do Sentencia; Ejemplos: 1. For c := 1 to 5 do Begin Write (`aa); Write (`BB) End; Al ejecutarse, visualiza: AaBBaaBBaaBBaaBBaaBB For Caracter := `A to `Z do WriteLn (Caracter); 3. 4. 1. 1 Decremento del contador FOR (Downto) El contador del ciclo se puede decrementar de uno en uno en lugar de incrementar. La sintaxis es la siguiente: For variable := valor inicial downto valor final do Sentencia; Ejemplos: For C := 5 downto 1 do Begin Write (`C); Writeln End; Lo anterior produce la siguiente salida:
5 4 3 2 1 Tambin podemos encontrar ciclos FOR anidados: For m := 1 to 10 do begin For n := 10 downto 2 do WriteLn (m,n) end; 3.4.2 La sentencia REPEAT Es una variante de la sentencia while. La sentencia REPEAT especifica un ciclo condicional que se repite hasta que la condicin se hace verdadera. El diagrama de flujo se representa de la siguiente manera:
Begin Sentencia 1; Sentencia 2; ... ... ... Sentencia n; End; Until expresion lgica Ejemplo: (* El siguiente programa imprime las secuencias de caracteres hasta que se presione cualquier tecla *) Uses wincrt; Var m : char; n : integer; Begin Repeat Begin Write ('a e i o u'); Write ('1 2 3 4 5'); End; Until keypressed End.
14. Prctica
1. Los patos de un granjero se venden a precios especiales si son grandes pero no demasiado. Disee un programa que lea el nmero de patos que posee el granjero y el peso de cada ave. Al final debe especificar cuntos patos pesan entre 1.5 kilos y 2 kilos inclusive. 2. Disee un programa para calcular e imprimir los primeros 2000 nmeros enteros positivos. 3. Leer las notas de 50 exmenes e imprimir cuntos de ellos tienen nota mayor o igual a 70. 4. Hacer un programa que lea los montos de las N ventas hechas por una tienda en un da y que imprima el monto total de ventas y el monto promedio. 5. Hacer un programa que lea 10 valores numricos (positivos y negativos). Debe imprimir el
nmero de valores negativos, el nmero de valores iguales a cero y el promedio de valores positivos. 6. Encuentre la suma de los primeros 50 nmeros enteros pares. 7. El inters simple se calcula mediante la frmula A=P(1+i*n), donde A=Monto de Inters, P=Capital, N=Nmero de aos e i=tasa de inters. 8. Hacer un programa que lea: P, i, y N e imprima el monto de inters a travs del nmero de aos ledo. 9. Disee un programa para calcular la nmina semanal de una compaa con N empleados. Por cada empleado, se debe leer: N de empleado, salario por hora y nmero de horas trabajadas. Por cada empleado se debe imprimir: N de empleado, salario bruto, impuesto federal, impuesto estatal, cuota del seguro social y salario neto. Los impuestos federales son el 15% del salario bruto, los estatales el 6% y el seguro social el 7%. El salario se calcula de la siguiente manera: Por las primeras 40 horas o menos se paga el salario normal por hora. Por las horas extra (ms de 40) se paga 1.5% adicional por hora. 10. Disee un programa para calcular cuntas veces se puede dividir un nmero X entre un nmero Y de tal manera que el resultado de la divisin sea un nmero entero.
Una cabecera del procedimiento que proporciona el nombre del mismo y, en caso de existir, una lista de parmetros formales. Una seccin de declaracin que puede contener constantes, variables e incluso otros procedimientos. Una seccin ejecutable: el cuerpo del procedimiento. Ejemplo: Program Recuadro; Var I : Integer; Procedure Estrellas; (* Este procedimiento visualiza 15 asteriscos *) Begin For I := 1 to 15 do Write (`*) End; Begin Estrellas; (* Llamado del procedure *); Write (`Mensajes); Estrellas; (* Nuevo llamado del procedure *); End. 4.1.3 Ventajas de utilizar procedimientos La organizacin de un programa en procedimientos lo hace ms fcil de escribir y depurar. Los procedimientos no deben exceder de 25 lneas. Las ventajas de utilizar procedimientos son: Facilita el diseo descendente. Los procedimientos se pueden ejecutar ms de una vez en un programa y/o en diferentes programas, ahorrando tiempo de programacin. El uso de procedimientos facilita la divisin de las tareas entre un equipo de programadores y se pueden comprobar individualmente.
16. Parmetros
4.2.1 Concepto Un parmetro es un mtodo para pasar informacin (valores a variables) del programa principal a un procedimiento y viceversa. Un parmetro es, prcticamente, una variable cuyo valor debe ser ya sea proporcionado por el programa principal al procedimiento o ser devuelto desde el procedimiento hasta el programa principal. Por consiguiente, existen dos tipos de parmetros: Parmetros de entrada: Sus valores deben ser proporcionados por el programa principal.
Parmetros de salida: Son parmetros cuyos valores se calcularn en el procedimiento y se deben devolver al programa principal para su proceso posterior. 4.2.2 Transferencia de informacin desde y/o hasta los procedimientos Existen dos tipos de procedimientos: Procedimientos sin parmetros: No existe comunicacin entre el programa principal y los procedimientos ni viceversa. Procedimientos con parmetros: Existe comunicacin entre el programa principal y los procedimientos o entre dos procedimientos. Ejemplo 1: (Parmetros de entrada) Procedure RecuadroDos (N : Integer); Var J : Integer; Begin For J := 1 to N do Write(`*) End; Ejemplo 2: (Parmetros de entrada/salida) El procedimiento Geometria recibe la longitud y anchura de un rectngulo, calcula el rea y permetro del rectngulo y devuelve los valores obtenidos al programa principal. Procedure Geometria (Longitud, Anchura : Real; Var Area, Permetro : Real); Begin
Area := Longitud * Anchura; Perimetro := 2 * (Longitud + Anchura) End; 4.2.3 Parmetros actuales y formales Las sentencias llamadas a procedimientos constan de dos partes: un nombre de procedimiento y una lista de parmetros llamados actuales: Nombreproc (pa1,pa2, pa3,...); Los parmetros actuales pa1, pa2, pa3, ... deben tener unos valores que se pasan al procedimiento nombreproc. En la declaracin de un procedimiento cuando se incluyen parmetros, stos se denominan parmetros formales o ficticios (pf1, pf2, pf3, ...). Ellos sirven para contener los valores de los parmetros actuales cuando se invoca el procedimiento. Procedure nombreproc (pf1, pf2, pf3, ...) El valor de los parmetros actuales no se conoce cuando se declara el procedimiento, sin embargo, cuando se ejecuta la sentencia de llamada al procedimiento es preciso que tengan valores asignados, ya que en caso contrario se producir un error. Program Correspondencia; Uses Wincrt; Var X,Y,A,P : real; Procedure Geometria (Longitud, Anchura : Real; Var Area, Perimetro : Real); Begin (* Geometra *) Area := Longitud * Anchura; Perimetro := 2 * (Longitud + Anchura) End; Begin WriteLn ('Introducir longitud: '); Readln (X); WriteLn ('Introducir anchura: '); Readln (Y); Geometria (X,Y,A,P); (* Llamada al procedimiento *)
WriteLn ('El rea es: ', A:6:2); WriteLn ('El permetro es: ', P:6:2) End.
Imprimir (D, E, F) End; Begin A := 2; B := 3; C := 4; WriteLn ('Antes de llamar al procedimiento Pasar'); Imprimir (A, B, C); Pasar(A, B, C); WriteLn ('Despus de llamar al procedimiento Pasar'); Imprimir (A, B, C); End. La salida de este programa es: Antes de llamar al procedimiento Pasar a=2 b=3 c=4
Var x,y : real; Procedure mayor (a,b : real); Var max : real; Begin if a > b then max := a else max := b; writeln ('El mayor de los dos nmeros es ',max:4:2); End; Begin repeat write ('Introduzca dos nmeros '); readln (x,y); mayor (x,y) until x = 0 End. 4.2.2 Ejemplo El siguiente ejemplo muestra un intercambio de valores de dos variables con un procedimiento. Program Intercambio; Uses wincrt; Var x,y : real; resp : char; Procedure cambio (var a,b : real); Var
aux : real; Begin aux := a; a := b; b := aux; writeln ('Ahora el valor de a es ',a:5:2,' y el valor de b es ',b:5:2); End; Begin repeat clrscr; write ('Introduzca el valor para x '); readln (x); write ('Introduzca el valor para y '); readln (y); cambio(x,y); writeln; write ('Desea continuar (S/N)?'); readln (resp); until (resp = 'N') or (resp = 'n') End.
4.3.1 Funciones aritmticas o matemticas 4.3.2 Funciones definidas por el usuario Adems de las funciones predefinidas citadas anteriormente, es posible que el usuario pueda declarar sus propias funciones de igual modo que declara sus procedimientos. Una funcin es un subprograma que devuelve un nico resultado al programa o subprograma que le llam. La sintaxis es muy similar a la de un procedimiento. Function nombre (parmetros): tipo (declaracin de variables locales) begin <cuerpo de la funcin> nombre de la funcin := valor de la funcin end; Comparacin entre funciones y procedimientos En vez de la palabra procedure se debe utilizar la palabra function Al igual que en los procedimientos, el nombre de una funcin es un identificador. Sin embargo, el nombre de la funcin se refiere a la posicin de memoria que contiene el valor devuelto por la funcin. La lista de los parmetros formales son los identificadores utilizados para recibir valores del programa. El tipo de datos del resultado coincide con el tipo expresado en la cabecera de la funcin. En el cuerpo de la funcin tiene que existir una sentencia de asignacin como la siguiente: Nombre_funcin := valor_funcin La funcin slo devuelve un valor, el procedimiento puede devolver cero, uno o varios valores. El tipo de dato del resultado de la funcin debe estar indicado en la cabecera y puede ser tipo char, integer, real o bolean. Ejemplo:
Program Cubo; Uses Wincrt; Var Num,valor : integer; Function El_cubo (Numero: integer):integer; Begin valor := Num*Num*Num; End; Begin Write ('Digite un nmero entero: '); Readln (Num); El_cubo(Num); Write ('El cubo de ',Num,' es ',valor); End.
Disee un programa que mediante una funcin calcule la suma de los nmeros que estn en un rango establecido. (Por ejemplo de 1 a 100). Pruebe con varios rangos. Escribir un programa que, mediante una funcin devuelva el valor del da de la semana en respuesta a la entrada de la letra inicial de dicho da. Mediante una funcin, determinar el nmero de das de un mes dado. Escriba un programa que mediante una funcin determine si un nmero es primo.
21. Respuestas
Respuesta No 1. Program Salario; Uses wincrt; Var id_empleado,i,n : integer; nom_empleado : string [40]; sal_bruto,salario_neto,tod_ded: real; resp : char; Procedure calcula (var sal_brut : real); Var cc_ss,b_p : real; Begin cc_ss := sal_brut * 0.08; b_p := sal_brut * 0.01; tod_ded := cc_ss + b_p; salario_neto := sal_brut - tod_ded End; Begin i:=1; Write ('Digite el nmero de empleados a procesar: ');
readln (n); While i <= n do begin clrscr; write ('Id. del empleado ',i,' de ',n,' : '); readln (id_empleado); write ('Nombre: '); readln (nom_empleado); write ('Salario bruto: '); readln (sal_bruto); writeln; calcula(sal_bruto); writeln; writeln ('El salario neto de ',nom_empleado,' es ',salario_neto:10:2); writeln ('Sus deducciones fueron ',tod_ded:10:2); writeln; writeln ('Presione enter para continuar...'); readln; i := i+1; end; End. Respuesta No. 3. Program sumas; Uses wincrt; Var i,n:integer; Function Sumar (N : integer) : integer; Var suma : integer; Begin
Suma := 0; For i:= 1 to N do suma := suma + i; Sumar := Suma; Write ('La suma de los nmeros del 1',' al ',n, ' es: ',suma); Readln; End; Begin Write ('Digite el nmero mximo: '); Readln (N); Sumar (N); End. Respuesta No. 6. Program TestPrimos; Uses Wincrt; Var N : integer; Function Primo (Q : integer) : boolean; Var D : integer; P : boolean; Begin If Q < 4 then Primo := True Else Begin P:= True; D := 2;
While P and (D<=Q div 2) do Begin P := Q mod D <> 0; D := D + 1 End; Primo := P End End; Begin Writeln ('Introduzca un entero positivo o cero para terminar: '); Readln (N); While N > 0 do Begin If Primo (N) then Writeln (N,' es primo') Else Writeln (N,' no es primo'); Writeln ('Introduzca otro entero'); Readln (N); End; Writeln End.
22. Arreglos
Introduccin Primero que todo, es importante conocer el concepto de estructura de datos. Una estructura de datos es "una coleccin de datos organizados de un modo particular." Las estructuras de datos pueden ser de dos tipos: estticas y dinmicas. Las estructuras de datos estticas son aquellas a las que se le asigna una cantidad fija de memoria cuando se declara la variable. Las estructuras de datos dinmicas son aquellas cuya ocupacin de memoria puede aumentar o disminuir durante el tiempo de ejecucin. Entre las
estructuras de datos estticas podemos encontrar los vectores y los arreglos, tema que estudiaremos a continuacin. 5.0 Concepto Un array (se suele traducir como arreglo) es una estructura de datos en la que se almacena una coleccin de datos del mismo tipo, por ejemplo, los salarios de los empleados de una empresa. Un array es una lista de un nmero determinado de elementos del mismo tipo. Se caracteriza por: Almacenar los elementos del array en posiciones de memoria continua. Tener un nico nombre de variable (por ejemplo salarios) que represente a todos los elementos. stos a su vez se diferencian por un ndice o subndice. Se puede accesar directa o aleatoriamente los elementos del array.
5.1.1 Declaracin de un array o vector Siempre se deben declarar luego de las constantes (si existen). Un array o vector se declara por medio del tipo de array. La sintaxis es la siguiente:
Type Nombre_array = array [rango del subndice] of tipo; Nombre_array: Se refiere a un nombre de identificador vlido. Tipo_subndice: Puede ser boolean, char o un rango de tipo enumerado. Tipo: Se refiere al tipo de los elementos del vector. Todos los elementos deben ser del mismo tipo. Ejemplos: Type X = array [1..8] of real; Type Luces = (Rojo, Verde, mbar); Type DiasDeSemana=(Lunes, Martes, Mircoles, Jueves, Viernes, Sabado, Domingo); ConjuntoDias = array Type Salarios = array [A..Z] of real; (En este caso es de tipo real porque el salario es de ese tipo. El subndice indica que los salarios van de los empleados cuya inicial es A hasta la Z). Las declaraciones de tipo array no crea ninguna variable especfica de tipo array, sino que proporciona informacin del array como un todo. Para declarar una variable tipo array, se utiliza la siguiente sintaxis: Type Valores = array [1..10] of real; Var Precios : Valores; Primeramente se crea el tipo del array y luego se declara la o las variables referenciadas al array. Otro ejemplo de aplicacin puede ser el siguiente: Const Max = 500;
Type Texto = array [1..Max] of char; Var Palabras, Letras: Texto; En este ejemplo se crean dos variables arrays: Palabras y Letras. Las posiciones del array van de 1 a 500 y contendrn un valor tipo caracter. 5.1.2 Lectura y escritura de un vector 5.1.2.1 Lectura Para leer un vector se debe hacer elemento a elemento y se requiere de alguna estructura repetitiva, ya sea un while, repeat o for. Ejemplos: I := 1; While I <= 100 do Begin Read (Notas [I]); I := I+1 End; 5.1.2.1 Escritura Para visualizar un vector, igualmente, es necesario situarlo dentro de una estructura repetitiva. For I := 1 to Numero do Writeln (Notas [I]:3); Writeln; (* Evita que todas las salidas del vector aparezca en la misma lnea *) I := 1; Repeat Read (Notas[I]); I := I + 1 Until I > 100 For I:= 1 to n do Readln(Notas[I]);
Ejemplo: Type Tabla = array [1..25,1..4] of real; Var Grados : Tabla; Para localizar o almacenar un valor en el array se deben especificar dos posiciones o subndices, uno para la fila y otro para la columna. 5.2.2 Escritura de una matriz Para escribir un vector, se debe hacer referencia tanto a la fila como a la columna. As: For fila := 1 to 3 do Begin For Columna := 1 to 4 do Write (A[Fila, Columna]:4); End; Ejemplo: Calcular el promedio de cada estudiante de una lista de veinticinco alumnos de una clase de informtica con notas en cuatro asignaturas. Program Promedio; Var Notas I,J : Array [1..25,1..4] of real; : Integer;
Suma,Prom: Real; Begin For I := 1 to 25 do Begin Write (`Notas del estudiante: ,I:1); Writeln (`En una misma lnea digite todas las notas);
Suma := 0; For J := 1 to 4 do Begin Read (Notas[I,J]); Suma := Suma + Notas[I,J] End; Readln; Prom := Suma/4; Writeln (`La nota promedio del estudiante `,I:1, es `,Prom:1:1) End End.
25. Prctica
Escriba un programa que almacene en un vector los das de la semana. Escriba un programa que almacene en un vector su nombre. Escriba un programa que almacene en un vector los nmeros pares del 1 al 10. Escriba un programa que lea diez nmeros enteros y los invierta. Escriba un programa que lea las dimensiones de una matriz, las lea, visualice la matriz y que encuentre el menor y mayor elemento de esa matriz y sus posiciones. Escriba un programa que encripte un password de siete letras debe contener consonantes y vocales. El algoritmo de encriptacin ser sustituir cada vocal por el nmero que le corresponde. (A=1, E=2,O=3,I=4,U=5). Escribir un programa que en una matriz almacene los nmeros primos del 1 al 100. Escriba un programa que capture e imprima la siguiente tabla: Distrito 1 2 3 4 Candidato A 194 180 221 432 Candidato B 48 20 90 50 Candidato C 206 320 821 946
Escriba un programa que almacene en una matriz los nmeros pares del 1 al 40 y los imprima.
Begin Mensaje := `Hola mis amigos, por favor estudien bastante; Write (`Mi mensaje de hoy para ustedes es: `),Mensaje; Writeln; Write (`Presione enter...); Readln End. 6.1.2 Longitud de una cadena Una cadena fsicamente es una estructura de una secuencia de 0 hasta 255 caracteres de longitud. Sin embargo, la ocupacin en memoria de una cadena es un nmero de bytes igual al de caracteres de la cadena ms uno. As la cadena: `Programador tiene una longitud de 11 caracteres, entonces ocupar en memoria 12 bytes. Esto se debe a que el primer byte en una cadena, contiene la longitud de la cadena actualmente almacenada en memoria.
Supongamos que esta palabra corresponde a un dato almacenado en la variable PUESTO que fue definida de la siguiente manera: Var Puesto : String[20]; Sucede que, entonces, la longitud lgica de la variable ser de 11 bytes pero la longitud fsica ser de 20 bytes pues as fue definida. 6.1.3 Asignacin de cadenas A las variables de cadena, como se ha visto, se pueden dar valores con una sentencia de asignacin o con una sentencia de lectura (read). Ambas situaciones se pueden describir con la ecuacin: Destino fuente
Donde destino es la cadena a la que se da un valor y fuente es la expresin de cadena que contiene el correspondiente valor. Esta ecuacin acta como la sentencia de asignacin que evala la cadena fuente y se almacena en la variable de la cadena destino. Dependiendo del tamao (longitud de la cadena) de las cadenas fuente y destino se pueden presentar tres casos diferentes que analizaremos a partir de la siguiente declaracin de variables de cadena.
Var Cad1 : String [8]; Cad2 : String [11]; Cad3 : String [15]; Cad4 : String [11]; 6.1.3.1 Caso I. Las longitudes de la cadena destino y fuente son iguales Supongamos que se ejecuta la sentencia Cad2 := `informatica; Este caso no presenta problemas, pues cada posicin de cad2 se rellena con un carcter. Cad2 I 1 N 2 F 3 O 4 R 5 M 6 A 7 T 8 I 9 C 10 A 11
Lo mismo sucede si se ejecuta la sentencia Cad4 := Cad2; 6.1.3.2 Caso II. La longitud de la cadena destino es mayor que la cadena fuente Supongamos que ahora se ejecuta la sentencia Cad3 := Cad2; Resultar que Cad3 tiene 15 caracteres y slo hay 11 caracteres en cad2. La cadena Cad3 seguir teniendo una longitud mxima de 15 caracteres, pero slo se almacenan en ella ahora 11 caracteres y su longitud actual ser de 11. Cad3 I NFORM ATI C A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 longitud actual = 11 longitud mxima = 15
6.1.3.3 Caso II. La longitud de la cadena destino es mayor que la cadena fuente Supongamos que se trata de ejecutar ahora Cad1 := Cad2; En este caso, como Cad1 tiene una longitud de ocho caracteres, la cadena destino no se puede almacenar totalmente. En este caso se trunca la cadena destino y se almacenan en Cad1 los primeros ocho caracteres (de izquierda a derecha) de Cad2. Cad1 I NFORM AT 123 4 56 78 longitud actual = 11 longitud mxima = 8
3. Escribir un programa que en una matriz almacene los nmeros primos del 1 al 100 y que al final del programa, en una variable proporcione la suma. 4. 5. Escriba un programa que lea diez nmeros enteros y los invierta. Escriba un programa que cuente las vocales de una palabra.
6. Escriba un programa que lea una cadena de caracteres en minscula y la convierta a mayscula. Utilice procedimientos. 7. Escriba un programa para almacenar la siguiente tabla, que cuente los votos e imprima el candidato ganador. Distrito 1 2 3 4 Candidato A 194 180 221 432 Candidato B 48 20 90 50 206 320 140 821 Candidato C
8. Hacer un programa que lea una cadena de caracteres, que imprima la longitud de la cadena y contar el nmero de vocales que tiene la palabra o frase.
29. Punteros
Introduccin Como vimos anteriormente en la leccin nmero 5, las estructuras de datos dinmicas son aquellas cuya ocupacin de memoria puede aumentar o disminuir durante el tiempo de ejecucin. Mediante los punteros, tema que estudiaremos a continuacin, podemos crear estructuras de datos dinmicas que tienen capacidad de variar en tamao y ocupar tanta memoria como realmente requieran. Estas estructuras son llamadas punteros. 7.1 Concepto Los punteros son tambin llamados apuntadores. Son tipos de datos que permiten crear estructuras de datos dinmicas, las cuales pueden variar en tamao y memoria requerida. Las variables que se crean y se destruyen durante la ejecucin se llaman variables dinmicas o annimas. As, durante la ejecucin de un programa, puede haber una posicin de memoria especfica asociada con una variable dinmica y posteriormente puede no existir ninguna posicin de memoria asociada con ella.
Una estructura de datos dinmica es una coleccin de elementos llamados nodos de la estructura - normalmente tipo registro- que se enlazan o encadenan juntos. Este enlace se establece asociando con cada nodo un puntero que apunta al nodo siguiente de la estructura. Las estructuras de datos dinmicas son tiles para almacenar y procesar conjuntos de datos cuyos tamaos cambian durante la ejecucin del programa, por ejemplo, el conjunto de trabajos que se han introducido en una computadora y estn esperando su ejecucin o el conjunto de nombres de pasajeros y asignacin o el conjunto de nombres de pasajeros y asignacin respectiva de asientos de un vuelo de avin determinado. Pascal proporciona los mtodos para asignar y liberar espacio de memoria utilizando punteros y los procedimientos new y dispose. El tipo de datos puntero es de tipo simple pues no se puede romper en otros componentes ms pequeos, como s sucede con el array o el registro. Los punteros son variables que se utilizan para almacenar la direccin de memoria de otra variable. Las variables que se utilizan para almacenar direcciones son llamadas variables puntero o simplemente puntero. Grficamente se representa as
Al definir un puntero se debe indicar el tipo de valores que se almacenarn en las posiciones designadas por los punteros. Esto se debe a que los diferentes tipos de datos requieren distintas cantidades de memoria para almacenar sus constantes, una variable puntero puede contener una direccin de una posicin de memoria adecuada slo para un tipo dado. Por esta razn se dice que un puntero apunta a una variable particular, es decir, a otra posicin de memoria. Una variable tipo puntero contiene la direccin de la posicin de otra variable. 7.1.1 Declaracin de punteros Se puede declarar un puntero a una variable carcter, a un array de enteros, a un registro, o a cualquier otro tipo de dato. Y se pueden declarar como Var o Type. La sintaxis para la declaracin de un puntero es la siguiente: Var Nombre-variable : ^ identificador - tipo Ejemplo: Var Ptr : ^Real La variable Ptr apunta a un tipo de dato TipoElemento. Un ejemplo grfico es el siguiente, donde la variable P contiene 059164 que es la direccin de memoria donde est la variable entera apuntada 345:
Sin embargo, estas operaciones no se pueden realizar directamente luego de la declaracin, debido a que el objeto o direccin P^ no existe. Antes de que un programa utilice un puntero, se requiere abrir espacio para el tipo de datos objeto de la direccin del puntero. Para iniciar un puntero se debe utilizar el procedimiento NEW. 7.2.1 New La declaracin de un puntero P no crea una celda de memoria para apuntar a ella. El procedimiento (sentencia) New se utiliza para crear la celda de memoria P; es decir, el procedimiento New crea una variable dinmica y establece que una variable puntero apunte a ella. Sintaxis: New (P) P representa la variable puntero. La sentencia New (P); llama al procedimiento New que asigna almacenamiento para un valor determinado y sita la direccin de esta celda de memoria en la variable puntero P. Una vez que se asigna almacenamiento para un valor de tipo determinado al que est apuntando P, se puede almacenar un valor en esa celda de memoria y manipularlo. Ejemplo: New (Ptr);
Ptr^ := `Mckenna; La sentencia New (Ptr) crea una celda vaca de memoria a la que apunta Ptr. La segunda sentencia sita el valor `Mckenna en esa celda de memoria. Grficamente se representara as:
7.2.2 Dispose El procedimiento Dispose libera la posicin de memoria ocupada por una variable dinmica. Sintaxis: Dispose (P) (* P es una variable tipo puntero *) Grficamente se representa as:
Dispose destruye la variable referenciada por P y devuelve su zona de memoria 7.2.2.1 Constante nil Pascal proporciona una constante predefinida, nil (nulo. La constante nil se utiliza para dar un valor a una variable puntero que no apunta a ninguna posicin, nil puede ser asignad a un puntero de cualquier tipo. P:= nil; P:=5 Ejemplo: Var P,Q : ^Integer; Begin New (P); P^ :=8; Q^ :=P; Q^ :=5;
Dispose (P) End. 7.2.3 Assigned Determina si un puntero o variable de tipo procedimiento es nil. Especifica si el argumento es nil o e el argumento tiene un valor. Su sintaxis es: Function Assigned (Var P) : Bolean; P debe ser una referencia de un puntero o tipo procedimiento. La funcin devuelve verdadero (true) si P no es nil o falso (false) si es nil. Una posible aplicacin puede ser la siguiente: Var P : Pointer; Begin P : nil; If Assigned (P) then Writeln (`Prueba Uno); P := @P; If Assigned (P) then Writeln (`Prueba Dos); End. La llamada Assigned(P) correspondiente a la evaluacin de P <> nil para una variable puntero, mientras @P <> nil se corresponde a una variable por procedimiento.
Lista id1 : Tipo1; Lista id2 : Tipo2; Lista id3 : Tipo3; . . . Lista idN : TipoN; End; Nombre_reg: Nombre de la estructura o registro. Lista id: Lista de uno o ms nombres de campos que componen el registro. Tipo: Puede ser cualquier tipo de dato estndar o definido por el usuario. Un registro se suele representar grficamente en funcin de sus campos: Empleado
Tipo real
Empleado = record Nombre : String[30]; Edad : Integer; Domicilio : String[40]; Salario : Real; End;
Los datos mostrados anteriormente en Empleado mediante una secuencia de sentencias de asignacin: Empleado.Nombre := `Chi-ki-tico; Empleado.Edad := 34; Empleado.Domicilio := `Calle El ltimo Grito; Empleado.Salario := 245320; Una vez que los datos estn almacenados en un registro, se pueden manipular de igual forma que otros datos en memoria. Write (Empleado.Nombre); (* Visualiza Chi-ki-tico *) 8.2.2 Operaciones sobre registros Los procedimientos de lectura y escritura permiten nicamente nmeros caracteres o cadenas. Un registro al ser una estructura compuesta (distintos tipos de datos) es preciso efectuar las operaciones de lectura y escritura individualmente. Otra operacin que se puede realizar entre registros es la asignacin (copia del contenido de un registro en otro del mismo tipo). Si A y D son variables registro del mismo tipo, la sentencia: A := D copia todos los valores asociados con el registro D al registro A. Ejemplo: Type Stock = record Numeros : Integer; Nombre : String[20]; Precio : Real; end; Var Articulo : Stock 8.2.3 La sentencia WITH La tarea de escribir el selector de campo completo cada vez que se referencia un campo de un registro es tediosa, sobre todo si el nmeros es grande. La sentencia WITH permite referenciar el nombre del registro en su cabecera y posteriormente para llamar a algn campo slo se necesita el nombre del campo y no el selector de campo completo, con el nombre del registro (por ejemplo, Edad en vez de Cliente.Edad).
Sintaxis: With Camporegistro do Begin (* Sentencias que hacen referencia a campos de Camporegistro *) End; Camporegistro: Nombre o nombres de registros. Sentencias: Relacionadas con los campos. Ejemplo: Program Ejemplo; Type Empleado = record Nombre : String [20]; Edad : Integer; Empresa : String [30]; End; Var Socio : Empleado; Deducciones : Real; Begin With Socio do Begin Readln (Nombre); Neto := Salario - Deducciones; Writeln (Empresa); End; End.
Rewrite (f); Existen algunos aspectos importantes que se deben tomar en cuenta al utilizar la sentencia Rewrite: Si al abrir el archivo de texto, con assign y reset, ya existe en el disco, la sentencia Rewrite lo rescribir, en otras palabras, "se perderT el archivo contiguo. Por el contrario, las sentencias assign y rewrite suponen la existencia del archivo llamado en el disco. Si este archivo no existe, las sentencias anteriores producirn errores de ejecucin. El siguiente programa define un tipo registro (cliente) y a continuacin rellena (pone valores en los campos) en la variable correspondiente. Otra variable del mismo tipo se asigna a la primera variable y los campos de la segunda variable se imprimen uno a uno. Program Visualiza_Registros; Type Datos = record Nombre : String [80]; Direccion : String [80]; Edad : Integer; Saldo : Real End; Var Aux, Cliente : Datos; Begin Write (`Digite el nombre del cliente: `); Readln (Cliente.Nombre); Cliente.Direccin := `Calle El ltimo Grito; Write (`Digite la edad del cliente: `); Readln (Cliente.Edad); Cliente.Saldo := 245320; Aux := Cliente; (* Transfiere los datos al registro Aux *) (* Visualizacin de los campos de Aux *) Writeln (`Nombre: `, Aux.Nombre);
Este mtodo de lectura/escritura campo a campo es engorroso. Pascal proporciona la sentencia with que facilitar el proceso de lectura/escritura de los registros. 8.3.2 - 8.3.3 Manipulacin de archivos tipificados y funciones 8.3.2.1 Escritura de un archivo Una vez que se ha abierto el archivo para escritura, las sentencias write y writeln sirven para escribir datos en el nuevo archivo. Sintaxis: Write (f,v1,v2,...); f es una variable tipo archivo. v1,v2,... son variables del tipo de datos. Ejemplos: 1. Write (demo,Esto es una prueba de escritura); Writeln (demo,y esta es la siguiente prueba); 2. Var NombreArch : string[60]; archtex ... ... Write (`Nombre de archivo); Readln (NombreArch); Assign (Archtex,NombreArch); Reset (Archtex); 8.3.2.2 Lectura de un archivo La lectura de un archivo se efecta mediante las sentencias read o readln. Sintaxis: Read (f,v1,v2,...); : text;
f es una variable tipo archivo. v1,v2,... son variables del tipo de datos. Ejemplo: Var Horas : Real; Archivo : Text; Mensaje : string [30]; Begin Assign (Archivo,Demo); Reset (Archivo); ... ... Readln (Archivo,Mensaje,Horas); End. 8.3.2.3 Cierre de un archivo Para cerrar un archivo se utiliza la siguiente sintaxis: Close (Nombrearchivo);
Las operaciones de Assign, Rewrite y Reset se utilizan de igual forma que en los archivos tipificados. El procedimiento Append abre un archivo existente para aadir datos al final del mismo. La sintaxis es: Append (f) 8.4.3 Funciones Algunas funciones son: Append, Read, Readln, Write y Writeln, Eoln y Eof. 8.4.3.1 Eoln Devuelve el estado de fin de lnea de un archivo. Es una funcin tipo lgico. La sintaxis es: Eoln (var f: text); f es una variable de archivo de texto. Para llamar a la funcin se procede as: eoln (f) Devuelve true si en la posicin actual del archivo est la marca de fin de lnea o si eof (f) es true; caso contrario devuelve false. 8.4.3.2 Eof (End of file) Devuelve el estado de un archivo de texto. Es de tipo lgico e indica si el fin de archivo se ha almacenado mediante true, caso contrario devuelve false. La sintaxis es la siguiente: Eof (var:text); Prctica 1. 2. Cree un archivo con sus datos personales: Cdula, nombre, direccin, telfono,email. Abra el archivo creado y agrguele cuatro registros ms con otros datos. eoln(f) llamada a la funcin
Una unidad contiene uno o ms procedimientos, funciones constantes definidas y a veces otros elementos. Se puede compilar, probar y depurar una unidad independientemente de un programa principal. Una vez que una unidad ha sido compilada y depurada, no necesita compilarse ms veces, Turbo Pascal se encarga de enlazar la unidad al programa que utiliza esa unidad, empleando siempre en esta tarea menor tiempo que en la propia compilacin. Los procedimientos, funciones y constantes que se definen en una unidad pueden ser utilizados por cualquier futuro programa que escriba sin tener que ser declarados en el programa. Las unidades tienen una estructura similar a los programas y en consecuencia requieren un formato estricto, y es preciso declararlas por el usuario como si se tratara de un programa o subprograma. Turbo Pascal proporciona siete unidades estndar para el uso del programador: System, Graph, DOS, Crt, Printer, Turbo3 y Graph3. Las cinco primeras sirven para escribir sus programas y las dos ltimas para mantener compatibilidad con programas y archivos de datos creados con la versin 3.0 de Turbo Pascal. Las siete unidades estn almacenadas en el archivo TURBO/.TPL (librera de programas residente propia del programa Turbo Pascal). La versin 7.0 introdujo dos nuevas unidades WinDos y Strings. 9.1.2 Estructura de una unidad Una unidad est constituida de cuatro partes: cabecera de la unidad, seccin de interface (interfaz), seccin implementation (implementacin) y seccin initialization (inicializacin). Formato: Unit <identificador> Interface Uses <lista de unidades>; (* opcional *) (* declaraciones pblicas de objetos *) Implementation (* declaraciones privadas *) (* definicin de procedimientos y funciones pblicos *) begin (* cdigo de inicializacin *) (* opcional *) end 9.1.2.1 Cabecera de la unidad La cabecera de la unidad comienza con la palabra reservada unit, seguida por el nombre de la unidad (identificador vlido). Es similar a una cabecera de programa, donde la palabra reservada unit reemplaza a la palabra reservada program. Por ejemplo para crear una unidad denominada MiUnidad se ha de utilizar la cabecera de la unidad, as: Unit MiUnidad;
El nombre de la unidad es arbitrario, pero debe coincidir con el nombre del archivo que contiene. Por ejemplo, si la unidad se denomina Test Unit Test; El archivo que contiene el programa fuente de la unidad se debe llamar Test.PAS. Cuando turbo Pascal combina la unidad, le asigna la extensin TPU (Turbo Pascal Unit). Si el nombre de la unidad es diferente del nombre del archivo, el programa principal no podr encontrar el archivo TPU (Turbo Pascal Unit). Si el nombre de la unidad es diferente del nombre del archivo, el programa principal no podr encontrar el archivo TPU. Una unidad creada por el usuario puede utilizar otras unidades, siempre que se incluyan en la clusula uses que aparece inmediatamente despus de la palabra interface, y separadas por comas. 9.1.2.2 Seccin de interfaz La seccin de interface (interfaz) es la parte de la unidad que sirve para conectar dicha unidad con otras unidades y programas. Esta seccin se conoce como "la parte pblica" de la unidad, ya que todos los objetos que figuren en esta seccin son visibles desde el exterior o exportables. Las restantes unidades y programas tienen acceso a la informacin contenida en la seccin de interface. En la interfaz de la unidad se pueden declarar constantes, tipos de datos, variables y procedimientos. Los procedimientos y funciones visibles a cualquier programa que utilice la unidad se declaran aqu, pero sus cuerpos, reales - implementaciones- se encuentran en la seccin de implementacin. La seccin de interfaz indica a un programador cules procedimientos y funciones se pueden utilizar en un programa. La seccin de implementacin indica al compilador cmo implementarlos. Ejemplo de declaracin Unit Rayo; Interface Uses DOS, Graph, Crt; (* se utilizan las unidades DOS, Graph y Crt *) Var a, b, c : integer; Function Exponencial (a, b : integer) : real; Procedure Dividir (x, y : integer; var cociente : integer); 9.1.2.3 Seccin de implementacin La seccin de implementacin es estrictamente privada; su contenido no es exportable. Slo los procedimientos o funciones que aparecen en la seccin interface pueden ser invocados desde el exterior de la unidad. Esta seccin contiene el cuerpo de los procedimientos y funciones declarados en la seccin de interface. Unit Rayo;
Interface Function Exponencial (A, B : Integer) : Real; Procedure Dividir (X, Y : Integer; Var Cociente : Integer); Implementation P, I : Integer; Begin P := 1; For I := 1 to B do P := P * ; Exponencial := P End; Procedure Dividir (X, Y : Integer; Var Cociente : Integer); Begin Cociente := X div Y End; End. Ntese que la declaracin de una unidad est terminada por la palabra reservada End y un punto. 9.1.2.3 Seccin de iniciacin La seccin de iniciacin puede contener instrucciones pero tambin puede estar vaca. Estas instrucciones sirven, por ejemplo, para iniciar variables. La ejecucin de estas instrucciones se efecta en el momento del lanzamiento o ejecucin de un programa que utiliza la unidad antes de la ejecucin de la primera instruccin del cuerpo del programa. En la seccin de iniciacin se inicializa cualquier estructura de datos (variables) que utilice la unidad y las hace disponibles (a travs del interface) al programa que las utiliza. Comienza con la palabra reservada begin seguida por una secuencia de sentencias y termina con "end. ". La seccin de iniciacin debe llamarse antes de que el cuerpo del programa se ejecute. Function Exponencial (A, B : Integer) : Real; Var
37. Aplicacin
Una unidad tiene una estructura muy similar a la de un programa. La clusula uses de la parte de interface slo es necesaria cuando la unidad actual llame a otras unidades. Todos los procedimientos y funciones en la seccin de interface deben ser definidos en la seccin de implementacin. La cabecera de los procedimientos y funciones declarados en la parte de interface deben ser idnticos a la cabecera de las mismas funciones definidas en la parte de implementacin; sin embargo, es posible escribir la cabecera en forma abreviada en la seccin de implementacin. Unit utilidad; (* este nombre de la unidad debe coincidir con el nombre del archivo de programa *) Interface Uses Wincrt, Printer; Procedure Frase (Texto : String); Implementation Uses Printer; Var MiVar : Integer Procedure Frase; Begin Clrscr; GotoXY ((80-Lenght (Texto)) div 2,1) Write (texto); End. Begin MiVar := 0 End. Una vez que se dispone el cdigo fuente de una unidad, se compila de igual forma que un programa, pero el archivo obtenido no es ejecutable directamente. Tiene la extensin TPU (Turbo Pascal Unit).
Para utilizar esa unidad dentro de un programa, debe incluir una sentencia uses para indiciar al compilador que est utilizando esa unidad. ProgramPrueba; Uses Utilidad; Ejemplo: Escribir una unidad que conste a su vez de un procedimiento para intercambiar los valores de dos variables, as como calcular su valor mximo. Unit Demo1; Interface Procedure Intercambio (Var I,J : Integer); Function Mximo (I, J : Integer) : Integer; Implementation Procedure Intercambio; Var Aux : Integer; Begin Aux := I; I := J; J := Aux End; Function Mximo; Begin If I>J then Maximo := I Else Maximo :=J End; End.
Una vez que lo haya escrito, gurdelo en disco con el nombre de Demo1.PAS, a continuacin, complelo hacia el disco. El cdigo objeto se llamar Demo1.TPU. Esta unidad la utilizaremos en el siguiente programa: Program Prueba; Uses Demo1; Var X,Y : Integer; Begin Write (`Introducir dos nmeros enteros: `); Readln (X,Y); Intercambio (X,Y); Writeln (X, `,Y); Writeln (`El valor mximo es: `, Mximo (X,Y)); End.
38. Aplicaciones
9. 3. 1 Utilizacin de unidades estndar El archivo TURBO.TPL que contiene todas las unidades estndar se carga en memoria central a la vez que el propio compilador y est disponible en cualquier momento, con la ayuda de la clusula uses. Como se ha visto anteriormente, un programa debe contener la clusula uses, situada inmediatamente despus de la cabecera. 9. 3. 1. 1 Unidad System Esta unidad contiene todos los procedimientos y funciones estndar de Turbo Pascal relativas a entradas/salidas, cadena de caracteres, gestin de memoria, etc. 9. 3. 1. 2 Unidad Wincrt Esta unidad proporciona un conjunto especfico de declaraciones para entrada y salida: constantes, variables, procedimientos y funciones, que permiten el acceso al control de los modos de pantalla, al teclado, a los colores, al posicionamiento del cursor, etc. La mayora de los programas de Pascal que hacen uso de la pantalla para representar salidas recurren a la unidad Wincrt. Algunos procedimientos que necesitan de esta unidad son: Clrscr: Limpia la pantalla
KeyPressed: Detecta la pulsacin de una tecla Sound: Hace sonar el altavoz interno Window: Define una ventana de texto en la pantalla 9. 3. 1. 3 Unidad WinDos Esta unidad contiene declaraciones, constantes, tipos, variables, procedimientos y funciones relacionadas con el sistema operativo DOS y la gestin de archivos. Los subprogramas que constituyen esta unidad no existen en Pascal estndar. Esta unidad no necesita ninguna otra unidad en su declaracin. Algunos procedimientos importantes son: GetTime, SetTime, DiskSize, GetAttr. Ejemplo: Visualizar la hora en la esquina superior derecha de la pantalla. Program Hora; Uses Wincrt,Windos; Var Horas, Minutos, Segundos, Centesimas : Word; Begin Clrscr; While not keypressed do Begin Gotoxy (64,1); GetTime(Horas, Minutos, Segundos, Centesimas); (* Hora reloj interno *) Writeln (Horas:2, `;, minutos:2,`:, Segundos:2,:,Centesimas:2) End End.