Skip to content

Latest commit

History

History
1120 lines (1058 loc) 路 31.5 KB

Practica3.md

File metadata and controls

1120 lines (1058 loc) 路 31.5 KB

Practica 3

Archivos Secuenciales - Bajas

1) Modificar el ejercicio 4 de la pr谩ctica 1 (programa de gesti贸n de empleados), agreg谩ndole una opci贸n para realizar bajas copiando el 煤ltimo registro del archivo en la posici贸n del registro a borrar y luego truncando el archivo en la posici贸n del 煤ltimo registro de forma tal de evitar duplicados.

馃摎 Resoluci贸n
program Ej1;
const
    valorAlto = 9999;
type
    cadena20 = string[20];
    empleado = record
        nro:integer;
        apellido:cadena20;
        nombre:cadena20;
        edad:integer;
        dni:integer;
    end;
    archivo = file of Empleado;
//_______________________________________________
procedure LeerEmpleado(var emp:Empleado);
begin
    Write('Apellido: '); ReadLn(emp.apellido);
    if(emp.apellido <> 'fin')then
    begin
        Write('Nombre: '); ReadLn(emp.nombre);
        Write('Edad: '); ReadLn(emp.edad);
        Write('Dni: '); ReadLn(emp.dni);
        Write('Nro Empleado: '); ReadLn(emp.nro);
    end;
end;
//_______________________________________________
procedure CrearArchivo(var arch_logico:archivo;var arch_fisico:cadena20);
var
    emp:Empleado;
begin
    writeln( 'Ingrese el nombre del archivo:' );
    Readln( arch_fisico );          
    assign( arch_logico, arch_fisico );
    rewrite( arch_logico );        
    LeerEmpleado(emp);                
    while emp.apellido <> 'fin' do          
    begin
        write( arch_logico, emp); 
        LeerEmpleado(emp); 
    end;
    close( arch_logico ); 
end;

//_______________________________________________
procedure MostarPersona(emp:empleado);
begin
    WriteLn('Nro Empleado: ',emp.nro);
    WriteLn('Apellido: ',emp.apellido);
    WriteLn('Nombre: ',emp.nombre);
    WriteLn('Dni: ',emp.dni);
    WriteLn('Edad: ',emp.edad);
end;
//_______________________________________________
procedure ListarDatosi(var arch_logico: archivo );
var
    emp:empleado;
    cadenaPred:cadena20;
begin
    WriteLn('Ingrese un nombre o apellido a buscar: ');
    ReadLn(cadenaPred);
    reset(arch_logico); 
    while(not eof(arch_logico)) do begin
		read(arch_logico, emp);
		if ((emp.apellido = cadenaPred) or (emp.nombre = cadenaPred)) then 
            MostarPersona(emp);
    end;
    close(arch_logico);
end;
//_______________________________________________
procedure ListarDatosii(var arch_logico:archivo);
var
    emp:empleado;
begin
    reset(arch_logico); 
    while(not eof(arch_logico)) do begin
		read(arch_logico, emp);
        WriteLn('Nro: ',emp.nro);
		WriteLn('Apellido: ',emp.apellido);
        WriteLn('Nombre: ',emp.nombre);
        WriteLn('Dni: ',emp.dni);
        WriteLn('Edad: ',emp.edad);
        WriteLn('__________');
    end;
    close(arch_logico);
end;
//_______________________________________________
procedure ListarDatosiii(var arch_logico:archivo);
var
    emp:empleado;
begin
    reset(arch_logico); 
    while(not eof(arch_logico)) do begin
		read(arch_logico, emp);
        if (emp.edad > 70) then
		begin
            WriteLn('Nro: ', emp.nro);
            WriteLn('Apellido: ',emp.apellido);
            WriteLn('Nombre: ',emp.nombre);
            WriteLn('Dni: ',emp.dni);
            WriteLn('Edad: ',emp.edad);
            WriteLn('__________');
        end;
    end;
    close(arch_logico);
end;
//_______________________________________________
procedure Agregar(var arch_logico:archivo);
var
    emp:empleado;
begin
    reset(arch_logico);
    while (not eof(arch_logico)) do read(arch_logico,emp);
    LeerEmpleado(emp);
    write(arch_logico, emp);
	close(arch_logico);
end;
//_______________________________________________________________
procedure ModificarEdades(var arch_logico:archivo);
var
    emp:empleado;
    edad:integer;
    nroEmpleado:Integer;
    cont,cant:integer; 
    Encontro:Boolean;
