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.
- se debe de no mezclar al escribir con minúsculas y mayúsculas, (pero no es una regla)
- 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
|