segunda-feira, 20 de junho de 2011

Trabalho 2 - Locadora de Veículos

program locadora_veiculos;
uses crt;
type cli = record
         nome, telefone: string;
         codigo: integer;
     end;
     vei = record
         modelo: string;
         marca: string;
         diaria: real;
         situacao: string;
         cliente: integer;
         diarias: integer;
     end;
var veiculos: array [1..10] of vei;
    clientes: array [1..50] of cli;
    i, opcao, icliente: integer;

function procura_carro(modelo: string; v: array of vei; i: integer): integer; {procura a posicao onde esta localizado o carro com modelo X, modelo: modelo do carro, v: vetor dos carros, i: posicao do proximo carro a ser cadastrado}
var j: integer; {j eh um contador}
begin
     procura_carro:=-1;
     for j:=0 to i-2 do
         if (lowercase(v[j].modelo) = lowercase(modelo)) then
            procura_carro:=j;
end;

function procura_cliente(codigo:integer; c: array of cli; i: integer): integer; {procura a posicao onde esta localizado o cliente com codigo X, codigo: codigo do cliente, c: vetor dos carros, i: posicao do proximo cliente a ser cadastrado}
var j: integer; {j eh um contador}
begin
     procura_cliente:=-1;
     for j:=0 to i-2 do
         if (c[j].codigo = codigo) then
            procura_cliente:=j;
end;

procedure mostra_carros(v: array of vei; i: integer); {procedimento que mostra todos os carros da locadora, estejam eles disponiveis para alugar ou nao, v: vetor de carros, i: posicao do proximo carro a ser cadastrado}
var j, contacarros:integer; {j eh um contador, contacarros eh um contador pra mostrar uma mensagem de erro caso nao haja nenhum carro cadastrado}
begin
     contacarros:=0;
     for j:=0 to i-2 do
     begin
         writeln(j+1, '-', v[j].marca, ', ', v[j].modelo, ', R$', v[j].diaria:0:2,' a diaria. Situacao: ', v[j].situacao);
         contacarros:=contacarros+1;
     end;
     if (contacarros = 0) then
        writeln('Nao temos nenhum carro cadastrado');
     readkey;
end;

function mostra_carros_disponiveis(v: array of vei; i: integer): integer; {procedimento que mostra todos os carros disponiveis da locadora, v: vetor de carros, i: posicao do proximo carro a ser cadastrado}
var j: integer; {j eh um contador}
begin
     mostra_carros_disponiveis:=0;
     for j:=0 to i-2 do
         if (v[j].situacao = 'Disponivel') then
         begin
              mostra_carros_disponiveis:=mostra_carros_disponiveis+1;
              writeln(mostra_carros_disponiveis, '-', v[j].marca, ', ', v[j].modelo, ', R$', v[j].diaria:0:2,' a diaria.');
         end;
     if (mostra_carros_disponiveis = 0) then
     begin
        writeln('Desculpe, todos nossos veiculos estao alugados');
        readkey;
     end;
end;

procedure cadastro_veiculo(var v: array of vei; var i: integer); {procedimento para cadastrar o veiculo, v: vetor de carros, i: posicao do proximo carro a ser cadastrado}
var modelo: integer; {modelo eh uma variavel temporaria pra dizer se o carro ja foi cadastrado ou nao}
begin
     if (i > 10) then
     begin
        writeln('Nossa locadora nao suporta mais veiculos');
        readkey;
     end
     else
     begin
         repeat
             write('Escreva a marca do veiculo: ');
             readln(v[i-1].marca);
             write('Escreva o modelo do veiculo: ');
             readln(v[i-1].modelo);
             modelo:=procura_carro(v[i-1].modelo, v, i);
             if (modelo = -1) then
             begin
                 write('Escreva o valor da diaria: ');
                 readln(v[i-1].diaria);
             end
             else
                 writeln('Carro ja cadastrado, tente outro carro');
         until (modelo = -1);
         v[i].situacao:='Disponivel';
         v[i].marca:='';
         v[i].modelo:='';
         v[i].diaria:=0;
         v[i].diarias:=0;
         v[i].cliente:=0;
         i:=i+1;
     end;
end;

procedure aluga_carro(var v: array of vei; i: integer; var cl: array of cli; var icliente: integer); {}
var modelo: string; {modelo: modelo do carro a ser alugado}
    posicaocarro, posicaocliente, codigocliente: integer; {posicaocarro: indica a posicao onde esta localizado o carro no vetor de carros, posicaocliente: indica a posicao do cliente caso ele ja esteja cadastrado no sistema, codigocliente: variavel para ler o codigo do cliente}
