ibd curso 2007 clase 2. unlp - facultad de informáticaibd - clase 2 2 archivos – operaciones...

34
IBD Curso 2007 Clase 2

Upload: olalla-avila

Post on 16-Feb-2015

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

IBD Curso 2007

Clase 2

Page 2: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 22

Archivos – Operaciones Básicas

Utilizaremos la notación Pascal

Declaración de archivosVar archivo: file

of Tipo_de_dato;

Otra definición Type archivo: file

of Tipo_de_dato;

Var arch: archivo

EjemplosType emple = record

nombre: string [20];

direccion: string [40];

edad: integer;

end;

numero = file of integer;

empleado = file of emple;

Var arch_num: numero;

Var arch_emp: empleado,

Page 3: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 23

Archivos – Operaciones Básicas

Relación con el sistema operativo Se tiene que establecer la

correspondencia entre el nombre físico y nombre lógicoAssign ( nombre_lógico,

nombre_físico)

EjemploProgram archivos;…Type emple = record nombre: string [20]; direccion: string [40]; edad: integer; end; numero = file of integer; empleado = file of emple;Var arch_num:file of numero;Var arch_emp:file of empleado;…Begin … Assign( arch_num, ‘pepe.dat’ ) Assign( arch_emp, ‘pipo.dat’ ) …End;

Page 4: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 24

Archivos – Operaciones Básicas

Apertura y Creación de archivos De solo escritura

(creación ) Rewrite(nombre_logico);

De lectura/escritura

Reset(nombre_logico);

• Nombre lógico representa una variable de tipo archivo sobre la que se realizó la asignación.

Cierre de archivos Esta instrucción

indica que no se va a trabajar más con el archivo. Significa poner una marca de EOF (end of file) al final del mismo.

Close(nombre_logico);

Page 5: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 25

Archivos – Operaciones Básicas

Lectura y escritura de un archivo Estas operaciones

leen y/o escriben sobre los buffers relacionados a los archivos

No se realizan directamente sobre el Disco Rígido

Read(nombre_logico, variable);

Write(nombre_logico, variable);

En ambos casos la variable debe ser del mismo tipo que los elementos que se declararon como parte del archivo

Page 6: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 26

Archivos – Operaciones Básicas

Ejemplo de creación de un archivo

Program Generar_Archivo; type archivo = file of integer;

{definición del tipo de dato para el archivo }

var arc_logico: archivo; {variable que define el nombre lógico del archivo}

nro: integer; {nro será utilizada para obtener

la información de teclado} arc_fisico: string[12];

{utilizada para obtener el nombre físico del archivo desde teclado}

begin write( 'Ingrese el nombre del archivo:' ); read( arc_fisico ); {se obtiene el nombre del archivo} assign( arc_logico, arc_fisico ); rewrite( arc_logico ); {se crea

el archivo}

read( nro ); {se obtiene de teclado el primer valor} while (nro <> 0)do

begin write( arc_logico, nro ); {se escribe en el archivo cada número} read( nro ); end; close( arc_logico ); {se cierra el archivo abierto oportu- namente con la instrucción rewrite} end.

Page 7: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 27

Archivos – Operaciones adicionales

Funciones Fin de archivo

• Como trabaja?

• Hay que preguntar primero!!!

EOF(nombre_logico);

Tamaño del archivo (cant. de

registros)

FileSize(nombre_logico);

Posición (actual) dentro del

archivo

FilePos(nombre_logico);

Proceso Ir a una posición del

archivoSeek(nombre_logico,posición);

La posición se cuenta siempre desde el comienzo del archivo

El primer lugar es el cero.

Por lo tanto, posición varía de 0 a cant. reg.-1

Page 8: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 28

Archivos - Ejemplo

Proceso que presenta en pantalla el archivo generado anteriormente

Procedure Recorrido(var arc_logico: archivo ); var nro: integer; {para leer elemento del archivo} begin reset(arc_logico); {el archivo está creado, para operar con el mismo debe abrirse como de lect/escr}

while not eof( arc_logico) do begin read( arc_logico, nro ); {se obtiene elemento desde archivo} write( nro ); {se presenta cada valor en pantalla} end; close( arc_logico ); end;

Page 9: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 29

Archivos - Algorítmica Clásica

Operaciones usuales a resolver utilizando archivos Modificar el contenido actual del mismo Agregar nuevos elementos Actualizar un archivo maestro con uno o

