Pascal
Pascal
Pascal
TUTORIAL
Hace ya más de dos años que me inicie en esto de Internet por medio de un curso que estuve
realizando todo el verano, y donde entre otras muchas cosas aprendí algo de Html, lo justo para que
me enganchase esto del diseño web, todo comenzó como una pequeña sección de mi página
personal donde colgué mi primera práctica de programación. Después me propuse crear un Tutorial
con los conceptos más GENERAL
PROCESO básicos sobre programación,
DE GENERACIÓN el cual
DE UN poco a poco fue creciendo y
PROGRAMA
complicandose.
Finalmente decidí emprender un proyecto de web site que recogiera el mayor número de utilidades
posibles para los progradores de Turbo Pascal, un lenguaje que muchos pueden considerar obsoleto,
pero que en mi opinión resulta el más intuitivo y sencillo de aprender. Siendo un punto de
referencia para todos aquellos que se inician en la programación, y que en un futuro darán el salto al
Delphi.
Ha este proyecto se han sumado otras personas que han aportado su granito de arena para que el
sitio mejore cada dia, por eso quiero dar las gracias en primer lugar a Guillermo A. Martínez
Ipucha, que es el responsable de que tu puedas estar leyendo este manual ahora, ya que el lo adaptó
a formato Pdf, también a JRenton por sus librerías, a Diego F. Romero, Skull y Whitey por aportar
sus prácticas, también a Manuel Cardona de Tecnoempleo.com por confiar en mi web para colocar
su publicidad, así como al resto de patrocinadores que permiten que le pueda dedicar algo mas de
mi tiempo al proyecto.
También me gustaría dedicar este manual a Pedro Casas de León y a toda la gente del curso de
Internet, así como a mis colegas de la Politécnica (Centro Universitario de Mérida), a Fran y al
equipo Faferdi del proyecto Clickeas.com, y a mi familia y amigos.
http://www.terra.es/personal/raul_zm/ © 2000-2001 4
TIPOS DE DATOS PREDEFINIDOS EN TURBO PASCAL.
Tipos enteros
Rango
Nombre Tamaño (bytes) Formato
(desde...hasta)
Integer -32.768 a 32.767 2 Entero con signo
Word 0 a 65535 2 Entero sin signo
ShortInt -127 a 127 1 Entero corto con signo
Byte 0 a 255 1 Entero corto sin signo
-2.147.483.648 a
LongInt 4 Entero largo con signo
2.147.483.647
Tipos reales
Rango
Nombre Tamaño (bytes) Cifra significativas
(desde...hasta)
Real 2,9E-39 a 1,7E38 6 11-12
Single 1,5E-45 a 3,4E38 4 6-7
Double 5,0E-307 a 1,7E307 8 15-16
1,9E-4932 a
Extended 10 19-20
1,1E493210
Comp -9,2E18 a 9,2E18 8 18-19
El tipo Char depende del código de caracteres empleado por la máquina. El más utilizado es el
código ASCII. Una variable o constante tipo Char puede contener un solo carácter especificado
entre apóstrofes. Ejem. 'a' 'M'
Pueden tomar dos valores True (verdadero) False (falso). El identificador estándar boolean define
una variable de este tipo.
Una cadena (string) es una secuencia de caracteres que tiene una longitud máxima de 255
caracteres. Los caracteres que componen la cadena se delimitan con apóstrofes. Ejem.
Ejem.
Const
Lonmax 80;
Type
Cadena = String[Lonmax];
Var
Varcad: Cadena; {*almacena hasta 80 caracteres*}
Nombre: String; {*almacena hasta 255 caracteres*}
Existen dos diferentes tipos de datos simples definidos por el usuario: enumerados y subrago.
Tipos enumerados. Los tipos enumerados se componen de una lista de identificadores encerrados
entre paréntesis y separados por comas.
Ejem.
Type
Estaciones = (primavera, verano, otoño, invierno);
Colores (rojo, amarillo, verde, azul, violeta);
Los tipos enumerados son ordinales ya que llevan asociado cada uno un número entero, empezando
por el primero, al que se le asigna el O, al segundo un 1, y así sucesivamente, por lo que no es
independiente el orden de declaración. Un valor de tipo enumerado no puede pertenecer a dos
declaraciones de tipo distintas y no pueden leerse desde teclado, ni escribirse en pantalla.
Tipos subrango.
Ejem. 1
Type
Identificador=primerelemento..ultimoelemento;
Ejem. 2
Type
Fecha= 1..31;
Var
Dia: Fecha;
Los tipos enteros, carácter, booleanos, enumerados y subrango se denominan tipos ordinales. Un
tipo ordinal representa una secuencia ordenada de valores individuales, a los que se puede aplicar
los conceptos de predecesor y sucesor. En cada tipo de datos ordinales hay un primer valor y un
último valor.
Realizan conversión de tipos de datos antes de que la salida llegue al archivo de salida. Las
variables o argumentos de esta sentencia pueden ser: expresiones. constantes o variables numéricas,
de carácter, de cadena o booleanas.
Formatos:
Ejem.
Mostrar la salida formateada para números decimales.
Program formato;
Var
N:Real;
Begin
N:= 113;
Writeln ('Formato por defecto',n);
Writeln ('Anchura 8:1', n:8:1);
Writeln ('Anchura 8:3', n:8:3)
End.
Ejecución:
OPERADORES ARITMÉTICOS.
Operador Función
- Operador unario. Invierte el signo.
+ operador binario suma.
- operador binario resta.
* operador binario producto.
/ operador binario división real.
div operador binario división entera.
mod operador binario resto entero.
FUNCIONES PREDEFINIDAS.
Instrucción Función
Abs(x) Proporciona el valor absoluto de una variable numerica x.
ArcTan(x) El arco cuya tangente es x.
Chr(x) Devuelve el carácter ASCII de un entero entre O y 255.
Cos(x) Proporciona el valor del coseno de x.
Exp(x) La exponencial de x(eX).
Frac(x) Parte decimal de x.
Int(x) Parte entera de x.
Ln(x) Logaritmo neperiano de x.
Odd(x) True si x es impar, y false si es par.
Ord(x) Ordinal de una variable tipo ordinal x.
Pred(x) Ordinal anterior a la variable ordinal x.
Round(x) Entero más próximo al valor x.
Succ(x) Ordinal siguiente a la variable ordinal x.
Sin(x) Seno de x.
Sqr(x) Cuadrado de x.
Sqrt(x) Raiz cuadrada de x, para x>=O.
Trunc(x) Parte entera de x.
Se denominan estructuras de control a aquellas que determinan qué instrucciones deben ejecutarse y
qué número de veces. Existen dos tipos de estructuras de control: alternativas o de selección y
repetitivas o de iteración.
ESTRUCTURAS ALTERNATIVAS.
Son aquellas que bifurcan o dirigen la ejecución de un programa hacia un grupo de sentencias u otro
dependiendo del resultado de una condición. Las dos sentencias alternativas de Turbo Pascal son:
IF THEN ELSE.
Formato:
Ejem.
IF n>O then Writeln (`Número positivo');
IF n>O then
Writeln (`Número positivo')
ELSE
Writeln (`Negativo o cero');
No puede existir un punto y coma inmediatamente antes de una palabra ELSE ya que sería
interpretado como final de IF.
Formato:
...
(lista de constantesN):(sentenciaN);
ELSE (SENTENCIA)
...
END;
Ejem.
Program menu;
Var
Numerodia: integer;
Begin
Write('introduzca el ordinal de un día laborable de la semana:')
Readín (numerodia);
Write (`Hoy es ');
Case numerodia Of
1:Writeln ('Lunes');
2:Writeln ('Martes');
3:Writeln ('Miercoles');
4:Writeln ('Jueves');
5:Writeln ('Viernes');
6:Writeln ('Sábado')
Else
Writeln ('¡¡¡Domingo!!! No es día laborable');
End.
• SENTENCIA WHILE
• SENTENCIA REPEAT-UNTIL
• SENTENCIA FOR
• CUÁNDO SE USA CADA UNO
SENTENCIA WHILE
Indica al ordenador que se ejecuten una o más sentencias mientras se cumpla una determinada
condición. La condición viene determinada por una variable o expresión booleana.
Formato:
WHILE condición DO
BEGIN
(sentencia1);
...
(sentenciaN);
END;
WHILE condición DO
(sentencia);
Se ejecuta mientras la condición sea verdadera, y dentro del bucle debe existir, por lo menos, una
sentencia que modifique el valor de la variable o expresión, de lo contrario se puede producir una
situación de bucle infinito. Si la expresión lógica es falsa al comenzar el bucle, éste no se realizará.
Ejemplo.
Escribir los N primeros números naturales, donde N es un valor
introducido por el usuario.
Ejecuta las sentencias comprendidas entre las palabras reservadas REPEAT y UNTIL hasta que la
expresión o variable sea verdadera.
Formato:
REPEAT
begin
(Sentencia);
(Sentencia);
...
end;
UNTIL condición;
Se ejecutan siempre una vez, por lo menos, y la terminación del bucle se produce cuando el valor de
la expresión lógica o condición de salida es verdadera. Se ejecuta hasta que la expresión es
verdadera, es decir, se ejecuta mientras la expresión sea falsa.
Ejemplo.
El mismo que con la sentencia WHILE.
Program escribeenteros;
Var
N,contador:integer;
Begin
Write ('Introduzca número máximo de enteros: ');
Readin (N);
Contador:= O;
Repeat
Contador:=contador+1;
Write (contador:5)
Until contador = N;
Writeln ('Fin de programa. Contador = ',contador)
End.
Repite la ejecución de una o varias sentencias un número fijo de veces. previamente establecido.
Necesita una variable de control del bucle que es necesariamente de tipo ordinal, ya que el bucle se
ejecuta mientras la variable de control toma una serie consecutiva de valores de tipo ordinal,
comprendidos entre dos valores extremos (inferior y superior).
Formato ascendente:
Formato descendente:
Ejemplo:
El mismo que con la sentencia WHILE.
Program escribeenteros;
Mar
N,contador: integer;
Begin
Write ('Introduzca numero maximo de enteros: ');
Readln (N);
For contador:=1 to n do
Write (contador:5);
Writeln
End.
Aunque a primera vista pueda resultar más atractivo FOR, existen limitaciones en su aplicación ya
que en el bucle FOR siempre se incrementa o decrementa (de uno en uno) los valores de la variable
de control de bucle y no de dos en dos o de tres en tres, o con valores fraccionarios.
Pascal ofrece dos herramientas básicas para realizar programación descendente: los procedimientos
(procedure) y las funciones (function), a los que nos referiremos genéricamente con el término de
subprogramas. Turbo pascal incorpora además el concepto de unidad (unit), que permite aprovechar
módulos independientes ya compilados.
Los parámetros
Los parámetros son canales de comunicación para pasar datos ente programas y subprogramas en
ambos sentidos. Los parámetros van asociados a variables. constantes, expresiones, etc., y por tanto,
se indican mediante los correspondientes identificadores o expresiones. Los parámetros que se
utilizan en la llamada o invocación al subprograma se denominan parámetros actuales, reales o
argumentos, y son los que entregan la información al subprograma. Los parámetros que la reciben
en el subprograma se denominan parámetros formales o ficticios y se declaran en la cabecera del
subprograma.
Se declaran inmediatamente después de las variables del programa principal, teniendo la precaución
de que si un subprograma referencia o llama a otro, el referenciado debe declararse primero.
Declaración de procedimientos.
Declaraciones const
Locales
Type...
Var...
<declaración de otros procedimientos y funciones>
Cuerpo begin
Ejem.
Llamada a un procedimiento.
Ejem.
Ejemplo.
Procedimiento para intercambiar los valores de dos variables.
Program Uno;
Uses crt;
Var
Entero 1 ,entero2 : integer;
begin
clrscr; {*borrado de pantalla*}
Write ('introduzca 2 variables enteras: ');
Readln(entero1,entero2);
Writeln ('valores de las variables antes de la llamada');
Writeln ('Entero 1 = ',enterol,'entero 2 = ',entero2);
intercambio (enterol,entero2); {llamada al procedimiento}
Writeln ('Valor de las variables después de la llamada');
Writeln ('entero 1 = ',enterol,'entero 2 = ',entero2);
end;
Deben utilizarse funciones cuando solo tenga que devolverse un solo valor simple al programa
llamador. En todos los demás casos utilizaremos: procedimietos.
La estructura Array.
Es una estructura homogénea de datos de tamaño constante accediendo a cada uno de sus elementos
mediante un identificador comun y uno o varios índices.
Type
Rango1 = tipoordinal1;
Rango2 = tipoordinal2;
...
rangon = tipoordinaln;
tipobase = (*cualquier predefinido o definido por el usuario*)
tipoarray = array [rango1,rango2,...,rangon] of tipobase,
Numero de cursos 5
Grupos por curso 3
Numero de evaluaciones 3
Numero de asignaturas 6
Numero de alumnos por curso 20
Const
Numcurso=5;
Numasig=6;
Numalum=20;
Type
Cursos=1.. nurneurso;
Grupos='A'..'C';
Eval=(primera,segunda,tercera);
Asign=1.. numasin;
Alum=1. .numalum;
Tiponotas=array[cursos,grupos,eval,asign,alum] of real;
Var
Notas:tiponotas;
Curso:cursos;
Grupo:grupos;
Evaluacion:eval;
Materia:asign;
Alumno:alum;
Con los elementos de un array podemos realizar las mismas operaciones que el tipo base al que
pertenecen.
Ejemplo
Cad1:='esto es un ejemplo';
Cad2:='de concatenacion de cadenas';
Cadr:=cad1+cad2;
Write (cadr);
La funcion concat realiza la misma funcion que el operador de concatenacion. La sintáxis es:
La cadena vacia o nula se representa con dos caracteres apóstrofes seguidos ' '. El acceso a los
elementos de una cadena individualmente se hace como si fuera un array.
Ejemplo.
Cad1:='ejemplo';
Ejemplo.
Longitud:=length(cad1);
Instrucción Función
Extrae una subcadena de caracteres de otra cadena de
caracteres
Pos (subcadena,cadena)
Suprime el numero de caracteres que le digamos de una cadena
a partir de la posición que le indiquemos
DELETE
Delete (Cad,Po,Num)
Inserta una cadena de caracteres en otra a partir de una posicion
dada.
UPCASE Upcase(x)
Program Quicksort;
uses crt;
type
vector=array [1..10] of integer;
const
lista:vector=(8,5,6,3,1,4,2,7,10,9);
var
k:integer;
longitud:integer;
Registros
Un registro es una estructura heterogénea de datos, denominados campos y a los que accedemos por
nombre. Al igual que cualquier otro dato, el tipo registro (Record) antes de poder se utilizado debe
ser declarado en la sección de tipos.
La única operación (a parte de la lectura) que se puede realizar con una variable registro como tal es
la asignación, es decir, se pueden copiar todos los campos de una variable registro a otra variable
registro del mismo tipo. Además un registro puede ser pasado como parámetro a una función o
procedimiento.
Archivos
Ejemplo:
Type
Tiporegistro = record
Campo 1 :tipol;
.
.
Campo N : tipoN;
End;
Archivol : tipoarchivo;
Registro1 : tiporegistro;
Instrucción Operación
Este procedimiento asigna un archivo lógico con su archivo fisico
correspondiente. Después de la asignación, cualquier operación
sobre la variable archivo afectará al archivo Dos
ASSIGN correspondiente.
Assign (Vararch,nomarch);
Procedimiento que abre un archivo para lectura posicionando el
puntero de lectura del archivo en el primer elemento del archivo,
y poniendo la variable booleana EOF asociada al archivo a
False, o en la marca de fin de archivo sí el archivo esta vacio, en
RESET cuyo caso la variable EOF toma el valor True. No se puede
modificar el contenido de ningún registro.
RESET (nomvararchivo);
Función que devuelve el número del tipo de error cometido en el
IORESULT
tratamiento de archivos. Si no hay ningún error devuelve O.
El procedimiento Rewrite abre un archivo para escritura
destruyendo el contenido del arhivo si este ya existe. No es
REWRITE
posible ver datos de un archivo que está abierto con este
procedimiento, ya que borra los datos existentes.
Este procedimiento se utiliza para introducir el contenido de un
registro del archivo en una variable de memoria definida del
READ mismo tipo de dato que el registro leido.
READ (nomvararchivo,nomvarreg);
En la lectura del último registro el salto del puntero posiciona
éste sobre la marca de fin de archivo, colocando la función lógica
EOF "fin de archivo" asociada a cada archivo a verdadero.
EOF (vararchivo)
EOF
Ejemplo:
Están formados por registros del mismo formato y longitud por lo que permiten el acceso a un
registro especifico mediante un número asociado al mismo, que se denomina su número de registro
lógico. El número asociado es de tipo longint y se asigna al primer registro lógico el valor O. Para
que un archivo pueda ser tratado por posicionamiento o acceso directo debe residir obligatoriamente
en un dispositivo de almacenamiento de este tipo.
Las principales operaciones de archivos de acceso directo que se usan en Pascal son:
FILESIZE Tamaño del archivo en formato longint, indica el número de registros almacenados. Si
el fichero está vacio devuelve el valor O.
SEEK Permite seleccionar un registro específico del archivo por su número de registro, para su uso
en una operación de lectura o escritura.
El Turbo Pascal permite manipular archivos y directorios en disco de modo similar al sistema
operativo Ms-DOS. Pudiendose realizar las siguientes operaciones con archivos y directorios:
Erase(nomvararchivo)
Rename(nomvararchivo,'nombrenuevoarchivo')
Chdir (directorio)
Mkdir (directorio)
Rmdir (directorio)
Getdir(unidad,camino)
Este Tutorial para la programación en Turbo Pascal se encuentra disponible en Internet de forma
gratuita en la dirección:
http://www.terra.es/personal/raul_zm
http://www.lanzadera.com/turbopascal70
http://pascal.turincon.com
Aquí podras encontrar todas las ampliaciones y futuras modificaciones que se vayan realizando
sobre este tutorial. Así como los nuevos capítulos que incluirán temas tan importantes como
creación y uso de unidades, conjuntos, salida por impresora, o las rutinas de las unidades CRT y
Graph.
Además de los nuevos capítulos del tutorial, podrás encontrar prácticas realizadas en Turbo Pascal,
examenes resueltos, librerias para el ratón, parches para solucionar el "runtime error 200" que se
produce al ejecutar programas realizados en Turbo Pascal en ordenadores rápidos, con procesadores
de 200 Mhz en adelante (Pentium II y superiores).
http://www.terra.es/personal/raul_zm/ © 2000-2001 27