Curso de TURBO PASCAL

Entrega Nº 1

17 de Noviembre de 1998
Autor : Manuel Vergel
 

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