begin
    cont:=0;
    WriteLn('Ingrese la cantidad de edades que quiere modificar: ');
    ReadLn(cant);
    reset(arch_logico);
    while cont<cant do
    begin
        WriteLn('Ingrese el nro de una empleado para modificar su edad: ');
        ReadLn(nroEmpleado);
        Encontro:=false;
        while(not eof(arch_logico))and(not Encontro) do 
        begin
			read(arch_logico, emp);
			if(nroEmpleado = emp.nro) then Encontro:=true;
		end;
        if Encontro then
        begin
            writeln('Edad para Remplazar: '); readln(edad);
			seek(arch_logico, filepos(arch_logico)-1);
			emp.edad:= edad;
			write(arch_logico, emp);
        end   
        else
            WriteLn('No existe el empleado');
        cont:=cont+1;
        
    end;
    close(arch_logico);
end;
//_______________________________________________________________
procedure Exportar_Txt(var arch_logico:archivo);
var
	carga: text;
	emp: empleado;
begin
	assign(carga, 'todos_empleados.txt');
	reset(arch_logico);
	rewrite(carga);
	while(not eof(arch_logico)) do begin
		read(arch_logico,emp);
		with emp do
			writeln(carga,' ',nro,' ',apellido,' ',nombre,' ', edad,' ', dni);
		end;
	writeln('________ Exportado Crack ________');
	close(arch_logico); close(carga);
end;
//_______________________________________________________________
procedure ExportarErroneos(var arch_logico:archivo);
var
    carga: text;
	emp: empleado;
begin
    assign(carga, 'faltaDNIEmpleados.txt');
	reset(arch_logico);
	rewrite(carga);
    while(not eof(arch_logico)) do begin
		read(arch_logico,emp);
        if (emp.dni = 0) then
        begin
            with emp do
			    writeln(carga,' ',nro,' ',apellido,' ',nombre,' ', edad,' ', dni);
		    end;
        end;
		
	writeln('________ Exportado Crack ________');
	close(arch_logico); close(carga);
end;
//_______________________________________________
procedure leer(var arch:archivo; var aux:empleado);
begin
	if(not eof(arch))then 
		read(arch,aux)
    else 
		aux.nro:=valorAlto;
end;
//_______________________________________________
{se sabe que existe Carlos Garcia}
procedure bajaLogica(var x:archivo);
var
    datox:empleado;
    ultimoR:empleado;
    nro:integer;
begin 
	assign(x, 'archivo.data');
	reset(x);
    Seek(x,FileSize(x)-1); {Guardo el ultimo Registro}
	leer(x,datox);
    reset(x); {Abro el archivo desde el princio, no se si es buena practica, despues me fijo en el libro}
    leer(x,datox);
    WriteLn('Ingrese el nro del empleado que quiere eliminar: ');
    ReadLn(nro);
	while (datox.nro <> nro) and (datox.nro <> valorAlto) do	leer(x, datox);
    if (datox.nro <> valorAlto) then
    begin
	    seek(x, filepos(x)-1);
	    write(x, datox);
        seek(x, FileSize(x)-1);
	    Truncate(x);
    end
    else
        WriteLn('No se encontro el nro del empleado');
	
	close(x);
end;
//_______________________________________________
procedure Menu();
var 
    categoria:integer;
    arch_logico: archivo;
	arch_fisico: cadena20;
begin
    categoria:= 0;
    arch_fisico:='archivo.data';                        
	assign(arch_logico, arch_fisico);
	while (categoria <> 10)do begin
		writeln('_______________________');
		writeln('Menu 100% real no fake: ');
		writeln('1 | Crear un Archivo con empleados(Siempre lo primero)');
		writeln('2 | Datos de Empleados con un apellido predeterminado');
		writeln('3 | Mostrar todos la Empleados');
		writeln('4 | Mostrar las Empleados mayores de 70');
        writeln('5 | Agregar Empleados');
        writeln('6 | Modifica edad de Empleados');
        writeln('7 | Exportar a .txt');
        writeln('8 | Exportar a erroneos a .txt');
        writeln('9 | Baja Logica del ultimo empleado');
        writeln('10 | Cerrar Menu');
		write('Numero: ');
		readln(categoria);
		writeln('_______________________');
		case categoria of
			1: CrearArchivo(arch_logico,arch_fisico);
			2: ListarDatosi(arch_logico);
			3: ListarDatosii(arch_logico);
			4: ListarDatosiii(arch_logico);
            5: Agregar(arch_logico);
            6: ModificarEdades(arch_logico);
            7: Exportar_Txt(arch_logico);
            8: ExportarErroneos(arch_logico);
            9: bajaLogica(arch_logico);
            10: WriteLn('Archivo Cerrado');
			else writeln('Numero invalido'); 
		end;
	end;
