Final AED I UTN (medrano)

{-------------------------------------------------------------------------}
{ AUTOR: D'ACHARY Vladimiro Gaston                                        }
{ FECHA: 27/12/2013                                                       }
{ TEMA : Final Algoritmos y estructura de datos I de la UTN.              }
{        Realizacion de un programa para resolver un problema dentro del  }
{        area de las ART. Basicamente el problema consiste en la emision  }
{        de dos listados, uno que muestre las empresas aseguradas y el    }
{        centaje de reajuste de acuerdo a la cantidad de accidentes regis-}
{        trados con el siguiente formato:                                 }
{        RazSoc     porcent                                               }
{        _ _ _ _     _ _ _                                                }
{        El otro listado que se pide tiene que contener el total de los   }
{        de los trabajadores accidentados de la empresa con mayor porcent }
{        de reajuste.                                                     }
{        leg        dias                                                  }
{        _ _ _ _    _ _ _                                                 }
{        para la realizacion de programa se cuenta con dos archivos:      }
{        el archivo EMPRESAS.DAT, que contiene el listado de las empresas }
{        aseguradas (como maximo pueden ser 100) con el formato:          }
{        idEmp   rSoc  tAseg                                              }
{        tambien se cuenta con el archivo accidentes ACCIDENTES.DAT       }
{        en el que estan registrados todos los accidentes de los trabaja  }
{        dores de las empresas:  idEmp  leg  dias                         }
{        el archivo trabajadores esta ordenado, el de empresas no         }

program final_art_2007(input,output);

{$APPTYPE CONSOLE}

uses crt;

const
  MAX = 100;

type

  REmpresa = record
    idEmp:string[4];
    rSoc :string[15];
    tAseg:integer;
  end;

  FEmpresa = file of REmpresa;

  RAccidente = record
    idEmp:string[4];
    leg  :integer;
    dias :integer;
  end;

  FAccidente = file of RAccidente;

  PNodo= ^Nodo;
  Nodo = record
    leg :integer;
    dias:integer;
    sig:PNodo;
  end;

  RArr = record
    idEmp:string[4];
    rSoc :string[15];
    tAseg:integer;
    tAcc :integer;
    total:integer;
    lst:PNodo;
  end;

  TArr = array [1..MAX] of RArr;


function buscar(elArray:TArr
               ;target:string):byte;
var
  pos,i:byte;
  salir:boolean;
begin
  i:=1;
  pos:=0;
  salir:=false;

  while ( i<=MAX ) and ( salir=false ) do begin
    if ( elArray[i].idEmp=target ) then begin
      pos:=i;
      salir:=true
    end;

    i:=i+1;
  end;
  buscar:=pos;
end;


function buscarMaximo(elArray:TArr):byte;
var
  i,max,posMax:byte;
begin
  max:=elArray[1].tAcc;
  posMax:=1;
  for i:=1 to MAX do begin
    if ( elArray[i].tAcc>max ) then begin
      max:=elArray[i].tAcc;
      posMax:=i;
    end;
  end;
  buscarMaximo:=posMax;
end;

procedure crearArchivoEmp(var archEmp:FEmpresa
                         ;reg:REmpresa);

  procedure ingresoEmp(var reg:REmpresa);
  begin
    write('empresa: ');
    readLn(reg.idEmp);
    write('razon social: ');
    readLn(reg.rSoc);
    write('trabajadores asegurados: ');
    readLn(reg.tAseg);
    writeLn('--------------------------------');
  end;

begin
  assign(archEmp,'EMPRESAS.DAT');
  reWrite(archEmp);

  ingresoEmp(reg);

  while (reg.idEmp <> 'fin' ) do begin

    write(archEmp,reg);
    ingresoEmp(reg);

  end;

  close(archEmp);
end;

procedure crearArchivoAcc(var archAcc:FAccidente
                         ;reg:RAccidente);

  procedure ingresoAcc(var reg:RAccidente);
  begin
    write('empresa: ');
    readLn(reg.idEmp);
    write('legajo: ');
    readLn(reg.leg);
    write('dias de licencia: ');
    readLn(reg.dias);
    writeLn('--------------------------------');
  end;

begin
  assign(archAcc,'ACCIDENTES.DAT');
  reWrite(archAcc);

  ingresoAcc(reg);

  while reg.idEmp<>'fin' do begin
    write(archAcc,reg);
    ingresoAcc(reg);
  end;

  close(archAcc);
end;

procedure inicializarArr(var elArray:TArr);
var
  i:byte;
begin
  for i:=1 to MAX do begin
    elArray[i].idEmp:='';
    elArray[i].rSoc :='';
    elArray[i].tAseg:=0;
    elArray[i].tAcc :=0;
    elArray[i].total:=0;
    elArray[i].lst  :=NIL
  end;
end;

procedure subirArchivoEmp(var elArray:TArr);
var
  i:byte;
  archEmp:FEmpresa;
  regEmp :REmpresa;
begin
  i:=1;
  assign(archEmp,'EMPRESAS.DAT');
  reset(archEmp);

  while ( not eof(archEmp) ) do begin
    read(archEmp,regEmp);
    elArray[i].idEmp:=regEmp.idEmp;
    elArray[i].rSoc :=regEmp.rSoc;
    elArray[i].tAseg:=regEmp.tAseg;
    i:=i+1
  end;

  close(archEmp);
end;

function buscarNodo(lst:PNodo
                   ;reg:RAccidente):PNodo;
var
  aux:PNodo;
begin
  aux:=lst;

  while ( aux<>NIL ) and ( aux^.leg<>reg.leg ) do begin
    aux:=aux^.sig
  end;

  buscarNodo:=aux;
end;

procedure agregarNodo(var lst:PNodo
                     ;reg:RAccidente);
var
  aux,nuevo:PNodo;
begin
  new(nuevo);
  nuevo^.leg :=reg.leg;
  nuevo^.dias:=reg.dias;
  nuevo^.sig :=NIL;

  if ( lst=NIL ) then begin
    lst:=nuevo;
  end else begin
    aux:=lst;
    while ( aux^.sig<>NIL ) do begin
      aux:=aux^.sig;
    end;
    aux^.sig:=nuevo;
  end;
end;

procedure proceso(var elArray:TArr
                 ;reg:RAccidente);
var
  pos:byte;
  aux:PNodo;
begin
  pos:=buscar(elArray,reg.idEmp);
  elArray[pos].tAcc :=( elArray[pos].tAcc )+1;
  elArray[pos].total:=( elArray[pos].total )+reg.dias;

  aux:=buscarNodo(elArray[pos].lst,reg);
  if ( aux=NIL ) then begin
    agregarNodo(elArray[pos].lst,reg);
  end else begin
    aux^.dias:=aux^.dias+reg.dias;
  end;
end;

procedure mostrarArray(elArray:TArr);
var
  i:byte;
begin
  writeLn('id      R.Soc        As      Ac   Total');
  writeLn('----------------------------------------');
  for i:=1 to MAX do begin
    if ( elArray[i].idEmp<>'' ) then begin
      write(elArray[i].idEmp,'  ',elArray[i].rSoc,'     ');
      writeLn(elArray[i].tAseg,'    ',elArray[i].tAcc ,'    ',elArray[i].total);
      writeLn('----------------------------------------');
    end;
  end;
end;

procedure mostrarListadoReajustes(elArray:TArr);
var
  i:byte;
begin
  writeLn('Los reajustes son los siguientes: ');
  writeLn('----------------------------------');
  for i:=1 to MAX do begin
    if ( elArray[i].idEmp<>'' ) then begin
      writeLn(elArray[i].rSoc,'  ','%',elArray[i].tAcc);
    end;
  end;
end;

procedure mostrarListadoMaximo(elArray:TArr);
var
  pos:byte;
  aux:PNodo;
begin
  pos:=buscarMaximo(elArray);

  writeLn('emprsa de mayor re-Ajuste: ');
  writeLn('id. Empresa: ',elArray[pos].idEmp);
  writeLn('razon social: ',elArray[pos].rSoc);
  writeLn('listado de accidentes registrados :');
  writeLn('------------------------------------');

  aux:=elArray[pos].lst;
  while ( aux<>NIL ) do begin
    writeLn('legajo: ',aux^.leg,' ','dias de lic: ',aux^.dias);
    writeLn('------------------------------');
    aux:=aux^.sig;
  end;
end;

var
  regEmp :REmpresa;
  regAcc :RAccidente;

  archEmp:FEmpresa;
  archAcc:FAccidente;

  elArray:TArr;
  regArr :RArr;
begin

  // inicializo el array
  inicializarArr(elArray);

  // subo el archivo empresas (maestro) al array
  subirArchivoEmp(elArray);

  // abro el archivo accidentes (novedades)
  assign(archAcc,'ACCIDENTES.DAT');
  reset(archAcc);

  // recorro el archivo de modo secuencial y proceso registro por registro
  // hasta llegar al final del archivo accidentes (novedades)
  while ( not eof(archAcc) ) do begin

    // leo el registro
    read(archAcc,regAcc);

    // proceso el registro
    proceso(elArray,regAcc);

  end;

  // muestra el primer listado
  mostrarListadoReajustes(elArray);
  readKey();
  clrScr;

  // muestra el segundo listado
  mostrarListadoMaximo(elArray);

  // cierro el archivo ACCIDENTES.DAT (novedades)
  close(archAcc);
  readKey()
end.

Comentarios

Entradas populares de este blog

El juego del ahorcado, escrito en assembler i8086

Una posible implementacion en modo texto de una sopa de letras con python ( 2013 )

ayuda memoria sobre conversion dinamica descendente y polimorfismo