begin
     if (i = 1) then
     begin
        writeln('Nao temos carros cadastrados ainda');
        readkey;
     end
     else
     begin
         writeln('Nossos carros:');
         if (mostra_carros_disponiveis(v, i) <> 0) then
         repeat
               write('Escreva o modelo do carro: ');
               readln(modelo);
               posicaocarro:=procura_carro(modelo, v, i);
               if (posicaocarro = -1) then
               begin
                  writeln('Desculpe, nao temos esse modelo.');
                  readkey;
               end
               else if (v[posicaocarro].situacao = 'Alugado') then
               begin
                  writeln('Esse carro ja esta alugado!');
                  readkey;
               end
               else
               begin
                    write('Escreva o codigo do cliente: ');
                    readln(codigocliente);
                    posicaocliente:=procura_cliente(codigocliente, cl, icliente);
                    if (posicaocliente = -1) then
                    begin
                        cl[icliente-1].codigo:=codigocliente;
                        write('Escreva o nome do cliente: ');
                        readln(cl[icliente-1].nome);
                        write('Escreva o telefone do cliente: ');
                        readln(cl[icliente-1].telefone);
                    end;
                    repeat
                          write('Quantos dias de aluguel? ');
                          readln(v[posicaocarro].diarias);
                          if ((v[posicaocarro].diarias < 1) or (v[posicaocarro].diarias > 30)) then
                          begin
                             writeln('Voce deve alugar o carro por no minimo 1 e no maximo 30 dias');
                             readkey;
                          end;
                    until ((v[posicaocarro].diarias >= 1) and (v[posicaocarro].diarias <= 30));
                    v[posicaocarro].situacao:='Alugado';
                    v[posicaocarro].cliente:=codigocliente;
                    if (posicaocliente = -1) then
                    begin
                        icliente:=icliente+1;     
                        cl[icliente].nome:='';
                        cl[icliente].codigo:=0;
                        cl[icliente].telefone:='';
                    end;
               end;
         until (posicaocarro <> -1);
   end;
end;

procedure devolve_carro(var v: array of vei; i: integer; cl: array of cli; icliente: integer); {procedimento pra devolver um carro, v: vetor de carros, cl vetor de clientes, i numero de carros cadastrados ate o momento, icliente numero de clientes cadastrados ate o momento}
var j, contacarros: integer; {j eh um contador, contacarros eh usado pra mostrar uma mensagem de erro caso nao haja nenhum carro alugado}
begin
    contacarros:=0;
    writeln('Carros alugados:');
    for j:=0 to i-2 do
    begin
        if (v[j].situacao = 'Alugado') then
            begin
               contacarros:=contacarros+1;
               writeln(j+1, ', ', v[j].marca, ', ', v[j].modelo, ', Cliente: ', cl[procura_cliente(v[j].cliente, cl, icliente)].nome, ', Total a pagar: R$', v[j].diaria*v[j].diarias:0:2);
            end;
        end;
    if (contacarros > 0) then
    begin
        write('Escolha o carro a devolver pelo codigo: ');
        readln(j);
        if ((j <= i-1) and (j >= 1) and (v[j-1].situacao = 'Alugado')) then
        begin
           v[j-1].situacao:='Disponivel';
           v[j-1].diarias:=0;
           v[j-1].cliente:=0;
        end
        else
        begin
            writeln('Esse carro nao existe ou nao esta alugado');
            readkey;
        end;
    end
    else
    begin
        writeln('Nenhum carro esta alugado.');
        readkey;
    end;
end;

begin
     i:=1;
     veiculos[i].situacao:='Disponivel';
     veiculos[i].marca:='';
     veiculos[i].modelo:='';
     veiculos[i].diaria:=0;
     veiculos[i].diarias:=0;
     veiculos[i].cliente:=0;
     icliente:=1;
     clientes[icliente].nome:='';
     clientes[icliente].codigo:=0;
     clientes[icliente].telefone:='';
     repeat
         writeln('1- Cadastro de veiculos');
         writeln('2- Saida de veiculos');
         writeln('3- Devolucao de veiculos');
         writeln('4- Exibir veiculos da locadora');
         writeln('0- Fechar programa');
         write('Escolha uma opcao: ');
         readln(opcao);
         if (opcao = 1) then
              cadastro_veiculo(veiculos, i)
         else if (opcao = 2) then
              aluga_carro(veiculos, i, clientes, icliente)
         else if (opcao = 3) then
              devolve_carro(veiculos, i, clientes, icliente)
         else if (opcao = 4) then
              mostra_carros(veiculos, i)
         else if (opcao <> 0) then
         begin
             writeln('Opcao invalida');
             readkey;
         end;
         clrscr;
     until (opcao = 0);
end.