end;
//_______________________________________________
begin
    Menu();
end.

2) Definir un programa que genere un archivo con registros de longitud fija conteniendo informaci贸n de asistentes a un congreso a partir de la informaci贸n obtenida por teclado. Se deber谩 almacenar la siguiente informaci贸n: nro de asistente, apellido y nombre, email, tel茅fono y D.N.I. Implementar un procedimiento que, a partir del archivo de datos generado, elimine de forma l贸gica todos los asistentes con nro de asistente inferior a 1000.

Para ello se podr谩 utilizar alg煤n car谩cter especial situ谩ndolo delante de alg煤n campo String a su elecci贸n. Ejemplo: @Salda帽o.

馃摎 Resoluci贸n
program Ej2;
const
    valorAlto = 9999;
type
    cadena20 = string[20];
    empleado = record
        codigo:integer;
        apellido:cadena20;
        nombre:cadena20;
        direccion:integer;
        telefono:integer;
        dni:Integer;
        fecha:cadena20;
    end;
    maestro = file of empleado;
//____________________________________________________
procedure CrearMaestro(var m:maestro);
var
	carga: text;
	a: empleado;
begin
	assign(m,'maestro.data');
	assign(carga,'maestro.txt');
	rewrite(m); reset(carga);
	while(not eof(carga))do begin
	    with a do readln(carga, codigo, apellido, nombre);
        with a do readln(carga, direccion, telefono, dni);
        with a do readln(carga, fecha);
	    write(m,a);
	end;
	close(m); close(carga);
end;
//____________________________________________________
Procedure Imprimir(var m:maestro);
var  
    nro:empleado;  
begin
    reset(m); 
    while not eof(m) do 
    begin
        WriteLn('_________________');
        read(m, nro );
        write(nro.codigo);
        write(nro.apellido);
        writeln(nro.nombre);
        write(nro.direccion,' ');
        write(nro.telefono,' ');
        writeln(nro.dni);
        writeln(nro.fecha);       
        WriteLn('_________________');    
    end;
    close(m);
end;
//____________________________________________________
procedure leer (var archivo:maestro; var dato:empleado);
begin
    if (not eof( archivo ))then 
        read (archivo, dato)
    else 
        dato.codigo := valoralto;
end;
procedure bajaLogica(var x:maestro);
var
    datox:empleado;
begin 
	assign(x, 'maestro.data');
	reset(x);
	leer(x, datox);
    while datox.codigo <> valorAlto do
    begin
        if (datox.dni<800) then
        begin
            datox.apellido:='*'+datox.apellido;
            seek(x, filepos(x)-1);
            write(x, datox);
        end;
        leer(x, datox);        
    end;
	close(x);
end;
//____________________________________________________
procedure exportarTxt(var x: maestro);
var
	carga:text;
	datox: empleado;
begin
	assign(carga,'eliminados.txt');
	rewrite(carga);
	reset(x);
	while not eof(x)do begin
		read(x,datox);
		with datox do writeln(carga,codigo,' ',apellido);
	end;
	close(x); close(carga);
end;
//____________________________________________________
var
    m:maestro;
begin
    CrearMaestro(m);
    Imprimir(m);
    bajaLogica(m);
    Imprimir(m);
    exportarTxt(m);
end.