varios archivos detalles Corte de control Merge de varios archivos

Page 10: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 210

Archivos - Modificación

Este caso involucra un archivo de datos previamente generado y consiste en cambiar sus datos.

El archivo debe ser recorrido desde su primer elemento y hasta el último, siguiendo un procesamiento secuencial

Page 11: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 211

Archivos - Modificación

{declaración de los tipos de datos necesarios para el problema. Esta declaración se hace efectiva en el programa principal que tiene al proceso Actualizar como uno de sus módulos}

Type registro = record Nombre: string[20]; Direccion: string[20]; Salario: real; End; Empleados = file of registro;......

Procedure actualizar (Var Emp:empleados); {se recibe el archivo como parámetro

por referencia}

var E: registro;

begin

Reset( Emp );

while not eof( Emp ) do

begin

Read( Emp, E);

E.salario:=E.salario * 1.1;

Seek( Emp,filepos(Emp) -1 );

Write( Emp, E );

end;

close( Emp );

end;

Page 12: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 212

Archivos – Agregar datos

Se procesa un solo archivo

Ya tiene información

Se le incorporan datos nuevos

El proceso muestra como se hace

Procedure agregar (Var Emp:

empleados);

var E: registro;

begin

reset( Emp );

seek( Emp, filesize(Emp));

leer( E );

While E.nombre <> ' ' do

begin

write( Emp, E );

leer( E );

end;

close( Emp );

end;

Page 13: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 213

Archivos – Actualización Maestro Detalle Este problema

involucra utilizar al mismo tiempo varios archivos de datos. Se denomina maestro al

archivo que resume un determinado conjunto de datos.

Se denomina detalle al que agrupa información que se utilizará para modificar el contenido del archivo maestro.

En general• Un maestro• N detalles.

Consideraciones del proceso (precondiciones) Ambos archivos (maes-tro y

detalle) están orde-nados por el mismo criterio

En el archivo detalle solo aparecen emplea-dos que existen en el ar-chivo maestro

Cada empleado del ar-chivo maestro a lo sumo puede aparecer una vez en el archivo detalle

Page 14: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 214

Archivos – Un Maestro Un detalle – ejemplo

program actualizar; type emp = record nombre: string[30]; direccion: string[30]; cht: integer; {cant horas

trabajadas} end; e_diario = record nombre: string[30]; cht: integer; end; detalle = file of e_diario;

{ archivo que contiene la información diaria } maestro = file of emp; { archivo que contiene la información completa } var regm: emp; regd: e_diario; mae1: maestro; det1: detalle;

begin assign (mae1, 'maestro'); assign (det1, 'detalle'); {proceso principal} reset (mae1); reset (det1); while (not eof(det1)) do begin read(mae1, regm); read(det1,regd); while (regm.nombre <> regd.nombre) do read (mae1,regm); regm.cht := regm.cht + regd.cht; seek (mae1, filepos(mae1)-1); write(mae1,regm); end;

close(det1) close(mae1)

end.

Page 15: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 215

Archivos – Un Maestro Un detalle – ejemplo Precondiciones del ejemplo

Ambos archivos (maestro y detalle) están ordenados por código del producto)

En el archivo detalle solo aparecen productos que existen en el archivo maestro

Cada producto del maestro puede ser, a lo largo del día, vendido más de una vez, por lo tanto, en el archivo detalle pueden existir varios registros correspondientes al mismo producto

Page 16: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 216

Archivos – Un Maestro Un detalle – ejemplo

program actualizar; const valoralto='9999'; type str4 = string[4]; prod = record cod: str4; descripcion: string[30]; pu: real; cant: integer; end; v_prod = record cod: str4; cant_vendida: integer; end; detalle = file of v_prod; maestro = file of prod; var regm: prod; regd: v_prod; mae1: maestro; det1: detalle; total: integer; aux: str4;

procedure leer (var archivo:detalle; var dato:v_prod);

begin if (not eof(archivo)) then read (archivo,dato) else dato.cod:= valoralto; end;begin assign (mae1, 'maestro'); assign (det1, 'detalle'); {proceso principal} reset (mae1); reset (det1); read(mae1,regm); leer(det1,regd); {se procesan todos los registros del archivo det1}

Page 17: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 217

Archivos – Un Maestro Un detalle – ejemplo

