Algoritmos y Estructuras de Datos
Algoritmos y Estructuras de Datos
ALGORITMOS
.C
Y ESTRUCTURAS DE DATOS
DD
LA
APUNTE DE TEORIA
FI
► INTRODUCCIÓN:
El desarrollo de la tecnología de la información y de las comunicaciones, ha sido
responsable de una buena parte de los cambios sociales y productivos en el mundo de
las últimas décadas.
Las sociedades se distinguen entre sí por la complejidad de los problemas que
OM
puedan resolver, para lo cual deben acceder al conocimiento. Este acceso al
conocimiento depende de cómo se procesa, almacena y trasmite la información en un
país. Para brindar respuesta a esta necesidad social, la educación juega un papel muy
importante.
Una de las prioridades de los sistemas educativos de los países que pretendan
un crecimiento económico y un desarrollo social sustentable, es la alfabetización en
.C
tecnología.
El área Programación tiene como objetivo formar e informar acerca de
metodologías, técnicas y lenguajes de programación, como herramientas básicas para
DD
el desarrollo de software y el estudio de disciplinas que permitan crear nuevas
tecnologías.
► OBJETIVOS:
LA
● Objetivos Generales:
- Mejorar la capacidad de razonamiento.
- Adquirir habilidad y seguridad en la resolución de problemas.
- Desarrollar aptitudes que les permitan seguir aprendiendo por sí mismos.
Página 2
● Objetivos Específicos:
- Formular un problema en forma correcta, completa y sin ambigüedades.
OM
- Utilizar los conocimientos adquiridos para elegir un método para hallar la
solución de los problemas.
- Expresar el método elegido de forma tal que pueda ser interpretado por el
procesador a utilizarse.
- Reconocer datos e incógnitas
.C
- Elegir correctamente la estructura de datos.
- Ejecutar el procedimiento elegido para obtener la solución del problema.
DD
- Expresar el algoritmo en lenguaje de programación.
► CONTENIDOS:
La secuencia de contenidos conceptuales se organizó en siete unidades
LA
didácticas:
◊ Unidad 1:
Algoritmo, Programa, Lenguaje de programación, Lenguaje de máquina,
FI
Compilador – Definiciones
Representación de algoritmos – Diagramación – Diagramas de
Nassi- Schneiderman o de Chapin.
◊ Unidad 2:
Introducción al Pascal – Programa Pascal – Encabezamiento – Bloque – Cuerpo
Declaraciones y Definiciones – Tipos de Datos standard: enteros, reales,
caracteres y lógicos
Página 3
◊ Unidad 3:
Estructuras de Control
Bifurcación ó Selección Simple – Diagrama y programa -
OM
Repetición ó Iteración: con cantidad conocida de veces y con cantidad
desconocida de veces – Diagrama y programa
Selección múltiple – Diagrama y programa
◊ Unidad 4:
.C
Tipos de Datos no standard o definidos por el programador
Tipo Enumerado ó Escalar
DD
Tipo Subrango ó Intervalo
Tipo Estructurado – Arreglos unidimensionales y multidimensionales
Ordenamiento de un arreglo unidimensional – Búsqueda de un valor en
un arreglo unidimensional: Búsqueda Secuencial y Búsqueda Dicotómica
LA
◊ Unidad 5:
FI
Subprogramas – Definición
Funciones y Procedimientos – Definiciones – Diferencias
Variables Locales – Variables Globales
Correspondencia Argumento-Parámetro
Parámetro por valor – Parámetro por Referencia ó por Variable
◊ Unidad 6:
Otras Estructuras de Datos
Registros – Registros Jerárquicos
Arreglos de Registros
Página 4
◊ Unidad 7:
Archivos – Introducción - Buffers
Operaciones básicas sobre archivos – Otras operaciones sobre archivos
Organización y acceso a un archivo
► BIBLIOGRAFIA:
OM
- INTRODUCCIÓN A LA PROGRAMACIÓN Y A LAS ESTRUCTURAS DE DATOS
Silvia Braunstein ; Alicia Gioia - EUDEBA
- INTRODUCCIÓN AL PASCAL
Nell Dale ; Orshalick – McGraw Hill
- PASCAL MAS ESTRUCTURAS DE DATOS
.C
Nell Dale ; Susan Lilly – McGraw Hill
- ALGORITMOS, DATOS Y PROGRAMAS CON APLICACIONES EN PASCAL, DELPHI Y
VISUAL DA VINCI
DD
Armando E. de Giusti – Prentice Hall
- ALGORITMOS + ESRUCTURAS DE DATOS = PROGRAMAS
Niklaus Wirth – El Ateneo
LA
FI
Página 5
UNIDAD Nº 1
1-1. INTRODUCCIÓN
Dentro de los objetivos planteados para esta asignatura aparecen palabras tales
como: algoritmos, programas, lenguaje de programación, etc., con las cuales no
estamos familiarizados; para entenderlos mejor veamos algunas definiciones:
OM
1-1-1. ALGORITMOS:
Secuencia de acciones o pasos que permite resolver un problema. Un mismo
problema puede ser resuelto con distintos algoritmos.-
.C
1-1-2. PROGRAMA:
Traducción o codificación de un algoritmo a un lenguaje de programación; o
DD
sea, una secuencia de instrucciones que indica las acciones que han de ejecutarse.-
programa.-
1-1-5. COMPILADOR:
1-2. DIAGRAMACION:
Una vez comprendido el problema, se hace una representación gráfica de los
pasos a seguir para resolverlo. Esta representación se llama diagramación.-
Los diagramas son un conjunto de símbolos que han convenido de distintas
maneras distintos autores. En este curso adoptaremos los diagramas de NASSI-
Página 6
E
Lectura o entrada de datos
OM
Ordenes u operaciones
.C
S
Salida de datos y/o resultados
DD
condición
V F
Pregunta o comparación
Decisión simple
LA
EJEMPLO:
Describir mediante un diagrama de Chapin, el procedimiento lógico que debe
FI
Levantar el tubo
V ¿tiene tono? F
Marcar el nro.
v ¿contesta? F
Hablar
Colgar
Página 7
1-3-1. IDENTIFICADOR:
Como en el álgebra, a cada dato o elemento, ya sea constante o variable, se le
bautiza con un nombre o identificador; el cual si se ha elegido adecuadamente, ayuda
mucho a la persona que lea el programa.-
OM
1-3-2. CONSTANTES:
Como su nombre lo indica, son datos que no varían durante la ejecución de un
programa.-
1-3-3. VARIABLES:
.C
Son datos que cambian o evolucionan durante la vida o ejecución de un
programa.-
DD
1-4. SENTENCIA DE ASIGNACION:
Asigna el valor de la expresión que está a la derecha del signo := (signo de
LA
1-5. OPERADORES:
+ Suma
- Resta
* Multiplicación
/ División real
DIV División entera
MOD Resto de la división entera
Página 8
OM
>= ó => Mayor o igual
OR ó lógico
AND y lógico
NOT no
.C
1-7. EJEMPLO:
DD
Realizar un algoritmo en diagrama de Chapin para resolver el siguiente
problema:
Dados como datos: el precio del kilowatt-hora, la lectura actual y la lectura
anterior de un medidor; calcular el importe que una persona deberá abonar a la E.P.E.
Mostrar los datos y el resultado obtenido.-
LA
Página 9
UNIDAD Nº 2
INTRODUCCION AL PASCAL
OM
a)- ENCABEZAMIENTO: Este se compone de la palabra reservada
PROGRAM seguida de un identificador (nombre del programa definido por el
programador), y una lista de parámetros encerrados entre paréntesis que son los
nombres de los ficheros a través de los cuales el programa se comunica con y desde
el medio exterior. Nosotros utilizaremos INPUT (o sea entrada de datos por teclado),
.C
y OUTPUT (o sea salida de datos y/o resultados por pantalla).-
- Definición de constantes.
- Definición de tipos.
- Declaración de variables.
- Declaración de procedimientos y funciones.
FI
ii) CUERPO: Está compuesto por las sentencias ejecutables del programa
encerradas entre BEGIN y END. .-
Página 10
2-2-1. INTEGER:
Son todos los datos que contienen números positivos o negativos sin parte decimal
(o sea números enteros ). Ellos constan de un signo y dígitos sin comas:
OM
Cuando se omite el signo se asume que el número es positivo.-
Teóricamente, no hay límite sobre el tamaño de los enteros, pero las limitaciones
.C
del hardware de la computadora y las consideraciones prácticas dan lugar a que haya
que limitar el tamaño de un entero. Puesto que este límite varía de unas máquinas a
otras, Pascal tiene un identificador predefinido, MAXINT, cuyo valor es el mayor
valor entero que puede representarse en la computadora; en general MAXINT es
DD
32767 (aunque puede ser diferente para su máquina, por lo que puede imprimirlo para
ver cuál es su valor), entonces el rango de los enteros permitido sería:
ó
desde: -32767 hasta: 32767
FI
2-2-2. REAL:
Son todos los datos que contienen números positivos o negativos que tienen una
parte entera y una parte decimal.-
Página 11
Ejemplos:
Reales válidos Reales no válidos
12.34 12. (ningún dígito después del ".")
63E4 12.E3 (ningún dígito después del ".")
34.2E5 .46E-6 (ningún dígito antes del ".")
100E-9 245 (ni "E" ni ".")
OM
-50E-4 56.5E (ningún dígito después de "E")
2-2-3. CHAR:
Son todos los datos que contienen un carácter alfanumérico (sólo uno). Los
.C
caracteres alfanuméricos incluyen dígitos, letras y símbolos especiales.-
No se puede sumar '4' y '9', pero puede comparar valores de tipo CHAR. El
conjunto de caracteres de una máquina está ordenado, 'A' es siempre menor que 'B',
'B' es menor que 'C', y así sucesivamente. También '1' es menor que '2', '3' es menor
que '4',etc.-
FI
2-2-4. BOOLEAN:
Los datos Booleanos no pueden leerse como datos, pero pueden imprimirse.-
Cuando se aplican operadores lógicos (and( ∧ ); or( ∨ ); y not( ¬ )) a operandos
Booleans, producen un valor Boolean, que representaremos en el siguiente cuadro,
siendo p y q dos operandos Boolean:
Página 12
p q p∨q p^q ¬ p
OM
.F. .T. .T. .F. .T.
.F. .F. .F. .F. .T.
.C
2-2-5. STRING:
Turbo Pascal proporciona el tipo string para el procesamiento de cadenas
DD
(secuencias de caracteres ).
La definición de un tipo string debe especificar el número máximo de caracteres que
puede contener, esto es, la máxima longitud para las cadenas de ese tipo. La longitud
se especifica por una constante entera en el rango de 1 a 255.
LA
domicilio : string[30];
ciudad : string[40];
Una Vez declaradas las variables se pueden realizar asignaciones:
nombre := 'Juan José Perez' ;
Página 13
OM
longitud física más pequeña en cuyo caso ocurriría un truncamiento de la cadena.
Si la cantidad de caracteres asignados a una variable string es menor que la definición
realizada, Pascal completa con blancos a la derecha de la cadena; si se le asigna una
cantidad mayor, trunca
Ejemplo:
.C
Var
Nombre1 : String[9];
Nombre2 : String[20];
DD
.
.
.
Nombre1 := 'Instituto Tecnológico';
Nombre2 := 'Universidad';
LA
Las sentencias de entrada de un programa hacen que la computadora lea los datos
durante la ejecución del programa, lo que permite al programador escribir programas
generales que pueden ser utilizados repetidamente para conjuntos de datos diferentes,
cuyos valores no tienen porqué ser conocidos exactamente por el programador en el
momento de escribir el programa.-
Sin las sentencias de salida, muchos programas serían inútiles ya que el usuario no
tendría ninguna forma de conocer el resultado obtenido.-
Página 14
Significa que le asigna a la variable NUM el valor que ingresamos como dato.-
OM
Si queremos ingresar más de un dato, cada variable va separada de otra por coma, y
los datos respectivos deben ir separados por uno o más blancos.-
.C
Ejemplo:
READ (PRECIO, CANTIDAD);
DD
2-3-2. SENTENCIA WRITE:
Es la sentencia de salida en Pascal y permite que el contenido de una variable o el
valor de una expresión sea conocida por nosotros mediante una impresión.-
LA
Ejemplo:
WRITE (IMPORTE);
FI
Página 15
Pero dijimos que la sentencia write también permite conocer el valor de una
expresión; así este mismo ejemplo podría haber sido resuelto de la siguiente manera:
READ (PRECIO, CANTIDAD);
WRITE (PRECIO * CANTIDAD);
OM
apóstrofos.-
Ejemplo:
WRITE ('EL IMPORTE DE LA FACTURA ES: ', IMPORTE);
.C
Si quisiéramos que los datos se exhiban en un renglón y el resultado en otro,
necesitaríamos utilizar la sentencia WRITELN. Esta sentencia provoca lo siguiente:
una vez que la computadora exhibió lo indicado en la lista de parámetros encerrados
DD
entre paréntesis el cursor queda al principio del renglón siguiente.-
Ejemplo:
WRITELN (PRECIO, CANTIDAD);
LA
WRITE (IMPORTE);
Página 16
OM
El valor de la variable o constante se imprimirá justificada a la derecha con blancos
a la izquierda para ocupar el número correcto de columnas indicado después del ':'.-
EJEMPLO:
.C
Si NUM = 25 (entero); CONT = 54 (entero) y LET = 'B'(carácter)
Sentencia Salida
Página 17
dígitos que se imprimirán después del punto decimal (si el número tiene más
decimales que lo especificado en el formato, la computadora redondea el siguiente a
la cantidad determinada).-
EJEMPLO: Si PROM = 23.346
Sentencia Salida
OM
WRITE (PROM:9:3); ---23.346
WRITE (PROM:10:2); -----23.35
WRITE (PROM:10:4); ---23.3460
WRITE (PROM:6:0); ---23.
.C
2-4. RESOLUCION DE UN PROBLEMA:
DD
Dados como datos el precio del kilowatt-hora y las lecturas actual y anterior de un
medidor, calcular el importe que una persona deberá abonar a la E.P.E.
Exhibir los datos en un renglón y el resultado en otro.-
LA
E
FI
Página 18
OM
BEGIN
WRITE ('INGRESE PRECIO Y LECTURAS ACTUAL Y ANTERIOR');
READLN (PKW, LACT, LANT);
CONS := LACT - LANT;
IMPOR := CONS * PKW;
.C
WRITELN (PKW:6:2, LACT:12:0, LANT:12:0);
WRITELN;
DD
WRITE ('EL IMPORTE ES =':23, IMPOR:7:2)
END.
LA
FI
Página 19
UNIDAD Nº 3
ESTRUCTURAS DE CONTROL
OM
- LA SECUENCIAL (vista en las unidades anteriores)
- LA BIFURCACION O SELECCION
- LA REPETICION O ITERACION
.C
3-1. LA BIFURCACION O SELECCION:
Hemos visto la selección entre dos caminos dependiendo de una condición. Esta
DD
sentencia es la sentencia IF , y su sintaxis es la siguiente:
ELSE Sentencia
FI
Página 20
3-1-1- EJEMPLOS:
1)- Dado un número real hallar, si es posible, su raíz cuadrada
a) DIAGRAMA DE CHAPIN:
E
NUM
OM
NUM >= 0
V F
S
RAIZ := 'NO SE PUEDE
SQRT (NUM) CALCULAR
S LA RAIZ
.C
DD NUM, RAIZ CUADRADA'
b) PROGRAMA EN PASCAL:
VAR
NUM, RAIZ : REAL;
BEGIN
WRITE ('INGRESE NUMERO');
FI
READLN (NUM);
IF NUM >= 0
THEN BEGIN
Página 21
2)- A partir de los datos de: Pago por hora y Cantidad de horas trabajadas calcular
el Sueldo de un operario, sabiendo que si las horas trabajadas superan 60, las
excedentes se pagan el doble.-
a) DIAGRAMA DE CHAPIN:
OM
PRECH , CANTH
CANTH > 60
V F
.C
HEX := CANTH - 60 SUEL := CANTH
SUEL := (HEX * 2 * PRECH
+ 60) * PRECH
DD
S
SUEL
b) PROGRAMA EN PASCAL:
LA
Página 22
OM
3-2-1. CON CANTIDAD CONOCIDA DE VECES
Cuando una sentencia o un grupo de sentencias deben ejecutarse más de una vez
utilizamos una estructura de repetición. Si sabemos qué cantidad de veces se van
repetir, utilizamos la sentencia PARA; esta sentencia en PASCAL es la sentencia
FOR, y su sintaxis es la siguiente:
.C
Variable Valor TO Valor
DD
FOR de := DO Sentencia
control Inicial DOWNTO Final
LA
La variable de control, el valor inicial y el valor final deben ser del mismo tipo. La
variable de control debe declararse como cualquier otra variable.-
Donde dice Sentencia puede tratarse de una Sentencia Compuesta (cuya sintaxis ya
FI
la hemos visto).
Página 23
El proceso continúa hasta que la variable de control toma un valor mayor que el
valor final, en cuyo caso termina el ciclo.-
OM
Es importante destacar que:
.C
* AL SALIR DEL CICLO LA VARIABLE DE CONTROL QUEDA CON
VALOR INDEFINIDO.
DD
(No así dentro del ciclo, donde se puede utilizar su contenido).-
EJEMPLOS:
LA
a) DIAGRAMA DE CHAPIN:
FI
SUMA := 0
PARA N := 1 hasta 45 hacer
NOTA
SUMA := SUMA + NOTA
S
SUMA / 45
Página 24
b) PROGRAMA EN PASCAL:
OM
BEGIN
SUMA := 0;
FOR N := 1 TO 45 DO
BEGIN
WRITE (' INGRESE NOTA ');
.C
READLN ( NOTA);
SUMA := SUMA + NOTA
DD
END;
WRITE (' EL PROMEDIO DEL CURSO ES = ', SUMA/45 :4:2)
END.
LA
2)- Se desea obtener la suma de los N números naturales posteriores al número 300
inclusive.-
FI
a) DIAGRAMA DE CHAPIN:
E
N
SUMA := 0
FOR I := 300 TO N + 300 DO
SUMA := SUMA + I
S
SUMA
Página 25
b) PROGRAMA EN PASCAL:
OM
BEGIN
WRITE ('INGRESE CANTIDAD DE NROS.');
READLN (N);
SUMA := 0;
FOR I := 300 TO N + 300 DO
.C
SUMA := SUMA + I;
WRITE ('LA SUMA DE LOS',N:4,'NROS NATURALES >= 300 ES',
DD
SUMA:10:0)
END.
Cuando una sentencia o un grupo de sentencias deben repetirse más de una vez,
dependiendo de una condición, utilizamos la estructura MIENTRAS o REPETIR.-
la siguiente:
Página 26
Por lo tanto si la condición es falsa la primera vez, pueden no ejecutarse nunca las
sentencias del ciclo de repetición.-
EJEMPLOS:
1)-Se van ingresando números distintos de cero, salvo el último valor. Determinar
su suma.-
OM
a) DIAGRAMA DE CHAPIN:
SUMA := 0
E
.C
NUM
MIENTRAS NUM <> 0 hacer
DD
SUMA := SUMA + NUM
E
NUM
LA
SUMA
FI
b) PROGRAMA EN PASCAL:
PROGRAM SUMANDO (INPUT, OUTPUT);
VAR
Página 27
OM
2)- Se desea saber el total de ventas de cada uno de los vendedores de una empresa.
A tal fin se tienen como datos: el código de vendedor y el importe de cada una de las
ventas; un vendedor puede haber realizado más de una venta. No se sabe la cantidad
de vendedores que tiene la empresa ni la cantidad de ventas hechas por cada
vendedor (un código de vendedor igual a cero es fin de datos).-
ESTOS DATOS ESTAN ORDENADOS POR CODIGO DE VENDEDOR
.C
Exhibir cada código de vendedor y su total correspondiente y al final, el código de
vendedor con mayor importe vendido y dicho importe.-
Resolverlo usando CORTE DE CONTROL.-
DD
a) DIAGRAMA DE CHAPIN:
LA
IMPMAX := 0
COD E
ANT := COD
WHILE ANT = COD DO
E
IMPOR
IMPMAX:=TOT
CODMAX:=ANT
S
CODMAX , IMPMAX
Página 28
b) PROGRAMA EN PASCAL:
PROGRAM VENDEDOR (INPUT, OUTPUT);
{EJEMPLO DE CORTE DE CONTROL}
VAR
COD , ANT , CODMAX : INTEGER;
IMPOR , TOT , IMPMAX : REAL;
OM
BEGIN
IMPMAX := 0;
WRITE ('INGRESE CODIGO');
READLN (COD);
WHILE COD <> 0 DO
.C
BEGIN
TOT := 0;
DD
ANT := COD;
WHILE ANT = COD DO
BEGIN
WRITE ('INGRESE IMPORTE');
LA
READLN (IMPOR);
TOT := TOT + IMPOR;
WRITE ('INGRESE CODIGO');
READLN (COD)
FI
END;
WRITE ('EL VENDEDOR',ANT:4,' VENDIO $ ',TOT:15:2);
IF TOT > IMPMAX
THEN
BEGIN
IMPMAX := TOT;
CODMAX := ANT
END;
END;
WRITE ('EL VENDEDOR :',CODMAX:4,'TUVO MAYOR IMPORTE: $',
Página 29
IMPMAX:15:2)
END.
OM
REPEAT Sentencia UNTIL Condición
.C
Repite la ejecución de la ó las sentencias del ciclo hasta que la condición sea
verdadera. Por lo tanto el ciclo se ejecuta al menos una vez, pues compara al final del
mismo. Esta es la gran diferencia que tiene con la sentencia WHILE.-
DD
EJEMPLOS:
a) DIAGRAMA DE CHAPIN:
FI
REP X
FX := 3 * X + 2
X , FX
S
'Continúa o finaliza?: C/F'
E
RTA
UNTIL RTA = 'F'
Página 30
b) PROGRAMA EN PASCAL:
PROGRAM FUNCION (INPUT, OUTPUT);
VAR
X , FX : INTEGER;
RTA : CHAR;
BEGIN
OM
REPEAT
WRITE ('INGRESE VALOR ');
READLN (X);
FX := 3 * X + 2;
WRITE ('CONTINUA O FINALIZA INGRESANDO? C/F ');
.C
READLN (RTA)
UNTIL RTA = 'F'
DD
END.
a) DIAGRAMA DE CHAPIN:
E
N
E
NUM
FI
CONT := 1
REP ANT := NUM
E
NUM
CONT := CONT + 1
UNTIL ANT < NUM OR CONT = N
V ANT < NUM F
S S
Página 31
b) PROGRAMA EN PASCAL:
PROGRAM ORDEN (INPUT, OUTPUT);
VAR
N , CONT , ANT , NUM : INTEGER;
BEGIN
WRITE ('INGRESE LA CANTIDAD DE NROS.');
OM
READLN (N);
WRITE ('INGRESE UN NRO.');
READLN (NUM);
CONT := 1;
REPEAT
.C
ANT := NUM;
WRITE ('INGRESE NRO.');
DD
READLN (NUM);
CONT := CONT + 1
UNTIL ANT < NUM OR CONT = N;
IF ANT < NUM
LA
Hemos visto también que si para optar por un camino a seguir no se depende de una
condición, sino del valor que contenga un dato o expresión (el selector) podíamos
utilizar la sentencia CASOS; esta sentencia es la sentencia CASE en PASCAL.-
La sintaxis de la sentencia CASE es la siguiente:
CASE Selector OF Etiqueta : Sentencia END
Case
,
;
Página 32
EJEMPLO:
OM
Se tienen como datos los importes de las ventas de cada una de las sucursales de
una empresa, junto con el código de sucursal (1, 2, 3, 4 ó 5).- Cada sucursal puede
tener varias ventas. Los datos no están ordenados por código de sucursal. Un código
igual a cero indica fin de datos.- Obtener el total de ventas para cada sucursal.-
.C
a) DIAGRAMA DE CHAPIN:
DD
S1 := 0 ; S2 := 0 ; S3 := 0 ; S4 := 0 ; S5 := 0
E
REP COD
UNTIL COD >= 0 AND COD <= 5
LA
S1:= S1 2 COD
+IMP S2:= S2 3
+ IMP S3:= S3 4
+ IMP S4:= S4 5
+ IMP S5:= S5
+ IMP
E
REP COD
UNTIL COD >= 0 AND COD <= 5
S
S1 , S2 , S3 , S4 , S5
Página 33
b) PROGRAMA EN PASCAL:
PROGRAM VENTAS (INPUT, OUTPUT);
VAR
COD : INTEGER;
S1 , S2 , S3 , S4 , S5 , IMP : REAL;
BEGIN
OM
S1:= 0; S2:= 0; S3:= 0; S4:= 0; S5:= 0;
REPEAT
WRITE ('INGRESE CODIGO'); READLN (COD)
UNTIL ( COD >= 0 ) AND ( COD <= 5 );
WHILE COD <> 0 DO
.C
BEGIN
WRITE ('INGRESE IMPORTE');
DD
READLN (IMP);
CASE COD OF
1 : S1 := S1 + IMP;
2 : S2 := S2 + IMP;
LA
3 : S3 := S3 + IMP;
4 : S4 := S4 + IMP;
5 : S5 := S5 + IMP
END;
FI
REPEAT
WRITE ('INGRESE CODIGO'); READLN (COD)
UNTIL ( COD >= 0 ) AND ( COD <= 5)
END;
WRITELN ('TOTAL SUCURSAL 1 :':30, S1:12:2);
WRITELN ('TOTAL SUCURSAL 2 :':30, S2:12:2);
WRITELN ('TOTAL SUCURSAL 3 :':30, S3:12:2);
WRITELN ('TOTAL SUCURSAL 4 :':30, S4:12:2);
WRITE ('TOTAL SUCURSAL 5 :':30, S5:12:2)
END.
Página 34
UNIDAD Nº 4
TIPOS DE DATOS
OM
PASCAL nos proporciona la manera de especificar nuestros propios tipos de datos.-
Los enumerados o escalares son aquellos en los que mencionamos cada uno de los
valores que puede contener, mediante la definición:
.C
EJEMPLO:
DD
Si declaramos:
TYPE
COLOR = (BLANCO, VERDE, ROJO);
DIAS = (LUNES, MARTES MIERCOLES, JUEVES, VIERNES);
LA
VAR
D: DIAS;
BAN: COLOR;
FI
D := MARTES;
BAN := BLANCO;
D:= SABADO;
Página 35
OM
Son los tipos de datos cuyos valores estén dentro de ciertos límites: LIMITE INFE-
RIOR y LIMITE SUPERIOR.-
La forma general de definición es:
.C
TYPE T = mín .. máx ;
DD
siendo mín y máx, constantes.-
EJEMPLO:
Si declaramos:
LA
TYPE
NUM = 20 .. 100;
VAR
FI
EDAD: NUM;
EDAD := 50;
EDAD := 150;
Página 36
OM
Hasta ahora hemos visto tipos de datos simples. Algunas veces es necesario
almacenar y referenciar variables como un grupo. Estas estructuras de datos nos
permiten escribir programas para manipular datos más fácilmente.-
.C
Un ARRAY es un grupo de elementos a los que se les da un nombre común.-
Se accede a cada elemento por su posición dentro del grupo.-
Todos los elementos de un ARRAY deben ser del mismo tipo.-
DD
4-3-1. ARRAYS UNIDIMENSIONALES (Vectores):
LA
Página 37
EJEMPLOS:
a) VAR
NOM: ARRAY [1 .. 20] OF CHAR;
CONT: ARRAY ['A' .. 'P'] OF INTEGER;
b) TYPE
OM
COD = 20..60;
VAR
IMP: ARRAY [COD] OF REAL;
c) TYPE
.C
COLOR = (ROJO, VERDE, BLANCO, NEGRO, AZUL);
VAR
DD
BANDERA; ARRAY [1..30] OF COLOR;
esto, debemos declarar los dos arrays de "igual" manera, y escribir la sentencia de
asignación con los nombres de los arrays solamente sin índice:
NUM1 := NUM2;
PASCAL NO PERMITE:
a) REALIZAR OPERACIONES CON ARRAYS COMPLETOS TAL COMO:
SUM := NUM1 + NUM2;
Página 38
EJEMPLO:
OM
No se sabe cuántas ventas se han realizado por lo que un NRO. DE VENDEDOR
igual a cero indica fin de datos.- Los vendedores están numerados del 1 al 15.
Se desea obtener el total vendido por cada vendedor.
.C
a) DIAGRAMA DE CHAPIN:
DD
FOR I := 1 TO 15 DO
TOT [I] := 0
NV E
WHILE NV <> 0 DO
LA
E
IMP
TOT[NV] := TOT[NV] + IMP
NV E
FI
FOR I := 1 TO 15 DO
S
I , TOT[I]
b) PROGRAMA PASCAL:
PROGRAM VENTAS (INPUT, OUTPUT);
VAR
TOT : ARRAY [1..15] OF REAL;
NV, I : INTEGER;
IMP : REAL;
BEGIN
Página 39
FOR I := 1 TO 15 DO
TOT[I] := 0;
WRITE ('INGRESE NRO VENDEDOR');
READLN (NV);
WHILE NV <> 0 DO
BEGIN
OM
WRITE ('INGRESE IMPORTE');
READLN (IMP);
TOT[NV] := TOT[NV] + IMP;
WRITE ('INGRESE NRO. VENDEDOR');
READLN (NV)
.C
END;
FOR I := 1 TO 15 DO
DD
WRITELN ('EL VENDEDOR NRO.':25, I:3, 'VENDIO $ ', TOT[I]:5:2)
END.
LA
sin ser el más rápido en algunos casos, es uno de los más fáciles de entender.-
Este método consiste en comparar cada uno de los elementos del arreglo con todos
EJEMPLO:
Página 40
a) DIAGRAMA DE CHAPIN:
FOR I := 1 TO 20 DO
NUM[I] E
FOR I := 1 TO 19 DO
FOR J := I+1 TO 20 DO
OM
NUM[I] < NUM[J]
V F
AUX:=NUM[I]
NUM[I]:= NUM[J]
NUM[J]:=AUX
.C
FOR I := 1 TO 20 DO
NUM[I] S
DD
b) PROGRAMA PASCAL:
PROGRAM ORDEN (INPUT, OUTPUT);
LA
VAR
I, J, AUX : INTEGER;
NUM : ARRAY [1..20] OF INTEGER;
BEGIN
FI
FOR I := 1 TO 20 DO
BEGIN
WRITE ('INGRESE NRO.');
READLN (NUM[I])
END;
FOR I := 1 TO 19 DO
FOR J := I+1 TO 20 DO
IF NUM[I] < NUM[J]
THEN
BEGIN
Página 41
AUX := NUM[I];
NUM[I] := NUM[J];
NUM[J] := AUX
END;
FOR I := 1 TO 20 DO
WRITE (NUM[I],' ')
OM
END.
.C
que buscar un valor dentro del mismo, la forma más rápida para hacerlo es por medio
de la Búsqueda Dicotómica.-
DD
Para explicar este método, supongamos que los elementos del arreglo están
ordenados en forma creciente procediéndose entonces, de la siguiente manera:
Primero se fijan los extremos del intervalo de búsqueda, que serán las posiciones
LA
El proceso se repite hasta que se encuentra el valor a buscar, o bien hasta que no
haya más intervalo de búsqueda, lo que significará que el valor buscado no se
encuentra en el arreglo.-
EJEMPLO:
Página 42
a) DIAGRAMA DE CHAPIN:
FOR I := 1 TO 30 DO
E
VEC[I]
E
N
INF := 1 ; SUP := 30 ; MED := 15
OM
WHILE (INF<=SUP) AND (N<>VEC[MED]) DO
N<VEC[MED]
V F
.C
V N<>VEC[MED] F
DD
S S
b) PROGRAMA PASCAL:
LA
BEGIN
FOR I := 1 TO 30 DO
BEGIN
Página 43
MED := 15;
WHILE (INF<=SUP) AND (N<>VEC[MED]) DO
BEGIN
IF N<VEC[MED] THEN SUP:= MED - 1
ELSE INF:= MED + 1;
MED := (INF + SUP) DIV 2
OM
END;
IF N <> VEC[MED]
THEN WRITE ('EL VALOR', N, 'NO FUE ENCONTRADO')
ELSE WRITE ('EL VALOR',N,'SE ENCUENTRA EN LA POSICION',
MED)
.C
END. DD
4-3-1-3. INTERCALACION DE ARRAYS ORDENADOS:
Para explicar este método, supongamos tener dos arrays ordenados en forma
creciente cuyas dimensiones son n y m respectivamente, se obtendrá un nuevo array
FI
Si dos elementos comparados son iguales, se coloca uno y luego el otro en el nuevo
array y se pasan a comparar los elementos siguientes de cada uno de los dos arrays
dados.-
Página 44
El proceso continúa hasta que todos los elementos del primero o segundo array
hayan sido utilizados, en cuyo caso los elementos restantes se agregan como están en
el nuevo array.-
EJEMPLO:
Ingresar 10 números enteros ordenados en forma creciente en un array; luego 13
números enteros, también ordenados en forma creciente en otro array.-
OM
Obtener por intercalación, un tercer array ordenado en forma creciente, y luego
mostrarlo.-
a) DIAGRAMA DE CHAPIN:
FOR I := 1 TO 10 DO
.C
E
V1 [I]
FOR J := 1 TO 13 DO
DD
V2 [J] E
I := 1 ; J := 1 ; K := 1
WHILE (I <= 10) AND (J <= 13) DO
LA
V V1[I] = V2[J] F
K := K + 1
V I > 10 F
FOR L := J TO 13 DO FOR L := I TO 10 DO
V3[K] := V2[L] V3[K] := V1[L]
K := K + 1 K := K + 1
FOR I := 1 TO 23 DO
S
V3[I]
Página 45
b) PROGRAMA PASCAL:
PROGRAM MERGE (INPUT, OUTPUT);
VAR
I, J, K, L : INTEGER;
V1 : ARRAY [1..10] OF INTEGER;
V2 : ARRAY [1..13] OF INTEGER;
OM
V3 : ARRAY [1..23] OF INTEGER;
BEGIN
FOR I := 1 TO 10 DO
BEGIN
WRITE ('INGRESE NRO.');
.C
READLN (V1[I])
END;
DD
FOR J := 1 TO 13 DO
BEGIN
WRITE ('INGRESE NRO.');
READLN (V2[J])
LA
END;
I := 1; J := 1; K := 1;
WHILE ( I<= 10 ) AND ( J <= 13 ) DO
BEGIN
FI
I := I + 1
END
ELSE IF V1[I] = V2[J]
THEN BEGIN
V3[K] := V1[I];
I := I + 1;
K := K + 1;
Página 46
V3[K] := V2[J];
J := J + 1
END
ELSE BEGIN
V3[K] := V2[J];
J := J + 1
OM
END;
K := K + 1
END;
IF I > 10
THEN FOR L := J TO 13 DO
.C
BEGIN
V3[K] := V2[L];
DD
K := K + 1
END
ELSE FOR L := I TO 10 DO
BEGIN
LA
V3[K] := V1[L];
K := K + 1
END;
WRITELN (' ARREGLO ORDENADO ');
FI
FOR I := 1 TO 23 DO
WRITE (V3[I], ' ')
END.
Página 47
VAR
nombre: ARRAY [índ inf .. índ sup , índ inf .. índ sup] OF tipo;
OM
Un elemento particular del ARRAY se representa por:
EJEMPLO:
.C
Se tienen los siguientes datos de 30 alumnos de primer año:
DD
NRO. ALUMNO (entero)
NOTA 1, NOTA 2, NOTA 3, NOTA 4 (enteras)
a) DIAGRAMA DE CHAPIN:
FOR I := 1 TO 30 DO
FI
FOR J := 1 TO 5 DO
E
AL [I,J]
MAY := 0
FOR I := 1 TO 30 DO
FOR J := 2 TO 5 DO
V AL [I,J] > MAY F
MAY :=AL[I,J]
NRO :=AL[I,1]
PARC := J - 1
S
MAY , NRO , PARC
Página 48
b) PROGRAMA PASCAL:
PROGRAM PARCIAL (INPUT, OUTPUT);
VAR
I, J, MAY, NRO, PARC : INTEGER;
AL : ARRAY [1..30, 1..5] OF INTEGER;
BEGIN
OM
FOR I := 1 TO 30 DO
BEGIN
WRITE ('INGRESE NRO. DEL ALUMNO Y LAS 4 NOTAS');
FOR J := 1 TO 5 DO
READ (AL [I,J]);
.C
WRITELN
END;
DD
MAY := 0;
FOR I := 1 TO 30 DO
FOR J := 2 TO 5 DO
IF AL [I,J] > MAY
LA
THEN BEGIN
MAY := AL [I,J];
NRO := AL [I,1];
PARC := J - 1
FI
END;
WRITE ('LA MAYOR NOTA: ',MAY,' CORRESPONDE AL ALUMNO: ',
NRO, 'EN EL PARCIAL NUMERO: ',PARC)
END.
Tenemos que tener en cuenta que los datos que se cargan en un arreglo
bidimensional responden, por fila o por columna, a una persona, a una agencia, a una
comisión, etc.; por lo tanto, lo mismo que en una matriz matemática, no podemos
Página 49
cambiar un elemento por otro de lugar; lo que sí podemos hacer es cambiar una fila o
una columna por otra. Luego, un ordenamiento en un arreglo bidimensional tiene
sentido, si se pide que se ordene el mismo de manera tal que los elementos de una fila
o columna queden ordenados en forma creciente o decreciente.-
EJEMPLO:
OM
Se tienen los mismos datos del ejercicio anterior.
Se desea un listado de los mismos ordenados en forma creciente por NRO. DE
ALUMNO.-
a) DIAGRAMA DE CHAPIN:
.C
DD
FOR I := 1 TO 30 DO
FOR J := 1 TO 5 DO
E
AL [I,J]
FOR I := 1 TO 29 DO
LA
FOR J := I+1 TO 30 DO
V AL[I,1] > AL[J,1] F
FOR K:= 1 TO 5 DO
AUX := AL[I,K]
FI
AL[I,K]:=AL[J,K]
AL[J,K] := AUX
FOR I := 1 TO 30 DO
FOR J := 1 TO 5 DO
S
AL [I,J]
b) PROGRAMA PASCAL:
PROGRAM LISTADO (INPUT, OUTPUT);
VAR
I, J, K, AUX : INTEGER;
Página 50
BEGIN
WRITELN ('INGRESE EL NRO Y 4 NOTAS DE LOS 30 ALUMNOS');
FOR I := 1 TO 30 DO
BEGIN
OM
FOR J := 1 TO 5 DO
READ ( AL[I,J]);
WRITELN
END;
FOR I := 1 TO 29 DO
.C
FOR J := I+1 TO 30 DO
IF AL[I,1] > AL[J,1]
DD
THEN
FOR K := 1 TO 5 DO
BEGIN
AUX := AL[I,K];
LA
AL[I,K] := AL[J,K];
AL[J,K] := AUX
END;
WRITELN (' ALUMNO NOTA 1 NOTA 2 NOTA 3 NOTA 4');
FI
FOR I := 1 TO 30 DO
BEGIN
FOR J := 1 TO 5 DO
Página 51
EJEMPLO:
OM
Se tiene los datos de los 30 alumnos del ejercicio anterior ya ordenados en forma
creciente por NRO DE ALUMNO.
.C
notas de los 4 parciales; sino exhibir cartel aclaratorio.-
a) DIAGRAMA DE CHAPIN:
DD
FOR I := 1 TO 30 DO
FOR J := 1 TO 5 DO
E
LA
AL [I,J]
E
NRO
INF := 1 ; SUP := 30 ; MED := 15
FI
S
'ERROR EN FOR I:= 1 TO 5 DO
NRO ALUMNO' AL[MED,I] S
Página 52
b) PROGRAMA PASCAL:
PROGRAM BUSQUEDA (INPUT, OUTPUT);
VAR
I, J, INF, SUP, MED, NRO : INTEGER;
AL : ARRAY [1..30, 1..5] OF INTEGER;
BEGIN
OM
WRITE ('INGRESE NRO Y 4 NOTAS DE LOS 30 ALUMNOS');
FOR I := 1 TO 30 DO
BEGIN
FOR J := 1 TO 5 DO
READ (AL[I,J]); WRITELN
.C
END;
WRITE ('INGRESE NRO. DEL ALUMNO A BUSCAR');
DD
READLN (NRO);
INF := 1; SUP := 30; MED := 15;
WHILE INF <= SUP AND NRO <> AL[MED,1] DO
BEGIN
LA
END;
IF NRO <> AL [MED,1]
THEN WRITE (' ERROR EN EL NRO. DE ALUMNO')
ELSE
BEGIN
WRITELN (' ALUMNO NOTA 1 NOTA 2 NOTA 3 NOTA 4');
FOR I := 1 TO 5 DO
WRITE (AL[MED,I]
END
END.
Página 53
UNIDAD Nº5
SUBPROGRAMAS
5 -1. INTRODUCCION
Es frecuente en programación que un grupo de sentencias deba repetirse varias veces
OM
con distintos datos, o sea que debamos escribirlas varias veces. PASCAL permite
escribirlas una sola vez bajo la forma de subprogramas y usarlas las veces que sea
necesario.-
.C
Hay dos tipos de subprogramas: FUNCIONES y PROCEDIMIENTOS.-
DD
5-1-1. FUNCIONES:
Una función PASCAL es un grupo de sentencias dentro de un programa que forman
LA
Después que las sentencias han sido ejecutadas, el control vuelve a la sentencia en
Página 54
Esta invocación debe ser asignada a una variable, formar parte de una expresión
asignada a una variable, puede estar en un write o en un if.-
OM
Begin
sentencias ejecutables
.C
End;
donde nombre es el nombre de la función; declaración de parámetros, contiene los
parámetros ( cada uno de los cuales debe ser un identificador válido en PASCAL) de
DD
la función y los tipos de datos que se asocian con cada uno de ellos; y tipo es el
tipo de resultado que devuelve la función.-
Página 55
EJEMPLO:
n
Escribir un programa que calcule la expresión : Σ xi
OM
i=0
.C
Exhibir: x, n y el resultado de la sumatoria.-
DD
a) DIAGRAMA DE CHAPIN:
E
N, X P:= 1
SUMA:= 0 FOR E:= 1 TO EXP DO
FOR I:= 0 TO N DO P:= P * BASE
FI
b) PROGRAMA PASCAL:
PROGRAM SUMATORI (INPUT, OUTPUT);
VAR
N, I: INTEGER;
X, SUMA: REAL;
FUNCTION POTEN (BASE: REAL; EXP: INTEGER) : REAL;
Página 56
VAR
P: REAL;
E: INTEGER;
BEGIN
P:= 1;
FOR E:= 1 TO EXP DO
OM
P:= P * BASE;
POTEN:= P
END;
BEGIN
WRITE ('INGRESE EXTREMO SUMATORIA Y NRO.');
.C
READLN (N, X);
SUMA:= 0;
DD
FOR I:= 0 TO N DO
SUMA:= SUMA + POTEN(X, I);
WRITELN ('LA SUMATORIA DE LOS TERMINOS DE BASE',X:3:2);
WRITELN ('DESDE POTENCIA 0 A POTENCIA', N);
LA
5-1-2- PROCEDIMIENTOS:
Los procedimientos son subprogramas similares a las funciones pero con dos
diferencias importantes.
pero esta debe estar sola, es decir no puede estar formando parte de expresiones, ni
asignada a una variable, ni en un write, ni en un if. (primer diferencia)
Página 57
OM
La definición de un procedimiento en PASCAL es muy similar a la de una función,
salvo algunas diferencias. Primero, la palabra clave es PROCEDURE en lugar de
FUNCTION en la cabecera, y segundo que no contiene ningún atributo detrás de las
declaraciones de los parámetros puesto que no vuelve ningún valor en el nombre del
procedimiento.-
.C
Una definición de procedimiento tiene la forma:
PROCEDURE nombre (declaración de parámetros);
DD
declaración de identificadores locales
Begin
LA
sentencias ejecutables
End;
FI
Tanto en procedimientos como en funciones, como ya dijimos, las variables que son
utilizadas por ellos van declaradas en la parte de declaración de variables locales y se
las denomina de esa manera.-
Página 58
OM
Esta llamada puede ser:
.C
5-2-1. LLAMADA POR VALOR:
DD
Es la asignación del valor del argumento a su parámetro. El parámetro es entonces
una variable independiente, de nueva creación que recibe el valor del argumento al
comienzo de la ejecución del subprograma.
LA
Página 59
mas bien produce el paso de la dirección de memoria donde se almacena el valor del
argumento.-
En este tipo de llamada, los parámetros van precedidos por la palabra VAR.-
OM
EJEMPLO:
.C
a) DIAGRAMA DE CHAPIN:
DD
PROG. PPAL. PROCEDURE POTEN (BASE:real;
EXP:integer; var P:real)
LA
E
X,N P:= 1
SUMA:= 0 FOR E:= 1 TO EXP DO
FOR I:= O TO N DO
FI
S
X, N, SUMA
b) PROGRAMA PASCAL:
PROGRAM SUMATORI (INPUT, OUTPUT);
VAR
N, I: INTEGER;
X, SUMA, P: REAL;
Página 60
OM
P:= P * BASE
END;
BEGIN
WRITE ('INGRESE EXTREMO SUMATORIA Y NRO.');
READLN (N, X);
.C
SUMA:= 0;
FOR I:= 0 TO N DO
DD
BEGIN
POTEN (X, I, P);
SUMA:= SUMA + P
END;
LA
5-3- RECURSIVIDAD
Página 61
function factorial(numero:integer):integer;
begin
if numero = 0 then
factorial := 1
else
factorial := numero * factorial(numero-1)
OM
end;
Si numero = 4, la función realiza los siguientes pasos :
.C
DD
LA
FI
Página 62
OM
Otro ejemplo de procedimiento recursivo es el siguiente:
Supóngase que una persona se mete a una piscina cuya profundidad es de 5 metros.
Su intención es tocar el fondo de la piscina y después salir a la superficie. Tanto en el
descenso como en el ascenso se le va indicando la distancia desde la superficie (a
cada metro).
.C
Program Piscina;
Const
DD
prof_max = 5;
Var
profundidad:integer;
procedure zambullida(Var profun :integer);
LA
begin
WriteLn('BAJA 1 PROFUNDIDAD = ',profun);
profun := profun + 1;
FI
profun := profun - 1;
WriteLn('SUBE 1 PROFUNDIDAD = ', profun-1)
end;
begin
profundidad := 1;
zambullida(profundidad)
end.
Página 63
UNIDAD Nº 6
6-1. REGISTROS:
OM
Hasta ahora, la única estructura de datos que hemos visto son los arrays. Los
registros son similares a los arrays pues también representan un grupo de elementos
con un nombre común. Sin embargo, mientras que los elementos de un array deben
ser todos del mismo tipo, los elementos de un registro pueden ser de distintos tipos de
datos.
.C
O sea, los registros son un tipo de datos estructurado (ó variable compuesta), con
un número fijo de componentes (no necesariamente del mismo tipo) a las que se
accede por el nombre, no por un subíndice.-
DD
La declaración en Pascal de este tipo de datos es:
LA
donde:
nombre es un identificador válido en Pascal
Página 64
Ejemplo:
TYPE ALUMNO = RECORD
NOMBRE: STRING [20] ;
LEGAJO: REAL;
DNI: REAL;
NOTAS: ARRAY (1..6) OF INTEGER;
OM
ACURSA: INTEGER
END;
VAR
ESTUD: ALUMNO;
.C
Para referirnos a un campo del registro especificamos el nombre de la variable y el
nombre del campo separados por un punto.
DD
Ejemplo: [Link]
LA
FOR I:= 1 TO 6 DO
WRITE ([Link][I]);
Ejemplo:
TYPE NOMB = ARRAY [1..20] OF CHAR;
EMPLE = RECORD
Página 65
NOMBRE : NOMB;
DIRECC : RECORD
CALLE : NOMB;
NUM : INTEGER;
PISO : INTEGER;
DPTO: CHAR
OM
END;
SUELDO : REAL
END;
VAR
EMPLEADO : EMPLE;
.C
Un elemento particular de esta variable sería:
DD
[Link]
LA
Así:
WRITE (PERSONAL(4).SUELDO);
Nos mostraría el sueldo del empleado que está en la posición 4
Página 66
EJERCICIO:
Un negocio de ventas al por mayor y al por menor, comercializa 100 productos
distintos.-
El comerciante desea actualizar la lista de precios al público y de stock de los
productos; para ello se ingresan, para cada uno de ellos, los siguientes datos:
- CODIGO (entero)
- DESCRIPCION (hasta 20 caracteres)
OM
- CANTIDAD EN STOCK
- CANTIDAD MINIMA REQUERIDA EN STOCK
- PRECIO POR UNIDAD (para ventas al por menor)
- PRECIO POR UNIDAD PARA MAS DE 20 UNIDADES (para ventas al por
mayor)
.C
- PRECIO POR UNIDAD PARA MAS DE 50 UNIDADES ( " " " " " )
DD
Estos datos, que están ordenados en forma creciente por código de producto, se
ingresarán por medio de un procedimiento.-
Luego se van ingresando los datos de los productos que tienen modificaciones (no
necesariamente los 100):
LA
Página 67
NOTA: La búsqueda del código a actualizar se hará por medio de una FUNCION
que devuelva la posición en donde se encuentra dicho código (suponer que siempre se
encontrará el mismo).-
a) Diagrama de Chapin:
PROGRAMA PRINCIPAL
OM
CARGA (PROD, N)
E
CART
WHILE CART <> 0 DO
COP, CA, COEF E
.C
POS:= BUSCA (PROD, CART, N)
PROD[POS].PUN:= PROD[POS].PUN * COEF
DD
PROD[POS].P20:= PROD[POS].PUN * 0.90
PROD[POS].P50:= PROD[POS].PUN * 0.85
COP = 'C'
LA
V F
PROD[POS].CANT:= PROD[POS].CANT:=
PRO[POS].CANT + CA PROD[POS].CANT - CA
CART E
FI
LISTA1 (PROD, N)
LISTA2 (PROD, N)
Página 68
INF:= 1 ; SUP:= N1
MED:= (INF + SUP) DIV 2
WHILE CO <> P[MED].COD DO
CO < P[MED].COD
V F
OM
SUP:= MED - 1 INF:= MED + 1
MED:= (INF + SUP) DIV 2
BUSCA:= MED
.C
DD
PROCEDURE LISTA1 (VAR P: PRODUCTO; N1: INTEGER)
FOR I := 1 TO N1 DO
S
P[I].COD, P[I].DES, P[I].CANT,
LA
FOR I := 1 TO N1 DO
P[I].CANT < P[I].CMIN
V F
S
P[I].COD
P[I].DES
S
P[I].CMIN - P[I].CANT
Página 69
Programa PASCAL:
PROGRAM STOCK (input, output);
CONST
N = 100;
TYPE
ARTI = RECORD
OM
COD, CANT, CMIN: INTEGER;
DES: STRING(20);
PUN, P20, P50: REAL
END;
PRODUCTO = ARRAY [1..N] OF ARTI;
.C
VAR
PROD: PRODUCTO;
DD
CART, CA, POS: INTEGER;
COP: CHAR;
COEF: REAL;
LA
BEGIN
FOR I := 1 TO N1 DO
BEGIN
WRITE ('INGRESE CODIGO');
READLN (P[I].COD);
WRITE ('INGRESE DESCRIPCION DEL ARTICULO');
READLN (P[I].DES);
WRITE ('INGRESE CANTIDAD');
READLN (P[I].CANT);
WRITE ('INGRESE CANT. MINIMA');
READLN (P[I].CMIN);
Página 70
OM
FUNCTION BUSCA (VAR P: PRODUCTO; CO, N1: INTEGER) :INTEGER;
VAR
INF, SUP, MED: INTEGER;
BEGIN
.C
INF:= 1 ; SUP:= N1 ;
MED:= (INF + SUP) DIV 2;
DD
WHILE (CO <> P[MED].COD) DO
BEGIN
IF CO < P[MED].COD
THEN SUP := MED - 1
LA
END;
VAR
I, C : INTEGER;
BEGIN
FOR I := 1 TO N1 DO
BEGIN
WRITE (P[I].COD);
WRITE (P[I].DES);
Página 71
WRITE (P[I].CANT);
WRITELN (P[I].PUN, P[I].P20, P[I].P50)
END
END;
OM
VAR
I, C: INTEGER;
BEGIN
FOR I:= 1 TO N1 DO
IF P[I].CANT < P[I].CMIN
.C
THEN
BEGIN
DD
WRITE (P[I].COD);
WRITE (P[I].DES[C]);
WRITELN (P[I].CMIN - P[I].CANT)
END
LA
END;
BEGIN
CARGA (PROD, N);
FI
BEGIN
WRITE ('INGRESE COD. OPERACION, CANT. Y COEF.');
READLN (COP, CA, COEF);
POS := BUSCA (PROD, CART, N);
PROD[POS].PUN := PROD[POS].PUN * COEF;
PROD[POS].P20 := PROD[POS].PUN * 0.9;
PROD[POS].P50 := PROD[POS].PUN * 0.85;
Página 72
IF COP = 'C'
THEN PROD[POS].CANT := PROD[POS].CANT + CA
ELSE PROD[POS].CANT := PROD[POS].CANT - CA;
WRITE ('INGRESE CODIGO ARTICULO');
READLN (CART)
END;
OM
LISTA1 (PROD, N);
LISTA2 (PROD, N)
END.
.C
DD
LA
FI
Página 73
UNIDAD Nº 7
ARCHIVOS
7-1- INTRODUCCION
OM
Hasta ahora hemos visto diferentes estructuras de datos que son definidas en un
algoritmo y ocupan memoria RAM, se utilizan en la ejecución y todos los valores
contenidos en ellas se pierden, a lo sumo, cuando el algoritmo finaliza.
.C
datos que permita guardar su información en soporte no volátil (disco, diskette, cinta,
zip), y de esta forma preservarlas aunque el programa finalice. Estas estructuras de
datos son conocidas además como estructuras de almacenamiento, y deben asociarse
con un dispositivo de memoria auxiliar permanente donde archivar la información.
DD
Dichas estructuras se denominan archivos o ficheros.
7-2- ARCHIVOS
LA
Página 74
Antes de que el programa pueda operar sobre archivos, el sistema operativo debe
recibir instrucciones para hacer un enlace entre el nombre lógico que utilizará el
algoritmo y el archivo físico. Cuyo formato será, en líneas generales:
OM
Asignar_correspondencia (nombre_físico, nombre_lógico)
En Pascal:
.C
El nombre físico define exactamente el nombre con el que el sistema operativo
DD
encontrará al archivo dentro del almacenamiento secundario. En tanto, el nombre
lógico se corresponde con una variable definida en el algoritmo. Dicha variable debe
ser de tipo archivo.
ó:
Type archivo = file of tipo_de_datos;
Var archi: archivo;
7-3- BUFFERS
Se denomina buffer a una memoria intermedia entre un archivo y un programa,
donde los datos residen provisoriamente hasta ser almacenados definitivamente en
memoria secundaria o donde los datos residen una vez recuperados de dicha memoria
secundaria. Los buffers ocupan una zona de la memoria RAM de la computadora.
Página 75
Manejar buffers implica trabajar con grupos de datos en memoria RAM para que el
número de accesos al almacenamiento secundario se reduzca. Básicamente las
operaciones de lectura y escritura no se realizan directamente sobre la memoria
secundaria. Si esto fuera así, se necesitaría, ante cada uno de estas operaciones una
determinada cantidad de milisegundos para realizarla. Por lo tanto, estas operaciones
que se definen en los algoritmos, interactúan con un buffer, el cual al encontrarse en
memoria RAM agiliza el proceso.
OM
El sistema operativo de la computadora es el encargado de manipular los buffers.
Cuando un programa realiza una operación de lectura y en el buffer no hay
información para satisfacerla, se lee de memoria secundaria los datos para completar
nuevamente dicho buffer y así poder satisfacer el requerimiento. Algo similar ocurre
con la escritura, cuando se intenta escribir en un buffer y el mismo no tiene
capacidad, la información contenida es bajada o guerdada en memoria secundaria,
.C
una vez vacío el buffer puede tomar los datos definidos en la orden de escritura.
DD
7-4- OPERACIONES BASICAS SOBRE ARCHIVOS
Reset (nombre_lógico);
FI
Rewrite (nombre_lógico);
Página 76
7-4-2- CIERRE
Para efectuar el cierre explícito de un archivo y colocar la marca de fin de archivo:
Close (nombre_lógico);
OM
Para leer datos de un archivo:
.C
Write (nombre_lógico, variable);
DD
Donde variable es una variable cuyo tipo de dato debe corresponderse con la
definición del archivo.
LA
Cada una de estas instrucciones opera sobre la posición actual del archivo, y luego
avanza a la posición siguiente.
FI
Para recorrer un archivo desde el primer elemento hasta el final, es necesario contar
con operación que detecte el fin de dicho archivo:
Eof (nombre_lógico);
Esta función devuelve un valor booleano que será True si la posición corriente
dentro del archivo referencia a la marca de fin, y False, en caso contrario.
Página 77
Filesize (nombre_lógico);
OM
7-5-3- POSICIÓN ACTUAL
A veces necesitamos operar en otros procesos con la posición actual del archivo,
para lo cual debemos poder determinarla:
.C
Filepos (nombre_lógico);
DD
Esta función devuelve un número entero que corresponde a la posición actual del
apuntador del archivo.
Esta función permite llegar a un elemento particular del archivo. Donde posición es
un número entero menor a la cantidad de elementos del archivo.
Página 78
El acceso secuencial permite acceder a los elementos o registros uno tras otro y en
el orden físico en que están guardados. El acceso directo, en cambio, permite obtener
un registro determinado sin necesidad de haber accedido a los anteriores.
OM
- Secuencial Indizado
.C
Un archivo secuencial consiste de un conjunto de registros almacenados
consecutivamente de manera que para acceder al registro n-ésimo se debe,
previamente, acceder a los n-1 registros anteriores. Los registros se graban en forma
DD
consecutiva, a medida que se ingresan, y se recuperan en el mismo orden.
recuperan accediendo por su posición dentro del archivo. Por lo tanto es posible
acceder al n-ésimo lugar sin haber accedido a los n-1 registros anteriores. Esta
organización presenta la ventaja que se puede obtener cualquier elemento del archivo
en cualquier orden, siendo muy eficientes en cuanto a tiempo de acceso necesario
para recuperar la información; pero presenta el inconveniente de tener que determinar
FI
un acceso pseudo directo a los registros del archivo. Un ejemplo de esta organización
es la guía telefónica, en la que se puede acceder por letra, y dentro de cada página
existe una indicación de apellido de comienzo y apellido de fin dentro de la hoja; de
esta forma se puede acotar el espacio de búsqueda de un determinado teléfono dentro
de la guía, haciendo referencia mucho más rápidamente a la hoja donde se encuentra
el dato. Los archivos organizados con esta técnica tienen la ventaja de tener un acceso
mucho más rápido que los secuenciales, pero necesitan más espacio para mantener las
estructuras de los índices. Estas estructuras se denominan directorios del archivo.
Página 79
OM
Los archivos de texto se dividen en líneas formadas por conjuntos de caracteres,
separadas unas de otras por caracteres de control especiales. En el código ASCII, la
marca separadora de líneas está constituida por la combinación de caracteres CR/LF
(retorno de carro/avance de línea).
.C
En este tipo de archivos también se utiliza la variable booleana Eoln (f) para indicar
si el buffer se encuentra o no sobre la marca separadora de líneas. En caso afirmativo,
DD
toma el valor true. En algunas implementaciones de Pascal, el contenido del buffer
cuando se encuentra en la marca de fin de línea es un carácter en blanco (#32), por lo
que debe tenerse esto en cuenta, por ejemplo, si hacemos una estadística de caracteres
de un archivo de texto.
LA
Las funciones Eoln y Eof se refieren al fichero Input a menos que se especifique
un fichero o archivo diferente, en ese caso sería Eoln(nombre_lógico) y
Eof(nombre_lógico).
FI
7-8- EJERCICIO
Escribir un procedimiento que actualice los salarios de los empleados de una
Página 80
Salario: real
End;
Empleados = file of registro;
.
.
.
OM
Procedure Actualizar (var Emp: Empleados); {se recibe el archivo como parámetro
por referencia}
Var E: registro;
Begin
Reset (Emp); {el archivo contiene datos, se abre de E/S}
.C
While not eof (Emp) do {se evalúa si no se llegó a la marca de fin de archivo}
Begin
Read (Emp, E);
DD
{se obtiene el elemento del archivo}
[Link] := [Link] * 1.1; {se incrementa el salario}
Seek (Emp, filepos (Emp) – 1); {luego de la lectura la posición corriente del
archivo avanza una posición, para hacer la
LA
End;
Página 81