Curso de TURBO PASCAL

Entrega Nº 1

17 de Noviembre de 1998

Autor : Manuel Vergel
Para : La Web del Programador

 

Hoy en día existen muchos lenguajes de programación orientados hacia diferentes plataformas, como son los lenguajes visuales, tales como Visual BASIC, Delphi®, Visual C®, Visual Dbase®, entre muchos más, y los Lenguajes no visuales, entre estos están Cobol®, BASIC, Turbo Pascal®, Clipper®, C®, etc. El hecho esta que la principal diferencia entre uno y el otro es, en qué plataforma tienen que correr, los lenguajes visuales su característica principal es, que tienen que correr bajo el ambiente Windows® y los otros pueden correr tanto en MS-DOS® y en Windows®.

En este curso nos enfocaremos hacia el Lenguaje de Programación Turbo Pascal, la versión que se recomienda a utilizar es la 7, ya que el editor es más "amigable" en el aspecto de aquellas persona que están comenzando a manejarlo y no saben cuales son todas las palabras reservadas, ya que estas se resaltan de color blanco, y las demás palabras se distinguen de color amarillo, reconociendo de manera inmediata cuales son las palabras reservadas y si en un caso se escribió mal la palabra reservada. otra de las ventajas fueron mejoras en algunas funciones, bueno dejando aclarado ya lo anterior, pasamos a lo siguiente.

Un momento pero ¿Qué es una palabra reservada? Las palabras reservadas son todas aquellas palabras que son de uso exclusivo para el compilador y no se pueden utilizar como variables. Como por ejemplo:

 

and

asm

array

begin

case

const

constructor

destructor

div

do

downto

else

end

exports

file

for

function

goto

if

implementation

in

inherited

inline

interface

label

library

mod

nil

not

object

of

or

packed

procedure

program

record

repeat

set

shl

shr

string

then

to

type

unit

until

uses

var

while

with

xor

 

¿que es una variable?

Es una localidad de memoria que puede almacenar un tipo de dato especifico.

Existen cinco tipos de datos básicos:

Integer
Char
Boolean
Real
String
Son números enteros que no contienes decimales.
Solo puede almacenar caracteres del código ASCII
Solo puede almacenar valores de falso o verdadero
Son números que pueden incluir una parte decimal
Es un tipo de dato que puede almacenar varios caracteres

 

Turbo Pascal provee cinco ya predefinidos tipos de datos enteros, como se demuestra a continuación:

Tipo

dígitos

Signo y Bytes

Shortint
Integer
Longint
Byte
Word
-128..127
-32768..32767
-2147483648..2147483647
0..255
0..65535
con signo 8-bit
con signo 16-bit
con signo 32-bit
con signo 8-bit
con signo 16-bit

 

Asimismo tiene 5 tipos de datos de punto flotante o en otras palabras, de decimales. Cada uno de los siguientes tipos tiene un rango especifico y precisión.

Tipo

Rango

Dígitos

Bytes

real
simple
double
Extended
comp
2.9e-39..1.7e38
1.5e-45..3.4e38
5.0e-324..1.7e308
3.4e-4932..1.1e4932
-9.2e18..9.2e18
11-12
7-8
15-16
19-20
19-20
6
4
8
10
8

 

En Pascal no existe la diferencia en escribir las variables o palabras reservadas en minúsculas o mayúsculas, ya que el compilador no le da importancia y las toma por igual, ahora en el caso del lenguaje "C", a este si le importa. Lo que sí se recomienda es que se adopte un estilo de programación, ya que al cambiar de lenguaje es muy difícil pero no imposible, romper con una costumbre.

  1. se debe de no mezclar al escribir con minúsculas y mayúsculas, (pero no es una regla)
  2. utilizar la identación o sangría para una fácil localización de inicio y fin de bloques.

A continuación se cita un programa sin identar...

