Upload
olalla-avila
View
7
Download
0
Embed Size (px)
Citation preview
IBD Curso 2007
Clase 2
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,
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;
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);
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
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.
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
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;
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
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
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;
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;
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
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.
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
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}
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.
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;
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;
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.
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
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;
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;
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.
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
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
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;
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.
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;
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);
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.
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;
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);
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.