while (regd.cod <> valoralto) do begin aux := regd.cod; total := 0; {se procesan códigos iguales} while (aux = regd.cod ) do begin

total:=total + regd.cant_vendida; leer(det1,regd); end;

{se busca en el maestro el registro} while (regm.cod <> aux) do read (mae1,regm);

{se modifica el stock del producto} regm.cant := regm.cant– total; {reubica el puntero} seek (mae1, filepos(mae1)-1); write(mae1,regm); if (not eof (mae1)) then read(mae1,regm); end;

{ver resultados} reset (mae1); while (not eof(mae1)) do begin; read (mae1, regm); writeln(regm.cod,

regm.cant); end; end.

Page 18: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 218

Archivos – Un Maestro N detalle – ejemplo

El problema siguiente generaliza aún más el problema anterior

El maestro se actualiza con tres archivos detalles

Los archivos detalle están ordenados de menor a mayor

program Cap11_31; const valoralto='9999'; type str4 = string[4]; prod = record cod: str4; descripcion: string[30]; pu: real; cant: integer; end; v_prod = record cod : str4; cant_vendida: integer; end; detalle = file of v_prod; maestro = file of prod;

Page 19: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 219

Archivos – Un Maestro N detalle – ejemplo

var regm: prod; min, regd1, regd2,regd3: v_prod; mae1: maestro; det1,det2,det3: detalle; aux: str4;

procedure leer (var archivo: detalle; var dato:v_prod); begin if (not eof(archivo)) then read (archivo,dato) else dato.cod := valoralto; end;

procedure minimo (var r1,r2,r3: v_prod; var min:v_prod); begin if (r1.cod<=r2.cod) and (r1.cod<=r3.cod) then begin min := r1; leer(det1,r1) end else if (r2.cod<=r3.cod) then begin min := r2; leer(det2,r2) end else begin min := r3; leer(det3,r3) end; end;

Page 20: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 220

Archivos – Un Maestro N detalle – ejemplo

begin assign (mae1, 'maestro'); assign (det1, 'detalle1'); assign (det2, 'detalle2'); assign (det3, 'detalle3'); {proceso principal} reset (mae1); reset (det1); reset (det2); reset (det3); read(mae1,regm); leer(det1, regd1); leer(det2, regd2); leer(det3, regd3); minimo(regd1,regd2,regd3,min);

while (min.cod <> valoralto) do begin while (regm.cod <> min.cod) do read(mae1,regm); aux := min.cod; while (aux = min.cod ) do begin regm.cant:=regm.cant-min.cantvendida; minimo(regd1,regd2,regd3,min); end; seek (mae1, filepos(mae1)-1); write(mae1,regm); if (not eof (mae1)) then read(mae1,regm); end; {ver resultados} reset (mae1); while (not eof(mae1)) do begin; read (mae1, regm); writeln (regm.cod, regm.cant); end; end.

Page 21: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 221

Archivos – Corte de control

El problema consiste en la generación de reportes Es un problema clásico

en el manejo de BD. Si bien los DBMS lo

manejan diferente, veremos la algorítmica clásica de los mismos

Precondiciones• El archivo se encuentra

ordenado por provincia, partido y ciudad

• El formato de la impresión es el siguiente

Provincia: xxxx

Partido: yyyy

Ciudad # Var. # Muj. Desocupados

aaa ….. …… ……….

bbb ….. …… ……….

ccc ….. …… ……….

Total Partido ……………………..

Partido: zzzz

Ciudad # Var. # Muj. Desocupados

… ….. …… ……….

Total Partido ……………………..

Total Provincia: …..

Provincia: qqqq

Page 22: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 222

Archivos – Corte de control

program Corte_de_Control; const valoralto='zzzz'; type str10 = string[10]; prov = record provincia: str10;

partido: str10;

ciudad: str10;

cant_varones : integer;

cant_mujeres : integer;

cant_desocupados : integer; end; instituto = file of prov;

var regm: prov; inst: instituto; t_varones, t_mujeres, t_desocupados: integer; t_prov_var, t_prov_muj, t_prov_des: integer; ant_prov: str10; ant_partido: str10;

procedure leer (var archivo:instituto; var dato:prov); begin if (not eof( archivo )) then read (archivo,dato) else dato.provincia := valoralto; end;

Page 23: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 223

Archivos – Corte de control

