Está en la página 1de 71

MANUAL DE PASCAL

Organizacin del Tutorial

El Manual de Pascal est dirigido a usuarios principiantes de Pascal. El tutorial comienza con los conceptos fundamentales de programacin, y cada captulo contiene programas completos que reafirman los temas expuestos. Los programas se presentan con una variedad de colores a fin de diferenciar palabras reservadas, smbolos, identificadores, comentarios, etc. De la siguiente manera: Comentarios Palabra reservada Identificadores Smbolos Cadenas Nmeros

Capitulo I: Elementos del PASCAL Estructuras general de programas en Pascal


Pascal es un lenguaje de programacin de alto nivel, que facilita la prctica de la programacin estructurada. Utiliza un traductor que produce cdigo ejecutable, lo cual disminuye los tiempos de ejecucin de los programas. El lenguaje Pascal fue desarrollado por Niklaus Wirth, con el propsito de ayudar a los estudiantes en el manejo de las tcnicas de la programacin estructurada, pero en la actualidad su aplicacin es de propsitos generales. La construccin de programas en Pascal se basa en mdulos que guardan las siguientes reglas de construccin : Program identificador ; {cabecera opcional en Turbo Pascal} Uses identificadores Label lista de etiquetas ; {seccin de etiquetas} Const definiciones de constantes Type declaracin de tipos de datos definidos por el usuario Var Declaracin de variables Procedure definiciones de procedimientos Function definiciones de funciones

begin {cuerpo del programa} sentencias end. Las cinco secciones de declaracin -Label, Const, Type y Procedure y/o Function, as como la clusula Uses y Program, no tiene que estar presentes en todos los programas. Turbo Pascal es muy flexible al momento de escribir las secciones de declaracin, ya que se pueden hacer en cualquier orden (en Pascal estndar ISO si se require este orden). Sin embargo es conveniente seguir el orden establecido, le evitar futuros problemas. Nota: Las declaraciones de constantes, tipos y variables tambin se pueden poner en los procedimientos y/o funciones. Todo objeto referenciado en un programa debe haber sido previamente definido.

Identificadores
En la mayora de los programas de computador, es necesario manejar datos de entrada o de salida, los cuales necesitan almacenarse en la memoria principal del computador en el tiempo de ejecucin. Para poder manipular dichos datos, necesitamos tener acceso a las localidades de memoria donde se encuentran almacenados; esto se logra por medio de los nombres de los datos o IDENTIFICADORES. Los identificadores tambin se utilizan para los nombres de los programas, los nombres de los procedimientos y los nombres de las funciones, as como para las etiquetas, constantes y variables. Las reglas para formar los identificadores en Pascal son las siguientes : 1. Pueden estar compuestos de caracteres alfabticos, numricos y el carcter de subrayado ( _ ). 2. Deben comenzar con un carcter alfabtico o el carcter de subrayado. 3. Puede ser de cualquier longitud (slo los 63 primeros caracteres son significativos). 4. No se hace distincin entre maysculas y minsculas. 5. No se permite el uso de los IDENTIFICADORES RESERVADOS en los nombres de variables, constantes, programas o sub-programas. Identificadores vlidos
Nombre Cadena Edad_Maxima X_Y_Z Etiqueta2

Identificadores no vlidos
Num&Dias X nombre begin eje@s : : : : carcter & no vlido Contiene un blanco es una palabra reservada carcter @ no vlido

Eleccin de identificadores
La eleccin de identificadores permite una mejor lectura y comprensin de un programa. No es aconsejable utilizar identificadores que no sugieran ningn significado. La siguiente tabla muestra los IDENTIFICADORES RESERVADOS en Turbo-Pascal. Los marcados con un asterisco no estn definidos en Pascal estndar . Los marcados con ? no se utilizan en Turbo-Pascal *ABSOLUTE *AND ARRAY *EXTERNAL FILE FORWARD NIL *SHL AND FILE NOT *SHR IN *OVERLAY *STRING BEGIN FOR OF THEN CASE FUNCTION OR TYPE CONST VAR GOTO ?PACKED TO DIV *INLINE PROCEDURE UNTIL DO IF PROGRAM DOWNTO RECORD ELSE WHILE LABEL REPEAT WITH END MOD SET *XOR

Turbo-Pascal define los siguientes IDENTIFICADORES ESTANDAR de tipos predefinidos, constantes, variables, procedimientos y funciones. Cualquiera de ellos puede ser redefinido, perdindose as la facilidad de utilizar su definicin original. ADDR ARCTAN ASSIGN AUX AUXINPTR AUXOUTPTR BLOCKREAD BLOCKWRITE DELAY DELETE EOF EOLN ERASE EXECUTE EXIT EXP LENGTH LN LO LOWVIDEO LST LSTOUTPTR MARK MAXINT RELEASE RENAME RESET REWRITE ROUND SEEK SIN SIZEOF

BOOLEAN BUFLEN BYTE CHAIN CHAR CHR CLOSE CLREOL CLRSCR CON CONINPTR CONOUTPTR CONCAT CONSTPTR COPY COS WINCRTEXIT WINCRTINIT DELLINE

FALSE FILEPOS FILESIZE FILLCHAR FLUSH FRAC GETMEM GOTOXY HALT HEAPPTR HI IORESULT INPUT INSLINE INSERT INT INTEGER KBD KEYPRESSED

MEM MEMAVAIL MOVE NEW NORMVIDEO ODD ORD OUTPUT PI PORT POS PRED PTR RANDOM RANDOMIZE READ READLN REAL

SEEKEOF SEEKEOLN SQR SQRT STR SUCC SWAP TEXT TRM TRUE TRUNC UPCASE USR USRINPTR USROUTPTR VAL WRITE WRITELN

Declaracin de etiquetas
En el remoto caso de que sea necesaria la utilizacin de la instruccin Goto, deber marcarse con una etiqueta la lnea a donde desea enviarse el control de flujo del programa. La declaracin deber encabezarse con el identificador reservado Label, seguido por la lista de etiquetas separadas por comas y terminada por un punto y coma. Pascal estndar slo permite etiquetas formadas por nmeros de 1 a 4 dgitos. Turbo-Pascal permite la utilizacin de nmeros y/o cualquier identificador, excepto los identificadores reservados. Su uso no est recomendado y no se debe emplear nunca.

Definicin de constantes
En la definicin de constantes se introducen identificadores que sirven como sinnimos de valores fijos.

El identificador reservado Const debe encabezar la instruccin, seguido por una lista de asignaciones de constantes. Cada asignacin de constante debe consistir de un identificador seguido por un signo de igual y un valor constante, como se muestra a continuacin:

Const valor_maximo =255; precision =0.0001; palabra_clave='Tutankamen'; encabezado =' NOMBRE DIRECCION TELEFONO ';