3) Realizar un programa que genere un archivo de novelas filmadas durante el presente a帽o. De cada novela se registra: c贸digo, g茅nero, nombre, duraci贸n, director y precio. El programa debe presentar un men煤 con las siguientes opciones:

  • a) Crear el archivo y cargarlo a partir de datos ingresados por teclado. Se utiliza la t茅cnica de lista invertida para recuperar espacio libre en el archivo. Para ello, durante la creaci贸n del archivo, en el primer registro del mismo se debe almacenar la cabecera de la lista. Es decir un registro ficticio, inicializando con el valor cero (0) el campo correspondiente a c贸digo de novela, el cual indica que no hay espacio libre dentro del archivo.

  • b) Abrir el archivo existente y permitir su mantenimiento teniendo en cuenta el inciso a., se utiliza lista invertida para recuperaci贸n de espacio. En particular, para el campo de 麓enlace麓 de la lista, se debe especificar los n煤meros de registro referenciados con signo negativo, (utilice el c贸digo de novela como enlace).Una vez abierto el archivo, brindar operaciones para:

    • i) Dar de alta una novela leyendo la informaci贸n desde teclado. Para esta operaci贸n, en caso de ser posible, deber谩 recuperarse el espacio libre. Es decir, si en el campo correspondiente al c贸digo de novela del registro cabecera hay un valor negativo, por ejemplo -5, se debe leer el registro en la posici贸n 5, copiarlo en la posici贸n 0 (actualizar la lista de espacio libre) y grabar el nuevo registro en la posici贸n 5. Con el valor 0 (cero) en el registro cabecera se indica que no hay espacio libre.

    • ii) Modificar los datos de una novela leyendo la informaci贸n desde teclado. El c贸digo de novela no puede ser modificado.

    • iii) Eliminar una novela cuyo c贸digo es ingresado por teclado. Por ejemplo, si se da de baja un registro en la posici贸n 8, en el campo c贸digo de novela del registro cabecera deber谩 figurar -8, y en el registro en la posici贸n 8 debe copiarse el antiguo registro cabecera.

  • c) Listar en un archivo de texto todas las novelas, incluyendo las borradas, que representan la lista de espacio libre. El archivo debe llamarse novelas.txt.

NOTA: Tanto en la creaci贸n como en la apertura el nombre del archivo 
debe ser proporcionado por el usuario.
馃摎 Resoluci贸n
program Ej3;
const
    valorAlto = 9999;
type
    cadena20 = string[20];
    novela = record
        codigo:integer;
        genero:integer;
        nombre:cadena20;
        duracion:integer;
        director:cadena20;
        precio:Integer;
    end;
    maestro = file of novela;
//_________________________________________
procedure LeerNovela(var n:novela);
begin
    writeln('Codigo: ');ReadLn(n.codigo);
    if (n.codigo <> valorAlto) then
    begin
        writeln('Genero: ');ReadLn(n.genero);
        writeln('Nombre: ');ReadLn(n.nombre);
        writeln('Duraci贸n: ');ReadLn(n.duracion);
        writeln('Director: ');ReadLn(n.director);
        writeln('Precio: ');ReadLn(n.precio);
    end;
    
end;
//_________________________________________
procedure Crear(var m:maestro);
var
    nov:novela;
begin
    assign(m,'maestro.data');
    rewrite(m); 
    nov.codigo:=0;           //lista invertida
    write(m,nov);
    LeerNovela(nov);
    while (nov.codigo <> valorAlto) do 
    begin
        write(m,nov); 
        LeerNovela(nov);
    end;
    close(m);  
end;
//_________________________________________
procedure Leer (var archivo:maestro;var dato:novela);
begin
    if(not EOF(archivo)) then
        read(archivo,dato)
    else
        dato.codigo:=valoralto;
end;
//_________________________________________
procedure Alta(var m:maestro);
var
    cabecera,n:novela;
begin
    Reset(m);
    leer(m,cabecera);
    LeerNovela(n);
    if (cabecera.codigo = 0) then
    begin //Si tengo la cabecera vacia agrego el elemento al final
        Seek(m,FileSize(m));
        Write(m,n);
    end
    else 
        begin
            //Ej si el resultado es -5 voy a la posicion 5
            //(La cabecera siempre tiene que ser un nro negativo o 0)
            Seek(m,(cabecera.codigo*(-1)));
             //Una vez que me ubico, en el lugar libre, remplazo el elemento
            read(m,cabecera);
            Seek(m,FilePos(m)-1);
            Write(m,n);
            Seek(m,0);
            Write(m,cabecera);
            //Guardo el elemento que habia en la posicion 5
        end;
    Close(m);
end;
//_________________________________________
procedure modificar(var arch:maestro);
var
	n:novela;
	cod:integer;
begin
    writeln('Ingrese el codigo de la novela a modificar:');
    readln(cod);
    reset(arch);
    leer(arch,n);
    if(n.codigo <> valoralto)then begin
		while(n.codigo <> cod)do leer(arch,n);
		n.codigo:=cod;
		write('Genero de novela:'); readln(n.genero);
        write('Nombre de novela:'); readln(n.nombre);
        write('Duracion de novela:'); readln(n.duracion);
        write('Director de novela:'); readln(n.director);
        write('Precio de novela:'); readln(n.precio);
		seek(arch,filepos(arch)-1);
		write(arch,n);
    end;
    close(arch);
end;
//_________________________________________
procedure baja(var arch:maestro);
var 
    n,actual:novela;
    num,pos:integer;
begin
    reset(arch);
    read(arch,actual);
    writeln('Ingrese el codigo de la novela a eliminar:'); 
    readln(num);
    leer(arch,n);
    while (n.codigo <> num) do	    //busco hasta encontrar el numero
		leer(arch,n);
    if n.codigo = num then begin //si lo encuentro guardo la posicion
        pos:=filepos(arch)-1; //guardo la posicion de la baja
        n:=actual;
        seek(arch,pos); 
        write(arch,n); //sobreescribo la baja con los datos de cabecera
        actual.codigo:=-pos;

        seek(arch,0); //me paro en el principio de la lista
        write(arch,actual);
    end
    else 
        writeln('No se encuentra el codigo.');
    close(arch);
end;
//_________________________________________
procedure Menu(var m:maestro);
var
    opcion:integer;
begin
    opcion:=0;
    while opcion <= 3 do
    begin
        WriteLn('1| Dar de alta');
        WriteLn('2| Modificar');
        WriteLn('3| Baja');
        WriteLn('4| Cerrar programa');
        ReadLn(opcion);
        case opcion of
            1: Alta(m);
            2: Modificar(m);
            3: Baja(m);
        end;
    end;
  
end;
//_________________________________________
procedure exportarTxt(var x: maestro);
var
	carga:text;
	datox: novela;
begin
	assign(carga,'novelas.txt');
	rewrite(carga);
	reset(x);
	while not eof(x)do begin
		read(x,datox);
		with datox do writeln(carga,codigo,' ',nombre, ' ', genero);
	end;
	close(x); close(carga);
end;
//_________________________________________
var
    m:maestro;
begin
    Crear(m);
    Menu(m);
    exportarTxt(m);
end.

4) Dada la siguiente estructura:

type
    tTitulo = String[50];
    tArchRevistas = file of tTitulo;

Las bajas se realizan apilando registros borrados y las altas reutilizando registros borrados. El registro 0 se usa como cabecera de la pila de registros borrados: el n煤mero 0 implica que no hay registros borrados y N indica que el pr贸ximo registro a reutilizar es el N, siendo 茅ste un n煤mero relativo de registro v谩lido.

  • a) Implemente el siguiente m贸dulo:
{Abre el archivo y agrega el t铆tulo de la revista, recibido como
par谩metro manteniendo la pol铆tica descripta anteriormente}
procedure agregar (var a: tArchRevistas ; titulo: string);
  • b) Liste el contenido del archivo omitiendo las revistas eliminados. Modifique lo que considere necesario para obtener el listado.
馃摎 Resoluci贸n
program Ej4;
const
    valorAlto = 'ZZZZ';
type
    tTitulo = String[50];
    tArchRevistas = file of tTitulo ;
//__________________________________________
procedure CrearConTexto(var m:tArchRevistas);
var
	carga: text;
	a: tTitulo;
begin
	assign(m,'maestro.data');
	assign(carga,'maestro.txt');
	rewrite(m); reset(carga);
	while(not eof(carga))do begin
	    readln(carga, a);
	    write(m,a);
	end;
	close(m); close(carga);
end;
//__________________________________________
procedure Leer(var archivo:tArchRevistas; var dato:tTitulo);
begin
    if(not EOF(archivo)) then
        read(archivo,dato)
    else
        dato:=valoralto;
end;
//__________________________________________
procedure agregar(var t:tArchRevistas; titulo:tTitulo);
var
    nro:integer;
    nroString,aux:tTitulo;
begin
    Reset(t);
    Leer(t,nroString);
    Val(nroString,nro); //Leo la cabecera y lo convierto a entero
    if (nro <> 0) then
    begin
        Seek(t,nro); Read(t,aux);              //Me posiciono en la cabecera y me quedo con lo que tenia
        Seek(t,FilePos(t)-1); Write(t,titulo); //Agrego el dato en el lugar que tenia una baja 
        Seek(t,0);   Write(t,aux);             //Guardo el dato en aux
    end
    else
        begin
            Seek(t,FilePos(t)); Write(t,aux); //Agrego al final del todo
        end;
    Close(t);
end;
//__________________________________________
procedure listado(var m:tArchRevistas);
var
	t:tTitulo;
    tInt:Integer;
begin
	assign(m,'maestro.data');
	reset(m);
	leer(m,t);
    WriteLn('Los titulos que no se borraron');
	while (t <> valoralto) do begin
        Val(t,tInt);
        if (tInt <> 0) then
            WriteLn(tInt);
        leer(m,t);
	end;
	close(m);
end;
var
    titulo:tTitulo;
    t:tArchRevistas;
begin
    titulo:='Hola';
    CrearConTexto(t);
    agregar(t,titulo);
    listado(t);
end.

5) Dada la estructura planteada en el ejercicio anterior, implemente el siguiente m贸dulo:

{Abre el archivo y elimina el t铆tulo de la revista recibida como
par谩metro manteniendo la pol铆tica descripta anteriormente}
procedure eliminar (var a: tArchRevistas ; titulo: string);
馃摎 Resoluci贸n
program Ej5;
const
    valorAlto = 'ZZZZ';
type
    tTitulo = String[50];
    tArchRevistas = file of tTitulo ;
//__________________________________________
procedure CrearConTexto(var m:tArchRevistas);
var
	carga: text;
	a: tTitulo;
begin
	assign(m,'maestro.data');
	assign(carga,'maestro.txt');
	rewrite(m); reset(carga);
	while(not eof(carga))do begin
	    readln(carga, a);
	    write(m,a);
	end;
	close(m); close(carga);
end;
//__________________________________________
procedure Leer(var archivo:tArchRevistas; var dato:tTitulo);
begin
    if(not EOF(archivo)) then
        read(archivo,dato)
    else
        dato:=valoralto;
end;
//__________________________________________
procedure agregar(var t:tArchRevistas; titulo:tTitulo);
var
    nro:integer;
    nroString,aux:tTitulo;
begin
    Reset(t);
    Leer(t,nroString);
    Val(nroString,nro); //Leo la cabecera y lo convierto a entero
    if (nro <> 0) then
    begin
        Seek(t,nro); Read(t,aux);              //Me posiciono en la cabecera y me quedo con lo que tenia
        Seek(t,FilePos(t)-1); Write(t,titulo); //Agrego el dato en el lugar que tenia una baja 
        Seek(t,0);   Write(t,aux);             //Guardo el dato en aux
    end
    else
        begin
            Seek(t,FilePos(t)); Write(t,aux); //Agrego al final del todo
        end;
    Close(t);
end;
//__________________________________________
procedure listado(var m:tArchRevistas);
var
	t:tTitulo;
    tInt:Integer;
begin
	assign(m,'maestro.data');
	reset(m);
	leer(m,t);
    WriteLn('Los titulos que no se borraron');
	while (t <> valoralto) do begin
        Val(t,tInt);
        if (tInt <> 0) then
            WriteLn(tInt);
        leer(m,t);
	end;
	close(m);
end;
//__________________________________________
procedure eliminar(var t:tArchRevistas; titulo:tTitulo);
var
    dato,cabecera,posString:tTitulo;
    pos:integer;
begin
    Assign(t,'maestro.data');
    Reset(t);
    Leer(t,cabecera); //Guardo la cabecera
    while (dato <> valorAlto) and (dato <> titulo) do Leer(t,dato);

    if (dato = titulo) then
    begin
        pos:=(FilePos(t)-1);        //Guardo la posicion del archivo a eliminar
        Seek(t,pos); Write(t,cabecera); //Remplazo el dato
        
        Str(pos,posString);
        Seek(t,0); Write(t,posString);//Pongo en la cabecera el archivo que elimine
    end
    else
        WriteLn('El titulo no se encontro');    
    Close(t);
end;
//__________________________________________
var
    titulo:tTitulo;
    t:tArchRevistas;
begin
    titulo:='Hola';
    CrearConTexto(t);
    agregar(t,titulo);
    listado(t);
    eliminar(t,titulo);
end.

6) Una cadena de tiendas de indumentaria posee un archivo maestro no ordenado con la informaci贸n correspondiente a las prendas que se encuentran a la venta. De cada prenda se registra: cod_prenda, descripci贸n, colores, tipo_prenda, stock y precio_unitario. Ante un eventual cambio de temporada, se deben actualizar las prendas a la venta. Para ello reciben un archivo conteniendo: cod_prenda de las prendas que quedar谩n obsoletas. Deber谩 implementar un procedimiento que reciba ambos archivos y realice la baja l贸gica de las prendas, para ello deber谩 modificar el stock de la prenda correspondiente a valor negativo.

Por 煤ltimo, una vez finalizadas las bajas l贸gicas, deber谩 efectivizar las mismas compactando el archivo. Para ello se deber谩 utilizar una estructura auxiliar, renombrando el archivo original al finalizar el proceso.. Solo deben quedar en el archivo las prendas que no fueron borradas, una vez realizadas todas las bajas f铆sicas.

馃摎 Resoluci贸n
program Ej6;
const
    valorAlto = 9999;
type
    cadena20 = string[20];
    prenda = record
        cod_prenda:integer;
        descripcion:cadena20;
        colores:cadena20;
        tipo_prenda:cadena20;
        stock:integer;
        precio:real;
    end;
    maestro = file of prenda;
    detalle = file of integer; //Archivo con los codigos de prendas
//____________________________________________
procedure ImportarMaestro(var m:maestro);
var
	carga: text;
	a: prenda;
begin
	assign(m,'maestro.data');
	assign(carga,'maestro.txt');
	rewrite(m); Reset(carga);
	while(not eof(carga))do begin
	    with a do readln(carga, cod_prenda,descripcion,colores,tipo_prenda,stock,precio);
	    write(m,a);
	end;
	close(m); close(carga);
end;
//____________________________________________
procedure ImportarDetalle(var d:detalle);
var
	carga: text;
	a: Integer;
begin
	assign(d,'detalle.data');
	assign(carga,'detalle.txt');
	rewrite(d); Reset(carga);
	while(not eof(carga))do begin
        readln(carga, a);
	    write(d,a);
	end;
	close(d); close(carga);
end;
//____________________________________________
procedure LeerD(var arch:detalle; var dato:integer);
begin
	if(not eof(arch))then 
        read(arch,dato)
	else 
        dato:=valoralto;
end;
procedure LeerM(var arch:maestro; var dato:prenda);
begin
	if(not eof(arch))then 
        read(arch,dato)
	else 
        dato.cod_prenda:=valoralto;
end;
//____________________________________________
procedure bajaLogica(var m:maestro;var d:detalle);
var
    datoM:prenda;
    datoD:Integer;
begin
    Reset(m);       Reset(d);
    LeerD(d,datoD);  
    while datoD <> valorAlto do
    begin
        Seek(m,0); LeerM(m,datoM); //Leo lo que tengo en la cabecera
        while datoM.cod_prenda <> valorAlto do 
        begin
            if (datoM.cod_prenda = datoD) then
            begin
                datoM.stock:=-1;
                Seek(m,FilePos(m)-1); Write(m,datoM);
            end;
            LeerM(m,datoM);
        end;
        LeerD(d,datoD); 
    end;
    Close(m); Close(d);
end;
//____________________________________________
procedure bajaFisica(var m,mAux:maestro);
var
    datoM:prenda;
begin
    Reset(m); Rewrite(mAux);
    LeerM(m,datoM);
    while datoM.cod_prenda <> valorAlto do
    begin
        if (datoM.cod_prenda = -1) then
            Write(mAux,datoM);
        LeerM(m,datoM);
    end;
    Close(m); Close(mAux);
    Erase(m); //Elimino el archivo maestro
    Rename(mAux,'maestro');
end;
//____________________________________________
var
    m,mAux:maestro;
    d:detalle;
begin
    Assign(mAux,'maestrox.data');
    ImportarMaestro(m);
    ImportarDetalle(d);
    bajaLogica(m,d);
    bajaFisica(m,mAux);
end.

7) Se cuenta con un archivo que almacena informaci贸n sobre especies de aves en v铆a de extinci贸n, para ello se almacena: c贸digo, nombre de la especie, familia de ave, descripci贸n y zona geogr谩fica. El archivo no est谩 ordenado por ning煤n criterio. Realice un programa que elimine especies de aves, para ello se recibe por teclado las especies a eliminar. Deber谩 realizar todas las declaraciones necesarias, implementar todos los procedimientos que requiera y una alternativa para borrar los registros. Para ello deber谩 implementar dos procedimientos, uno que marque los registros a borrar y posteriormente otro procedimiento que compacte el archivo, quitando los registros marcados. Para quitar los registros se deber谩 copiar el 煤ltimo registro del archivo en la posici贸n del registro a borrar y luego eliminar del archivo el 煤ltimo registro de forma tal de evitar registros duplicados.

Nota: Las bajas deben finalizar al recibir el c贸digo 500000
馃摎 Resoluci贸n
program Ej7;
const
    valorAlto = 9999;
type    
    cadena20 = string[20];
    ave = record
        codigo:integer;
        nombre:cadena20;
        familia:cadena20;
        descripcion:cadena20;
        zona:cadena20;
    end;
    maestro = file of ave;
//_________________________________________
procedure Leer (var archivo:maestro; var dato:ave);
begin
    if (not EOF(archivo)) then
        read(archivo,dato) //en dato=el dato apuntado en archivoDeta
    else
        dato.codigo:=valoralto; //para cortar el while 
end;
//_________________________________________
procedure BajaLogica(var m:maestro);
var
    datoM:ave;
    codigoAve:integer;
begin
    Assign(m,'maestro.data');
    Reset(m);       
    WriteLn('El codigo del ave que quiere eliminar: ');
    ReadLn(codigoAve);
    while codigoAve <> 500 do
    begin
        Leer(m,datoM); //Leo lo que tengo en la cabecera
        while datoM.codigo <> valorAlto do 
        begin
            if (datoM.codigo = codigoAve) then
            begin
                datoM.codigo:=-1;
                Seek(m,FilePos(m)-1); Write(m,datoM);
            end;
            Leer(m,datoM);
        end;
        WriteLn('El codigo del ave que quiere eliminar: ');
        ReadLn(codigoAve);
        Seek(m,0);
    end;
    Close(m); 
end;
{procedure marcar(var arch:archivo); //Esto es para preguntar, no le des mucha bola
var
	reg: viaExtincion;
	cod: integer;
begin
	reset(arch);
	cod:=0;
	leer(arch,reg);
	while (reg.cod <> valoralto) and (cod <> valoralto) do begin
		writeln('Ingrese el codigo de especie a eliminar: ');
		read(cod);
		if(cod <> valoralto)and(reg.cod <> valoralto)then begin
			while(cod <> reg.cod)and(valoralto <> reg.cod) do leer(arch,reg);
			if cod = reg.cod then begin
				reg.cod := -1;
				seek(arch,filepos(arch)-1);
				writeln(reg.cod);
				write(arch,reg);
			end;
		end;
		reset(arch);
	end;
	close(arch);
end;}
//_________________________________________
procedure BuscarUltimo(var m:maestro;var ultimo:ave; var posUlt:Integer);
begin
    Seek(m,posUlt); //Nos vamos moviendo para atras
    Read(m,ultimo);
    while ultimo.codigo = -1 do //Busco el ultimo registro no borrado
    begin
        Seek(m,posUlt-1);   //Voy al anterior
        posUlt:=FilePos(m); //Guardo el anterior
        Read(m,ultimo);     //Continuo leyendo normal
    end;
end;
//_________________________________________
procedure BajaFisica(var m:maestro);
var
    datox,ultimo:ave;
    pos,posUlt:integer;
begin
    Assign(m,'maestro.data');
    Reset(m);
    Leer(m,datox);
    //Me quedo con la ultima posicion en la que tengo un registro
    //ya que es mas facil manejar el corte del archivo
    posUlt:=FilePos(m)-1; 
    while (datox.codigo <> valorAlto) and (FilePos(m) <= posUlt) do
    begin
        pos:=FilePos(m);
        if (datox.codigo = -1) then
        begin
            BuscarUltimo(m,ultimo,posUlt);
            posUlt:=posUlt-1;               //Decremento mi posUlt ya que encontre el eliminado
            Seek(m,pos-1); Write(m,ultimo); //remplazo el dato
        end;
        Leer(m,datox);
    end;
    Seek(m,posUlt+1); //Voy a la ultima posicion que seria EOF ya que antes esta en la anteultima
    //Para trabajar con solo los registros
    //Trunca un fichero en la posici贸n actual. Dicha posici贸n actual se convierte en el fin de fichero (EOF).
    Truncate(m);
    Close(m);
end;
//_________________________________________
var
    m:maestro;
begin
    BajaLogica(m);
    BajaFisica(m);
end.