Академический Документы
Профессиональный Документы
Культура Документы
desgraciadamente como factor externo que es, no esta bajo control de la empresa o del
programador.
PASCAL, es un compilador que permite usar cualquiera de los tres enfoques en la solucion
de problemas de informacion que puedan y deban ser resueltos empleando el computador y el
lenguaje aunque se repite este curso esta enfocado al primer modelo.
Proceso u Operacion
Variable(s) de
Salida
AREA= BASE *
ALTURA / 2
AREA
Observar para el caso de constantes fijas o conocidas (PI) no se debe dar como dato de
entrada su valor, en cambio colocar directamente su valor dentro de la formula, en la parte de
operaciones del problema.
Pero recordar tambien que existiran problemas sencillos donde:
No se ocupan entradas o no se ocupan operaciones, pero todos ocupan salida.
Una formula grande o muy compleja puede ser mas segura y facil de resolver, si es
descompuesta y resuelta en partes, juntando al final los parciales para obtener el resultado
final.
Un problema puede tener mas de una solucion correcta.
El problema no esta suficientemente explicado o enunciado, entonces, estudiarlo,
analizarlo y construirlo de manera generica.
TEMA 3: PASCAL PROGRAMACION VARIABLES
Identificadores son conjuntos de letras y/o numeros que se utilizan para simbolizar todos
los elementos que en un programa, son definibles por el usuario (programador o ingeniero de
software) del mismo, como son las variables donde se almacenan datos, funciones( pequenos
modulos con codigo), etiquetas, clases, objetos, etc.
En PASCAL un identificador es una palabra compuesta de letras y/o numeros de hasta 32
caracteres significativos, empezando siempre con una letra.
Una variable se define como un identificador que se utiliza para almacenar todos los datos
generados durante la ejecucion de un programa.
Ejemplos de buenas variables: Nombre, Edad, SdoDiario, IngMensual, Perim, Calif1, etc.
RANGO
char
Caracter ASCII
byte
0 a 255
integer
-32,768 a 32,767
Real
1E-38 a 1E+38
Boolean
TRUE o FALSE
shortint
-128 a 127
ord
0 a 65535
longint
-2147483648 a 214748364
String
Para el caso de strings se prodra usar cualquiera de los dos siguientes formatos:
Var
Nombre:string;
Carrera:string[30];
Para el primer caso pascal reserva 255 bytes de memoria, para el caso de carrera pscal
solo reservara 30 bytes, es obvio cual de los dos casos es mas eficiente.
TEMA 5: OPERADORES ARITMETICOS PASCAL PROGRAMACION
Un operador es un simbolo especial que indica al compilador que debe efectuar una
operacion matematica o logica.
Pascal reconoce los siguientes operadores aritmeticos:
Operador
Operacion
SUMA
RESTA
MULTIPLICACION
DIVISION
Div
DIVISION ENTERA
Mod
MODULO O RESIDUO
El problema no es el tipo real, sino que por definicion de la division entre enteros pascal
trunca la parte residual.
El operador (%) devuelve el residuo entero de una division entre enteros, ejemplo;
// area de declaracion
integer alfa;
// area de operaciones
alfa := 23 mod 4;
// area de despliegue
desplegar alfa; <- El resultado en pantalla es 3
Otro ejemplo;
alfa := 108 mod 10;
desplegar alfa; El resultado en pantalla es 8
Para resolver los problemas de potencias y raices, se usan ciertas instrucciones especiales
que proporciona el lenguaje, llamadas funciones matematicas, en pascal existe todo un
conjunto de instrucciones o funciones matematicas.
Y ademas deberan recordar sus leyes de logaritmos y de potencias:
Con el uso de los logaritmos, los procesos de multiplicacion, division, elevacion a
potencias y extraccion de raices entre numeros reales pueden simplificarse de la manera
siguiente.
log
= m/n log a
Las dos funciones que se usan para resolver este problema son:
Ln(x) - Nos regresa el logaritmo natural del numero x.
EXP(x) - nos regresa e X es decir el antilogaritmo de un numero.
Otra vez si se ocupa resolver la multiplicacion de 5 * 20, la regla de logaritmos nos dice
que el resultado es = log(5) + log(20) aunque en pascal se usa Ln(5) + Ln(20) pro en estos casos
lo que se tiene de resultado no es 100 sino el logaritmo de 100, porque estamos sumando los
logaritmos, es decir al resultado de la suma de logaritmos le tenemos que sacar su
antilogaritmo, para conocer el resultado final(100) de la mulptiplicacion.
Ejemplo en pascal
Real alfa
Alfa := Exp( Ln(5) + Ln(20) );
Como se observa primero se calculan los logaritmos de 5 y de veinte con (Ln), luego los
sumamos y a este resultado le extraemos el antilogaritmo con (EXP) que seria el resultado
final.
Otro ejemplo si se tiene la potencia 53 entonces aplicando la regla de logaritmos el
programa quedaria:
Real alfa
Alfa := EXP(5 * Ln(3));
Y si se tiene que obtener la raiz de 9 en programacion pascal sera:
Alfa := EXP( 1/2 * Ln(9));
aqui los parentesis estan de mas, porque por orden de operaciones, multiplicacion y
division tienen la misma jerarquia y entonces se resuelven de i zquierda a derecha, en otras
palabras ni que falten parentesis ni que sobren parentesis.
TEMA 7: COMPILADOR Turbo Pascal y Reglas para escribir un programaPara poder construir programas o aplicaciones se usara el compilador Turbo Pascal que se
encuentra en la siguiente direccion de internet.
http://community.borland.com/museum/
El compilador tiene el nombre de:
Antique Software: Turbo Pascal V5.5
Bajarlo, descomprimirlo en un folder o subdirectorio temporal, dentro se encontraran dos
folders llamados disk1, disk2, copiar el contenido de disk2 al folder disk1, luego correr un
programa llamado install, esto creara un nuevo folder en el disco duro llamado TP, que ya
contendra nuestro compilador a usar.
Para correr el compilador y el editor de programas que trae integrado, solo abrir una
sesion de msdos prompt en la barra de start de windows y luego navegar al directorio tP con la
orden:
C:\CD TP
Luego cargar el compilador con la orden:
C:\TP\ TURBO
Debera mostrarse la siguiente pantalla con el editor:
Recordar que dentro de este compilador no funciona el raton o mouse, todas las opciones
se cargan con la tecla ALT y la letra en rojo correspondiente, tambien se podran usar las teclas
de flechas del teclado para navegar por las opciones de los menus.
TEMA 8: PROGRAMACION PASCAL
La estructura de un programa en pascal es;
PROGRAM NOMPROG;
CONST
VAR
BEGIN
INSTRUCCIONES;
END.
EJEMPLO
program prog1;
var
area,base,altura :real;
begin
(* area de captura *)
write('Dame Base :');
readln(base);
write('Dame Altura:');
readln(altura);
(* area de operaciones *)
area := base * altura / 2;
(* area de despliegue *)
writeln('El Area es =',area:0:2);
readln;
end.
RECORDAR nunca grabarlo con un nombre que contenga mas de 8 letras o caracteres,
recordar que estamos hablando de los tiempos de msdos
INSTRUCCION WRITE() y WRITELN()
Es una de las mas poderosas herramientas de despliegue de datos que posee el lenguaje.
Su formato completo es:
WRITE(lista de parametros);
* Donde lista de parametros pueden ser:
a) Mensaje o texto
b) variables
c) Combinacion de los dos
Ejemplos;
write('el area es');
write('el area es=',area);
write('base=',base,'altura='altura');
Ademas cada argumento ya sea texto o variable puede incluir el sguiente modificador;
Texto o variable:tamaocampo:tamaodecimal
Ejemplo
Write('mama':10); - se desplegara centrado en los 10 primeros espacios de los 80 espacios
que tiene una pantalla de msdos.
Si el texto es mayor que el tamano asignado, TP ignora el tamano asignado y despliega
todo el texto.
Ejemplo
Pi:real;
Begin
Pi:=3.1416;
Write(pi:10:2);
End.
Estamos pidiendo desplegar todo el numero en 10 espacios, en este caso TP centra y
redondea al entero mas cercano, es decir la slida es 3.14.
La diferencia entre WRITE y WRITELN, es que el segundo incluye un cambio de renglon al
final del despligue.
RECORDAR que en este compilador, cuando esten capturando una string y luego un dato
numerico con read(), el compilador se va a saltar la captura del dato numerico, esto es un bug
del compilador, para resolver este problema, solo agregar uno o varios readln; sin nada
despues del read de captura de string o mejor aun solo usar readln() para captura.
INSTRUCCION READ() Y READLN();
Esta instruccion permite que el dato entrado desde el teclado sea capturado y
almacenado en la variable correspondiente su formato completo es:
read(lista de variables);
ejemplo
read(base,altura,nombre,edad);
Aqui se pretende capturar cuatro variables en una sola pasada.
Lo mas sensato es usar un read(variable) por cada variable que se ocupe capturar en el
programa.
Recordar tambien que en el caso de captura de reales es preferible agregar un cero (0)
para decimales que no lo contengan, es decir no capturar .234 sino 0.234
La diferencia entre read() y readln(), es que el primero deja el cursor en e l renglon de
captura y readln() lo avanza un renglon.
And
Array
Asm
Begin
break
case
const
constructor
xor
continue
destructor
div
do
downto
else
end
file
for
function
goto
if
implementation
in
inherited
inline
interface
label
mod
nil
not
object
of
on
operator
or
packed
procedure
program
record
repeat
self
set
shr
shl
string
then
to
type
unit
until
uses
var
while
with
Significado
Igual que
>
Mayor que
<
Menor que
>=
<>
IN
No es igual que o es
diferente que
Pertenece A
NOTA IMPORTANTE, Para el caso de objetos de tipo string, los operadores mencionados
arriba funcionan, es decir es valido usar la siguiente condicion:
string carrera;
if (carrera=informatica) then etc, etc, etc,
PROG2.pas
program prog2;
uses crt;
var
edad:integer;
ciudad,nombre:string;
begin
clrscr;
(* area captura datos *)
gotoxy(20,5);write('dame nombre :');
readln(nombre);
gotoxy(20,6);write('dame ciudad :');
readln(ciudad);
gotoxy(20,7);write('dame edad :');
readln(edad);
(* area de condicion *)
if ciudad = 'tijuana' then
begin
edad:=edad*12;
gotoxy(20,10);write(nombre,' tienes ',edad,' meses');
end
else
begin
gotoxy(20,10);write('no cumple la condicion');
end;
readln; readln;
end.
SIGNIFICADO
AND
Y LOGICO
OR
O LOGICO
NOT
NO NEGACION
Ejemplo:
if (sueldo > 700) and (sexo='m') then etc, etc, etc.
Notas:
Observar que cada condicion simple lleva sus propios parentesis.
Para que el computador evalue como CIERTA una condicion compuesta que contiene el
operador logico and, las dos condiciones simples deben ser ciertas.
Para que el computador evalue como CIERTA una condicion compuesta que contiene el
operador logico or, basta con que una de las condiciones simples sea cierta.
La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta
dada por la relacion donde n = cantidad de condiciones, la primera mitad de ellos ciertos y
la segunda mitad falsos.
Ejemplo, si formamos una condiciona compuesta con dos condiciones simples y el
operador logico y, la cantidad total de casos posibles serian
siguiente tabla de verdad.
y se puede construir la
EVALUACION
La evaluacion final se obtiene usando la regla anteriormente descrita para una condicion
compuesta que contiene el operador and.
Esta tabla significa lo siguiente;
1.- Cualquiera que san la cantidad de datos procesados, siempre caera en uno de estos
cuatro posibles casos.
La tabla de verdad para una condicion compuesta con or es la siguiente;
IRA COND SIMPLE
EVALUACION
Como se observa, una condicion compuesta con O, es menos restrictiva, o el 75% de los
casos terminarian ejecutando el grupo CIERTO de instrucciones de la instruccion condicional.
Construir una tabla de verdad para una condicion compuesta de tres o mas condiciones
simples, es tambien tarea sencilla, solo recordar que;
1.- La cantidad posible de casos posibles es
mitad empiezan con falso.
2.- Para evaluar esta condicion triple, primero se evaluan las dos primeras incluyendo su
operador bajo las reglas ya descritas y luego se evalua el resultado parcial contra la ultima
condicion y el ultimo operador para obtener la evaluacion final.
Ejemplo una condicion compuesta de tres condiciones simples, donde el pri mer operador
logico es el y y el segundo operador logico es el O, daria la siguiente tabla de verdad.
Ira cond
2da cond
Eval 1a Y 2a
3ra cond
Prog3.pas
program prog3;
uses crt;
var
letra:char;
begin
clrscr;
gotoxy(20,5);write('dame una letra :');
readln(letra);
(* empieza case *)
case letra of
'a': begin gotoxy(50,5); write('aguila'); readln; end;
'b','B': begin gotoxy(50,5); write('becerro'); readln; end;
'c': begin gotoxy(50,5); write('caballo ');write('camello'); readln; end;
else begin gotoxy(50,5);write('no hay');readln; end
end;
end.
Notas:
1.- Solo se puede usar como variable de condicion una variable entera o variable char.
2.- Las constantes que estamos buscando y comparando son de tipo char, por eso se
deben encerrar entre apostrofes ( ').
3.- Si se quiere resolver el problema de mayusculas o minusculas en el teclado,
observar que solo se separan con una coma ( , )
4.- Recordar que case solo trabaja con constantes y variables de tipo char o int, en este
ultimo caso solo usar una variable de opcion de tipo entero y en los case poner la constante
numerica sin apostrofes.
En particular, instrucciones de tipo case se usan para construir programas de seleccion de
menus, donde al usuario se le plantean dos o tres problemas distintos y el propio usuario
seleccionaba cual de ellos se ejecuta
EJEMPLO
Codigo prog4.pas
program prog4;
uses crt;
var
x:integer;
begin
clrscr;
for x:= 1 to 5 do
begin
gotoxy(10,4+x);write(x,' tecnologico');
end;
readln;
end.
En pascal solo puede haber incrementos de uno en uno, lo mas que existen son
decrementos de uno en uno, usando la instruccion:
for VarControl := ValIniGde DOWNTO ValFinChico do
begin instruccion(es); end;
Se pueden usar los siguientes casos;
a) valor incial diferente de uno ejemplo for x:= 5 to 8 do etc
b) valor inicial negativo for x:= -5 to 3 do etc
c) para incrementos diferentes de uno en uno , usar dentro del begin end un acumulador
del tipo x := x + 5 pero recordar que el ultimo valor del ciclo corresponda con el valor de
parada o la maquina se les cicla y se van divertir mucho cuando esto les pase.
d) para decrementos diferentes de uno en uno usar una tecnica similar x:= x- 20 dentro de
un ciclo for DOWNTO, pero recordar la nota anterior.
TAREAS PROGRAMACION PASCAL :
1.- CONSTRUIR UN PROGRAMA QUE DESPLIEGUE LOS NUMEROS DEL 20 AL 30.
2.- DESPLEGAR LOS ENTEROS ENTRE 50 Y 30 ACOMPANADOS DE SU POTENCIA
CUADRADA Y RAIZ CUBICA RESPECTIVA(revisar el tema de operadores aritmeticos).
3.- DESPLEGAR LOS MULTIPLOS DE 5, ENTRE 10 Y 50, ACOMPANADOS DE SU FACTORIAL
(este algortimo lo tienen que buscar en el www) Y LOGARITMO RESPECTIVO(revisar el tema de
operadores aritmeticos tambien).
4.- DESPLEGAR LA TABLA DE MULTIPLICAR QUE EL USUARIO INDIQUE.
5.- EVALUAR LA FUNCION Y=5X^2 + 3X + 8 CUANDO X> -310 (RANGO DE -3 HASTA 10)
Su formato general es :
cargar o inicializar variable de condicion;
while condicion do
begin
grupo cierto de instrucciones;
instruccion(es) para salir del ciclo;
end;
Un error muy comun con el while, es poner un punto y coma(;) despues de la (condicion)
ejemplo while condicion do ; -esto es y causa un error.
Prog5.pas
program prog5;
uses crt;
var
x:integer;
begin
clrscr;
x:=1;
while x <= 5 do
begin
gotoxy(10,4+x);write(x,' pato');
x:=x+1;
end;
readln;
end.
While puede llevar dos condiciones en este caso inicializar 2 variables de condicion y
cuidar que existan 2 de rompimiento o terminacion de ciclo.
El grupo cierto de instrucciones puede ser una sola instruccion o todo un grupo de
instrucciones.
La condicion puede ser simple o compuesta.
Los casos generales de for tambien se aplican a while.
A este ciclo tambien se le conoce tambien como ciclo de condicion de entrada o prueba
por arriba porque este ciclo evalua primero la condicion y posteriormente ejecuta las
instrucciones.
TEMA 9: CICLO REPEAT UNTIL PASCAL
Su diferencia basica con el ciclo while es que la prueba de condicion es hecha al finalizar el
ciclo, es decir las instrucciones se ejecutan cuando menos una vez porque primero ejecuta las
instrucciones y al final evalua la condicion. Tambien se le conoce por esta razon como ciclo de
condicion de salida.
Su formato general es:
cargar o inicializar variable de condicion;
repeat
begin
instrucciones;
end
until condicion;
OBSERVAR QUE NO LLEVA PUNTO Y COMA (;) ANTES DEL UNTIL
program prog6;
uses crt;
var
x:integer;
begin
clrscr;
x:=1;
REPEAT BEGIN
gotoxy(10,4+x);
write(x,' CONEJITO BLANCO HIMALAYA');
x:=x+1;
END
UNTIL x = 5;
readln;
end.
Observar que nada mas se ve hasta x=4, pero en realidad la x llego hasta el 5, cuando
termino lo que esta desplegandose en pantalla la x se incremento a 5 y luego se probo la
condicion y como era CIERTA o VERDADERA entonces acabo el ciclo.
Lo del conejito blanco del himalaya esta explicacado aqui TUTORIAL HTML
Otra diferencia basica con el ciclo while es que, aunque la condicion sea falsa desde un
principio el cuerpo de instrucciones se ejecutara por lo menos una vez.
Pedro nombres*2+)
Sin embargo sus problemas son similares a los de variables normales es decir hay que
declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc.
B) TABLAS
SUC A
10
20
30
40
SUC B
50
60
70
80
SUC D
90
100
110
120
Como se observa la diferencia principal entre un arreglo tipo lista y unarreglo tipo tabla
son las cantidades de columnas que contienen.
NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN ENFOCADOS A LOS
SISTEMAS DE INFORMACION CONTABLES ADMINISTRATIVOS.
EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE VECTORES Y
MATRICES, PERO LAS OPERACIONES Y METODOS SON PRECISAMENTE LOS DEL ALGEBRA
MATRICIAL.
program prog7;
USES crt;
VAR
edad: ARRAY[1..3] of integer;
nombre : ARRAY[1..3] of string[20];
ren:integer;
begin
clrscr;
(* captura de arreglos *)
for ren := 1 to 3 do
begin
gotoxy(10,ren*2+2);write('edad ',ren,':'); readln(edad[ren]);
gotoxy(10,ren*2+3);write('nombre',ren,':');read(nombre[ren]);
end;
(* despliegue de arreglos *)
for ren := 1 to 3 do
begin
gotoxy(10,ren*2+10);write('edad= ',edad[ren]);
gotoxy(10,ren*2+11);write('nombre= ',nombre[ren]);
end;
readln;readln;
end.
Siempre que se use un elemento de una lista en pascal con cualquier proceso (captura,
despliegue, operaciones)debera acompanarse de su indice respectivo.
Para procesar (hacer operaciones con ellos, o comparaciones, etc) los elementos de la
lista se debera usar un ciclo for con una variable de control llamda renglon, misma que se
usara tambien como indice de la lista.
Para desplegar los elementos de la lista, tambien se usa un ciclo for con su variable de
control renglon, tal como se muestra en el ejemplo.
El mismo ciclo de proceso o despliegue se puede utilizar para procesar o desplegar los
elementos de mas de una lista, siempre y cuando las listas sean del mismo tamano.
Ord crec
Ord decr
15
15
10
10
10
15
NOTAS:
- Las variables n, k, renglon, son variables de control y deberan ser declaradas de tipo integer.
- La variable temp, debera ser declarada de acuerdo al tipo de dato de los elementos de la
lista.
- Todas las referencias a LISTA, deberan ser cambiadas por el nombre verdadero de la lista real.
- Es el simbolo del if, quien determina el tipo de sorteo, es decir, (>)ascendente, (<)
descendente.
program prog8;
USES crt;
VAR
calif : ARRAY[1..3,1..2] of integer;
r,c,nc:integer;
begin
nc :=5;
clrscr;
(* captura tabla *)
for r := 1 to 3 do
begin
for c := 1 to 2 do
begin
gotoxy(nc,r+2);write('calif ',r,c,' :'); readln(calif[r,c]);
nc:=nc+20;
end;
nc:=5
end;
(* regalando 10 puntos a la calif *)
for r := 1 to 3 do
for c := 1 to 2 do
calif[r,c] := calif[r,c] + 10;
(* despliegue arreglo *)
for r := 1 to 3 do
begin
for c := 1 to 2 do
begin
gotoxy(nc,r+7);write('calif= ',calif[r,c]);
nc:=nc+20;
end;
nc:=5;
end;
readln;
end.
readln;
end;
begin
(* invocando procedimiento *)
edadmeses;
end.
Recordar tambien que un programa puede tener muchos procedimientos, y estos pueden
llamarse o invocarse entre si.
MUCHO OJO con la nota anterior, es valido que un procedimiento se llame o invoque o se
active a si mismo o usando una referencia circular, por ejemplo proc1, activa proc2 que a su
vez llama a proc1 esto se llama recursion y si no se controla con una instruccion
if(condicion)break o exit(no me acuerdo cual de las dos) se va a obtener un hermoso ciclo
infinito, muy divertido cuando le pasa a los programas de los companeros, estan avisados.
Como se observa un procedimiento puede ser un programa completo.
TEMA 2: PARAMETROS PASCAL
Un parametro es una variable que puede pasar su valor a un procedimiento desde el
principal o desde otro procedimiento. Existen ocasiones en que es necesario mandar al
procedimiento ciertos valores para que los use en algun proceso.
Estos valores que se pasan del cuerpo principal del programa o de un procedimiento a
otros procedimientos se llaman parametros.
Entonces la declaracion completa de un procedimiento es :
Procedure nomproc(lista de parametros);
Donde lista de parametros es una o mas variables separadas por punto y coma como lo
muestra el pograma ejemplo.
prog10.pas
program prog10;
uses crt;
var
edad1:integer;
procedure edadmeses(nombre:string; edad:integer);
var
meses:integer;
begin
meses:=edad*12;
write(nombre,' tus meses son= ',meses);
readln;
end;
begin
(* capturando el dato *)
clrscr;
write('dame edad : ');readln(edad1);
(* invocando procedimiento y pasando parametros *)
edadmeses('JUAN', edad1);
end.
Observar que en el procedimiento los parametros son dos variables locales es decir
variables que solo se pueden usar dentro del procedimiento estas variables son quienes
reciben los datos o valores.
3.- La cantidad de variables que se envian deben ser igual en cantidad, orden y tipo a las
variables que reciben.
4.- La variable que se recibe tiene un ambito local dentro del procedimiento, es decir solo
la puede usar ese procedimiento.
5.- Se puede mandar a un procedimiento un dato, una variable(como lo muestran los
ejemplos) o una expresion algebraica (no ecuacion o formula, pero siempre se deberan recibir
en una variable.
TEMA 3: VARIABLES LOCALES Y GLOBALES PROGRAMACION PASCAL
El lugar donde sea declarada una variable afectara el uso que el programa quiera hacer de
esa variable.
Las reglas basicas que determinan como una variable puede ser usada depende de 3
lugares donde se puede declarar una variable.
En primer lugar es dentro de cualquier funcion o procedimiento a estas se les llama
variables locales y solo pueden ser usadas por instrucciones que esten dentro de esa funcion o
procedimiento.
En segundo lugar es como parametro de una funcion donde despues de haber recibido el
valor podra actuar como variable local en esa funcion o procedimiento.
En escencia una variable local solo es conocida por el codigo de esa funcion o
procedimieto y es desconocida por otras funciones o procedimientos.
En tercer lugar es fuera de todas los procedimiento o funciones a este tipo de variables se
les llama variables globales y podran ser usadas por cualquie r funcion o procedimiento del
programa.
En programacion en serio no es acostumbrado usar muchas variables globales por varias
razones, una de ellas es que variables globales estan vivas todo el tiempo de ejecucion del
programa y si una global solo la ocupan unos cuantos procedimientos no tiene caso que este
viva para todo el resto, otra razon es que es peligroso tener variables globales porque todo el
conjunto de procedimiento y funciones que componen un programa tienen acceso o
comparten su valor y se corre el riesgo de que inadvertidamente alguno de ellos modifique su
valor.
Prog11.pas
program prog11;
uses crt;
var
(* realmente estas son variables globales *)
edad,meses:integer;
nombre:string;
procedure edadmeses;
begin
meses:=edad*12;
Es muy agradable trabajar sin parametros pero recordar la nota de arriba que no es muy
bueno usar muchas variables globales:
La lista de parametros formales es una lista de variables separadas por punto y coma ( ;)
que almacenaran los valores que reciba la funcion, estas variables actuan como locales dentro
del cuerpo de la funcion.
Recordar ademas que cuando se llame una funcion debera haber una variable que
reciba el valor que regresara la funcion, es decir generalmente se llama una funcion
mediante una sentencia de asignacion, por ejemplo resultado=funcion(5, 3.1416);
Prog12.pas
program prog11;
uses crt;
var
dolar:real;
FUNCTION dolares(pesos,tc:real):real;
begin
dolares := pesos /tc;
end;
begin
clrscr;
(* llamando funcion y cargando resultado *)
dolar := dolares(123.45 , 11.25);
write('SON ',dolar:0:2, ' DOLARES');
readln;
end.
(* desplegando *)
writeln('nombre : ',nombre);
writeln('edad : ',edad);
readln;
END.
Prog14.pas
program prog14;
uses crt;
type
rango = array[1..3] of integer;
var
vector:rango;
r1:integer;
PROCEDURE listas(var lista:rango);
var
r:integer;
begin
for r:=1 to 3 do
lista[r] := lista[r] + 1000;
end;
begin
clrscr;
(* cargando vector *)
vector[1]:=50;vector[2]:=100;vector[3]:=200;
(* pasandolo a procedimiento *)
listas(vector);
for r1:=1 to 3 do
writeln(vector[r1]);
readln;
end.
Es de recordar que los cambios que le hagan al arreglo dentro de la funcion se reflejaran
en el arreglo original, es por esto que si se quiere modificar un arreglo en una funcion no hay
necesidad de regresar ningun valor.
Ej:
RECORD alumno
nombre campo1
direccion campo2
edad campo3
etc
EL FORMATO GENERAL DE UNA ESTRUCTURA ES:
TYPE
Nomreg = RECORD
Campo1: tipo dato
Campo2: tipo dato
......
end;
VAR
varReg:nomreg;
Recomendacion es que en type usar el plural por ejemplo ALUMNOS y en la variable el
singular por ejemplo ALUMNO, ver ejemplo mas abajo.
Es el registro completo quien se declara en cualquiera de los lugares adecuados para ello.
Son los campos del registro a quienes se les va a asignar, inicializar, capturar, etc y de esta
manera a los campos se les considera como variables normales.
Para indicar a pascal durante cualquier proceso que la variable a utilizar es un campo de
una estructura se utiliza el siguiente formato.
varreg.nombredelcampo
Ejemplo.
prog15.pas
program prog15;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
estatura:real;
end;
var
alumno:alumnos;
BEGIN
clrscr;
(* capturando registro *)
write('dame clave : ');readln(alumno.clave);
write('dame nombre : ');readln(alumno.nombre);
write('dame estatura : ');readln(alumno.estatura);
(* operaciones *)
alumno.estatura := alumno.estatura + 0.23456;
(* despliegue *)
writeln;writeln;
writeln('clave : ',alumno.clave);
writeln('nombre : ',alumno.nombre);
writeln('estatura : ',alumno.estatura:0:2);
readln;
END.
Las operaciones mas elementales con los campos de una estructura incluyen captura e
inicializacion.
Recordar que el registro que se uso para crear el archivo se debera usar siempre y con el
mismo orden cuando se acceda al archivo con los procesos u operaciones anteriormente
mencionados.
Primero creamos una variable registro de tipo normal.
Luego se crea una variable VARARCHIVO de tipo ( file of) REGISTRO, esta variable se
estara usando mucho a lo largo de los programas.
Pueden pensar de esta variable como un ALIAS al archivo en disco, es decir en el disco
duro quedara grabado an algun lugar un archivo llamado C:\FOLDE\DIRECTORIO\DATOS.DAT
pero pascal ocupara una manera mas recortada de estarlo manejando, para esto se usa la
VARARCHIVO, es decir a juan francisco lopez montejo se le conoce mejor como pancho.
Las instrucciones nuevas a usar son:
A) ASSIGN(VARARCHIVO,RUTA DIRECTORIO NOMARCHIVO), esta instruccion asigna la
variable de archivo, al archivo real en disco, es decir VARARCHIVO quedara cargada con la
direccion o ruta y el nombre del archivo en disco.
B) REWRITE(VARARCHIVO)
Esta instruccion crea y abre un archivo fisico en disco, si el archivo ya existe rewrite
eliminara todo lo que tenga y el archivo quedara listo para el proceso de escribirle o grabarle
registros.
C) CLOSE(VARARCHIVO) ultimo proceso que debe incluir todo programa que maneje
archivos en pascal, esta instruccion le indica al compilador que cierre el archivo fisico en disco,
esto lo hace agregandole una marca de fin de archivo (EOF) al final del archivo.
Es importante siempre cerrar el archivo fisico en el disco o van a tener una situacion de
ABORT,RETRY,IGNORE muy divertida.
program prog17;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
estatura:real;
end;
var
alumno:alumnos;
archivo: file of alumnos;
ren:integer;
BEGIN
clrscr;
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
rewrite(archivo);
(* ciclo para capturar y grabar tres registros *)
for ren:= 1 to 3 do
begin
(* capturando registro *)
write('dame clave : ');readln(alumno.clave);
write('dame nombre : ');readln(alumno.nombre);
write('dame estatura : ');readln(alumno.estatura);
(* grabando el registro al archivo *)
write(archivo, alumno);
end;
(* cerrando archivo y avisando *)
close(archivo);
writeln;writeln;
writeln('REGISTROS INSERTADOS');
readln;
END.
program prog18;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
estatura:real;
end;
var
alumno:alumnos;
archivo: file of alumnos;
BEGIN
clrscr;
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
(* moviendo apuntador al final del archivo existente *)
seek(archivo,filesize(archivo));
(* capturando registro *)
write('dame clave : ');readln(alumno.clave);
write('dame nombre : ');readln(alumno.nombre);
write('dame estatura : ');readln(alumno.estatura);
(* grabando el registro al archivo *)
write(archivo, alumno);
(* cerrando archivo y avisando *)
close(archivo);
writeln;writeln;
writeln('NUEVO REGISTRO INSERTADO');
readln;
END.
prog21.pas
program prog21;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
estatura:real;
end;
var
alumno:alumnos;
archivo: file of alumnos;
clave:real;
BEGIN
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
(* capturando condicion *)
clrscr;
write('clave >= que : ');readln(clave);
(* iniciando ciclo de lectura de registros en archivo *)
while not(EOF(archivo)) do
begin
READ(archivo,alumno);
if alumno.clave > clave then
begin
write('clave : ');writeln(alumno.clave);
write('nombre : ');writeln(alumno.nombre);
write('estatura : ');writeln(alumno.estatura:0:2);
end;
end;
(* cerrando archivo *)
close(archivo);
write('<enter> para continuar');readln;
END.
(* avisando *)
write('Registro Eliminado <enter> para continuar');
readln;
END.
Para ver el archivo original usar el prog19.pas o mejor aun llamen el modulo apropiado
del menu que ya estan construyendo.
EL problema con esta manera de eliminar incluso fisicamente los registros del archivo es
que no hay manera de recuperar esa informacion posteriormente.
Es por eso que otra tecnica comun de eliminacion es incluir un campo de estado, status o
bandera o semaforo en el registro y conforme se va cargando el registro y antes de mandarlo a
disco se le agrega a dicho campo el caracter 'A' >alta, asi que cuando se quiera una baja solo
se pondria dicho campo en 'B' y todos los programas de lectura, busqueda y filtros deberan
revisar esta campo de estado antes de hacer algo con el registro.
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
assign(temporal,'c:\prog\temporal.dat');
rewrite(temporal);
clrscr;
(* iniciando ciclo de lectura de registros en archivo original *)
while not(EOF(archivo)) do
begin
READ(archivo,alumno);
(* realizando operacion ejemplo aumentar 15 cms a cada estatura *)
alumno.estatura := alumno.estatura + 0.15 ;
(* grabando a temporal *)
WRITE(temporal,alumno);
end;
(* cerrando archivos *)
close(archivo);
close(temporal);
(* borrando y eliminando archivos *)
erase(archivo);
rename(temporal,'c:\prog\alumnos.dat');
(* avisando *)
write('ESTATURAS AUMENTADAS <enter> para continuar');
readln;
END.
como se observa la solucion es muy sencilla solo se ocupa el registro original y los dos
archivos el original y el temporal, se va leyendo registro a registro de archivo original al
registro en memoria correspondiente, se realiza la operacion u proceso deseado con el
registro y se graba el registro modificado en el archivo temporal, al final se elimina archivo
original y se renombra el archivo temporal.
(* cerrando archivos *)
close(archivo);
close(temporal);
(* borrando y eliminando archivos *)
erase(archivo);
rename(temporal,'c:\prog\alumnos.dat');
(* avisando *)
write('Registro Editado <enter> para continuar');
readln;
END.
end;
var
alumno:alumnos;
archivo: file of alumnos;
BEGIN
clrscr;
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
(* moviendo apuntador al final del archivo existente *)
seek(archivo,filesize(archivo));
(* capturando registro *)
write('dame clave : ');readln(alumno.clave);
write('dame nombre : ');readln(alumno.nombre);
write('dame edad : ');readln(alumno.edad);
(* cargando status *)
alumno.status :='A';
(* grabando el registro al archivo *)
write(archivo, alumno);
(* cerrando archivo y avisando *)
close(archivo);
writeln;writeln;
writeln('NUEVO REGISTRO INSERTADO');
readln;
END.
Recordar que la estructura que se uso para crear el archivo se debera usar siempre y con
el mismo orden cuando se acceda al archivo con los procesos u operaciones anteriormente
mencionados.
Observar que es completamente similar a la creacion de archivos secuenciales.
Se agergo un campo de status de tipo char que se cargo con el caracter 'A' para significar
que este registro esta en altas, pueden usar status numericos para cargarlo con numeros que
signifiquen diferentes cosas por ejemplo 1.-alta, 2.-baja, 3.- baja temporal, 4.- permiso, etc.
Recuerden que para que funcione el archivo ya debes estar creado, si no quieren usar el
programa de creacion de archivos, pueden crearlo directamente en windows con file new text.
LECTURA
Prog26.pas
program prog26;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
edad:integer;
status:char;
end;
var
alumno:alumnos;
archivo: file of alumnos;
BEGIN
clrscr;
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
(* ciclo de lectura y despliegue registro *)
while not(EOF(archivo)) do
begin
read(archivo,alumno);
(* revisando status registro *)
if alumno.status = 'A' then
begin
write('clave : ');writeln(alumno.clave);
write('nombre : ');writeln(alumno.nombre);
write('edad : ');writeln(alumno.edad);
write('<enter> para continuar ');readln;;
end;
end;
(* cerrando archivo *)
close(archivo);
END.
Recordar que siempre debes estar revisando o validando el campo se status o bandera
para conocer el estado del registro.
TEMA 3: BUSQUEDA ARCHIVOS DISCO PASCAL
En este tema se analiza la busqueda de un registro o renglon determinado.
En este proceso el usuario del programa quiere que se despliegue un y solo un registro de
informacion proporcionando un dato de busqueda generalmente la clave del registro.
se pondria dicho campo en 'B' y todos los programas de lectura, busqueda y filtros deberan
revisar esta campo de estado antes de hacer algo con el registro.
Como ya se incluyo el campo de status en el registro el programa es muy sencillo;
Prog29.pas
program prog29;
uses crt;
type
alumnos = RECORD
clave:integer;
nombre:string[30];
edad:integer;
status:char;
end;
var
alumno:alumnos;
archivo: file of alumnos;
clave:integer;
BEGIN
clrscr;
(* creando y abriendo el archivo *)
assign(archivo,'c:\prog\alumnos.dat');
reset(archivo);
(* clave a buscar *)
write('clave a eliminar');readln(clave);
(* moviendo apuntador a registro buscado *)
SEEK(archivo,clave-1);
(* leyendo registro *)
READ(archivo,alumno);
(* cambiando status registro *)
alumno.status := 'B';
(* moviendonos otra vez a posicion inicial *)
(* o sobreescribimos el registro que sigue *)
SEEK(archivo,clave-1);
(* grabando el registro actualizado *)
WRITE(archivo,alumno);
(* avisando *)
writeln('Registro Eliminado ');
write('<enter> para continuar ');readln;;
(* cerrando archivo *)
close(archivo);
END.
Como se observa es mas facil eliminar registros que incluyan banderas de estado y que
ademas estan en archivos random o directos.
TEMA 6: OPERACIONES CON CAMPOS PASCAL ARCHIVOS
En este tema se analiza la manera de poder realizar operaciones o procesos con los
campos de los registros en el archivo DIRECTO, lo unico importante a considerar es que los
campos del registro son en cierta medida igual que variables normales y por tanto se pueden
procesar de manera normal como lo muestra el ejemplo.
La tecnica depende de si se quiere modificar
a) un solo registro,
b) o un subconjunto de registros que cumplan una condicion o
c) todo los registros del archivo.
Para el caso A solo usar el caso de eliminacion o bajas, solo cambiar la parte donde cambiamos
el estatus por la operaciony regrabar. Para los casos B y C, realizar un ciclo de lectura del
archivo y usar dentro el siguiente algoritmo
WHILE NOT EOF
READ(ARCHIVO,REGISTRO)
OPERACION CON CAMPO
SEEK(ARCHIVO, REGISTRO.CLAVE - 1)
WRITE(ARCHIVO,REGISTRO)
END WHILE
y no se ocupan los dos archivos como en el caso secuencial.
TEMA 7: EDICION MODIFICACION DE REGISTROS PASCAL
Modificar o editar un registro es uno de los procesos mas comunes con archivos en disco,
generalmente despues de un fuerte proceso de captura de registros, una revision o consulta
general muestra muchos de ellos con errores de captura.
PROGRAMA DE BUSQUEDA
DESPLEGAR REGISTRO BUSCADO
PEDIR NUEVOS CAMPOS ( Y NO CAMBIAR NINGUNA CLAVE NI DE BUSQUEDA NI DE ARCHIVO )
SEEK(ARCHIVO, CLAVE O REGISTRO.CLAVE - 1)
WRITE(ARCHIVO,REGISTRO)
CLOSE(ARCHIVO)