Un valor constante puede consistir de un nmero (entero o real), o de una constante de caracteres. La constante de caracteres consiste de una secuencia de caracteres encerrada entre apstrofes ( ' ), y, en Turbo-Pascal, tambin puede formarse concatenndola con caracteres de control ( sin separadores ), por ejemplo :
'Teclee su opcin ==>'^G^G^G;

Esta constante sirve para desplegar el mensaje :


Teclee su opcin ==>

y a continuacin suena el timbre tres veces. Las constantes de caracteres pueden estar formadas por un solo carcter de control, p.ej.:
hoja_nueva = ^L

Existen dos notaciones para los caracteres de control en Turbo Pascal, a saber : 1. El smbolo # seguido de un nmero entero entre 0 y 255 representa el carcter al que corresponde dicho valor decimal en el cdigo ASCII. 2. El smbolo ^ seguido por una letra, representa el correspondiente carcter de control. Ejemplos :
#12 representa el (hoja_nueva o #$1B representa el ^G representa el ^M representa el valor decimal 12 alimentacin de forma). valor hexadecimal 1B (escape). carcter del timbre o campana. carcter de retorno de carro.

Pascal proporciona las siguientes CONSTANTES PREDEFINIDAS : Nombre Tipo Valor

pi false true MaxInt

real 3.1415926536 (Slo en Turbo Pascal) boolean boolean integer 32767

adems de las constantes literales para los tipos integer y real con representacin decimal y hexadecimal, y las constantes literales para el conjunto de caracteres ASCII, ms los caracteres especiales (no incluidos en el conjunto estndar del ASCII)

Definicin de tipos
Adems de identificadores, los datos deben tener asignado algn tipo que indique el espacio de memoria en que se almacenarn y que al mismo tiempo evita el error de tratar de guardar un dato en un espacio insuficiente de memoria . Un tipo de dato en Pascal puede ser cualquiera de los tipos predefinidos ( integer, real, byte, boolean, char ), o algn otro definido por el programador en la parte de definicin de tipos . Los tipos definidos por el programador deben basarse en los tipos estndar predefinidos, para lo cual, debe iniciar con el identificador reservado Type , seguido de una o ms asignaciones de tipo separadas por punto y coma. Cada asignacin de tipo debe consistir de un identificador de tipo, seguido por un signo de igual y un identificador de tipo previamente definido. La asignacin de tipos a los datos tiene dos objetivos principales: 1. Detectar errores de operaciones en programas. 2. Determinar cmo ejecutar las operaciones. Pascal se conoce como un lenguaje "fuertemente tipeado" (strongly-typed) o de tipos fuertes. Esto significa que todos los datos utilizados deben tener sus tipos declarados explcitamente y el lenguaje limita la mezcla de tipos en las expresiones. Pascal detecta muchos errores de programacin antes de que el programa se ejecute. Los tipos definidos por el programador pueden utilizarse para definir nuevos tipos, por ejemplo :
Type entero = integer; otro_entero = entero;

A continuacin se hace una breve descripcin de los tipos predefinidos .

Tipos enteros
Tipos enteros predefinidos Tipo byte integer longint shortint word
BYTE

Rango 0 .. 255 -32768 .. 32767 -247483648 .. 2147483647 -128 .. 127 0 .. 65535

Formato 8 bits sin signo 16 bits con signo 32 bits con signo 8 bits con signo 16 bits sin signo

El tipo byte es un subconjunto del tipo integer, en el rango de 0 a 255 . Donde quiera que se espere un valor byte, se puede colocar un valor integer; y viceversa (EXCEPTO cuando son pasados como PARAMETROS). Asimismo, se pueden mezclar identificadores de tipo byte y de tipo integer en las expresiones. Los valores de tipo byte se guardan en UN OCTETO de memoria. INTEGER El rango de los valores definidos por el tipo integer , en Turbo Pascal, se encuentra entre -32768 y 32767 . Cada valor de este tipo se guarda en DOS OCTETOS de memoria. LONGINT (enteros largos) A partir de la versin 4.0 se han incorporado nmeros que amplan el rango de variacin de los enteros a -2,147,483,648. Este tipo de datos se denomina longint (enteros largos). Ocupan CUATRO OCTETOS de memoria. Existe una constante predefinida de tipo longint, denominada MaxLongInt, cuyo valor es 2,147,483,647. SHORTINT (enteros cortos) En ciertos casos, puede ser prctico disponer de valores enteros positivos y negativos cuyo alcance sea ms restringido que el de los tipos enteros. Los tipos shortint pueden tomar valores entre -128 y 127. Ocupan UN OCTETO de memoria. WORD Existen casos en los que se desea representar nicamente valores positivos. Este es el caso. Por ejemplo, cuando se desea acceder desde un programa hasta una direccin de memoria. En tal situacin, no tiene sentido una direccin negativa. Turbo Pascal dispone del tipo word (o

palabra, de palabra de memoria), cuyo intervalo posible de valores es de 0 a 65535. Ocupa DOS OCTETOS de memoria.

Tipos reales
REAL En el contexto de Pascal, un nmero real es aquel que est compuesto de una parte entera y una parte decimal, separadas por un punto. El rango de estos nmeros est dado entre los valores 1E-38 y 1E+38 . Cada valor de este tipo se guarda en SEIS OCTETOS de memoria. Durante una operacin aritmtica con nmeros reales, un valor mayor que 1E+38 (sobreflujo) causar la detencin del programa y desplegar un mensaje de error ; mientras que un valor menor que 1E-38 (bajoflujo), producir un resultado igual a cero. Deben tomarse en cuenta las siguentes restricciones para los valores de tipo real : 1. 2. 3. 4. 5. No pueden utilizarse como subindices en las definiciones del tipo estructurado array. No pueden formar subrangos. No se pueden usar para definir el tipo base de un conjunto (tipo estructurado set) No deben utilizarse para el control de las instrucciones for y case. Las funciones pred y succ no pueden tomarlos como argumentos.

Los nmeros reales estn siempre disponibles en Turbo Pascal, pero si su sistema incluye un coprocesador matemtico como 8087, 80287 u 80387, se dispone adems de otros tipos de nmeros reales:

real (real) single (real corto) comp (entero ampliado) double (real de doble precisin) extended (real ampliado)

Computadoras sin coprocesador matemtico (emulacin por software) datos disponibles : real, comp, double, extended y single. Computadoras con coprocesador matemtico datos disponibles : real, comp, double, extended y single (reales IEEE) Desde la versin 5.0 se permite utilizar los datos tipo coprocesador matemtico aunque su computadora no lo tenga incorporado. La razn es que se emula dicho coprocesador. Los

diferentes tipos reales se diferencian por el dominio de definicin, el nmero de cifras significativas (precisin) y el espacio ocupado en memoria.

Turbo Pascal 4.0 requiere obligatoriamente un chip coprocesador matemtico para hacer uso de nmeros reales de coma flotante IEEE. Turbo Pascal 5.0 a 7.0 emula el chip coprocesador matemtico totalmente en software, permitiendo ejecutar tipos IEEE tanto si tiene como si no un chip 8087/287/387 instalado en su mquina. Tipo real single double extended comp Rango 2.910 E -39 .. 1.710 E 38 1.510 E -45 .. 3.410 E 38 5.010 E -324 .. 1.710 E 308 1.910 E -4932 .. 1.110 E 4932 -2 E 63 +1 .. 2 E 63 - 1 Cifras 11 -12 7-8 15 - 16 19 - 20 19 - 20 Tamao y bytes 6 4 8 10 8

BOOLEAN Un valor de tipo boolean puede asumir cualquiera de los valores de verdad denotados por los identificadores true y false, los cuales estn definidos de tal manera que false < true . Un valor de tipo boolean ocupa UN OCTETO en la memoria. CHAR Un valor de tipo char es cualquier carcter que se encuentre dentro del conjunto ASCII ampliado, el cual est formado por los 128 caracteres del ASCII ms los 128 caracteres especiales que presenta, en este caso, IBM. Los valores ordinales del cdigo ASCII ampliado se encuentran en el rango de 0 a 255. Dichos valores pueden representarse escribiendo el carcter correspondiente encerrado entre apstrofes. As podemos escribir :
'A' < 'a'

Que significa : " El valor ordinal de A es menor que el de a " o " A est antes que a " Un valor de tipo char se guarda en UN OCTETO de memoria. CADENA (STRING) Un tipo string (cadena) es una secuencia de caracteres de cero o ms caracteres correspondientes al cdigo ASCII, escrito en una lnea sobre el programa y encerrado entre apstrofos.

El tratamiento de cadenas es una caracterstica muy potente de Turbo Pascal que contiene ISO Pascal estndar. Ejemplos:
'Turbo Pascal','Tecnolgico', #13#10

Nota:

Una cadena sin nada entre los apstrofos se llama cadena nula o cadena vaca. La longitud de una cadena es el nmero de carcteres encerrados entre los apstrofos.

Operadores
Los operadores sirven para combinar los trminos de las expresiones. En Pascal, se manejan tres grupos de operadores: 1. ARITMERICOS 2. RELACIONALES 3. LOGICOS

Operadores aritmticos
Son aquellos que sirven para operar trminos numricos. Estos operadores podemos clasificarlos a su vez como : a. UNARIOS b. BINARIOS Los operadores UNARIOS son aquellos que trabajan con UN OPERANDO. Pascal permite el manejo de un operador unario llamado: MENOS UNARIO Este operador denota la negacin del operando, y se representa por medio del signo menos ( ) colocado antes del operando. Por ejemplo: Si x tiene asignado el valor 100, -x dar como resultado -100 ; esto es que el resultado es el inverso aditivo del operando.

Los operadores BINARIOS, son los que combinan DOS OPERANDOS, dando como resultado un valor numrico cuyo tipo ser igual al mayor de los tipos que tengan los operandos. La siguiente tabla muestra los smbolos de los operadores binarios de Pascal as como los nombres de las operaciones que realizan. Operadores aritmticos bsicos Operador + * / div mod shl shr Operacin Suma Resta Multiplicacin Divisin Divisin entera Mdulo Desplazamiento a la izquierda Desplazamiento a la derecha Operandos real , integer real , integer real , integer real , integer integer integer Ejemplo Resultado a+b suma de a y b a-b Diferencia de a y b a*b Producto de a por b a/b Cociente de a por b a div b Cociente entero de a por b a mod b Resto de a por b a shl b Desplazar a la izquierda b bits a shr b Desplazar a la derecha b bits

Conviene observar lo siguiente: 1. Cuando los dos operandos sean del tipo integer, el resultado ser de tipo integer. 2. Cuando cualquiera de los dos operandos, o ambos, sean del tipo real, el resultado ser de tipo real. 3. Cuando, en la operacin div, OPERANDO-1 y OPERANDO-2 tienen el mismo signo, se obtiene un resultado con signo positivo; si los operandos difieren en signo, el resultado es negativo y el truncamiento tiene lugar hacia el cero. Ejemplos :
7 (-7) (-7) 7 15.0 15 div div div div div div 3 (-3) 3 (-3) 3.0 (4/2) = = = = = = 2 2 -2 -2 no vlido no vlido

La operacin div almacena slo la parte entera del resultado, perdindose la parte fraccionaria (truncamiento). 4. La operacin MODULO est definida solamente para OPERANDO-2 positivo. El resultado se dar como el entero no negativo ms pequeo que puede ser restado de OPERANDO-1 para obtener un mltiplo de OPERANDO-2 ; por ejemplo :
6 mod 3 = 0

7 (-6) (-7) (-5) (-15)

mod mod mod mod mod

3 3 3 3 (-7)

= = = = =

1 0 -1 -2 -1

NOTA En las operaciones aritmticas, debe asegurarse que el resultado de sumar, restar o multiplicar dos valores, no produzca un resultado fuera de los rangos definidos por la implementacin para los diferentes tipos.

Operadores relacionales
Una RELACIN consiste de dos operandos separados por un operador relacional. Si la relacin es satisfecha, el resultado tendr un valor booleano true; si la relacin no se satisface, el resultado tendr un valor false. Los operadores deben ser del mismo tipo, aunque los valores de tipo real, integer y byte pueden combinarse como operandos en las relaciones. A continuacin se describen los operadores relacionales utilizados en Pascal: Smbolo = <> < > <= >= Ejemplos: Relacin 20 = 11 15 < 20 PI > 3.14 'A' < 20 'A' = 65 Resultado false true true false true Significado IGUAL que NO IGUAL que MENOR que MAYOR que MENOR o IGUAL que MAYOR o IGUAL que

Operadores lgicos

Al igual que las relaciones, en las operaciones con operadores lgicos se tienen resultados cuyo valor de verdad toma uno de los valores booleanos true o false. Los operadores lgicos en Pascal son: NOT Sintaxis : not operando Descripcin : Invierte el valor de verdad de operando. Ejemplo : Si bandera tiene un valor de verdad true, not bandera produce un resultado con valor de verdad false. AND Sintaxis : operando.1 and operando.2 Descripcin : Produce un resultado con valor de verdad true cuando ambos operandos tienen valor de verdad true; en cualquier otro caso el resultado tendr un valor de verdad false. OR Sintaxis : operando.1 or operando.2 Descripcin : Produce un resultado con valor de verdad false cuando ambos operadores tienen valores de verdad false; en cualquier otro caso el resultado tendr un valor de verdad true. XOR Sintaxis : operando.1 xor operando.2 Descripcin : Un operando debe tener valor de verdad true y el otro false para que el resultado tenga valor de verdad true. Turbo Pascal tambin permite las siguientes operaciones entre los bits de operandos exclusivamente de tipo entero :

AND Sintaxis : operando.1 and operando.2 Descripcin: Pone a ceros los bits de operando.2

cuyos correspondientes en operando.1 estn en ceros. Los valores se pasan a binario, y, sobre cada bit de operando.1 se realiza la operacin and lgica con el correspondiente bit de operando.2. Ejemplo : 29 and 30 = 28 Cuya forma en binario es :
0000000000011101 = 29 (operando.1) and 0000000000011110 = 30 (operando.2) _____________________ 0000000000011100 = 28 (resultado)

OR ( o inclusiva ) Sintaxis : operando.1 or operando.2 Descripcin : Pone a uno los bits de operando.1 cuyos correspondientes bits en operando.2 estn a uno. Ejemplo : 17 or 30 = 31 En binario:
0000000000010001 = 17 (operando.1) or 0000000000011110 = 30 (operando.2) _____________________ 0000000000011111 = 31 (resultado)

XOR ( o exclusiva ) Sintaxis : operando.1 xor operando.2 Descripcin : Invierte el estado de los bits de operando.1, cuyos correspondientes en operando.2 estn a uno. Ejemplo : 103 xor 25 = 126 En binario:
0000000001100111 = 103 (operando.1) xor 0000000000011001 = 25 (operando.2) ______________________ 0000000001111110 = 126 (resultado)

SHL

Sintaxis : operando.1 shl operando.2 Descripcin : Desplaza hacia la izquierda los bits de operando.1, el nmero de posiciones establecidas por operando.2. Los bits que salen por el extremo izquierdo se pierden. Ejemplo : 10 shl 2 = 40 En binario:
0000000000001010 = 10 (operando.1) shl 2 <= 0000000000101000 = 40 (resultado) (operando.2)

SHR Sintaxis : operando.1 shr operando.2 Descripcin : Desplaza hacia la derecha los bits de operando.1 el nmero de posiciones establecidas por operando.2. Los bits que salen por el extremo derecho se pierden Ejemplo : 125 shr 3 = 15 En binario :
0000000001111101 = 125 (operando.1) shr 3 => 0000000000001111 = 15 (resultado) (operando.2)

Expresiones
Las expresiones son secuencias de constantes y/o variables separadas por operadores vlidos. Se puede construir una expresin vlida por medio de: 1. Una sola constante o variable, la cual puede estar precedida por un signo + - . 2. Una secuencia de trminos (constantes, variables, funciones) separados por operadores. Adems debe considerarse que: Toda variable utilizada en una expresin debe tener un valor almacenado para que la expresin, al ser evaluada, d como resultado un valor.

Cualquier constante o variable puede ser reemplazada por una llamada a una funcin. Como en las expresiones matemticas, una expresin en Pascal se evala de acuerdo a la precedencia de operadores. La siguiente tabla muestra la precedencia de los operadores en Turbo Pascal: Precedencia de operadores 5 - (Menos unario) 4 Not 3 * / div mod and shl shr 2 + - or xor 1 = <> > < >= <= Las reglas de evaluacin para las expresiones son : 1. Si todos los operadores en una expresin tienen la misma precedencia, la evaluacin de las operaciones se realiza de izquierda a derecha. 2. Cuando los operadores sean de diferentes precedencias, se evalan primero las operaciones de ms alta precedencia (en una base de izquierda a derecha ), luego se evalan las de precedencia siguiente, y as sucesivamente. 3. Las reglas 1) y 2) pueden ser anuladas por la inclusin de parntesis en una expresin. Ejemplos :
1. 3 + 2*5 {*,+} 2. 4 + 10 =14 3. 20*4 div 5 4. {Igual prioridad de izquierda a derecha : *,div} 5. 80 div 5 = 16 6. 3 - 5 * (20+(6/2)) 7. 3 - 5 * (20+(6/2)) = 3 - 5 * (20 + 3) 8. {parntesis ms interno} 9. = 3 - 5 * 23 {segundo parntesis} 10. = 3 - 115 {Multiplicacin} 11. = -112 {resta}

