Tratamentos de Erros

Publicado por Ivan Rocha 12/07/2007

[ Hits: 3.383 ]

Homepage: http://homes.dcc.ufba.br/~ivan062/bahia

Download trablogicafinal




Script em Pascal que explora diversos tratamentos de erros, através de cadastro de funcionários, salários, códigos, departamentos em um vetor.

O campo departamento é apontador para posições de vetor, onde há cadastro de departamentos, com nome, endereço, e número de funcionários.

Cabe à criatividade de cada um, perceber como funciona o programa e seu menu!

  



Esconder código-fonte

program cadrasfunc;

//uses crt;

const MAXNUMFUNCS = 10;
const TAMVETORDEPTO = 2;

{daclaracao de tipos}

type

departamento = record
   nome     : string[50];
   endereco : string[50];
   numero   : 0..1001;
end;

funcionario = record
   nome    : string[50];
   codigo  : integer;
   salario : real;
   depto   : ^departamento;
end;

VDepto = array [0..TAMVETORDEPTO] of ^departamento;
VFunc = array [0..(MAXNUMFUNCS - 1)] of ^funcionario;

{declaracao de variaveis}

var 
   op: char;
   //VetorDepto: array [0..TAMVETORDEPTO] of ^departamento;
   //VetorFunc: array [0..(MAXNUMFUNCS - 1)] of ^funcionario;
   VetorDepto: Vdepto;
   VetorFunc: Vfunc;
   letras: set of char;



{========== INICIALIZAR ===========}

procedure inicializaVet(var VetorFunc: Vfunc; var VetorDepto: VDepto);
var
   i: integer;
begin
   for i := 0 to (MAXNUMFUNCS - 1) do
      VetorFunc[i] := nil;
   for i := 0 to TAMVETORDEPTO do
      VetorDepto[i] := nil;
end;

{========== INSERIR FUNCIONARIO ===========}

procedure inserirFunc(var VetorFunc: VFunc; var VetorDepto: Vdepto);
var
   Func: ^funcionario;
   deptoTemp, codigoTemp, salarioTemp: string[50];
   i, j, k, erro, error, erroSal, erroNome, tamanho, nomeTemp: integer;
   achou: boolean;
begin
   i := 0;
   achou := false;
   erro := 0;
   letras := ['a'..'z'];
   while ((i <= (MAXNUMFUNCS -1)) and (not(achou))) do
      if(VetorFunc[i] = nil) then
         achou := true
      else
         i := i + 1;
   if(achou) then begin
      j := 1;
      //letras := ['a'..'z'];
      new(Func);
      //write('Digite o nome do Funcionario: ');
      readln(Func^.nome);
      Func^.nome := lowercase(Func^.nome);
      while ((j <= 50) and (erro <> 1)) do begin
         //if ((lowercase(Func^.nome[j])) in ['a'..'z']) then
         {if ((Func^.nome[j]) in letras) then
            j := j + 1
         else
            erro := 1;
      end;}
         val(Func^.nome[j], nomeTemp, erroNome);
         if(erroNome = 0) then
            erro := 1
         else
            j := j + 1;
      end;

      j := 0;
      achou := false;
      //write('Digite o codigo do Funcionario: ');
      readln(codigoTemp);
      val(codigoTemp, Func^.codigo, error);
      if(error = 0) then begin
         while ((j < MAXNUMFUNCS -1) and (not(achou))) do begin
            if (VetorFunc[j] <> nil) then
               if (Func^.codigo = VetorFunc[j]^.codigo) then
                  achou := true;
            j := j + 1;
         end;
      end
      else
         if (erro <> 1) then
            erro := 2;
      if ((not(achou)) and ((Func^.codigo < 0) or (Func^.codigo > 1000))) then
         if (erro <> 1) then
            erro := 2;



      //write('Digite o salario do Funcionario: ');
      readln(salarioTemp);
      val(salarioTemp, Func^.salario, erroSal);
      tamanho := length(salarioTemp);
      if((tamanho < 4) or (tamanho > 9) or (salarioTemp[tamanho - 2] <> '.')) then
         erroSal := 1;
      if (erroSal <> 0) then
         if ((erro <> 1) and (erro <> 2)) then
            erro := 3;


      //write('Digite o Departamento do Funcionario: ');
      readln(deptoTemp);
      deptoTemp := lowercase(deptoTemp);
      if ((deptoTemp = 'financeiro') or (deptoTemp = 'administrativo') or (deptoTemp = 'pesquisa')) then begin
      end
      else
         if ((erro <> 1) and (erro <> 2) and (erro <> 3)) then
            erro := 4;


      case (erro) of
         0:begin
            if (achou) then
               writeln('codigo ja existente')
            else begin
               k := 0;
               while (k <= TAMVETORDEPTO) do
                  if (VetorDepto[k] <> nil) then begin
                     if (deptoTemp = VetorDepto[k]^.nome) then begin
                        Func^.depto := VetorDepto[k];
                        k := TAMVETORDEPTO + 1;
                        Func^.depto^.numero := Func^.depto^. numero + 1;
                        VetorFunc[i] := Func;
                     end;
                  end;
            end;
         end;
         1:begin
               writeln('dados invalidos');
               writeln(Func^.nome);
         end;
         2:begin
               writeln('dados invalidos');
               writeln(codigoTemp);
         end;
         3:begin
               writeln('dados invalidos');
               writeln(salarioTemp);
         end;
         4:begin
               writeln('dados invalidos');
               writeln(deptoTemp);
         end;
      end;
   end 
   else begin
      writeln('nao ha espaco no sistema');
   end;
