Documente Academic
Documente Profesional
Documente Cultură
Pascal
1. Introducción
Pascal es un lenguaje de alto nivel y de propósito general (es aplicable a un gran número de
aplicaciones diversas) desarrollado por el profesor suizo Niklaus Wirth como un lenguaje para
enseñar la programación con un método disciplinado y sistemático. Wirth trató de eliminar las
inconsistencias de otros lenguajes de programación de su época y además que sirviera para
enseñar las técnicas de programación a sus alumnos.
Una versión preliminar del lenguaje apareció en 1968 y a finales de 1970 apareció el primero
compilador totalmente completo.
Características principales
Turbo Pascal
Las versiones han evolucionado de la 1.0 hasta la 7.0 que cuenta con una
biblioteca de objetos denominada Turbo Visión.
2. Programación descendente (“Top - Down”)
La programación descendente o "Top - Down" es el proceso mediante el cual un problema se
descompone en una serie de niveles o pasos sucesivos de refinamiento (stepwise). La
metodología descendente consiste en efectuar una relación entre las sucesivas etapas de
estructuración de modo que exista una relación entre ellas mediante entradas y salidas de
información. El problema se descompone en varias estructuras jerárquicas, de forma que se
pueda considerar cada estructura desde dos puntos de vista: ¿qué hace? y ¿cómo lo hace?
3. Programación modular
La programación modular es uno de los métodos de diseño más flexibles y potentes para
mejorar la productividad de un programa. En programación modular el programa se divide en
módulos (partes independientes), cada una de las cuales ejecuta una única función o actividad
y se codifican independientemente de otros módulos. Cada uno de estos módulos se analiza,
codifica y pone a punto por separado.
Cada programa contiene un módulo denominado programa principal que controla todo lo que
sucede; se transfiere el control a los submódulos o subprogramas. Estos ejecutan su función y
una vez completada su tarea, devuelven el control al módulo principal.
Un submódulo puede realizar tareas de distinta naturaleza como: entrada, salida, manipulación
de datos, control de otros módulos o una combinación de éstos. Un módulo puede transferir
temporalmente (bifurcar) el control a otro módulo; sin embargo, cada módulo debe
eventualmente devolver el control al módulo del cual recibió originalmente el control.
4. Conceptos básicos de Pascal: datos y tipos de datos
Concepto de dato
Los diferentes objetos de información con los que trabaja un programa en Pascal se conocen
como datos. Todos los datos tienen un tipo asociado con ellos. Pueden ser de tipo carácter,
entero, un número real, etc.
Turbo Pascal dispone de cinco tipos predefinidos (no necesitan una nueva definición de parte
del programador pues cada tipo tiene un límite) que permiten representar valores enteros.
Si se asigna un valor fuera del límite de cada tipo, producirá un mensaje de error:
Debe comenzar con una letra (A a Z, mayúsculas o minúsculas). No puede contener blancos.
Los caracteres permitidos después del primer carácter son letras, dígitos y el carácter de
subrayado ( _ ).
No se puede utilizar una palabra reservada como identificador. Las palabras reservadas son
aquellos términos que tienen un significado especial para Pascal y no se pueden utilizar para
otros propósitos.
Algunas palabras reservadas son: absolute, and, array, begin, const, div, do, downto, else, if,
in,label,mod,not,of, packed, procedure, record, set, shr, then,to, unit, uses, var, while, xor.
Expresiones
2º +, -
Regla asociativa izquierda. Los operadores en una misma expresión o subexpresión con igual
nivel de prioridad ( *, / ) se evalúan de izquierda a derecha.
Ejemplos:
4 + 10
14
46 div 5
Práctica
8 * 5 * (7+2 - (4 + 4)) R/ 40
(1 + 6) * 5 div 7 mod 4 + 1 R/ 2
3 + 4 - 14 /2 R/ 0
2 * (2 + 6 * 4) R/ 52
a - (b + c div d) + e * f
6. Concepto de sentencia
Las sentencias son pasos que describen las acciones algorítmicas que pueden ser ejecutadas.
Se clasifican según su operatividad en ejecutables y no ejecutables. Las ejecutables son
aquellas que especifican operaciones de cálculos aritméticos y entradas/salidas de datos y no
ejecutables son las que no realizan ninguna acción concreta, sino que ayudan a la legibilidad
el programa sin afectar su ejecución. Las sentencias ejecutables son aquellas que aparecen en
el cuerpo del programa luego de la palabra begin.
Program Nombre;
Uses
Crt,Printer;
Var
Cedula: String[16];
Apellido1: String[15];
Apellido2: String[15];
Nombre: String[20];
Clrscr;
Readln (Cedula);
Readln (Apellido1);
Readln (Apellido2);
Readln (Nombre);
Readln (Edad);
Write (`El empleado se llama `,Apellido1,´ `,Apellido2,´ `,Nombre,´ `,´y tiene `,Edad,
` `,´años´);
End.
Es una sentencia que no contiene ninguna otra sentencia. Se clasifican en: asignación y
procedure.
Formato
Variable ? expresión
En Pascal el operador `?´ se sustituye por el símbolo :=, que se denomina carácter de
asignación.
Ejemplos:
A := 16 (Se le asigna 16 a la variable A)
Un procedure o procedimiento es un subprograma que realiza una tarea específica. Estos son
ejecutados cuando Pascal encuentra el nombre del procedimiento. Deben estar declarados
antes de ser referenciados dentro del programa.
Ejemplo:
Program Calcula;
Var
Valor1: Integer;
Valor2: Integer;
Procedure Elmayor;
Begin
Begin
Readln
End
Else
Begin
Readln
End
Else
Begin
Write (`Son iguales´);
Readln
End
End;
Begin
Readln (Valor1);
Readln (Valor2);
Elmayor
End.
Ejemplo:
Begin
Readln (Numero);
Numero:= Numero+1;
End.
Una entrada de datos o valores es equivalente al término lectura. La entrada o lectura de datos
se refiere a la recepción de valores provenientes de un dispositivo periférico de entrada como
un teclado, una unidad de disco, un escáner, etc. y su direccionamiento hacia zonas de
memoria de la computadora.
Los procedimientos de lectura son: Read y ReadLn. Estos esperan a que se pulse la tecla
ENTER antes de asignar un valor a la variable.
2.4.1.1 Ejemplo
Program Suma;
Uses
Crt;
Clrscr;
Readln (i);
Readln (j);
End.
Los programas para ser útiles deben proporcionar información de salida (resultados). Esta
salida toma información de la memoria y la sitúa o almacena en: la pantalla, en un dispositivo
de almacenamiento (disco duro o flexible), o en un puerto de E/S (puertos serie para
comunicaciones o impresoras). El procedimiento que se utiliza para visualizar o escribir la
información es el Write o el WriteLn. Tanto el Write como el WriteLn cumplen la misma
función, o sea desplegar información. La diferencia es que el WriteLn despliega la información
y salta a la línea siguiente.
2.4.2.1 Ejemplo
Program Resultado;
Uses
Crt;
Clrscr;
9. Práctica
1. Hacer un programa que lea su cédula, su nombre y su teléfono y los imprima en pantalla.
2. Hacer un programa que lea tres números, que calcule el mayor y el menor de esos
números y los imprima.
3. Hacer un programa que lea un código de producto, su descripción, su precio unitario, las
unidades compradas y el precio total a pagar e imprima el resultado.
4. Hacer un programa que lea dos números y que imprima el resultado de su suma, su
resta, su multiplicación y su división.
5. Hacer un programa que lea la cédula de un trabajador, su nombre y su salario. Debe
calcular el 8% correspondiente al rebajo de la CCSS y el 1% del Banco Popular, el total de
deducciones y el salario neto.
Al final debe imprimir lo siguiente: "Estimado empleado: (nombre). En este mes su salario se
desglosa así:
6. Escriba un programa que lea tres números para tres variables a, b y c. Con base en los
valores almacenados, calcule la expresión ((a+7*c)/(b+2-a)+2*b).
Por ejemplo, supongamos que se desea diseñar un programa para calcular el salario semanal
de un empleado que trabaja por horas; la empresa paga un 1.5% adicional por todas las horas
trabajadas superiores a 40. El algoritmo de cálculo de pago sería el siguiente:
Leer HorasTrabajadas
Si HorasTrabajadas>40 entonces
Adicional ?(HorasTrabajadas-40)*SalarioHora*1.5%
Si no
Fin_Si
Se utilizan para expresar condiciones y describen una relación entre dos valores.
Es importante recordar aquí el orden de evaluación de expresiones aritméticas:
Las expresiones lógicas pueden combinarse para formar expresiones más complejas. Esto se
logra utilizando los operadores lógicos: and, or y not.
La operación and (y) combina dos condiciones simples y produce un resultado verdadero sí y
sólo sí los dos operandos de la expresión son verdaderos.
La operación not (no) actúa sobre una sola condición simple u operando y simplemente niega
o invierte su valor.
Esto se puede demostrar más fácilmente mediante las tabla de verdad para cada operador.
3.1.3.2 Operador or
Puesto que las expresiones lógicas toman el valor verdadero o falso, se necesita una sentencia
de control que indique a la computadora que ejecute una sentencia en caso de que la
expresión sea verdadera y otra sentencia en el caso de que sea falsa. Esto se logra mediante
la sentencia IF. El siguiente ejemplo describe su utilidad.
Ejemplo:
Program Numeros;
Var
Numero : Real;
Begin
Read (Numero);
Begin
Readln
Readln
End;
End.
La sentencia que sigue a la palabra reservada then o else puede ser cualquiera, incluso otra
sentencia if - then - else. Cuando existe una sentencia if - then - else dentro de otra sentencia if
- then - else, se dice que dichas sentencias están anidadas.
Ejemplo:
Program Mayor;
Uses
Wincrt;
Var
A,B,C : Integer;
Elmayor : Integer;
Begin
If A > B Then
If A > C Then
Elmayor := A
Else
Elmayor := C
Else
If B > C Then
Elmayor := B
Else
Elmayor := C;
End.
La sentencia CASE se utiliza para elegir entre diferentes alternativas. Una sentencia CASE se
compone de varias sentencias simples. Cuando un CASE se ejecuta, una y sólo una de las
sentencias simples se selecciona y se ejecuta.
Ejemplo:
Program Cursor;
(* Este programa mueve el cursor a través de la pantalla mediante las teclas predefinidas,
cuando se presiona otra tecla, emite un pitido de advertencia*)
Uses
Wincrt;
Var
X,Y : Integer;
C : Char;
Begin
Clrscr;
X := 40;
Y := 10;
GotoXY (X,Y);
Write (`*´);
Repeat
C := Readkey;
GotoXY (X,Y);
Write (` `);
Case C of
`S´ : Y := Y - 1;
`B´ : Y := Y + 1;
`D´ : X := X + 1;
`I´ : X := X - 1;
`P´ : Exit
Else
Write (Chr(7)
End;
GotoXY (X,Y);
Write (`*´)
Until C = `P´
End.
Ejemplo:
Var
Primo : bolean;
Número : Integer;
Begin
Primo: = True;
Divisor := 2;
ReadLn (Numero);
Begin
Primo := False;
Divisor := Divisor + 1
End;
Else
End.
13. Ciclos
Es una estructura de control que permite la repetición de una serie determinada de sentencias.
Se le llama también bucle o lazo.
El cuerpo del ciclo o bucle contiene las sentencias que se repiten. Pascal proporciona tres
estructuras o sentencias de control para especificar la repetición: while, repeat, for.
Sintaxis:
Sentencia;
Ejemplos:
1.
For c := 1 to 5 do
Begin
Write (`aa´);
Write (`BB´)
End;
Al ejecutarse, visualiza:
AaBBaaBBaaBBaaBBaaBB
WriteLn (Caracter);
El contador del ciclo se puede decrementar de uno en uno en lugar de incrementar. La sintaxis
es la siguiente:
Sentencia;
Ejemplos:
For C := 5 downto 1 do
Begin
Write (`C´);
Writeln
End;
For m := 1 to 10 do
begin
For n := 10 downto 2 do
WriteLn (m,n)
end;
Repetir
Sentencias
Hasta_que condición
Sintaxis:
Repeat
Begin
Sentencia 1;
Sentencia 2;
...
...
...
Sentencia n;
End;
Ejemplo:
(* El siguiente programa imprime las secuencias de caracteres hasta que se presione cualquier
tecla *)
Uses wincrt;
Var m : char;
n : integer;
Begin
Repeat
Begin
End;
Until keypressed
End.
14. Práctica
1. Los patos de un granjero se venden a precios especiales si son grandes pero no demasiado.
Diseñe un programa que lea el número de patos que posee el granjero y el peso de cada ave.
Al final debe especificar cuántos patos pesan entre 1.5 kilos y 2 kilos inclusive.
2. Diseñe un programa para calcular e imprimir los primeros 2000 números enteros positivos.
3. Leer las notas de 50 exámenes e imprimir cuántos de ellos tienen nota mayor o igual a 70.
4. Hacer un programa que lea los montos de las N ventas hechas por una tienda en un día y
que imprima el monto total de ventas y el monto promedio.
5. Hacer un programa que lea 10 valores numéricos (positivos y negativos). Debe imprimir el
número de valores negativos, el número de valores iguales a cero y el promedio de valores
positivos.
6. Encuentre la suma de los primeros 50 números enteros pares.
7. El interés simple se calcula mediante la fórmula A=P(1+i*n), donde A=Monto de Interés,
P=Capital, N=Número de años e i=tasa de interés.
8. Hacer un programa que lea: P, i, y N e imprima el monto de interés a través del número de
años leído.
9. Diseñe un programa para calcular la nómina semanal de una compañía con N empleados.
Por cada empleado, se debe leer: Nº de empleado, salario por hora y número de horas
trabajadas. Por cada empleado se debe imprimir: Nº de empleado, salario bruto, impuesto
federal, impuesto estatal, cuota del seguro social y salario neto. Los impuestos federales son el
15% del salario bruto, los estatales el 6% y el seguro social el 7%. El salario se calcula de la
siguiente manera: Por las primeras 40 horas o menos se paga el salario normal por hora. Por
las horas extra (más de 40) se paga 1.5% adicional por hora.
10. Diseñe un programa para calcular cuántas veces se puede dividir un número X entre un
número Y de tal manera que el resultado de la división sea un número entero.
4.1.1 Concepto
Un procedimiento es un programa que realiza una tarea específica. Puede recibir cero o más
valores del programa que llama y devolver cero o más valores al programa que realizó la
llamada. Un procedimiento está compuesto de un grupo de sentencias a las que se asigna un
nombre (identificador) y constituye una unidad de programa. La tarea asignada al
procedimiento se ejecuta siempre que Pascal encuentra el nombre del procedimiento.
Los procedimientos es obligatorio declararlos y deben ser declarados antes de que puedan ser
referenciados en el cuerpo del programa. En Pascal reciben el nombre de PROCEDURE.
Al igual que los identificadores, los procedimientos deben declararse dentro del cuerpo del
programa. La declaración de un procedimiento NO indica a la computadora que ejecute las
instrucciones dadas, sino que indica a la computadora cuáles son estas instrucciones y dónde
están localizadas cuando sea necesario.
Procedure nombreproc;
Declaraciones locales
Begin
End;
A las variables que se encuentran dentro de un procedimiento se les llaman Variables Locales
y a las que se ubican en el cuerpo principal, fuera de los procedimientos, se les llama
Variables Globales.
Una sección de declaración que puede contener constantes, variables e incluso otros
procedimientos.
Ejemplo:
Program Recuadro;
Var I : Integer;
Procedure Estrellas;
Begin
For I := 1 to 15 do
Write (`*´)
End;
Begin
Write (`Mensajes´);
End.
Los procedimientos se pueden ejecutar más de una vez en un programa y/o en diferentes
programas, ahorrando tiempo de programación.
4.2.1 Concepto
Un parámetro es un método para pasar información (valores a variables) del programa principal
a un procedimiento y viceversa.
Un parámetro es, prácticamente, una variable cuyo valor debe ser ya sea proporcionado por el
programa principal al procedimiento o ser devuelto desde el procedimiento hasta el programa
principal. Por consiguiente, existen dos tipos de parámetros:
- Parámetros de entrada: Sus valores deben ser proporcionados por el programa principal.
Ejemplo 1:
(Parámetros de entrada)
Var
J : Integer;
Begin
For J := 1 to N do
Write(`*´)
End;
Ejemplo 2:
(Parámetros de entrada/salida)
Begin
Area := Longitud * Anchura;
End;
Los parámetros actuales pa1, pa2, pa3, ... deben tener unos valores que se pasan al
procedimiento nombreproc.
Program Correspondencia;
Uses Wincrt;
Var
X,Y,A,P : real;
Begin (* Geometría *)
End;
Begin
Readln (X);
Readln (Y);
End.
Program EjemploParametros;
Uses Wincrt;
Var
A,B,C : Integer;
Begin
WriteLn ('A = ', D:1, ' ':5,'B = ', E:1,' ':5,'C = ', F:1)
End;
Begin
F := D * E;
End;
Begin
A := 2;
B := 3;
C := 4;
Pasar(A, B, C);
End.
4.2.1 Ejemplo
En este ejemplo los parámetros formales a y b recibe, cuando son llamados, los valores
contenidos en los parámetros actuales de x e y.
Program Calculo;
Uses wincrt;
Var
x,y : real;
Var
max : real;
Begin
if a > b then
max := a
else
max := b;
End;
Begin
repeat
readln (x,y);
mayor (x,y)
until x = 0
End.
4.2.2 Ejemplo
Program Intercambio;
Uses wincrt;
Var
x,y : real;
resp : char;
Var
aux : real;
Begin
aux := a;
a := b;
b := aux;
End;
Begin
repeat
clrscr;
readln (x);
readln (y);
cambio(x,y);
writeln;
readln (resp);
End.
El pseudocódigo es el siguiente:
Nombre_función (argumento1,argumento2,...);
Los argumentos es lo que se conoce en Pascal como parámetros. Para poder calcular el valor
o resultado de la función, todo lo que se necesita conocer es el valor o valores de los
parámetros respectivos.
4.3.1 Funciones aritméticas o matemáticas
Además de las funciones predefinidas citadas anteriormente, es posible que el usuario pueda
declarar sus propias funciones de igual modo que declara sus procedimientos.
begin
<cuerpo de la función>
end;
Al igual que en los procedimientos, el nombre de una función es un identificador. Sin embargo,
el nombre de la función se refiere a la posición de memoria que contiene el valor devuelto por
la función.
La lista de los parámetros formales son los identificadores utilizados para recibir valores del
programa.
El tipo de datos del resultado coincide con el tipo expresado en la cabecera de la función.
En el cuerpo de la función tiene que existir una sentencia de asignación como la siguiente:
Nombre_función := valor_función
La función sólo devuelve un valor, el procedimiento puede devolver cero, uno o varios valores.
El tipo de dato del resultado de la función debe estar indicado en la cabecera y puede ser tipo
char, integer, real o bolean.
Ejemplo:
Program Cubo;
Uses
Wincrt;
Var
Num,valor : integer;
Begin
valor := Num*Num*Num;
End;
Begin
Readln (Num);
El_cubo(Num);
End.
Debe utilizar un procedimiento de cálculo tomando como parámetro el salario bruto (utilice una
variable diferente al del programa principal). Finalmente, debe calcular la deducción de la Caja
y del Banco Popular y el salario neto.
Hacer un programa de funciones aritméticas que lea un número real y mediante un menú y
utilizando procedimientos para cada función calcule:
Diseñe un programa que mediante una función calcule la suma de los números que están en
un rango establecido. (Por ejemplo de 1 a 100). Pruebe con varios rangos.
Escribir un programa que, mediante una función devuelva el valor del día de la semana en
respuesta a la entrada de la letra inicial de dicho día.
21. Respuestas
Respuesta No 1.
Program Salario;
Uses wincrt;
Var
id_empleado,i,n : integer;
sal_bruto,salario_neto,tod_ded: real;
resp : char;
Var
cc_ss,b_p : real;
Begin
End;
Begin
i:=1;
While i <= n do
begin
clrscr;
readln (id_empleado);
readln (nom_empleado);
readln (sal_bruto);
writeln;
calcula(sal_bruto);
writeln;
writeln;
readln;
i := i+1;
end;
End.
Respuesta No. 3.
Program sumas;
Uses wincrt;
Var i,n:integer;
Begin
Suma := 0;
For i:= 1 to N do
suma := suma + i;
Sumar := Suma;
Write ('La suma de los números del 1',' al ',n, ' es: ',suma);
Readln;
End;
Begin
Readln (N);
Sumar (N);
End.
Respuesta No. 6.
Program TestPrimos;
Uses Wincrt;
Var
N : integer;
Var
D : integer;
P : boolean;
Begin
If Q < 4 then
Primo := True
Else
Begin
P:= True;
D := 2;
While P and (D<=Q div 2) do
Begin
P := Q mod D <> 0;
D := D + 1
End;
Primo := P
End
End;
Begin
Readln (N);
While N > 0 do
Begin
Else
Readln (N);
End;
Writeln
End.
22. Arreglos
Introducción
Primero que todo, es importante conocer el concepto de estructura de datos. Una estructura de
datos es "una colección de datos organizados de un modo particular." Las estructuras de datos
pueden ser de dos tipos: estáticas y dinámicas.
Las estructuras de datos estáticas son aquellas a las que se le asigna una cantidad fija de
memoria cuando se declara la variable. Las estructuras de datos dinámicas son aquellas cuya
ocupación de memoria puede aumentar o disminuir durante el tiempo de ejecución. Entre las
estructuras de datos estáticas podemos encontrar los vectores y los arreglos, tema que
estudiaremos a continuación.
5.0 Concepto
Un array (se suele traducir como arreglo) es una estructura de datos en la que se almacena
una colección de datos del mismo tipo, por ejemplo, los salarios de los empleados de una
empresa.
Un array es una lista de un número determinado de elementos del mismo tipo. Se caracteriza
por: - Almacenar los elementos del array en posiciones de memoria continua.
- Tener un único nombre de variable (por ejemplo salarios) que represente a todos los
elementos. Éstos a su vez se diferencian por un índice o subíndice.
Siempre se deben declarar luego de las constantes (si existen). Un array o vector se declara
por medio del tipo de array. La sintaxis es la siguiente:
Type
Tipo: Se refiere al tipo de los elementos del vector. Todos los elementos deben ser del mismo
tipo.
Ejemplos:
Type
Type
Type
ConjuntoDias = array
Type
(En este caso es de tipo real porque el salario es de ese tipo. El subíndice indica que los
salarios van de los empleados cuya inicial es A hasta la Z).
Las declaraciones de tipo array no crea ninguna variable específica de tipo array, sino que
proporciona información del array como un todo.
Type
Var
Precios : Valores;
Primeramente se crea el tipo del array y luego se declara la o las variables referenciadas al
array.
Const
Max = 500;
Type
Var
En este ejemplo se crean dos variables arrays: Palabras y Letras. Las posiciones del array van
de 1 a 500 y contendrán un valor tipo caracter.
5.1.2.1 Lectura
Para leer un vector se debe hacer elemento a elemento y se requiere de alguna estructura
repetitiva, ya sea un while, repeat o for.
Ejemplos:
I := 1; I := 1; For I:= 1 to n do
End;
5.1.2.1 Escritura
Para visualizar un vector, igualmente, es necesario situarlo dentro de una estructura repetitiva.
For I := 1 to Numero do
Writeln; (* Evita que todas las salidas del vector aparezca en la misma línea *)
Al igual que en los arrays unidimensionales o vectores, se crean con declaraciones type y var
y deben ser de tipo ordinales o subrango. Se deben indicar:
- Rango permitido
Ejemplo:
Type
Var
Grados : Tabla;
Para escribir un vector, se debe hacer referencia tanto a la fila como a la columna. Así:
For fila := 1 to 3 do
Begin
For Columna := 1 to 4 do
End;
Ejemplo:
Calcular el promedio de cada estudiante de una lista de veinticinco alumnos de una clase de
informática con notas en cuatro asignaturas.
Program Promedio;
Var
I,J : Integer;
Suma,Prom: Real;
Begin
For I := 1 to 25 do
Begin
For J := 1 to 4 do
Begin
Read (Notas[I,J]);
End;
Readln;
Prom := Suma/4;
End
End.
25. Práctica
Escriba un programa que almacene en un vector los días de la semana.
Escriba un programa que almacene en un vector los números pares del 1 al 10.
Escriba un programa que lea las dimensiones de una matriz, las lea, visualice la matriz y que
encuentre el menor y mayor elemento de esa matriz y sus posiciones.
Escriba un programa que encripte un password de siete letras debe contener consonantes y
vocales. El algoritmo de encriptación será sustituir cada vocal por el número que le
corresponde. (A=1, E=2,O=3,I=4,U=5).
Escribir un programa que en una matriz almacene los números primos del 1 al 100.
1 194 48 206
2 180 20 320
3 221 90 821
4 432 50 946
Escriba un programa que almacene en una matriz los números pares del 1 al 40 y los imprima.
26. Cadenas (“Strings”)
6.1 Definición
Pascal, como cualquier otro lenguaje, debe tener la capacidad de procesar frases como
"Presione ENTER para continuar", "Calculando...", "Proceso terminado", etc.
Una cadena de caracteres o string es una serie de caracteres cuya longitud (número de
caracteres que contiene) puede variar de 1 hasta 255 caracteres. Turbo Pascal tiene el tipo de
dato string que almacena información de texto. Este dato se puede almacenar en constantes y
en variables de cadena. Una variable de cadena está declarada para la palabra string seguida
de la longitud máxima de la cadena encerrada entre corchetes.
Las variables de cadena se pueden declarar las de cualquier otro tipo, ya sea en la sección var
o en type.
Var
Type
Var
Mensaje : Cadena80;
Nombre : Cadena40;
Es importante recordar que si se declara como Type inmediatamente después, dentro de las
variables, se debe declarar una variable que haga referencia al Type.
Una vez declaradas las variables de cadena se pueden realizar asignaciones o bien
operaciones de lectura / escritura en los programas.
Por ejemplo:
Program Ejemplo;
Var
Mensaje = string[40];
Begin
Writeln;
Readln
End.
Una cadena físicamente es una estructura de una secuencia de 0 hasta 255 caracteres de
longitud. Sin embargo, la ocupación en memoria de una cadena es un número de bytes igual al
de caracteres de la cadena más uno. Así la cadena:
`Programador´
tiene una longitud de 11 caracteres, entonces ocupará en memoria 12 bytes. Esto se debe a
que el primer byte en una cadena, contiene la longitud de la cadena actualmente almacenada
en memoria.
Supongamos que esta palabra corresponde a un dato almacenado en la variable PUESTO que
fue definida de la siguiente manera:
Var
Puesto : String[20];
Sucede que, entonces, la longitud lógica de la variable será de 11 bytes pero la longitud física
será de 20 bytes pues así fue definida.
A las variables de cadena, como se ha visto, se pueden dar valores con una sentencia de
asignación o con una sentencia de lectura (read). Ambas situaciones se pueden describir con
la ecuación:
Destino fuente
Dependiendo del tamaño (longitud de la cadena) de las cadenas fuente y destino se pueden
presentar tres casos diferentes que analizaremos a partir de la siguiente declaración de
variables de cadena.
Var
Cad2 := `informatica´;
Este caso no presenta problemas, pues cada posición de cad2 se rellena con un carácter.
Cad2 I N F O R M A T I C A
1 2 3 4 5 6 7 8 9 10 11
Cad4 := Cad2;
6.1.3.2 Caso II. La longitud de la cadena destino es mayor que la cadena fuente
Cad3 := Cad2;
Resultará que Cad3 tiene 15 caracteres y sólo hay 11 caracteres en cad2. La cadena Cad3
seguirá teniendo una longitud máxima de 15 caracteres, pero sólo se almacenan en ella ahora
11 caracteres y su longitud actual será de 11.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 longitud máxima = 15
6.1.3.3 Caso II. La longitud de la cadena destino es mayor que la cadena fuente
Cad1 := Cad2;
En este caso, como Cad1 tiene una longitud de ocho caracteres, la cadena destino no se
puede almacenar totalmente. En este caso se trunca la cadena destino y se almacenan en
Cad1 los primeros ocho caracteres (de izquierda a derecha) de Cad2.
2. Escriba un programa que almacene en un vector los números pares del 1 al 10.
3. Escribir un programa que en una matriz almacene los números primos del 1 al 100 y que
al final del programa, en una variable proporcione la suma.
7. Escriba un programa para almacenar la siguiente tabla, que cuente los votos e imprima el
candidato ganador.
1 194 48 206
2 180 20 320
3 221 90 140
4 432 50 821
8. Hacer un programa que lea una cadena de caracteres, que imprima la longitud de la
cadena y contar el número de vocales que tiene la palabra o frase.
29. Punteros
Introducción
Como vimos anteriormente en la lección número 5, las estructuras de datos dinámicas son
aquellas cuya ocupación de memoria puede aumentar o disminuir durante el tiempo de
ejecución. Mediante los punteros, tema que estudiaremos a continuación, podemos crear
estructuras de datos dinámicas que tienen capacidad de variar en tamaño y ocupar tanta
memoria como realmente requieran. Estas estructuras son llamadas punteros.
7.1 Concepto
Los punteros son también llamados apuntadores. Son tipos de datos que permiten crear
estructuras de datos dinámicas, las cuales pueden variar en tamaño y memoria requerida. Las
variables que se crean y se destruyen durante la ejecución se llaman variables dinámicas o
anónimas. Así, durante la ejecución de un programa, puede haber una posición de memoria
específica asociada con una variable dinámica y posteriormente puede no existir ninguna
posición de memoria asociada con ella.
Una estructura de datos dinámica es una colección de elementos llamados nodos de la
estructura - normalmente tipo registro- que se enlazan o encadenan juntos. Este enlace se
establece asociando con cada nodo un puntero que apunta al nodo siguiente de la estructura.
Las estructuras de datos dinámicas son útiles para almacenar y procesar conjuntos de datos
cuyos tamaños cambian durante la ejecución del programa, por ejemplo, el conjunto de
trabajos que se han introducido en una computadora y están esperando su ejecución o el
conjunto de nombres de pasajeros y asignación o el conjunto de nombres de pasajeros y
asignación respectiva de asientos de un vuelo de avión determinado.
Pascal proporciona los métodos para asignar y liberar espacio de memoria utilizando punteros
y los procedimientos new y dispose.
El tipo de datos puntero es de tipo simple pues no se puede romper en otros componentes más
pequeños, como sí sucede con el array o el registro. Los punteros son variables que se utilizan
para almacenar la dirección de memoria de otra variable. Las variables que se utilizan para
almacenar direcciones son llamadas variables puntero o simplemente puntero.
Al definir un puntero se debe indicar el tipo de valores que se almacenarán en las posiciones
designadas por los punteros. Esto se debe a que los diferentes tipos de datos requieren
distintas cantidades de memoria para almacenar sus constantes, una variable puntero puede
contener una dirección de una posición de memoria adecuada sólo para un tipo dado.
Por esta razón se dice que un puntero apunta a una variable particular, es decir, a otra posición
de memoria.
Var
Ejemplo:
Var
Ptr : ^Real
Type
PuntX = ^Real;
Var
P : PuntX;
P es una variable puntero de tipo PuntX que apunta a posiciones que contienen valores de tipo
real. La posición de memoria designada por el valor de la variable puntero P se representa por
P^. Se pueden asignar valores a P^ y utilizar valores de P^ en expresiones tal como cualquier
otra variable. Si P apunta a posiciones que contiene reales, P^ es una variable real.
Ejemplo:
7.2.1 New
Sintaxis:
New (P)
La sentencia New (P); llama al procedimiento New que asigna almacenamiento para un valor
determinado y sitúa la dirección de esta celda de memoria en la variable puntero P. Una vez
que se asigna almacenamiento para un valor de tipo determinado al que está apuntando P, se
puede almacenar un valor en esa celda de memoria y manipularlo.
Ejemplo:
New (Ptr);
Ptr^ := `Mckenna´;
La sentencia New (Ptr) crea una celda vacía de memoria a la que apunta Ptr. La segunda
sentencia sitúa el valor `Mckenna´ en esa celda de memoria.
7.2.2 Dispose
El procedimiento Dispose libera la posición de memoria ocupada por una variable dinámica.
Sintaxis:
Pascal proporciona una constante predefinida, nil (nulo. La constante nil se utiliza para dar un
valor a una variable puntero que no apunta a ninguna posición, nil puede ser asignad a un
puntero de cualquier tipo.
P:= nil;
P:=5
Ejemplo:
Var
P,Q : ^Integer;
Begin
New (P);
P^ :=8;
Q^ :=P;
Q^ :=5;
Dispose (P)
End.
7.2.3 Assigned
P debe ser una referencia de un puntero o tipo procedimiento. La función devuelve verdadero
(true) si P no es nil o falso (false) si es nil. Una posible aplicación puede ser la siguiente:
Var P : Pointer;
Begin
P : nil;
P := @P;
End.
La llamada Assigned(P) correspondiente a la evaluación de P <> nil para una variable puntero,
mientras @P <> nil se corresponde a una variable por procedimiento.
Un registro (record) es un tipo de datos estructurado (denominado dato record) que consta de
un conjunto de elementos que pueden ser del mismo tipo o de tipos diferentes.
Los componentes de un registro se denominan campos. Cada campo tiene un nombre llamado
identificador de campo, que es algún identificador elegido por el programador cuando se
declara el tipo de registro y un tipo que se especifica cuando se declara el tipo de dato record.
Type
Nombre_reg = record
Lista id1 : Tipo1;
End;
Lista id: Lista de uno o más nombres de campos que componen el registro.
Tipo: Puede ser cualquier tipo de dato estándar o definido por el usuario.
Empleado
Ejemplo:
Type
Empleado = record
Nombre : String[30];
Edad : Integer;
Domicilio : String[40];
Salario : Real;
End;
NombreReg.NombreCampo
Los datos mostrados anteriormente en Empleado mediante una secuencia de sentencias de
asignación:
Empleado.Nombre := `Chi-ki-tico´;
Empleado.Edad := 34;
Empleado.Salario := 245320;
Una vez que los datos están almacenados en un registro, se pueden manipular de igual forma
que otros datos en memoria.
Otra operación que se puede realizar entre registros es la asignación (copia del contenido de
un registro en otro del mismo tipo). Si A y D son variables registro del mismo tipo, la sentencia:
A := D
Ejemplo:
Type
Stock = record
Numeros : Integer;
Nombre : String[20];
Precio : Real;
end;
Var
Articulo : Stock
La tarea de escribir el selector de campo completo cada vez que se referencia un campo de un
registro es tediosa, sobre todo si el números es grande. La sentencia WITH permite referenciar
el nombre del registro en su cabecera y posteriormente para llamar a algún campo sólo se
necesita el nombre del campo y no el selector de campo completo, con el nombre del registro
(por ejemplo, Edad en vez de Cliente.Edad).
Sintaxis:
With Camporegistro do
Begin
End;
Ejemplo:
Program Ejemplo;
Type
Empleado = record
Edad : Integer;
End;
Var
Socio : Empleado;
Deducciones : Real;
Begin
With Socio do
Begin
Readln (Nombre);
Writeln (Empresa);
End;
End.
34. Archivos tipificados o aleatorios
Son archivos que pueden contener datos tipo integer, real o record. Para declarar un archivo se
procede de la siguiente manera:
Type
Ejemplo:
Type
Var
Nom: Nombres;
Para crear un archivo se utilizan las sentencias Assign la cual crea el archivo y Rewrite para
abrir el archivo.
La sintaxis es la siguiente:
Assign (f,nombre);
nombre: Nombre externo con el que se conoce al archivo por el sistema operativo.
La operación Assign establece una correspondencia entre la variable tipo archivo con un
archivo externo situado en disco.
Luego de haber sido asignado, el archivo debe ser abierto. Esta operación se realiza por medio
de uno de los dos procedimientos predefinidos: rewrite y reset.
8.3.1.1 Reset
Abre un nuevo archivo existente para una operación de lectura. Si se intenta llamar a Reset y el
archivo especificado no existe, se producirá un error de E/S (entrada/salida).
Sintaxis:
Reset (NombreArch);
8.3.1.2 Rewrite
Crea y abre un nuevo archivo. Si el archivo ya existe, Rewrite borra su contenido; en caso
contrario, el archivo queda abierto para una operación de escritura.
Sintaxis:
Rewrite (f);
Existen algunos aspectos importantes que se deben tomar en cuenta al utilizar la sentencia
Rewrite:
- Por el contrario, las sentencias assign y rewrite suponen la existencia del archivo
llamado en el disco. Si este archivo no existe, las sentencias anteriores producirán errores de
ejecución.
El siguiente programa define un tipo registro (cliente) y a continuación rellena (pone valores en
los campos) en la variable correspondiente. Otra variable del mismo tipo se asigna a la primera
variable y los campos de la segunda variable se imprimen uno a uno.
Program Visualiza_Registros;
Type
Datos = record
Edad : Integer;
Saldo : Real
End;
Var
Begin
Readln (Cliente.Nombre);
Readln (Cliente.Edad);
Cliente.Saldo := 245320;
End.
Una vez que se ha abierto el archivo para escritura, las sentencias write y writeln sirven para
escribir datos en el nuevo archivo.
Sintaxis:
Write (f,v1,v2,...);
Ejemplos:
archtex : text;
...
...
Readln (NombreArch);
Assign (Archtex,NombreArch);
Reset (Archtex);
Sintaxis:
Read (f,v1,v2,...);
f es una variable tipo archivo.
Ejemplo:
Var
Horas : Real;
Archivo : Text;
Begin
Assign (Archivo,´Demo´);
Reset (Archivo);
...
...
Readln (Archivo,Mensaje,Horas);
End.
Close (Nombrearchivo);
Var
NombreVariable : Text;
El procedimiento Append abre un archivo existente para añadir datos al final del mismo.
La sintaxis es:
Append (f)
8.4.3 Funciones
Algunas funciones son: Append, Read, Readln, Write y Writeln, Eoln y Eof.
8.4.3.1 Eoln
La sintaxis es:
eoln (f)
Devuelve true si en la posición actual del archivo está la marca de fin de línea o si eof (f) es
true; caso contrario devuelve false.
Práctica
1. Cree un archivo con sus datos personales: Cédula, nombre, dirección, teléfono,email.
2. Abra el archivo creado y agréguele cuatro registros más con otros datos.
9.1.1 Concepto
Las unidades tienen una estructura similar a los programas y en consecuencia requieren un
formato estricto, y es preciso declararlas por el usuario como si se tratara de un programa o
subprograma.
Turbo Pascal proporciona siete unidades estándar para el uso del programador: System,
Graph, DOS, Crt, Printer, Turbo3 y Graph3. Las cinco primeras sirven para escribir sus
programas y las dos últimas para mantener compatibilidad con programas y archivos de datos
creados con la versión 3.0 de Turbo Pascal. Las siete unidades están almacenadas en el
archivo TURBO/.TPL (librería de programas residente propia del programa Turbo Pascal). La
versión 7.0 introdujo dos nuevas unidades WinDos y Strings.
Una unidad está constituida de cuatro partes: cabecera de la unidad, sección de interface
(interfaz), sección implementation (implementación) y sección initialization (inicialización).
Formato:
Unit <identificador>
Interface
Implementation
(* declaraciones privadas *)
begin
end
La cabecera de la unidad comienza con la palabra reservada unit, seguida por el nombre de la
unidad (identificador válido). Es similar a una cabecera de programa, donde la palabra
reservada unit reemplaza a la palabra reservada program. Por ejemplo para crear una unidad
denominada MiUnidad se ha de utilizar la cabecera de la unidad, así:
Unit MiUnidad;
El nombre de la unidad es arbitrario, pero debe coincidir con el nombre del archivo que
contiene. Por ejemplo, si la unidad se denomina Test
Unit Test;
El archivo que contiene el programa fuente de la unidad se debe llamar Test.PAS. Cuando
turbo Pascal combina la unidad, le asigna la extensión TPU (Turbo Pascal Unit). Si el nombre
de la unidad es diferente del nombre del archivo, el programa principal no podrá encontrar el
archivo TPU (Turbo Pascal Unit). Si el nombre de la unidad es diferente del nombre del archivo,
el programa principal no podrá encontrar el archivo TPU.
Una unidad creada por el usuario puede utilizar otras unidades, siempre que se incluyan en la
cláusula uses que aparece inmediatamente después de la palabra interface, y separadas por
comas.
La sección de interface (interfaz) es la parte de la unidad que sirve para conectar dicha unidad
con otras unidades y programas. Esta sección se conoce como "la parte pública" de la unidad,
ya que todos los objetos que figuren en esta sección son visibles desde el exterior o
exportables. Las restantes unidades y programas tienen acceso a la información contenida en
la sección de interface.
Ejemplo de declaración
Unit Rayo;
Interface
Uses
Var
a, b, c : integer;
Unit Rayo;
Interface
P, I : Integer;
Begin
P := 1;
For I := 1 to B do
P := P * ;
Exponencial := P
End;
Begin
Cociente := X div Y
End;
End.
Nótese que la declaración de una unidad está terminada por la palabra reservada End y un
punto.
La sección de iniciación puede contener instrucciones pero también puede estar vacía. Estas
instrucciones sirven, por ejemplo, para iniciar variables. La ejecución de estas instrucciones se
efectúa en el momento del lanzamiento o ejecución de un programa que utiliza la unidad antes
de la ejecución de la primera instrucción del cuerpo del programa.
La sección de iniciación debe llamarse antes de que el cuerpo del programa se ejecute.
37. Aplicación
Una unidad tiene una estructura muy similar a la de un programa.
La cláusula uses de la parte de interface sólo es necesaria cuando la unidad actual llame a
otras unidades. Todos los procedimientos y funciones en la sección de interface deben ser
definidos en la sección de implementación.
Unit utilidad; (* este nombre de la unidad debe coincidir con el nombre del
archivo de programa *)
Interface
Uses
Wincrt, Printer;
Implementation
Uses
Printer;
Var
MiVar : Integer
Procedure Frase;
Begin
Clrscr;
Write (texto);
End.
Begin
MiVar := 0
End.
Una vez que se dispone el código fuente de una unidad, se compila de igual forma que un
programa, pero el archivo obtenido no es ejecutable directamente. Tiene la extensión TPU
(Turbo Pascal Unit).
Para utilizar esa unidad dentro de un programa, debe incluir una sentencia uses para indiciar al
compilador que está utilizando esa unidad.
ProgramPrueba;
Uses Utilidad;
Ejemplo:
Escribir una unidad que conste a su vez de un procedimiento para intercambiar los valores de
dos variables, así como calcular su valor máximo.
Unit Demo1;
Interface
Implementation
Procedure Intercambio;
Var
Aux : Integer;
Begin
Aux := I;
I := J;
J := Aux
End;
Function Máximo;
Begin
If I>J then
Maximo := I
Else
Maximo :=J
End;
End.
Una vez que lo haya escrito, guárdelo en disco con el nombre de Demo1.PAS, a continuación,
compílelo hacia el disco. El código objeto se llamará Demo1.TPU. Esta unidad la utilizaremos
en el siguiente programa:
Program Prueba;
Uses
Demo1;
Var
X,Y : Integer;
Begin
Readln (X,Y);
Intercambio (X,Y);
End.
38. Aplicaciones
9. 3. 1 Utilización de unidades estándar
El archivo TURBO.TPL que contiene todas las unidades estándar se carga en memoria central
a la vez que el propio compilador y está disponible en cualquier momento, con la ayuda de la
cláusula uses.
9. 3. 1. 1 Unidad System
Esta unidad contiene todos los procedimientos y funciones estándar de Turbo Pascal relativas
a entradas/salidas, cadena de caracteres, gestión de memoria, etc.
9. 3. 1. 2 Unidad Wincrt
La mayoría de los programas de Pascal que hacen uso de la pantalla para representar salidas
recurren a la unidad Wincrt. Algunos procedimientos que necesitan de esta unidad son:
9. 3. 1. 3 Unidad WinDos
Ejemplo:
Program Hora;
Uses
Wincrt,Windos;
Var
Begin
Clrscr;
Begin
Gotoxy (64,1);
End
End.