programa Ejemplo;
uses crt;
var i:byte;
begin
Writeln(‘Esto es un ejemplo...’);
for i:=1 to 10 do
begin
If i mod 2= 0 then
begin
writeln(‘esto es un par...’);
writeln(‘ y estoy en el bloque del if ‘)
end
else
begin
writeln(‘esto es un impar...’);
writeln(‘ estoy en el bloque del else ‘);
end;
end;
end.

Este es el mismo ejemplo con identación....

programa Ejemplo;
uses crt;
var i:byte;
begin
      Writeln(‘Esto es un ejemplo...’);
      for i:=1 to 10 do
      begin
            If i mod 2= 0 then
            begin
                  writeln(‘esto es un par...’);
                  writeln(‘ y estoy en el bloque del if ‘)
            end
            else
            begin
                  writeln(‘esto es un impar...’);
                  writeln(‘ y estoy en el bloque del else ‘);
            end;
      end;
end.

A simple vista uno se da cuenta cual de los dos programas es más fácil de entender y determinar que instrucciones están en determinado bloques...

Ya con estas dos recomendaciones, continuamos con conceptos básicos, lo que un principiante debe de conocer y saber distinguir.

Cuando uno es inexperto para programar nos surgen muchas dudas como declarar una variable en nuestro programa. Como antes mencionaba existen varios tipos de datos, pero por el momento nos enfocaremos a los cinco tipos principales. Para no crear confusiones y sea más sencillo utilizar los tipos. Existe una parte especifica donde las variables deben de ser declaradas, cabe destacar que no es como en Basic, si alguno de ustedes a manejado Basic o C, uno podía declarar las variables donde uno quisiera no importando en que lugar lo haríamos, en especial todas las variables que utilicemos en un programa, deben de estar ya previamente declaradas como tales. Al declarar las variables estas deben de contener ya sea letras y números o letras, no se aceptan variables que tengan caracteres especiales tales como :* , - , /, @, š etc., ni espacios en blancos, otra cosa también que la primera letra de la palabra debe de ser una letra, en el caso que se quieran mezclar números y letras, ya que si colocan al principio de la declaración de la variable un número, se marcara error, por identificador no valido...

Ejemplos de variables:

La sintaxis de la declaración de una variable es la siguiente:
Var
      Identificador, identificador..:tipo;
      ...
      Identificador, identificador..:tipo;

 

Un ejemplo de declaración de una variable:

Programa ejemplo2;
Var dato1, dato2:integer;
      Cadena:string;
Begin
      {aquí va el código}
End.

Ya declare ya tres variables, dos que son de tipo entero y una de tipo cadena de caracteres.

Supóngase que usted tiene que resolver un pequeño programa que haga la suma de dos números y imprima en pantalla su resultado:

Programa ejemplo2;
Uses crt;
Var dato1, dato2:integer;
      Cadena:string;
Begin
      Clrscr;
      Write('Dame dato A :');
      Write('Dame dato B :');
End.

 

Existen una cantidad de posibles errores que suelen ocurrir ya sea en tiempo de compilación y en tiempo de ejecución, que son los que detecta turbo Pascal, pero hay un tipo de error que es el mate para cualquier programador y es el de tipo lógico, que son los errores más difícil para detectar, ya que depende de la habilidad del programador para evitarlos.

Por ejemplo: si se desea pasar esta ecuación a turbo Pascal

Z = A+B


    C

Siendo los valores A=10, B=5 y C=5, el resultado de la formula, lógicamente debe de ser 3.

En lenguaje de Pascal quedaría de la siguiente manera:

Z:=A+B/C;

No existe ningún error que pueda detectar el compilador, ya que esta correctamente escrito, si procedemos a evaluar la quedaría así

Z=10+5/5

Z=10+1

Z=10

Si nos damos cuenta el resultado es erróneo y esto se debió a que se interpreto mal la formula, ya que no se respetaron las prioridades, es decir, la suma de A y B, debió de ser primero que la división de B y C, este es un ejemplo típico de errores lógicos, la formula correcta quedaría así:

Z:=(A+B)/C

Ahora la evaluamos:

Z=(10+5)/5
Z=(15)/5
Z=3

Los errores en tiempo de compilación son aquellos en los cuales, escribimos mal el código y este nos señala el tipo de error que es, como una falta de punto y coma, falta paréntesis, se esperaba un identificador, etc.

Errores en tiempo de compilación son:

Error

Mensaje

Traducción

1
2
3
4
5
6
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
112
113
114
116
117
118
119
121
122
123
124
126
127
128
129
130
131
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
Out of memory
Identifier expected
Unknown identifier
Duplicate identifier
Syntax error
Error in real constant
Error in integer constant
String constant exceeds line
Unexpected end of file
Line too long
Type identifier expected
Too many open files
Invalid file name
File not found
Disk full
Invalid compiler directive
Too many files
Undefined type in pointer def
Variable identifier expected
Error in type
Structure too large
Set base type out of range
File components may not be files or objects
Invalid string length
Type mismatch
Invalid subrange base type
Lower bound greater than upper bound
Ordinal type expected
Integer constant expected
Constant expected
Integer or real constant expected
Pointer Type identifier expected
Invalid function result type
Label identifier expected
BEGIN expected
END expected
Integer expression expected
Ordinal expression expected
Boolean expression expected
Operand types do not match
Error in expression
Illegal assignment
Field identifier expected
Object file too large
Undefined external
Invalid object file record
Code segment too large
Data segment too large
DO expected
Invalid PUBLIC definition
Invalid EXTRN definition
Too many EXTRN definitions
OF expected
INTERFACE expected
Invalid relocatable reference
THEN expected
TO or DOWNTO expected
Undefined forward
Invalid typecast
Division by zero
Invalid file type
Cannot read or write variables of this type
Pointer variable expected
String variable expected
String expression expected
Circular unit reference
Unit name mismatch
Unit version mismatch
Internal stack overflow
Unit file format error
IMPLEMENTATION expected
Constant and case types do not match
Record or object variable expected
Constant out of range
File variable expected
Pointer expression expected
Integer or real expression expected
Label not within current block
Label already defined
Undefined label in preceding statement part
Invalid @ argument
UNIT expected
; expected
: expected
, expected
( expected
) expected
= expected
:= expected
[ or "(." expected
] or ".)" expected
. expected
.. expected
Too many variables
Invalid FOR control variable
Integer variable expected
Files and procedure types are not allowed here
String length mismatch
Invalid ordering of fields
String constant expected
Integer or real variable expected
Ordinal variable expected
INLINE error
Character expression expected
Too many relocation items
Overflow in arithmetic operation
No enclosing FOR, WHILE or REPEAT statement
Debug information table overflow
CASE constant out of range
Error in statement
Cannot call an interrupt procedure
Must be in 8087 mode to compile this
Target address not found
Include files are not allowed here
No inherited methods are accessible here
Invalid qualifier
Invalid variable reference
Too many symbols
Statement part too large
Files must be var parameters
Too many conditional symbols
Misplaced conditional directive
ENDIF directive missing
Error in initial conditional defines
Header does not match previous definition
Cannot evaluate this expression
Expression incorrectly terminated
Invalid format specifier
Invalid indirect reference
Structured variables are not allowed here
Cannot evaluate without System unit
Cannot access this symbol
Invalid floating point operation
Cannot compile overlays to memory
Pointer or procedural variable expected
Invalid procedure or function reference
Cannot overlay this unit
Too many nested scopes
File access denied
Object type expected
Local object types are not allowed
VIRTUAL expected
Method identifier expected
Virtual constructors are not allowed
Constructor identifier expected
Destructor identifier expected
Fail only allowed within constructors
Invalid combination of opcode and operands
Memory reference expected
Cannot add or subtract relocatable symbols
Invalid register combination
286/287 instructions are not enabled
Invalid symbol reference
Code generation error
ASM expected
Duplicate dynamic method index
Duplicate resource identifier
Duplicate or invalid export index
Procedure or function identifier expected
Cannot export this symbol
Duplicate export name
Executable file header too large
Too many segments
No hay memoria
Se esperaba un identificador
Identificador desconocido
Identificador duplicado
Error de sintaxis
Error en constante real
Error en constante entera
La cadena excede la línea
Falta fin de archivo
Línea demasiado larga
Tipo de identificador esperado
Demasiados archivos abiertos
Invalido nombre de archivo
Archivo no encontrado
Disco lleno
Directiva de compilador invalida
Demasiados archivos
No definido tipo en puntero def
Se esperaba un identificador
Error en tipo
Estructura demasiado larga
Conjunto del tipo de base fuera de rango
Componente archivo puede no ser archivos o objetos
Cadena de ruta invalida
Tipo no corresponde
Invalido subrango en tipo base
Limite menor más grande que él limite superior
Tipo de ordinal se esperaba
Se esperaba un entero
Se esperaba una constante
Se esperaba un entero o un real
Se esperaba un identificador de tipo puntero
Invalida función por el resultado del tipo
Se esperaba un identificador de etiqueta
Se esperaba un begin
Se esperaba un end
Se esperaba una expresión entera
Se esperaba una expresión ordinal
Se esperaba una expresión Boolean
Tipos de operandos no coinciden
Error en expresión
Ilegal asignación
Se esperaba un campo identificador
Archivo objeto demasiado largo
Indefinido externo
Invalida registro de archivo objeto
Codigo de segmento muy largo
Segmento de dato muy largo
Se esperaba un do
Invalida definicion public
Invalida definicion extrn
Demasiados extrn definiciones
Se esperaba of
Se esperaba interface
Invalida referencia
Se esperaba un then
Se esperaba un to o downto
Indefinido forward
Invalido el typecast
División por cero
Invalido tipo de archivo
No puedo leer o escribir variables de este tipo
Se esperaba una variable de tipo puntero
Se esperaba una variable de tipo string
Se esperava una expresión de tipo cadena
Referencia circular a la unidad
Nombre de la unidad no corresponde
Version de la unidad no corresponde
Sobrefujo de la pila interna
Error formato de la unidad de archivo
Se esperaba implementation
Constantes y tipo de casos no coinciden
Registro o variable objeto se esperaba
Constante fuera de rango
Se esperaba una variable de tipo archivo
Se esperaba una expresión de tipo puntero
Se esperaba una expresión real o entera
Etiqueta no esta en bloque actual
Etiqueta definida lista
Indefinida etiqueta en precedida parte de declaracion
Argumento @ invalida
Se esperaba unit
Se esperaba ";"
Se esperaba ";"
Se esperaba ","
Se esperaba "("
Se esperaba ")"
Se esperaba "="
Se esperaba ":="
Se esperaba "[" o "("
Se esperaba "]" o ")"
Se esperaba "."
Se esperaba ".."
Demasiadas variabes
Invalida variable para el for
Se esperaba una variable entera
Tipos de archivos y procedimientos no se alojan aquí
Tamaño de cadena no coincide
Invalido orden de campos
Se esperaba constante cadena
Se esperaba variable real o entera
Se esperaba variable ordinal
Error INLINE
Se esperaba expresión carácter
Demasiados items de relocación
Sobrefuljo en operación matematica
No esta cerrado el bucle For, Repeat o While
Tabla de sobreflujo de información debug
Constante de case fuera de rango
Error en estatuto
No puedo llamar una interrupción al procedimiento
Debe estar en modo 8087 para compilarlo
Objetivo de dirección no encontrado
Archivos incluidos no estan alojados aquí
No hay metodos heredados aquí
Calificador invalido
Invalida referencia a la variable
Demasiados simbolos
Parte de la declaración demasiada larga
Archivo debe de tener parametros
Muchos simbolos condicionales
Colocada mal directiva de compilación
Endif directiva buscada
Error en condicional inicial definida
Encabezado no coincide con la previa definicion
No puedo evaluar esta expresión
Expresión incorrectamente terminada
Formato invalido especificado
Invalida referencia indirecta
Estructuras variables no pueden ser alojadas aquí
No puedo evaluar sin unidad system
No puedo accesar a este simbolo
Invalida operación de punto flotante
No puedo compilar overlays a memoria
Variable puntero o procedural se esperaba
Invalido procedimiento o referencia a funcion
No puedo overlay esta unidad
Demasiadas jeraquizaciones
Acceso al archivo denegado
Tipo de objeto esperado
Tipo de objeto local no son alojados aquí
Se esperaba virtual
Se esperaba metodo identificador
Constructores virtuales no son alojados aquí
Se esperaba identificador constructor
Se esperaba identificador destructor
El fail son puede alojarse dentro de los constructores
Invalida combinación de opcode y operandos
Se esperaba referencia a memoria
No puedo añadir o substraer simbolos relocalizables
Combinación invalida de registros
286/287 instrucciones no estan disponibles
Referencia invalida a simbolo
Error en generación de codigo
Se esperaba ASM
Deplicado metodo dinamico index
Duplicado identificador refuente
Duplicado o invalido export index
Identificador procedimiento o función se esperaba
No puedo exportar este simbolo
Nombre exportado duplicado
Cabecera de archivo ejecutable muy larga
Demasidados segmentos

 

Estos son los errores en tiempo de ejecución:

Error

Mensaje

Traducción

1
2
3
4
5
6
12
15
16
17
18
100
101
102
103
104
105
106
150
151
152
154
156
157
158
159
160
161
162
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
Invalid function number
File not found
Path not found
Too many open files
File access denied
Invalid file handle
Invalid file access code
Invalid drive number
Cannot remove current directory
Cannot rename across drives
No more files
Disk read error
Disk write error
File not assigned
File not open
File not open for input
File not open for output
Invalid numeric format
Disk is write-protected
Bad drive request struct length
Drive not ready
CRC error in data
Disk seek error
Unknown media type
Sector Not Found
Printer out of paper
Device write fault
Device read fault
Hardware failure
Division by zero
Range check error
Stack overflow error
Heap overflow error
Invalid pointer operation
Floating point overflow
Floating point underflow
Invalid floating point operation
Overlay manager not installed
Overlay file read error
Object not initialized
Call to abstract method
Stream registration error
Collection index out of range
Collection overflow error
Arithmetic overflow error
General Protection fault
Invalido numero de función
Archivo no encontrado
Ruta no encontrada
Demasiados archivos abiertos
Accso al archivo denegado
Manejo de archivo invalido
Codigo de acceso mal al archivo
Numero invalido de drive
No puedo remover el directorio actual
No puedo renombrar atravez de este mecanismo
No mas archivos
Error de lectura en disco
Error de escritura en disco
Archivo no asignado
Archivo no abierto
Archivo no abierto para introducir
Archivo no abierto para salida
Invalido formato numerico
Disco esta protegido
Mala longitud de la estructura de la petición
Drive no listo
Crc error en datos
Error en busqueda de disco
Desconocido tipo de media
Sector no encontrado
Impresora sin papel
Dispositivo escribe incidente
Dispositivo lee incidente
Hardware fallando
División por cero
Error en chequeo de rango
Error en sobreflujo de pila
Error de sobreflujo en monton
Inalida operación de puntero
Sobreflujo en punto flotante
Sobreflujo en capacidad inferior de punto flotante
Invalida operación de punto flotante
Manejador de overlay no instalado
Error en lectura de archivo overlay
Objeto no inicializado
Llamada a metod abstracto
Error en registracion de Stream
Colección de indices fuera de rango
Error de colección de sobreflujo
Error en sobreflujo aritemtico
Proteccion general en dispositivo

 

En este momento estare trabajando en la proxima entrega, con más fundamentos de programación, desearia no llevarme mucho tiempo y tener para el jueves o viernes mas información, para ser colgada en esta pagina, desearia mucho tener una respuesta acerca de este curso y si hay interes para el aprendizaje de este tan bonito y preciado lenguaje.

Aquí les dejo un pseudocodigo, para que lo analizen y si lo pueden pasar a lenguaje Pascal, esta es una alternativa de muchas que hay...

Antes que nada declara las variables que se van a utilizar poco a poco van saliendo, ve colocando el nombre de la variable y con su tipo, es decir: TECLA ES UN CARÁCTER, etc...

A) Bueno lo primero que tienes que hacer es lo siguiente tener la lista de palabras cargadas en un archivo.

REPETIR
      LEER CADENA
      AÑADIR LA CADENA AL ARCHIVO
      LEER TECLA
HASTA TECLA= ‘N’

B) Despues leerlas y cargarlas si se te hace mas fácil en un arreglo de un tamaño adecuado para que entren las palabras que están en el archivo.

I ASIGNALE 0
MIENTRAS QUE NO SEA FIN DE ARCHIVO
      INCREMENTA I +1
      LEER CADENA DEL ARCHIVO
      AÑADIR LA CADENA AL ARREGLO[I]
END MIENTRAS

C) Ya que están cargadas en el arreglo determinar el orden en como quieres que se visualizen las palabras a descifrar, ya sea en ORDEN SECUENCIAL o en ORDEN ALEATORIO. Aquí ya viene lo bueno, la palabra se debe de colocar de la siguiente manera, para adivinarla.

Esta es la palabra clave
I N S T I T U T O

Y así se debe de desplegar en pantalla
__ __ __ __ __ __ __ __ __

Tienes que determinar cuantos intentos se van a aceptar, te propongo que sean de 3 a 5 intentos.

REPETIR
      INTENTOS ASÍGNALE 5
      NUM_INTENTOS ASIGNALE 0
      TOTAL ASIGNALE 0
      CADENA ASIGNALE VECTOR[ALEATORIO(I)]
      CADENA2 ASIGNALE CADENA
      GANO ASIGNALE VERDADERO
      LIMPIA PANTALLA
      GOTOXY(2,1)
      { POSICIONA EL CURSOR EN COLUMNA 2 Y FILA 1}
      FOR J ASIGNALE 1 HASTA EL TAMAÑO DE CADENA HACER
             ESCRIBE (‘_ ’)
      ENDFOR
      REPEAT
            ENCONTRADO ASIGNALE FALSE
            ESCRIBE (‘Dame una letra’)
            LEER (TECLA)
            FOR J ASIGNALE 1 HASTA EL TAMAÑO DE CADENA HACER
                  SÍ (CADENA[J]=TECLA) Y (CADENA2[J] <> ‘@’) ENTONCES
                        ENCONTRADO ASIGNALE TRUE
                        TOTAL ASIGNALE TOTAL + 1
                        GOTOXY(J+1)
                        ESCRIBE (TECLA)
                        CADENA2[J] ASIGNALE ‘@‘
                        SI TOTAL= TAMAÑO DE CADENA ENTONCES
                              GANO=VERDADERO
                        END SI
                  END SI
                  SI ENCONTRADO = FALSE ENTONCES
                        NUM_INTENTOS ASIGNALE NUM_INTENTOS ENDSI
            ENDFOR
      HASTA NUM_INTENTOS=5 Ó GANO=VERDADERO
      SI NUM_INTENTOS= 5 THEN
            ESCRIBE(‘PERDISTES...’)
            ESCRIBE (‘LA CADENA ERA ‘,CADENA)
      ENDSI
      ESCRIBE(‘DESEA DE NUEVO JUGAR [S/N]:’)
      LEER TECLA
HASTA TECLA=’N’

 

Este paso es ya pasarlo a código de Turbo Pascal o Quick Basic, si en algo no le entiendes mándame un Email.

Las cadenas si te das cuenta las manejo como si fueran arreglos y la verdad son arreglos pero de caracteres... (se aceptan cualquier comentario o mejoras relacionado al curso...)

 

Autor : Manuel Vergel