Instrucciones
Aunque un programa en Pascal puede contar con una sola instruccin (tambin llamada enunciado, sentencia o estatuto), normalmente incluye una cantidad considerable de ellas. Uno de los tipos de instrucciones ms importantes lo forman las instrucciones de asignacin; las cuales asignan a una variable (por medio del smbolo := ) , el resultado de la evaluacin de una expresin. La sintaxis para las instrucciones de asignacin es :

identificador := expresin ;

Al smbolo := le llamaremos, en lo sucesivo : "simbolo de asignacin" Los siguientes son ejemplos de instrucciones de asignacion :
numero := 100 ; importe := precio * cantidad ; hipotenusa := sqrt(sqr(cateto_op)+sqr(cateto_ad ));

Es posible construir una instruccin vaca escribiendo slamente el punto y coma de una instruccin. As podemos escribir :
valor := valor + 1;;

Lo que incluye las dos instrucciones :


valor := valor + 1; y la instruccin vaca : ;

Bloques de instrucciones
En todo lugar donde sea vlido utilizar una instruccin simple, es posible utilizar una instruccin compuesta o bloque de instrucciones, el cual se forma agrupando varias instrucciones simples por medio de los identificadores begin y end. Por ejemplo:
begin suma := 1000.0; incr := 20.0; total := suma + incr {Obsrvese la ausencia de punto y coma al final de la instruccin} end.

No es necesario escribir el punto y coma antes de end ya que el punto y coma se usa para separar instrucciones, no para terminarlas. begin y end son delimitadores de bloque.

Procedimientos de entrada / salida


Desde el punto de vista del hardware, las instrucciones de entrada y salida le ayudan al programa a comunicarse con un perifrico de la computadora tal como una terminal, una impresora o un disco.

Las instrucciones de entrada estndar, sirven para leer carcteres desde el teclado, y las instrucciones de salida estndar despliegan carcteres en la pantalla. En Pascal todas las operaciones de entrada/salida se realizan ejecutando unidades de programa especiales denominados procedimientos de entrada/salida que forman parte del compilador y sus nombres son identificadores estndar: Procedimientos de entrada Procedimientos de salida Read Write Readln Writeln

Procedimientos Read y Readln


Los procedimientos predefinidos Read y ReadLn (contraccin de Read Line), constituyen la base para las instrucciones de entrada estndar. Las instrucciones de entrada proporcionan datos durante la ejecucin de un programa. Las instrucciones para llamar a los procedimientos Read y ReadLn son de la siguiente forma :
Read(lista_de_variables); ReadLn(lista_de_variables);

donde : lista_de_variables : es una lista de identificadores de variables separados por comas, los datos que se pueden leer son : enteros, caracteres, o cadenas. No se puede leer un boolean o un elemento de tipo enumerado. Los datos estructurados , arrays, registros o conjuntos, no se pueden leer globalmente y se suele recurrir a disear procedimientos especficos. La accin de la instruccin es obtener, del teclado, tantos valores de datos como elementos hay en lista_de_variables. Los datos debern ser compatibles con los tipos de las variables correspondientes en la lista. Cada valor entero o real en el flujo de entrada puede ser representado como una secuencia de caracteres en alguna de las formas permitidas para tales nmeros, y puede estar inmediatamente precedido por un signo ms o un signo menos. Cada valor entero o real puede ser precedido por cualquier cantidad de caracteres blancos o fines de lnea, pero no deber haber blancos o fines de lnea entre el signo y el nmero. La diferencia entre las instrucciones Read y ReadLn consiste en que Read permite que la siguiente instruccin contine leyendo valores en la misma lnea; mientras que, con ReadLn la siguiente lectura se har despus de que se haya tecleado el carcter de fin de lnea.

Cuando se tienen datos de tipo char en una instruccin Read, los caracteres blancos y los de fin de lnea son considerados en el conteo de los elementos de las cadenas de caracteres mientras no se complete el total especificado para cada una de ellas. Cada fin de lnea es tratado como un carcter, pero el valor asignado a la variable ser un carcter blanco. Es aconsejable que cada cadena de caracteres se lea en una instruccin Read o ReadLn por separado, para evitar el tener que ir contando hasta completar la cantidad exacta de caracteres que forman la cadena (o de lo contrario se tendrn resultados sorpresivos y frustrantes al verificar los datos ledos).

Procedimientos Write Y Writeln


La salida estndar se realiza en base a estos procedimientos predefinidos, y las instrucciones para invocarlos toman las siguientes formas :
Write(lista_de_salida); WriteLn(lista_de_salida);

donde : lista_de_salida es una lista de variables, expresiones y/o constantes, cuyos valores van a ser desplegados en la pantalla. El procedimiento Write permite que la siguiente instruccin se realice en la misma lnea , mientras que WriteLn alimenta una nueva lnea, antes de finalizar. Por ejemplo, las instrucciones :
Write ('! HOLA '); WriteLn('AMIGOS !');

producirn la salida :
! HOLA AMIGOS ! cursor en la siguiente lnea.

Mientras que :
Write('TECLEE <CTRL> F PARA FINALIZAR ==> ');

desplegar :
TECLEE <CTRL> F PARA FINALIZAR ==> CURSOR

Para producir un rengln en blanco, se debe escribir : WriteLn ;

Un valor booleano desplegar cualquiera de las cadenas : TRUE o FALSE, as :


Write('20 + 30 = ', 20 + 30 ,' ES ', 20 + 30 = 50);

producir :
20 + 30 = 50 ES TRUE

dejando el cursor en la misma lnea, al final de TRUE. Cuando un valor de salida se escribe sin una especificacin de longitud de campo, se utilizar la especificacin de campo por omisin. La especificacin de longitud de campo por omisin depender del tipo de valor de salida y de la implementacin de Pascal. As tenemos que, para todas las implementaciones : 1. La especificacin de longitud de campo por omisin para los valores de tipo char es 1 2. Si el valor a ser desplegado requiere menos del nmero de caracteres especificado, se imprimirn tantos caracteres blancos como sean necesarios para completar dicho nmero. 3. Si el valor a ser desplegado requiere un nmero de caracteres mayor que el especificado, se usa la mnima especificacin de longitud de campo que se requiera para representar un valor de tipo real o entero, pero las cadenas sern truncadas ajustndolas al campo especificado y desechar los caracteres en exceso que se encuentren ms a la derecha. 4. En el caso de valores de tipo real, se puede utilizar una especificacin de longitud de fraccin. Por omisin en Turbo Pascal, los valores de tipo real se desplegarn en formato de punto flotante (tambin llamado exponencial), as : a. Para el caso de valores positivos ( R >= 0.0 ), el formato es: bbn.nnnnnnnnnnEsnn b. Para valores negativos ( R < 0.0 ), el formato es : b-n.nnnnnnnnnnEsnn donde : b = blanco n = nmero ( 1-9 )

s = signo ( + - ) E = letra "E" para exponente La especificacin de campo mnima aceptada es :


para R >= 0.0 , SIETE caracteres. para R < 0.0 , OCHO caracteres.

Ejemplos: Sentencias WriteLn ('Hola Mundo'); WriteLn('22' + '20'); WriteLn(pi); WriteLn(3.0); Resultados Hola Mundo 2220 3.1415926536E+00 3.0000000000E+00

Debido a que Pascal alinea (justifica) las impresiones hacia la derecha del campo correspondiente, cuando es necesario acomodar tabularmente los caracteres de cadenas que no ocupan la totalidad de columnas especificadas. Por ejemplo, suponiendo que nombre es un identificador de tipo string[20] (cadena con formato de 20 caracteres), para que la impresin de todos los valores de nombre empiece en la misma columna, podemos utilizar la instruccin :
WriteLn(numero,'.- ',nombre, ' ':20-length(nombre),calif:3);

y, al ejecutar el programa se tendr algo parecido a : 1.- JUAN FLORES 2.- EGRID L. CASTRO 3.- RAMON RAMIREZ 90(Ntese la justificacin de los nombres 100hacia la izquierda y los nmeros hacia 99la derecha)

Formatos de salida
Formato 1 : WriteLn (tem:anchura...); Anchura: Expresin entera (literal, constante, variable o llamada a funcin) que especifca la anchura total del campo en que se escribe tem. Formato 2 : WriteLn (tem:anchura:dgitos ...); Dgitos: dgitos decimales de un nmero real

Anchura: Total de dgitos del nmero real contando parte entera, punto decimal y dgitos decimales. Ejemplos: Valor:= 25.0776; Sentencias WriteLn (Valor); WriteLn(Valor:2); WriteLn(Valor:2:1); WriteLn(Valor:2:4); WriteLn(Valor:2:8); WriteLn('Tec':1); WriteLn('Tec':3); WriteLn('Tec':5); Resultados 2.5077600000E+01 2.5E+01 25.1 25.0776 25.07760000 Tec Tec _ _ Tec Comentario

Notese el redondeo

Espacios vacios _

Secuencia
En este caso, las instrucciones se ejecutan una despus de la otra sin omitir ninguna de ellas. La sintaxis para las instrucciones ejecutadas en secuencia es :

................ ................ <instruccin.1> ; <instruccin.2> ; ................ ................ <instruccin.N> ; ................ ................

Seleccin
La seleccin de alternativas en Pascal se realiza con alguna de las dos siguientes formas : 1. La sentencia if 2. La sentencia case

IF-THEN-ELSE
Dado que una condicin produce un valor verdadero o falso, se necesita una sentencia de control que ejecute determinada sentencia si la condicin es verdadera , y otra si es falsa. En Pascal esta alternativa se realiza con la sentencia IF-THEN-ELSE. A continuacin se describe el diagrama de flujo y el formato de la sentencia.

Formatos de la sentencia IF:


if <condicin> if <condicin> then then <instruccin_1> <instruccin_1> else else <instruccin_2> <instruccin_2>

En este caso, primero se evala condicin y si el resultado arroja un valor de verdad(verdadero), se ejecuta instruccin_1 ; en caso contrario se ejecuta instruccin_2. La condicin es una expresin Booleana que puede ser verdadera o falsa (true o false). Una expresin Booleana se forma comparando valores de las expresiones utilizando operadores de relacin (relacionales) o comparacin y los operadores lgicos vistos anteriormente. Ejemplos :

Omisin de clusula else :


Program Edades; Uses Wincrt; Var edad : integer ; begin WriteLn('Escribe tu edad : '); ReadLn(edad); if edad >= 18 then WriteLn('!Eres Mayor de edad !'); WriteLn('Esta instruccin siempre se ejecuta');

ReadKey end.

Nota: Antes de la palabra end no se debe anteponer un punto y coma como se muestra en este ejemplo. El hacerlo generara una sentencia vaca (sentencia que no hace nada).

Utilizacin de clusula else :


Program Edades; Uses Wincrt; Var edad : integer ; begin WriteLn('Escribe tu edad : ') ; ReadLn(edad) ; if edad >= 18 then WriteLn('!Eres Mayor de edad !') else WriteLn('!Eres Menor de edad !'); WriteLn('Esta instruccin siempre se ejecuta'); ReadKey end.

Nota: Antes de la clusula else no se antepone un punto y coma, si lo hubiese el compilador producir un mensaje de error, puesto que no existe ninguna sentencia en Pascal que comience con else. La parte else es opcional, pero la ejecucin siempre continuar en otra instruccin. En lugar de utilizar instrucciones simples, se pueden usar bloques de instrucciones, como a continuacin se muestra:

Program Edades; Uses Wincrt; Var edad : integer ; begin WriteLn('Escribe tu edad : ') ; ReadLn(edad) ; if edad >= 18 then begin WriteLn('!Eres Mayor de edad !'); WriteLn('!Ya puedes Votar!') end else begin WriteLn('!Eres Menor de edad !'); WriteLn('!An no puedes votar!') end; WriteLn('Esta instruccin siempre se ejecuta'); ReadKey end.

Sentencia IF anidadas :
Program NumMayor; Uses Wincrt; Var n1,n2,n3,mayor : integer ; begin WriteLn('Escribe tres numeros enteros : '); ReadLn(n1,n2,n3); if n1>n2 then if n1>n3 then mayor:=n1 else mayor:=n3 else if n2>n3 then mayor:=n2 else mayor:=n3; WriteLn('El mayor es ',mayor); ReadKey end.

CASE-OF-ELSE
Esta forma es muy til cuando se tiene que elegir entre ms de dos opciones, por lo que le llamaremos forma de seleccin mltiple. La siguiente figura representa la seleccin mltiple.

Su formato es:
case <selector> of constante.1 :

begin <instrucciones>; end; constante.2 : begin <instrucciones> ; end; ..................... ..................... constante.N : begin <instrucciones> ; end

begin <instrucciones> ; end; end; { FIN DE CASE }

else

Dependiendo del valor que tenga la expresin selector, se ejecutarn las instrucciones etiquetadas por constante . Aqu tambin los bloques de instrucciones pueden ser reemplazados por instrucciones simples. Conviene tener presente que no debe escribirse punto y coma antes de la palabra else. Reglas: 1. La expresin <selector> se evala y se compara con las constantes;las constantes son listas de uno o ms posibles valores de <selector> separados por comas. Ejecutadas la(s) <instrucciones>, el control se pasa a la primera instruccin a continuacin de end (fin de case). 2. La clusula else es opcional. 3. Si el valor de <selector> no est comprendido en ninguna lista de constantes y no existe la clusula else, no sucede nada y sigue el flujo del programa; si existe la clusula else se ejecutan la(s) <instrucciones> a continuacin de la clusula else. 4. El selector debe ser un tipo ordinal ( integer, char, boolean o enumerado). Los nmeros reales no pueden ser utilizados ya que no son ordinales. Los valores ordinales de los lmites inferiores y superiores deben de estar dentro del rango -32768 a 32767. Por consiguiente, los tipos string, longint y word no son vlidos. 5. Todas las constantes case deben ser nicas y de un tipo ordinal compatible con el tipo del selector. 6. Cada sentencia, excepto la ltima, deben ir seguidas del punto y coma. Ejemplo:

Program Tecla; {El siguiente programa lee un carcter del teclado y despliega un mensaje en pantalla si es letra o nmero o carcter especial} Uses Wincrt; Var caracter : char; begin Write('Escribe un caracter : '); caracter:=ReadKey;WriteLn; case caracter of '0'..'9' : WriteLn('Es un nmero'); 'a'..'z','A'..'Z' : WriteLn('Es una letra') else WriteLn('Es un caracter especial') end; ReadKey end.

Iteracin
Las formas de iteracin sirven para ejecutar ciclos repetidamente, dependiendo de que se cumplan ciertas condiciones. Una estructura de control que permite la repeticin de una serie determinada de sentencias se denomina bucle (lazo o ciclo) En ingls (loop). El cuerpo del bucle contiene las sentencias que se repiten. Pascal proporciona tres estructuras o sentencias de control para especificar la repeticin:

1. While 2. Repeat 3. For

WHILE-DO
La estructura repetitiva while(mientras) es aquella en la que el nmero de iteraciones no se conoce por anticipado y el cuerpo del bucle se ejecuta repetidamente mientras que una condicin sea verdadera . Su formato es :
while <condicin> do begin <instrucciones>; End;

y su diagrama:

Reglas de funcionamiento : 1. La condicin se evala antes y despus de cada ejecucin del bucle. Si la condicin es verdadera, se ejecuta el bucle, y si es falsa, el control pasa a la sentencia siguiente al bucle. 2. Si la condicin se evala a falso cuando se ejecuta el bucle por primera vez, el cuerpo del bucle no se ejecutar nunca. 3. Mientras la condicin sea verdadera el bucle se ejecutar. Esto significa que el bucle se ejecutar indefinidamente a menos que "algo" en el interior del bucle modifique la condicin haciendo que su valor pase a falso. Si la expresin nunca cambia de valor, entonces el bucle no termina nunca y se denomina bucle infinito lo cual no es deseable.

REPEAT-UNTIL
La accin de repeat-until es repetir una serie de instrucciones hasta que se cumpla una determinada condicin . Su formato es :
repeat <instruccin.1> ; <instruccin.2> ; .................. .................. <instruccin.N> ; until <condicin>;

Aqu las palabras repeat y until sirven tambin como delimitadores de bloque. Su diagrama de flujo es:

Reglas de funcionamiento: 1. La condicin se evala al final del bucle, despus de ejecutarse todas las sentencias. 2. Si la condicin es falsa, se vuelve a repetir el bucle y se ejecutan todas sus instrucciones. 3. Si la condicin es falsa, se sale del bucle y se ejecuta la siguiente instruccin a until. 4. La sintaxis no requiere begin y end. Analcense los diagramas de while-do y repeat-until, para comprender las diferencias entre ambas formas.

FOR-TO-DO
Cuando se sabe de antemano el nmero de veces que deber ejecutarse un ciclo determinado, sta es la forma ms conveniente. El formato para for-to-do es :
for <contador>:=<expresin.1> to <expresin.2> do begin <instrucciones> ; end;

Al ejecutarse la sentencia for la primera vez, a contador se le asigna un valor inicial(expresion.1), y a continuacin se ejecutan las intrucciones del interior del bucle, enseguida se verifica si el valor final (expresin.2) es mayor que el valor inicial (expresin.1); en caso de no ser as se incrementa contador en uno y se vuelven a ejecutar las instrucciones, hasta que el contador sea mayor que el valor final, en cuyo momento se termina el bucle.

Aqu, contador no puede ser de tipo real. El contador se puede decrementar sustituyendo la palabra to por la palabra downto. Formato:
for <contador>:=<expresin.1> downto <expresin.2> do begin <instrucciones> ; end;

Tipos de datos
Pascal requiere que todos los tipos de datos sean formalmente definidos antes de ser utilizados, ya que tal definicin ser usada por el compilador para determinar cuanto espacio de memoria se reservar para las variables de cada tipo, as como para establecer los lmites de los valores que pueden asignarse a cada variable, por lo que estableceremos las siguientes reglas generales para los diferentes tipos de datos que se utilizan en Pascal: 1. Cada variable debe tener un solo tipo en el bloque donde fue declarada. 2. El tipo de cada variable debe ser declarado antes de que la variable sea utilizada en una instruccin ejecutable. 3. A cada tipo de dato se le pueden aplicar ciertos operadores especficos. Para facilitar su estudio, hemos clasificado a los tipos de datos que pueden ser definidos por el programador en SIMPLES y ESTRUCTURADOS.

Tipos simples
Hasta aqu, hemos considerado los tipos simples estndar integer, real, boolean, char y byte proporcionados por Turbo Pascal. Estos tipos de datos pueden ser utilizados para declarar variables numricas, de caracteres y/o lgicas. Sin embargo, es posible que ninguno de ellos satisfaga los requerimientos de un determinado problema, hacindose necesaria la utilizacin de otros tipos como:

TIPO SUBRANGO
El tipo de dato ms simple que se puede definir en un programa Pascal es el tipo subrango o intervalo. Estos tipos son tiles, sobre todo por la facilidad que ofrecen para verificar automticamente errores. Un tipo subrango se define de un tipo ordinal, especificando dos constantes de ese tipo, que actan como lmite inferior y superior del conjunto de datos de ese tipo. Un tipo subrango es un tipo ordinal y sus valores se ordenan de igual modo que en el tipo patrn de que se deducen. Ejemplos:

este tipo subrango consta de los elementos 0,1,2,3,4,5,6,7,8,9 este subrango consta de los caracteres 2. '0'..'9' '0' a '9' este subrango consta de los caracteres 3. 'A'..'F' 'A' a 'F' 1. 0..9

Se pueden crear variables cuyos valores se restrinjan a un subrango dado. Las declaraciones de tipo subrango se sitan entre las declaraciones de constantes y de variables. Formato:
type Nombre = lmite inferior .. lmite superior