begin assign (inst, 'censo' ); reset (inst); leer (inst, regm); writeln ('Provincia: ', regm.provincia); writeln ('Partido: ', regm.partido); writeln

('Ciudad','Varones','Mujeres','Desocu pados');{ se inicializan los contadores para el total del partido para varones, mujeres y desocupados } t_varones := 0; t_mujeres := 0; t_desocupados := 0;{ se inicializan los contadores para el total de cada provincia } t_prov_var := 0; t_prov_muj := 0; t_prov_des := 0;

while ( regm.provincia <> valoralto)do begin ant_prov := regm.provincia; ant_partido := regm.partido; while (ant_prov=regm.provincia) and (ant_partido=regm.partido) do begin write (regm.ciudad, regm.cant_varones, regm.cant_mujeres,regm.cant_desocupados); t_varones := t_varones + regm.cant_varones; t_mujeres := t_mujeres + regm.cant_mujeres; t_desocupados := t_desocupados + regm.cant_desocupados; t_prov_var := t_prov_var + regm.cant_varones; t_prov_muj := t_prov_muj + regm.cant_mujeres; t_prov_des := t_prov_des + regm.cant_desocupados; leer (inst, regm); end;

Page 24: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 224

Archivos – Corte de control

write ('Total Partido: ', t_varones,t_mujeres,t_desocupados); writeln; t_varones := 0; t_mujeres := 0; t_desocupados := 0; ant_partido := regm.partido; if (ant_prov <> regm.provincia) then begin write ('Total Provincia’,t_prov_var,t_prov_muj,t_prov_des); writeln; t_prov_var := 0; t_prov_muj := 0; t_prov_des := 0; writeln ('Provincia: ', regm.provincia); end; writeln ('Partido: ', regm.partido); end; end.

Page 25: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 225

Archivos - Merge

Involucra archivos con contenido similar, el cual debe resumirse en un único archivo.

Precondiciones:Todos los archivos detalle tienen igual

estructuraTodos están ordenados por igual

criterioVeremos dos casos prácticos

Page 26: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 226

Archivos – Merge 3 archivos

Ejemplo: Programación de

computadoras inscribe a los alumnos que cursarán la materia en tres computadoras separadas. C/U de ellas genera un archivo con los datos personales de los estudiantes, luego son ordenados físicamente por otro proceso. El problema que tienen los JTP es generar un archivo maestro de la asignatura

Precondiciones• El proceso recibe

tres archivos con igual estructura

• Los archivos están ordenados por nombre de alumno

• Un alumno solo aparece una vez en el archivo

Postcondición• Se genera el archivo

maestro de la asignatura ordenado por nombre del alumno

Page 27: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 227

Archivos – Merge 3 archivos

program union_de_archivos;

const valoralto = 'zzzz'; type str30 = string[30]; str10 = string[10]; alumno = record nombre: str30; dni: str10; direccion: str30; carrera: str10; end; detalle = file of alumno;

var min,regd1,regd2,regd3: alumno; det1,det2,det3,maestro : detalle;

procedure leer (var archivo:detalle; var dato:alumno);

begin if (not eof( archivo )) then read (archivo, dato) else dato.nombre := valoralto; end; procedure minimo (var r1,r2,r3:alumno; var

min:alumno); begin if (r1.nombre<r2.nombre) and (r1.nombre<r3.nombre) then begin min := r1; leer(det1,r1) end else if (r2.nombre<r3.nombre) then begin min := r2; leer(det2,r2) end else begin min := r3; leer(det3,r3) end; end;

Page 28: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 228

Archivos – Merge 3 archivos

begin assign (det1, 'det1'); assign (det2, 'det2'); assign (det3, 'det3'); assign (maestro, 'maestro');

{proceso principal} rewrite (maestro); reset (det1); reset (det2); reset (det3);

leer(det1, regd1); leer(det2, regd2); leer(det3, regd3); minimo(regd1, regd2, regd3, min);

{se procesan los tres archivos} while (min.nombre <> valoralto) do begin write (maestro,min); minimo(regd1,regd2,regd3,min); end; close (maestro);

{ver resultados} reset (maestro); while (not eof(maestro)) do begin; read (maestro,min); writeln (min.nombre,min.dni); end; end.

Page 29: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 229

Archivos – Merge 3 archivos

Los vendedores de cierto comercio asientan las ventas realizadas…..

Precondiciones Similar al anterior Cada vendedor

puede realizar varias ventas diarias

program union_de_archivos_II; const valoralto = '9999'; type str4 = string[4]; str10 = string[10]; vendedor = record cod: str4; producto: str10; montoVenta: real; end; ventas = record cod: str4; total: real; end; detalle = file of vendedor; maestro = file of ventas; var min, regd1, regd2, regd3: vendedor; det1, det2, det3: detalle; mae1: maestro; regm: ventas; aux: str4;

Page 30: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 230

Archivos – Merge 3 archivos

procedure leer (var archivo:detalle; var dato:vendedor); begin if (not eof( archivo )) then read (archivo, dato) else dato.cod := valoralto; end;procedure minimo (var r1,r2,r3: vendedor; var min:vendedor); begin if (r1.cod <= r2.cod) and (r1.cod <= r3.cod)then begin min := r1; leer(det1,r1) end else if (r2.cod <= r3.cod) then begin min := r2; leer(det2,r2) end else begin min := r3; leer(det3,r3) end; end;

begin assign (det1, 'det1'); assign (det2, 'det2'); assign (det3, 'det3'); assign (mae1, 'maestro');

reset (det1); reset (det2); reset (det3); rewrite (mae1);

leer (det1, regd1); leer (det2, regd2); leer (det3, regd3); minimo (regd1, regd2, regd3,min);

Page 31: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 231

Archivos – Merge 3 archivos

{se procesan los archivos de detalles} while (min.cod <> valoralto) do begin aux := min.cod;{se asignan valores para registro del archivo maestro} regm.cod := min.cod; regm.total := 0;{se procesan todos los registros de un mismo vendedor} while (aux = min.cod ) do begin regm.total := regm.total+ min.montoVenta; minimo (regd1, regd2, regd3, min); end;

{se guarda en el archivo maestro} write(mae1, regm); end;

{ver resultados} reset (mae1); while (not eof( mae1 ))

do begin read (mae1,regm); writeln (regm.cod, regm.total); end;end.

Page 32: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 232

Archivos – Merge N archivos

Los vendedores de cierto comercio asientan las ventas realizadas…..

Precondiciones Similar al anterior Cada vendedor

puede realizar varias ventas diarias

Idem anterior con N archivos….

program union_de_archivos_III; const valoralto = '9999'; type str4 = string[4]; str10 = string[10]; vendedor = record cod: str4; producto: str10; montoVenta: real; end; ventas = record cod: str4; total: real; end; maestro = file of ventas; arc_detalle=array[1..100] of file of vendedor; reg_detalle=array[1..100] of vendedor; var min: vendedor; deta: arc_detalle; reg_det: reg_detalle; mae1: maestro; regm: ventas; aux: str4; i: integer; N:integer;

Page 33: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 233

Archivos – Merge N archivos

procedure leer (var archivo:detalle; var dato:vendedor); begin if (not eof( archivo )) then read (archivo, dato) else dato.cod := valoralto; end;procedure minimo (var reg_det: reg_detalle; var min:vendedor;

var deta:arc_detalle); var i: integer; begin {busco el mínimo elemento del vector reg_det en el campo cod, supongamos que es el índice i} min = reg_det[i]; leer( deta[i], reg_det[i]); end;

begin Read(n) for i:= 1 to N do begin assign (deta[i], 'det'+i); {ojo lo anterior es

incompatible en tipos} reset( deta[i] ); leer( deta[i], reg_det[i] ); end; assign (mae1, 'maestro'); rewrite (mae1); minimo (reg_det, min, deta);

Page 34: IBD Curso 2007 Clase 2. UNLP - Facultad de InformáticaIBD - CLASE 2 2 Archivos – Operaciones Básicas Utilizaremos la notación Pascal Declaración de archivos

UNLP - Facultad de InformáticaIBD - CLASE 234

Archivos – Merge N archivos

{se procesan los archivos de detalles } while (min.cod <> valoralto) do begin aux := min.cod;{se asignan valores para registro del archivo maestro} regm.cod := min.cod; regm.total := 0;{se procesan todos los registros de un mismo vendedor} while (aux = min.cod ) do begin regm.total := regm.total+ min.montoVenta; minimo (reg_det, min, deta); end;

{se guarda en el archivo maestro} write(mae1, regm); end;

{ver resultados} reset (mae1); while (not eof( mae1 ))

do begin read (mae1,regm); writeln (regm.cod, regm.total); end;end.