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.