Ejemplos:
{$R+} {Directiva de compilador R} Program Positivos; Uses Wincrt; {El siguiente programa realiza una validacin para que slo se acepten valores positivos entre 0 y 32767 por medio de un tipo subrango} Type NumPositivo = 0..MaxInt; Var numero : NumPositivo; Begin ClrScr; {numero:=-1; (est instruccin provocara un error} Write('Escribe un nmero entero positivo : '); ReadLn(numero); ReadKey end.

Nota: Puesto que Pascal no siempre produce un error cuando el valor de un tipo subrango est fuera de su rango definido. Sin embargo se puede tener la posibilidad de visualizar dichos errores mediante la directiva de compilador:
{$R+} {$R-} activada desactivada

Por default esta desactivada. Slo se debe usar durante la fase de depuracin. TIPOS ENUMERADOS En estos tipos de datos simples, se listan los identificadores que sern asociados con cada valor a utilizar. Por ejemplo:
Type dias_semana =(lunes,martes,miercoles,jueves, viernes,sabado,domingo); colores_baraja =(espada,oro,basto,copa);

De igual forma las variables pueden ser de tipo enumerado:


Var dias : dias_semana; baraja : colores_baraja;

Formato:
Type nombre = (constante1,constante2,...,constanteN)

Los datos de tipo colores_baraja slo podrn tomar los valores denotados por : espada, oro, basto, copa . La posicin de cada valor en la lista define su orden, por lo que para el tipo dias_semana tenemos que :
domingo > viernes da como resultado true sabado < martes da como resultado false jueves <> miercoles da como resultado true

Caractersticas:

Un tipo de dato enumerado es un tipo ordinal cuyo orden se indica por la disposicin de los valores en la definicin. El nmero de orden de cada elemento comienza en 0 para el primer elemento. Las variables de tipo enumerado slo pueden tomar valores de estos tipos. Los nicos operadores que pueden acompaar a los tipos ordinales son los operadores de relacin y asignacin.

A los valores de los tipos enumerados se les pueden aplicar las funciones estndar succ (de sucesor), pred (de predecesor) y ord (de ordinal).

En el caso del valor mximo de un tipo enumerado, succ no est definido, y, para su valor mnimo, no est definido pred. La funcin estndar ord es aplicable a los argumentos que sean valores de tipo enumerado. La relacin biunvoca se da entre los valores del tipo y los enteros comprendidos entre 0 y N1, donde N es la cardinalidad del tipo enumerado. El tipo estndar boolean es equivalente a un tipo enumerado de la forma :
boolean = ( false, true);

Aplicacin de las funciones Ord, Pred, Succ Argumento(x) Tipos de datos Ord(x) Pred(x) lunes dias_semana 0 Indefinido oro colores_baraja 1 espada 22 Integer 22 21 0 Integer 0 -1 -20 Integer -20 -21 MaxInt Integer MaxInt MaxInt-1 false Lgico 0 Indefinido

Succ(x) martes basto 23 1 -19 Indefinido true

Ejemplo:
Program Dias_Semana; Uses Wincrt; {El siguiete programa muestra los dias de la semana por medio de tipos enumerados} Type Dia_Semana = (Lunes,Martes,Miercoles,Jueves, Viernes,Sabado,Domingo); Var dias :Dia_Semana; i :byte; Begin ClrScr; dias:=lunes; for i:=1 to 7 do begin case dias of Lunes :WriteLn('Lunes '); Martes :WriteLn('Martes '); Miercoles :WriteLn('Miercoles'); Jueves :WriteLn('Jueves '); Viernes :WriteLn('Viernes '); Sabado :WriteLn('Sabado '); Domingo :WriteLn('Domingo ') end;

dias:=succ(dias) end; ReadKey end.

Tipos estructurados
En Pascal, se pueden definir , a partir de los datos simples, otros tipos ms complejos conocidos como tipos estructurados. Cuando se declara una variable como de un tipo estructurado, se puede manipular la estructura completa, o bien trabajar con los datos individuales que la forman. A continuacin, se describirn los diferentes tipos estructurados que pueden manejarse en Pascal.

Cadenas (String) Arreglos (Array) Registros (Record) Conjuntos (Set) Archivos

Cadenas (strings)
Turbo Pascal proporciona el tipo string para el procesamiento de cadenas (secuencias de caracteres ). La definicin de un tipo string debe especificar el nmero mximo de caracteres que puede contener, esto es, la mxima longitud para las cadenas de ese tipo. La longitud se especifca por una constante entera en el rango de 1 a 255. El formato para definir un tipo string es: <identificador> = string [limite_superior]; Las variables de cadena se declaran en la seccin Var o Type. Declaracin en Var:
Var nombre : string[30]; domicilio : string[30];

ciudad

: string[40];

Declaracin en Type:
Type cad30 cad40 Var nombre domicilio ciudad : string[30]; : string[40]; : cad30; : cad30; : cad40;

Una Vez declaradas las variables se pueden realizar asignaciones u operaciones de lectura/escritura. nombre := 'Egrid Lorely Castro Gonzalez' ; domicilio := 'Altamirano #220'; ciudad := 'La Paz B.C.S.';

El contenido de la cadena se debe encerrar entre apstrofes. Si se desea que figure un apstrofe en una cadena, es preciso doblarlo en la cadena. Los procedimientos de Entrada/Salida son de la siguiente forma :
ReadLn (nombre); WriteLn('Hola ',nombre);

Longitud de una cadena


Las variables de tipo cadena pueden ocupar la mxima longitud definida, ms un octeto que contiene la longitud actual de la variable. Los caracteres que forman la cadena son numerados desde 1 hasta la longitud de la cadena. Ejemplo:
Var nombre : string[10]; begin nombre := 'Susana'; end.

Obsrvese que el primer byte no es el carcter '6' si no el nmero 6 en binario (0000 0110) y los ltimos bytes de la cadena hasta 10 (7-10) contienen datos aleatorios. Una cadena en Turbo Pascal tiene dos longitudes :

1. Longitud fsica : Es la cantidad de memoria que ocupa realmente, est se establece en tiempo de compilacin y nunca cambia 2. Longitud lgica : Es el nmero de caracteres almacenados actualmente en la varible cadena. Este dato puede cambiar durante la ejecucin del programa. Es posible acceder a posiciones individuales dentro de una variable cadena, mediante la utilizacin de corchetes que dentro de ellos se especifca el nmero indice dentro de la cadena a utilizar as para el ejemplo anterior se tiene :
nombre[1] nombre[2] nombre[3] nombre[4] nombre[5] nombre[6] ==> ==> ==> ==> ==> ==> 'S' 'u' 's' 'a' 'n' 'a'

Operaciones entre cadenas


Las operciones bsicas entre cadenas son : asignacin, comparacin y concatenacin. Es posible asignar una cadena a otra cadena, incluso aunque sea de longitud fsica ms pequea en cuyo caso ocurrira un truncamiento de la cadena.

Ejemplo:
Var nombre : String[21]; . . nombre := 'Instituto Tecnolgico de La Paz';

El resultado de la 'Instituto Tecnolgico'.

asignacin

en

la

variable

nombre

ser

la

cadena

Las comparaciones de las cadenas de caracteres se hacen segn el orden de los caracteres en el cdigo ASCII y con los operadores de relacin.
'0' < '1' '2' > '1' 'A' < 'B' 'm' > 'l'

Reglas de comparacin de cadenas


Las dos cadenas se comparan de izquierda a derecha hasta que se encuentran dos caracteres diferentes. El orden de las dos cadenas es el que corresponde al orden de los dos caracteres diferentes. Si las dos cadenas son iguales pero una de ella es ms corta que la otra, entonces la ms corta es menor que la ms larga. Ejemplo :

'Alex' > 'Alas' {puesto que 'e' > 'a'} 'ADAN' < 'adan' {puesto que 'A' < 'a'} 'Damian' < 'Damiana' {'Damian' tiene menos caracteres que 'Damiana'} 'El gato' < 'Los gatos' {puesto que (blanco) < 's'}

Otra operacin bsica es la concatenacin. La concatenacin es un proceso de combinar dos o ms cadenas en una sola cadena. El signo + se puede usar para concatenar cadenas ( al igual que la funcin concat ), debiendo cuidarse que la longitud del resultado no sea mayor que 255. Ejemplos :
'INSTITUTO '+'TECNOLOGICO'='INSTITUTO TECNOLOGICO' 'CONTAB'+'.'+'PAS'= 'CONTAB.PAS'

Se puede asignar el valor de una expresin de cadena a una variable cadena, por ejemplo :
fecha := 'lunes';

y utilizar la variable fecha en :


frase:='El prximo '+fecha+' inician las clases';

Si la longitud mxima de una cadena es excedida, se pierden los caracteres sobrantes a la derecha. Por ejemplo, si fecha hubiera sido declarada del tipo string[7], despus de la asignacin contendra los siete primeros caracteres de la izquierda (CENTENA).

PROCEDIMIENTOS Y FUNCIONES DE CADENA INTERNOS


Turbo Pascal incorpora las siguientes funciones y procedimientos para el tratamiento de cadenas. Procedimientos y funciones de cadena Procedimiento Funcin Delete Concat Insert Copy Str Length Val Pos

Procedimiento Delete
Delete borra o elimina una subcadena de una cadena contenida en otra cadena de mayor longitud. Formato : Delete (s, posicin, nmero)
S Cadena original o fuente Posicin Expresin entera que indica la posicin del primer carcter a suprimir. Nmero Cantidad de caracteres a suprimir.

Si posicin es mayor que la longitud de la cadena, no se borra ningn carcter. Si nmero especifca ms caracteres que los existentes desde la posicin inicial hasta el final de la cadena, slo se borran tantos caracteres como estn en la cadena. Ejemplo :
Cad := 'Tecnolgico' Delete(cad,1,5) Resulta la cadena 'lgico'

Procemiento Insert Insert inserta una subcadena en una cadena. Formato : Insert (cad1, s, posicin)
cad1 cadena a insertar s cadena donde se inserta posicin carcter a partir del cual se inserta

Ejemplo:
cad:= 'Mxico ' Insert (' lindo y querido',cad,7) Resulta 'Mxico lindo y querido'

Procedimiento Str Este procedimiento efecta la conversin de un valor nmerico en una cadena. Formato :

Str (valor,s)
Valor expreson nmerica s cadena

Ejemplos :
Numero := 235.55; Str(Numero,cadena); Write(cadena); Resulta la cadena '2.355000000E+02' Numero := 12345; Str(Numero,cadena); Write(cadena); Resulta la cadena '12345' Numero := 12345; Str(Numero+1000:10,cadena); Write(cadena); Resulta la cadena ' 13345'

Procedimiento Val Este procedimiento convierte una cadena en variable nmerica. Para que esta conversin sea efectiva, el contenido de la cadena de caracteres debe corresponderse a las reglas de escritura de nmeros: no debe de existir ningn blanco en la primera o ltima posicin. Formato: Val (S, variable, cdigo)
S cadena Variable variable de tipo entero o real cdigo si la conversin ha podido ser efectuada toma el valor cero; en caso contrario contiene la primera posicin del primer carcter de la cadena S que impide la conversin y en ese caso variable no queda definida

Ejemplo:
Var cad : string[10]; num1,codigo : integer; num2 : real; begin cad:='22.25'; Val(cad,num2,codigo); if codigo=0 then WriteLn(num2:2:2) {Produce 22.25} else WriteLn(codigo); cad:='12x45';

Val(cad,num1,codigo); if codigo=0 then WriteLn(num1) else WriteLn(codigo) {Produce 3} end.

Funcin Concat Adems del uso de '+' para la concatenacin, Turbo Pascal tiene la funcin concat que permite concatenar una secuencia de caracteres. Formato: Concat (S1,S2,...,Sn)
S1,S2...cadenas o variables de caracteres (expresin tipo cadena)

Ejemplo :
Var cad1,cad2 : string[20]; destino : string[50]; begin cad1:='Hola como '; cad2:='Estas '; destino:=Concat(cad1,cad2,', estoy bien') end.

Esto produce una cadena destino igual a 'Hola como estas, estoy bien'

Funcin Copy Esta funcin devuelve una cadena de caracteres (subcadena) extrada de una cadena. Formato: Copy(s,posicin,nmero)
s cadena (fuente) posicin primer carcter a extraer (tipo entero) nmero total de caracteres a extraer (tipo entero)

Si posicin es mayor que la longitud de S, se devuelve una cadena vaca; si nmero especifca ms caracteres que los indicados desde posicin, slo se devuelve el resto de la cadena. Ejemplo:
cad := 'Instituto Tecnolgico de La Paz'; cad2 := Copy(cad,26,6); Write(cad2);

Lo que produce la cadena 'La Paz' contenida en cad2. Funcin Lenght (longitud) La funcin Lenght proporciona la longitud lgica de una cadena de caracteres y devuelve un valor entero. Formato : Length (s)
s expresin tipo cadena

Ejemplo :
Var cad : string[20]; begin cad:='Hola'; WriteLn(Length ('Hola como estas')); {devuelve el valor 15} WriteLn(Length ('')); {devuelve cero (cadena vaca)} WriteLn(Length (cad)); {devuelve el valor 4} WriteLn(Ord(cad[0])) {devuelve el valor 4} end.

Funcin Pos Esta funcin permite determinar si una cadena est contenida en otra. En este caso, la funcin devuelve la posicin donde comienza la cadena buscada en la cadena fuente, si la cadena no existe, se devuelve el resultado 0. Formato : Pos (cadena buscada, cadena fuente) Ejemplo:

cad:= 'uno dos tres cuatro cinco seis'; WriteLn(Pos('dos',cad)); {Resulta 5 que es la posicin de 'd'} WriteLn(Pos('ocho',cad)); {Resulta 0 no existe la cadena 'ocho'}

Arreglos (array)
Un arreglo est formado por un nmero fijo de elementos contguos de un mismo tipo. Al tipo se le llama tipo base del arreglo. Los datos individuales se llaman elementos del arreglo. Para definir un tipo estructurado arreglo, se debe especificar el tipo base y el nmero de elementos. Un array se caracterza por: 1. Almacenar los elementos del array en posiciones de memoria contnua. 2. Tener un nico nombre de variable que representa a todos los elementos, y stos a su vez se diferencan por un ndice o subndice. 3. Acceso directo o aleatorio a los elementos individuales del array. Los arrays se clasifican en:

Unidimensionales (vectores o listas) Multidimensionales ( tablas o matrices)

El formato para definir un tipo array es: nombre_array = array [tipo subndice] of tipo
nombre_array identificador vlido tipo subndice puede ser de tipo ordinal: boolean o char, un tipo enumerado o un tipo subrango. Existe un elemento por cada valor del tipo subndice tipo describe el tipo de cada elemento del vector; todos los elementos de un vector son del mismo tipo

Las variables de tipo array se declaran en la seccin Var o Type. Declaracin en Var:

Var nombres calif numero

: array[1..30] of string[30]; : array[1..30] of real; : array[0..100] of 1..100;

Declaracin en Type:
Type nombres calif numero Var nom califica num : array[1..30] of string[30]; : array[1..30] of real; : array[0..100] of 1..100; : nombres; : calif; : numero;

Arrays unidimensionales
Un array de una dimensin (vector o lista) es un tipo de datos estructurado compuesto de un nmero de elementos finitos, tamao fijo y elementos homogneos. Supongamos que desea conservar las edades de 10 personas. Para almacenar estas edades se necesita reservar 10 posiciones de memoria, darle un nombre al array, y a cada persona asignarle su edad correspondiente.

Nombre del vector Subndice Contenido

edades [1],[2],... edades[2]= 28

Ejemplo:
Program Vector_edades; {El siguiente programa captura 20 edades y las muestra en forma ascendente por medio de arrays} Uses Wincrt; Const MaxPersonas = 10; Var edades : array [1..MaxPersonas] of byte; i,j,paso : byte; begin

ClrScr; {lectura de array} for i:=1 to MaxPersonas do begin gotoxy(10,5); ClrEol; Write('Edad de la ',i,' persona : '); ReadLn(edades[i]) end; {ordenacin} for i:=1 to MaxPersonas-1 do begin for j:=i+1 to MaxPersonas do begin if edades[i]>edades[j] then begin paso :=edades[i]; edades[i]:=edades[j]; edades[j]:=paso end end; WriteLn(edades[i]) {escritura del array} end; Readkey end.

Arrays paralelos
Dos o ms arrays que utilizan el mismo subndice para referirse a trminos homlogos se llaman arrays paralelos. Basados en el programa anterior se tienen las edades de 'x' personas, para saber a que persona se refiere dicha edad se puede usar otro arreglo en forma paralela y asociarle los nombres de manera simultnea con las edades.

Ejemplo:
Program Paralelo_edades; {El siguiente programa captura 10 edades y nombres por medio de arrays paralelos y los muestra ordenados en forma ascendente} Uses Wincrt; Const MaxPersonas = 10; Var edades :array [1..MaxPersonas] of byte; nombres :array [1..MaxPersonas] of string [10]; aux_nom :string[10]; i,j,aux_edad :byte; begin ClrScr; {lectura de arrays paralelos de manera simultnea} for i:=1 to MaxPersonas do begin gotoxy(10,5); ClrEol;

Write(i,'.- Nombre : ','Edad : '); gotoxy(23,5);ReadLn(nombres[i]) ; gotoxy(48,5);ReadLn(edades[i]) end; {ordenacin} for i:=1 to MaxPersonas-1 do for j:=i+1 to MaxPersonas do if edades[i]>edades[j] then begin aux_edad :=edades[i]; edades[i] :=edades[j]; edades[j] :=aux_edad; aux_nom :=nombres[i]; nombres[i]:=nombres[j]; nombres[j]:=aux_nom end; ClrScr; for i:=1 to MaxPersonas do WriteLn(nombres[i]:10,' ',edades[i]:3) {escritura de los arrays paralelos} Readkey end.

Registros (record)
Un registro es una estructura que consiste de un nmero fijo de componentes llamados campos. Los campos pueden ser de diferentes tipos y deben tener un identificador de campo. La definicin de un tipo registro debe consistir de la palabra reservada record, seguida de una lista de campos y terminada por el identificador reservado end. formato:
Type tipo_reg = record lista id1:tipo 1; lista id2:tipo 2; . . . lista idn:tipo n end; tipo_reg nombre de la estructura o dato registro lista id lista de uno o ms nombres de campos separados por comas tipo puede ser cualquier tipo de dato estndar o definido por el usuario

Ejemplo :

Type registro_empleado = Record nombre profesion puesto sueldo end;

: : : :

string[30] ; string[20] ; string[20] ; real

Un registro puede representarse grficamente en funcin de sus campos.

El registro como un todo tiene el nombre registro_empleado. Este nuevo tipo que se acaba de definir puede utilizarse en la seccin Var, para declarar variables como por ejemplo:
Var empleado : registro_empleado ;

Para asignar valores a cada campo del registro empleado, puede procederse de la siguiente manera :
....................... ....................... ....................... empleado.nombre := 'MENDEZ ROMERO FEDERIC'; empleado.profesion := 'INGENIERO CIVIL'; empleado.puesto := 'DIRECTOR'; empleado.sueldo := 5000.00 ; ....................... ....................... .......................

Para simplificar la notacin de los registros, se pueden utilizar instrucciones With Do. Por ejemplo, la instruccin :
WriteLn(empleado.nombre:35, empleado.puesto:25, empleado.sueldo:15:0);

puede escribirse :
With empleado Do WriteLn(nombre:35,puesto:25,sueldo:15:0);

Asimismo, para leer datos usamos :


With empleado Do begin Write('NOMBRE : '); ReadLn(nombre); Write('PROFESION : '); ReadLn(profesion); Write('PUESTO : '); ReadLn(puesto); Write('SUELDO MENSUAL : '); ReadLn(sueldo) end;

Obsrvese el siguiente segmento de programa :

.............................. .............................. .............................. Type fecha = Record anio : 1900..1989 ; mes : 1..12 ; dia : 1..31 end; datos = Record nombre : string[30] ; sueldo : real ; fecha_ingreso : fecha end; Var personal : datos ; ............................... ............................... ...............................

La asignacin del valor 15 al campo dia del registro personal se hace de la siguiente manera:
personal.fecha_ingreso.dia := 15 ;

donde :
personal.fecha_ingreso

hace referencia al campo fecha_ingreso del registro personal, mientras que :


dia

se refiere al campo dia del campo fecha_ingreso, que a su vez es un registro de tipo fecha. Usando la forma With Do quedara :
With personal Do With fecha_ingreso Do dia := 15 ;

que es equivalente a :
With personal, fecha_ingreso Do dia := 15 ;

o tambin a:
with personal Do with fecha_ingreso Do dia:=15;

Ejemplo:
Program Registro; {EL siguiente programa captura 10 empleados y sus datos personales en un arreglo con la utilizacin de registros} Uses Crt; Const MaxEmpleados=10; Type registro_empleado = Record nombre : string[30]; profesion : string[20]; puesto : string[20]; sueldo : real end; Var registro : registro_empleado; empleado :array[1..MaxEmpleados] of registro_empleado; i,col,ren :byte; begin ClrScr; Write(' Nombre Profesin Puesto Sueldo');

col:=1;ren:=2; for i:=1 to MaxEmpleados do begin With registro do begin gotoxy(col,ren); ReadLn(empleado[i].nombre); gotoxy(col+21,ren); ReadLn(empleado[i].profesion); gotoxy(col+40,ren); ReadLn(empleado[i].puesto); gotoxy(col+59,ren); ReadLn(empleado[i].sueldo); inc(ren); col:=1; end end; ReadKey end.

Conjuntos (sets)
Un conjunto es una coleccin de objetos relacionados. Cada objeto en un conjunto es llamado miembro o elemento del conjunto. Aunque en matemticas no hay restricciones para que los objetos puedan ser elementos de un conjunto, Pascal slo ofrece una forma restringida de conjuntos, por lo que : 1. Los elementos de un conjunto deben ser del mismo tipo, llamado el tipo base. 2. El tipo base debe ser un tipo simple, excepto el tipo real. Representacin de conjuntos: Elementos Notacin Matemtica Pascal 1,2,3,4,5 {1,2,3,4,5} [1,2,3,4,5] a,b,c {a,b,c} ['a','b','c'] Aunque se puede utilizar notacin de tipo subrango para especificar secuencia de valores que pertenezcan a un conjunto, los elementos del conjunto no tienen una ordenacin interna particular. La nica relacin entre los miembros de un conjunto es: existe o no existe en el conjunto. [5,5] y [5] son equivalentes (contienen un slo elemento) Ejemplos de conjuntos: [1,3,5] conjunto de tres enteros

[1..3,8..10] conjunto de seis enteros [1,2,3,8,9,10] [] conjunto vaco (ningn elemento) ['a','b','A'..'D'] conjunto de seis elementos ['a','b','A','B','C','D'] Un conjunto especial, denominado conjunto vaco, es aquel que no contiene ningn elemento. El formato para la definicin de un tipo conjunto es :
type <identificador> = set of <tipo_base>

Ejemplos :
Type dias_mes mayusculas caracteres equipos = = = = set of 0..31; set of 'A'..'Z'; set of char; (Chivas,Santos,Pumas, Toluca,Tigres,America, Leon); = set of equipos;

futbol Var GrupoA,GrupoB : futbol;

En Pascal, el mximo nmero de elementos permitidos en un conjunto es 256, y los valores ordinales del tipo base deben estar en el rango de 0 a 255 .

Asignacin en conjuntos
Los elementos se ponen en los conjuntos utilizando una sentencia de asignacin.
GrupoA := [Chivas,Santos,Toluca]; GrupoB := [Tigres..Leon];

Si dos tipos de conjuntos son compatibles (tienen los tipos de base compatibles: igual tipo de dato, o uno subrango de otro, o ambos del mismo tipo patrn), sus variables representativas se pueden utilizar en sentencias de asignacin.
GrupoA := GrupoB; GrupoB := [];{asignacin del conjunto vaco}

La relacin In
El operador relacional In y una expresin relacional nos permite conocer si un elemento dado pertenece a un conjunto dado.

Formato: elemento in [ lista de elementos ] El resultado de evaluar la expresin relacional puede ser true o false. El tipo de datos de elemento y la lista de elementos deben ser compatibles. Ejemplo:
Program Hasta_Si; {El siguiente programa obtiene del teclado un nombre hasta que se presiona la tecla 's' o 'S' o Esc} Uses Crt; Const Esc =#27; Var nombre : string[30]; tecla : char; begin Repeat ClrScr; Write('Escribe tu nombre : '); ReadLn(nombre); Write('Desea Salir S/N ? : '); Tecla:=Readkey Until tecla in['s','S',Esc]; ClrScr end.

Operaciones con conjuntos


Una vez creados los conjuntos y las variables tipo conjunto es posible realizar tres operaciones binarias sobre ellos: unin, interseccin y diferencia. La siguiente tabla resume el funcionamiento de las operaciones con conjuntos A y B. Operaciones sobre dos conjuntos A y B Operacin Unin Interseccin Diferencia Ejemplo: Notacin Pascal + * Conjunto resultante A+B es el conjunto que contiene todos los elementos que estn en A, en B o en ambos. A*B es el conjunto cuyos elementos pertenecen a A y B simultneamente. A-B es el conjunto cuyos elementos son de A pero no de B.

Operacin [1,3,4,5]+[1,2,4] [1,3,4,5]*[1,2,4] [1,3,4,5]-[1,2,4] [1,2,3]+[ ] [1,2,4]*[3,5,6] [1,2,3]-[ ] Reglas de prioridad

Resultado [1,2,3,4,5] [1,4] [3,5] [1,2,3] [] []

Cuando una expresin de conjuntos contiene dos o ms operadores de conjunto, stos se evalan de acuerdo a la siguiente prioridad: * Prioridad ms alta +,- Prioridad ms baja En caso de operaciones con igual prioridad se evalan de izquierda a derecha.

Comparacin de conjuntos (operadores de relacin)


Los conjuntos se pueden comparar entre s mediante el uso de los operadores relacionales (==,<>,<=,>=). Los operandos deben ser del mismo tipo base. El resultado de la comparacin es un valor lgico: true o false. Operadores de relacin de conjuntos A y B Nombre del Operador Resultado operador El valor de A< = B es true. Si cada elemento de A es <= Subconjunto tambin de B. En caso contrario es false. El valor de A = B es true si cada elemento de A est en B y = Igualdad cada elemento de B est en A. En caso contrario A = B es falso, A=B equivale a (A<=B) and (B<=A). El valor de A < > B es true si el valor de A = B es false y <> Desigualdad viceversa. A < > B equivale a not (A = B), A >= B es true si B<=A es >= Superconjunto true.

Ejemplos : Comparacin [3,5] = [3,5] [ ] = [1] [ ] <= [1,5] [1,2] >= [1,2,3,4] [ ] >= [1,2] [1,4,5] = [4,5,1] Prioridad de operadores : Prioridad Not 1 (ms alta) *,/,div,mod,and 2 +,-,or 3 =,<>,<,<=,>,>=,in 4 (ms baja) Operador Resultado true false true false false true

Lectura de conjuntos
Algunas operaciones no se pueden ejecutar sobre variables de conjunto. Por ejemplo, no se puede leer cinco ciudades en un conjunto Mundo con la siguiente sentencia:

ReadLn(Mundo)

La razn es que la computadora no puede saber cuantos elementos existen en el conjunto. Si se desea leer y almacenar datos en un conjunto se debe utilizar un bucle.
for elemento:=1 to 5 do begin {leer un dato} {almacenar el valor en el siguiente elemento del conjunto} end;

Reglas :

1. Inicializar A al conjunto vaco. A := [ ]; 2. Leer cada elemento x del conjunto y aadirlo al conjunto A con la operacin unin (+) ReadLn(x); A := A + [x];

Escritura de conjuntos
Los valores de conjuntos no se pueden visualizar con la sentencia Write. Para visualizar los elementos de un conjunto A se debe utilizar el siguiente algoritmo: 1. Copiar los elementos de A en un conjunto auxiliar Aux que tenga un tipo base compatible con el de A. 2. Declarar x una variable del tipo base de Aux e inicializar x al primer elemento de est tipo base. 3. Mientras x es diferente del ltimo elemento de est tipo base y Aux no est vaca, hacer: I. Si x pertenece a Aux, entonces visualizar x y eliminarlo de Aux II. Sustituir x con su sucesor. Ejemplo:
Program Impares; {El siguiente programa encuentra y muestra todos los nmeros impares menores o igual a un nmero dado n que est entre el lmite 1..255} Uses Crt; Type numeros = set of 1..255; Var impares,Aux :numeros; x,MaxNum,i :byte; begin ClrScr; Write('Escribe un nmero entero : '); ReadLn(MaxNum); impares:=[]; {inicializa a conjunto vaco} for i:=1 to MaxNum do begin if odd(i) then impares:=impares + [i] {aadir elementos al conjunto}

end; {visualizar elementos del conjunto} Aux:=impares; x:=1; while (x<>MaxNum+1) and (Aux<>[]) do begin if x in Aux then begin WriteLn(x); Aux:=Aux-[x] end; x:=succ(x) end; ReadKey; ClrScr end.

Archivos (file)
Un tipo archivo se define con los identificadores reservados FILE OF, seguidas por el tipo de los componentes del archivo. Por ejemplo :
Type empleado = file of Record nombre:string[30]; sueldo:real; end; Var nomina : empleado ;

tambin puede escribirse as :


Type empleado = Record nombre:string [30]; sueldo:real; end; Var nomina : file of empleado;

NOTA: mas adelante se ver con ms detalle este tema.

Subprogamas
Un programa en Pascal consiste de uno o ms mdulos, los cuales a su vez tambin pueden estar constitudos por otros mdulos, y as sucesivamente. Estos mdulos sern llamados, en trminos generales, SUBPROGRAMAS, y en particular PROCEDIMIENTOS y FUNCIONES. Un subprograma es un bloque de programa que realiza una tarea determinada, y que al llamrsele o invocrsele puede necesitar que se le pasen PARAMETROS. Los parmetros son identificadores que proveen un mecanismo para pasar informacin hacia los subprogramas invocados. Los parmetros que se utilizan en la declaracin de subprogramas se llaman PARAMETROS FORMALES. Un subprograma puede ser invocado desde cualquier punto del programa, por medio de una instruccin INVOCADORA, la cual puede contener una lista de parmetros llamados PARAMETROS ACTUALES.

Procedimientos
Un procedimiento es un subprograma que realiza alguna de las tareas del programa, y que no devuelve ningn valor al subprograma que lo invoc.

Un procedimiento est compuesto de un grupo de sentencias a las que se asigna un nombre (identificador) y constituye una unidad del programa. La tarea asignada al procedimiento se ejecuta siempre que Pascal encuentra el nombre del procedimiento. En Turbo Pascal resulta obligatorio declarar los procedimientos antes de ser referenciados en el cuerpo del programa.

Declaracin de un procedimiento
La sintaxis para declarar un procedimiento es : Formato 1 :
procedure nombre_procedimiento; declaraciones locales begin cuerpo del procedimiento end;

Formato 2:
procedure nombre_procedimiento(parmetros formales); declaraciones locales begin cuerpo del procedimiento end;

La existencia de parmetros_formales depender de la naturaleza del procedimiento, esto es, de la tarea que va a realizar y de la forma en que lo ha estructurado su creador.

Invocacin al procedimiento
Para invocar a un procedimiento, la sintaxis es : <nombre_de_procedimiento> (parmetros_actuales) ; donde la existencia de parmetros_actuales depender de que en la declaracin del procedimiento se hayan utilizado parmetros formales. Para ejemplificar el uso de procedimientos, disearemos un programa que resuelva el problema de SUMAR Y MULTIPLICAR MATRICES. PSEUDOCODIGO

{PROGRAMA PARA SUMAR Y MULTIPLICAR MATRICES} INICIO IMPRIME encabezado. LEE las dimensiones de las matrices A y B. SI las matrices no son compatibles para la suma, ENTONCES IMPRIME mensaje_1. SI las matrices no son compatibles para la mult., ENTONCES IMPRIME mensaje_2. SI son compatibles para la suma o para la mult. , ENTONCES INICIO LEE las matrices A y B. IMPRIME las matrices A y B. SI son compatibles para la suma, ENTONCES INICIO SUMA las matrices A y B. IMPRIME la matriz resultado C. FIN SI son compatibles para la multiplicacion, ENTONCES INICIO MULTIPLICA las matrices A y B. IMPRIME la matriz resultado D. FIN FIN FIN.

CODIFICACION :
Program Opera_matrices; {Programa para sumar y multiplicar matrices de orden hasta de dim_max por dim_max } Uses Wincrt; Const dim_max = 10; Type mat = array [1..dim_max , 1..dim_max] of real; Var mat_a,mat_b,mat_c : mat; bandera_suma,bandera_mult:boolean; ren_a,ren_b,col_a,col_b :integer; procedure inicio; Var contador : integer; begin ClrScr; gotoxy(23,2); WriteLn('SUMA Y MULTIPLICACION DE MATRICES'); for contador := 1 to 80 do Write('='); WriteLn end; {Lee las dimensiones de las matrices} procedure dim ;

begin WriteLn('DIMENSIONES DE LA MATRIZ A'); WriteLn; Write('Nmero de renglones ==> '); ReadLn(ren_a); Write('Numero de columnas ==> '); ReadLn(col_a); WriteLn; WriteLn; WriteLn('DIMENSIONES DE LA MATRIZ B'); WriteLn; Write('Nmero de renglones ==> '); ReadLn(ren_b); Write('Nmero de columnas ==> '); ReadLn(col_b) end; {Verifica la compatibilidad para la suma} procedure compat_suma (ren_f_a,ren_f_b,col_f_a,col_f_b:integer; Var bandera_f:boolean); begin if ((ren_f_a <> ren_f_b) or (col_f_a <> col_f_b)) then begin WriteLn; WriteLn('Las matrices A y B son incompatibles para la suma'); bandera_f :=false end else bandera_f :=true end; {Verifica la compatibilidad para la multiplicacin} procedure compat_mult(ren_f_a,ren_f_b,col_f_a,col_f_b:integer; Var bandera_f:boolean); begin if col_f_a <> ren_f_b then begin WriteLn; WriteLn('Las matrices A y B son icompatibles para la multiplicacin'); bandera_f := false end else bandera_f := true end; {Lee una matriz} procedure lee(nmat:char;Var mat_f:mat;ren_max,col_max:integer); Var ren,col : integer; begin WriteLn; WriteLn('ELEMENTOS DE LA MATRIZ : ',nmat); WriteLn; for ren := 1 to ren_max do for col := 1 to col_max do begin Write('Elemento [ ',ren,',',col,'] = '); ReadLn(mat_f[ren,col]) end

end; {Suma dos matrices} procedure suma( mat_f_a,mat_f_b:mat;Var mat_f_c:mat; ren_f, col_f :integer); Var ren,col : integer; begin WriteLn; WriteLn('La suma de A y B es :'); for ren := 1 to ren_f do for col := 1 to col_f do mat_f_c[ren,col] := mat_f_a[ren,col] + mat_f_b[ren,col] end; {Multiplica dos matrices} procedure multiplica( mat_f_a, mat_f_b: mat ;Var mat_f_c : mat ; ren_f_a, col_f_a, col_f_b :integer); Var ren, acol, bcol : integer ; acum : real ; begin WriteLn; WriteLn('El producto de A y B es :'); for ren := 1 to ren_f_a do for bcol := 1 to col_f_b do begin acum := 0.0 ; for acol := 1 to col_f_a do acum := acum + mat_f_a[ren,acol] * mat_f_b[acol,bcol]; mat_f_c[ren,bcol] := acum end end; {Imprime una matriz} procedure imprime(nmat : char ; mat_f : mat ; ren_f, col_f : integer) ; Var ren, col : integer; begin WriteLn; WriteLn('MATRIZ ',nmat); for ren := 1 to ren_f do for col := 1 to col_f do begin Write(mat_f[ren,col]:6:1,' '); WriteLn end; WriteLn; Write('Oprima una tecla para continuar..... '); ReadKey; WriteLn end; {Mdulo Principal} begin inicio; dim; compat_suma(ren_a,ren_b,col_a,col_b,bandera_suma); compat_mult(ren_a,ren_b,col_a,col_b,bandera_mult); if bandera_suma or bandera_mult then

begin lee('A',mat_a,ren_a,col_a); lee('B',mat_b,ren_b,col_b); imprime('A',mat_a,ren_a,col_a); imprime('B',mat_b,ren_b,col_b); if bandera_suma then begin suma(mat_a,mat_b,mat_c,ren_a,col_a); imprime('C',mat_c,ren_a,col_b) end; if bandera_mult then begin multiplica(mat_a,mat_b,mat_c,ren_a,col_a,col_b); imprime('D', mat_c, ren_a, col_b) end end end.

Observe que el MDULO PRINCIPAL est formado por un bloque de instrucciones que invocan a procedimientos.

Funciones
La diferencia principal entre un procedimiento y una funcin es que el identificador de la funcin asume un valor, y cuando la funcin termina su tarea, devuelve ese valor al mdulo que la invoc; mientras que el procedimiento no devuelve ningn valor. Puesto que el nombre de la funcin toma un valor, dicho nombre debe tener asociado un tipo de dato.

Declaracin de funciones
La declaracin de una funcin tiene la siguiente forma :
function Nombre (p1,p2,...):tipo {declaraciones locales y subprogramas} begin <cuerpo de la funcin> Nombre := valor de la funcin end; p1,p2,... lista de parmetros formales tipo tipo de dato del resultado que devuelve la funcin

Ejemplos :

function verifica : boolean ; { Funcin sin parmetros formales} function cambia(Var valor_1, valor_2: real):real; function potencia( base, exponente : real ):real;

Invocacin de funciones
Las funciones se invocan de la siguiente manera : <nombre_funcin> (parmetros_locales) ;

donde : parmetros_locales es una lista de variables y/o constantes separadas por comas. La existencia de parmetros_locales depender de que existan parmetros formales en la declaracin de la funcin. Por ejemplo, resolvamos el problema de cacular la raz cuadrada de un nmero, utilizando el algoritmo de Newton: x(i+1) = x(i) + 0.5 ( a/x(i) -x(i) ) La codificacin del programa sera :
Program Raiz_cuadrada; {El siguiente programa calcula la raz cuadrada de un nmero} Uses Wincrt; Var raiz, numero : real; {Declaracin de la funcin raiz_cuad} function raiz_cuad( a : real ) : real ; Var c,x : real ; begin x := 1E-9 ; c := 1.0 ; while Abs (c-x)>1E-9 do begin c := x ; x := x + 0.5 * ( a/x -x ) end; raiz_cuad := x {El resultado se asigna a nombre_funcin} end; begin ClrScr; Write('La raz cuadrada de : ');

ReadLn(numero) ; raiz:=raiz_cuad(numero); {Invoca a la funcin raiz_cuad} WriteLn ; WriteLn('Es igual a : ',raiz:6:8); ReadKey; ClrScr end.

Ambito de variables
Las variables se clasifican en LOCALES y GLOBALES. Una variable LOCAL es una variable declarada dentro de un subprograma, y el significado de dicha variable se limita a ese subprograma y a los mdulos que ste contiene. Cuando otro subprograma utiliza el mismo nombre de variable, se crea una variable diferente en otra posicin de la memoria. Por eso, si un subprograma asigna un valor a una de las variables locales, tal valor no es accesible a los otros subprogramas. Cuando se desea que otros subprogramas tengan acceso al valor de una variable, sta debe declararse como GLOBAL, lo cual se logra declarndola en el mdulo que abarca a dichos subprogramas. Para tener la seguridad de que una variable va a tener un alcance GLOBAL, conviene declararla en el MODULO PRINCIPAL. Los conceptos anteriores se aclaran por medio de la siguiente figura:
Program anidado;

Referencias de identificadores vlidos : Bloque Identificador Significado de cada identificador anidado M constante global i,,j varibles globales A procedimiento declarado en anidado A i parmetros de A r,s variables locales B funcin local j variable declarada en anidado B funcin declarado en anidado M constante global B g parmetros de B m,n variables locales r,s variable declarada en A i parmetro de A y variable declarada en anidado A procedimiento declarado en anidado B funcin declarada en anidado M constante global

Paso de parmetros
Al invocar a un subprograma se le pueden pasar parmetros, los cuales pueden consistir de valores de variables declaradas en el mdulo invocador. El paso de tales parmetros puede hacerse de dos maneras:

Por valor Por referencia

Paso por valor


El paso de parmetros por valor consiste en enviar una COPIA del valor de la variable al mdulo invocado. De esta manera se asegura que el valor de la variable slo puede ser modificado por el mdulo que la declar.

Si la palabra Var no aparece delante del parmetro formal en un procedimiento, Turbo Pascal supone que el parmetro formal es un parmetro por valor. Ejemplo:
Program Suma_por_Valor; {El siguiente programa realiza la suma de dos numeros } Uses WinCrt; Var A,B,C:integer; procedure suma(A,B,C :integer); begin C := A + B end; begin ClrScr; C:=10; A:=10; B:=10; suma(A,B,C); WriteLn(A,',',B,',',C); ReadKey; ClrScr end.

El resultado de la ejecucin del programa sera : 10,10,10 El valor de C no se modifica puesto que es un parmetro por valor.

Paso por referencia


En el caso de que se requiera que el valor de una variable sea modificado por el mdulo invocado, debe hacerse el paso de parmetro por referencia, por medio del cual el mdulo invocado tiene acceso a la direccin en que se guarda el valor a modificar. Para aclarar los conceptos de paso por valor y paso por referencia, analicemos el programa de suma y multiplicacin de matrices dado en la seccin anterior. Observamos que las invocaciones a subprogramas son similares en los casos de paso por valor y paso por referencia. Por ejemplo, las invocaciones a los procedimientos imprime y suma quedan de la siguiente manera :
imprime('C',mat_c,ren_a,col_b);

suma(mat_a,mat_b,mat_c,ren_a,col_a);

y sus respectivas declaraciones son :


procedure imprime(nmat:char;mat_f:mat;ren_f,col_f:integer); procedure suma(mat_f_a,mat_f_b:mat;Var mat_f_c:mat;ren_f,col_f:integer);

Vemos que en la declaracin del procedimiento suma existe la parte: Var mat_f_c : mat la cual significa lo siguiente : "La variable mat_f_c contiene la direccin de la variable correspondiente en la invocacin (mat_c ) , y es de tipo mat " Esto significa que el paso del parmetro mat_c se hizo por referencia, y que el procedimiento invocado (suma) puede modificar el valor de mat_c .

Ejemplo: Program Suma_por_Referencia;


{El siguiente programa realiza la suma de dos nmeros } Uses Wincrt; Var A,B,C:integer; procedure suma(A,B:integer;Var C:integer); begin C := A + B end; begin ClrScr; C:=10; A:=10; B:=10; suma(A,B,C); WriteLn(A,',',B,',',C); ReadKey; ClrScr end.

El resultado de la ejecucin del programa sera : 10,10,20

El valor de C se modifica puesto que es un parmetro por referencia. Nota : En Turbo Pascal no se permite el paso de procedimientos y funciones como parmetros

Recursin
En Pascal, a un procedimiento o funcin le es permitido no slo invocar a otro procedimiento o funcin, sino tambin invocarse a s mismo. Una invocacin de ste tipo se dice que es recursiva. La funcin recursiva ms utilizada como ejemplo es la que calcula el factorial de un nmero entero no negativo, partiendo de las siguientes definiciones:
factorial (0) = 1 factorial (n) = n*factorial(n-1), para n>0

La funcin, escrita en Pascal, queda de la siguiente manera :


function factorial(numero:integer):integer; begin if numero = 0 then factorial := 1 else factorial := numero * factorial(numero-1) end;

Si numero = 4, la funcin realiza los siguientes pasos :

1. factorial(4) := 4 * factorial(3) Se invoca a si misma y crea una segunda variable cuyo nombre es numero y su valor es igual a 3. 2. factorial(3) := 3 * factorial(2) Se invoca a si misma y crea una tercera variable cuyo nombre es numero y su valor es igual a 2. 3. factorial(2) := 2 * factorial(1) Se invoca a si misma y crea una cuarta variable cuyo nombre es numero y su valor es igual a 1. 4. factorial(1) := 1 * factorial(0) Se invoca a si misma y crea una quinta variable cuyo nombre es numero y su valor es igual a 0. 5. Como factorial(0) := 1, con ste valor se regresa a completar la invocacin: factorial(1) := 1 * 1 , por lo que factorial(1) := 1 6. Con factorial(1) := 1, se regresa a completar: factorial(2) := 2 * 1, por lo que factorial(2) := 2 7. Con factorial(2) := 2, se regresa a completar : factorial(3) := 3 * 2, por lo que factorial(3) := 6 8. Con factorial(3) := 6, se regresa a completar : factorial(4) := 4 * 6, por lo que factorial(4) := 24 y ste ser el valor que la funcin factorial devolver al mdulo que la haya invocado con un valor de parmetro local igual a 4 . Un ejemplo de procedimiento recursivo es el siguiente: Supngase que una persona se mete a una piscina cuya profundidad es de 5 metros. Su intencin es tocar el fondo de la piscina y despus salir a la superficie. Tanto en el descenso como en el ascenso se le va indicando la distancia desde la superficie (a cada metro).
Program Piscina; Uses Wincrt; Const prof_max = 5; Var profundidad:integer; procedure zambullida(Var profun :integer); begin WriteLn('BAJA 1 PROFUNDIDAD = ',profun); profun := profun + 1; if profun <= prof_max then zambullida(profun) else WriteLn; profun := profun - 1; WriteLn('SUBE 1 PROFUNDIDAD = ', profun-1) end; begin ClrScr; profundidad := 1;

zambullida(profundidad) end.