end;

{========== INSERIR DEPARTAMENTO ===========}

procedure inserirDepto(var VetorDepto: VDepto);
var
   Depto: ^departamento;
   i: integer;
   inseriu: boolean;
   //deptoTemp: string[50];
begin
   inseriu := false;
   new(Depto);
   //write('Digite o nome do Departamento: ');
   readln(Depto^.nome);
   Depto^.nome := lowercase(Depto^.nome);
   //deptoTemp := lowercase(Depto^.nome);
   //write('Digite o endereco do Departamento: ');
   readln(Depto^.endereco);
   Depto^.numero := 0;
   if ((Depto^.nome = 'financeiro') or (Depto^.nome = 'administrativo') or (Depto^.nome = 'pesquisa')) then
   //if ((deptoTemp = 'financeiro') or (deptoTemp = 'administrativo') or (deptoTemp = 'pesquisa')) then
   begin
      i := 0;
      while ((i<=TAMVETORDEPTO) and (not (inseriu))) do
      begin
         if (VetorDepto[i] <> NIL) then
         begin
            if (upcase(Depto^.nome) = upcase(VetorDepto[i]^.nome)) then
            begin
               writeln('departamento ja cadastrado');
               writeln(Depto^.nome);
            end;
         end
         else
         begin
            VetorDepto[i] := Depto;
            inseriu := true;
         end;
         i := i+1;
      end;
   end
   else begin
      //writeln;
      writeln('departamento invalido');
      writeln(Depto^.nome);
      //writeln(Depto^.endereco);
      //writeln(Depto^.numero);
   end;
end;



{========== CONSULTA FUNCIONARIO ===========}

procedure consultaFunc;
var resp   : string[50];
    erro,i : integer;
    codigo : integer;
    achou  : boolean;
begin
   readln(resp);
   val(resp,codigo,erro);
   if(erro <> 0) then begin
      writeln('codigo invalido');
      writeln(resp);
   end
   else
      if((codigo < 0) or (codigo > 1000)) then begin
         writeln('codigo invalido');
         writeln(resp);
      end
      else begin
         i := 0;
         achou := false;
         while(i <= MAXNUMFUNCS - 1) do begin
            if(VetorFunc[i] <> nil) then
               if(VetorFunc[i]^.codigo = codigo) then begin
                  writeln(VetorFunc[i]^.nome);
                  writeln(VetorFunc[i]^.codigo);
                  writeln(VetorFunc[i]^.salario:6:2);
                  writeln(VetorFunc[i]^.depto^.nome);
                  i := MAXNUMFUNCS + 1;
                  achou := true;
               end;
            i := i + 1;
         end;
         if(not achou) then begin
            writeln('codigo inexistente');
            writeln(resp);
         end
   end;
end;



{========== CONSULTA DEPARTAMENTO ==========}

procedure consultaDepto;
var resp  : string[50];
    i     : integer;
    achou : boolean;
begin
   readln(resp);
   resp := lowercase(resp);
   if((resp = 'financeiro') or (resp = 'administrativo') or (resp = 'pesquisa')) then begin
      i := 0;
      achou := false;
      while (i <= TAMVETORDEPTO) do begin
         if(VetorDepto[i] <> nil) then
            if(lowercase(VetorDepto[i]^.nome) = resp) then begin
               writeln(VetorDepto[i]^.nome);
               writeln(VetorDepto[i]^.endereco);
               writeln(VetorDepto[i]^.numero);
               i := MAXNUMFUNCS + 1;
               achou := true;
            end;
         i := i + 1;
      end;
      if(not achou) then begin
         writeln('departamento inexistente');
         writeln(resp);
      end;
   end
   else begin
      writeln('departamento invalido');
      writeln(resp);
   end;
end;



{=============== REMOVER FUNCIONARIO =============}

procedure removerFunc(var VetorFunc: VFunc; var VetorDepto: VDepto);
var
   i: integer;
   //codigoTemp: string[10];
   codigoTemp: integer;
   achou: boolean;
   p: ^funcionario;
begin
   readln(codigoTemp);
   achou := false;
   i:=0;
   if((codigoTemp >= 0) and (codigoTemp <= 1000)) then begin
      while ((i <= (MAXNUMFUNCS -1)) and (not(achou))) do begin
         if (VetorFunc[i] <> nil) then
            if (codigoTemp = VetorFunc[i]^.codigo) then begin
               achou := true;
            end;
         i := i + 1;
      end;
      i := i - 1;       //*********************************************
      if(achou) then begin
         p := VetorFunc[i];
         p^.depto^.numero := p^.depto^.numero -1;
         VetorFunc[i] := nil;
         dispose(p);
      end
      else begin
         writeln('funcionario inexistente');
         writeln(codigoTemp);
      end;
   end
   else begin
      writeln('codigo invalido');
      writeln(codigoTemp);
   end;
end;


{======= LISTAGEM DE FUNCIONARIOS =======}

procedure listarFunc;
var
   mincodigo, codigoAnt, i, j: integer;
begin
   i := 0;
   codigoAnt := -1;
   while(i < MAXNUMFUNCS) do begin
      mincodigo := 10000;
      for j := 0 to (MAXNUMFUNCS - 1) do begin
         if (VetorFunc[j] <> nil) then begin
            if ((VetorFunc[j]^.codigo < mincodigo) and (VetorFunc[j]^.codigo > codigoAnt)) then
               mincodigo := VetorFunc[j]^.codigo;
         end;
      end;
      if (mincodigo <> 10000) then
         writeln(mincodigo);
      codigoAnt := mincodigo;
      i := i + 1;
   end;
end;


{======= FUNCIONARIO POR INDICE DO VETOR =======}

procedure funcPorIndiceVetor;
var resp   : string[50];
    erro   : integer;
    indice : integer;
begin
   readln(resp);
   val(resp,indice,erro);
   if((erro <> 0) or (indice < 0) or (indice > MAXNUMFUNCS - 1)) then begin
      writeln('indice de vetor invalido');
      writeln(resp);
      end
   else if(VetorFunc[indice] <> nil) then
      writeln(VetorFunc[indice]^.codigo)
   else
      writeln('funcionario inexistente');
end;



{======= DEPARTAMENTO POR INDICE DO VETOR =======}

procedure deptoPorIndiceVetor;
var resp   : string[50];
    erro   : integer;
    indice : integer;
begin
   readln(resp);
   val(resp,indice,erro);
   if((erro <> 0) or (indice < 0) or (indice > TAMVETORDEPTO)) then begin
      writeln('indice de vetor invalido');
      writeln(resp);
      end
   else if(VetorDepto[indice]<>NIL) then
      writeln(VetorDepto[indice]^.nome)
   else
      writeln('nenhum departamento armazenado nesta posicao');
end;



{============ PROGRAMA PRINCIPAL ===============}

begin
   inicializaVet(VetorFunc, VetorDepto);
   repeat
      readln(op);
      case op of
         'i': begin
               //write('Inserir Departamento ou Funcionario? ');
               readln(op);
               {case op of
                  'f': inserirFunc;
                  'd': inserirDepto;
               end;}
               if (op = 'f') then
                  inserirFunc(Vetorfunc, VetorDepto);
               if (op = 'd') then
                  inserirDepto(VetorDepto);
         end;
         'c': begin
               //write('Consultar Departamento ou Funcionario? ');
               readln(op);
               {case(op) of
                  'f': consultaFunc;
                  'd': consultaDepto;
               end;}
               if (op = 'f') then
                  consultaFunc;
               if (op = 'd') then
                  consultaDepto;
         end;
         'r': removerFunc(VetorFunc, VetorDepto);
         'l': listarFunc;
         'v': funcPorIndiceVetor;
         'd': deptoPorIndiceVetor;
      end;
      //write('teste');
   until op = 'e';
   //writeln;
end.

Scripts recomendados

Array de números aleatórios não-repetidos de um intervalo em Pascal

Executar comando do DOS.

somatório de uma matriz 7x5

escreve os números de 1 a 9 com repeat - until

programa pra somar e tirar média


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts