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.

quarta-feira, 25 de maio de 2011

trabalho de AED

questao numero 1:

program ex1;
uses crt, dos;
var opcao1, opcao2: char; {opcao1 = escolher se é hoje ou amanha o compromisso; opcao2 = escolher se deseja ou nao terminar o programa}
    h, m, subtracao: integer; {h = hora do compromisso, e armazena o horario do compromisso convertido para minutos; m = minuto do compromisso; subtracao = diferença entre o horario do sistema e o horario do compromisso}
    hatual, matual, satual, csatual: word; {hatual = hora do sistema e armazena o horario do sistema convertido para minutos; matual = minuto do sistema; satual = segundo do sistema; csatual = centesimos de segundos do sistema}
    horadodia: string; {horadodia = determinar se o compromisso do dia seguinte é de tarde, de manhã, de noite ou de madrugada}

begin
     repeat                    
         writeln('Escreva o dia do compromisso: (h para hoje, a para amanha)');
         repeat
            readln(opcao1);
            if (opcao1 <> 'a') and (opcao1 <> 'h') then
                writeln('Opcao invalida! Escreva h para hoje, ou a para amanha');
         until (opcao1 = 'a') or (opcao1 = 'h');
         repeat
            writeln('Qual a hora do compromisso?');
            readln(h);
            if (h > 23) or (h < 0) then
                writeln('Hora invalida! Entre com um numero entre 0 e 23');
         until (h <= 23) and (h >= 0);
         repeat
            writeln('Qual o minuto do compromisso?');
            readln(m);                                                    
            if (m > 59) or (m < 0) then
                writeln('Minuto invalido! Entre com um numero entre 0 e 60');
         until (m >= 0) and (m <= 59);
         h:=h*60+m;
         gettime(hatual,matual,satual,csatual);
         hatual:=hatual*60+matual;
         subtracao:=h-hatual;
         if (opcao1 = 'h') then
            if (subtracao >= 0) then
               writeln('Esteja preparado! Seu compromisso inicia daqui: ', subtracao div 60, 'h e ', subtracao mod 60, 'min')
            else
               writeln('Voce se atrasou para o compromisso! Ele iniciou ha: ', -subtracao div 60,'h e ',-subtracao mod 60, 'min')
         else
            begin
               if (h >= 0) and (h < 5*60) then
                   horadodia:='madrugada'
               else if (h >= 5*60) and (h < 12*60) then
                   horadodia:='manha'
               else if (h >= 12*60) and (h < 18*60) then
                   horadodia:='tarde'
               else if (h >= 18*60) and (h < 24*60) then
                   horadodia:='noite';
               writeln('Amanha de ', horadodia, ' voce tem um compromisso agendado pras: ', h div 60,'h e ',h mod 60,'min');
            end;
         writeln('Deseja continuar o programa? (s ou n)');
         repeat
            readln(opcao2);
            if (opcao2 <> 'n') and (opcao2 <> 's') then
               writeln('Opcao invalida! Escreva s para continuar, ou n para terminar o programa');
         until (opcao2 = 'n') or (opcao2 = 's');
         clrscr;
     until (opcao2 = 'n')
end.

questao numero 2:

program ex2;
uses crt;
var n, ntemp, contador, temp, i, j, capicua: integer; {n = numero a ser testado; ntemp = variavel temporaria para efetuar operacoes com o numero sem perder o numero original; contador = utilizado para contar quantos algarismos tem o numero a ser testado; temp = utilizado para calcular o exponencial de 10 e armazenar 1 se o numero for quadrado perfeito, e 0 caso contrario, e tambem armazenar o quadrado do numero, para testar se o numero é quadrado perfeito ou nao; i = contador do for; j = utilizado para armazenar quanto a metade do numero de algarismos do numero; capicua = armazena 1 se o numero for capicua, e 0 se não for}

begin
     for n:=0 to 10001 do
     begin
           ntemp:=n;
           contador:=0;
           while (ntemp <> 0) do
           begin
                ntemp:=ntemp div 10;
                contador:=contador+1;
           end;
           ntemp:=n;
           j:=contador div 2;
           capicua:=1;
           while (contador >= j-1) and (capicua = 1) do
           begin
                temp:=1;
                for i:=1 to contador-1 do
                    temp:=temp*10;
                if (ntemp div temp <> ntemp mod 10) then
                   capicua:=0;
                ntemp:=ntemp mod temp div 10;
                contador:=contador-2;
           end;
           contador:=1;
           repeat
                temp:=contador*contador;
                contador:=contador+1;
           until (temp >= n);
           if (temp = n) then
              temp:=1
           else
              temp:=0;
           if (capicua = 1) and (temp = 1) then
              writeln(n, '-Esse numero eh capicua e quadrado perfeito!');
     end;
     readln;
end.

questao numero 3:

program ex3;
uses crt;
var n1, n2, mdc, opcao: integer; {n1 = armazena o primeiro numero pro MDC; n2 = armazena o segundo numero pro MDC; mdc = armazena o mdc, que vai diminuindo caso esse numero nao divida os dois numeros n1 e n2; opcao = variavel para finalizar o programa ou nao}

begin
     repeat
           writeln('Escreva dois numeros para o calculo do MDC');
           readln(n1, n2);
           if (n1 < n2) then
              mdc:=n1
           else
              mdc:=n2;
           while (n1 mod mdc <> 0) or (n2 mod mdc <> 0) do
              mdc:=mdc-1;
           writeln('O MDC entre ', n1,' e ', n2,' eh: ',mdc);
           repeat
              writeln('Deseja reiniciar o programa? (1 para sim, 2 para nao)');
              readln(opcao);
              if (opcao <> 1) and (opcao <> 2) then
                 writeln('Opcao invalida! Escreva 1 para sim e 2 para nao');
           until (opcao = 1) or (opcao = 2);
           clrscr;
     until (opcao <> 1);
end. 


questao numero 4:

program ex4;
uses crt, dos;
var opcaomenu:integer;
    opcao1: char;
    h, m, subtracao: integer;
    hatual, matual, satual, csatual: word;
    horadodia: string;
    n, ntemp, contador, temp, i, j, capicua: integer;
    n1, n2, mdc: integer;
    pro1, pro2, pro3: integer; {pro1 = contabilizar o numero de vezes que o programa 1 foi executado; pro2 = contabilizar o numero de vezes que o programa 2 foi executado; pro3 = contabilizar o numero de vezes que o programa 3 foi executado}

begin
     pro1:=0;
     pro2:=0;
     pro3:=0;
     repeat
           writeln('Escolha qual programa voce quer executar:');
           writeln('1- Compromissos');
           writeln('2- Numeros Capicua');
           writeln('3- MDC de dois numeros');
           writeln('4- Finalizar programa');
           repeat
               readln(opcaomenu);
               if (opcaomenu < 1) or (opcaomenu > 4) then
                  writeln('Opcao invalida! Entre com um numero entre 1 e 4');
           until (opcaomenu >= 1) and (opcaomenu <= 4);
           if (opcaomenu = 1) then
           begin
             writeln('Escreva o dia do compromisso: (h para hoje, a para amanha)');
             repeat
                readln(opcao1);
                if (opcao1 <> 'a') and (opcao1 <> 'h') then
                    writeln('Opcao invalida! Escreva h para hoje, ou a para amanha');
             until (opcao1 = 'a') or (opcao1 = 'h');
             repeat
                writeln('Qual a hora do compromisso?');
                readln(h);
                if (h > 23) or (h < 0) then
                    writeln('Hora invalida! Entre com um numero entre 0 e 23');
             until (h <= 23) and (h >= 0);
             repeat
                writeln('Qual o minuto do compromisso?');
                readln(m);                                                    
                if (m > 59) or (m < 0) then
                    writeln('Minuto invalido! Entre com um numero entre 0 e 60');
             until (m >= 0) and (m <= 59);
             h:=h*60+m;
             gettime(hatual,matual,satual,csatual);
             hatual:=hatual*60+matual;
             subtracao:=h-hatual;
             if (opcao1 = 'h') then
                if (subtracao >= 0) then
                   writeln('Esteja preparado! Seu compromisso inicia daqui: ', subtracao div 60, 'h e ', subtracao mod 60, 'min')
                else
                   writeln('Voce se atrasou para o compromisso! Ele iniciou ha: ', -subtracao div 60,'h e ',-subtracao mod 60, 'min')
             else
                begin
                   if (h >= 0) and (h < 5*60) then
                       horadodia:='madrugada'
                   else if (h >= 5*60) and (h < 12*60) then
                       horadodia:='manha'
                   else if (h >= 12*60) and (h < 18*60) then
                       horadodia:='tarde'
                   else if (h >= 18*60) and (h < 24*60) then
                       horadodia:='noite';
                   writeln('Amanha de ', horadodia, ' voce tem um compromisso agendado pras: ', h div 60,'h e ',h mod 60,'min');
                end;
               
             pro1:=pro1+1;
           end
           else if (opcaomenu = 2) then
           begin
             for n:=0 to 10001 do
             begin
                   ntemp:=n;
                   contador:=0;
                   while (ntemp <> 0) do
                   begin
                        ntemp:=ntemp div 10;
                        contador:=contador+1;
                   end;
                   ntemp:=n;
                   j:=contador div 2;
                   capicua:=1;
                   while (contador >= j-1) and (capicua = 1) do
                   begin
                        temp:=1;
                        for i:=1 to contador-1 do
                            temp:=temp*10;
                        if (ntemp div temp <> ntemp mod 10) then
                           capicua:=0;
                        ntemp:=ntemp mod temp div 10;
                        contador:=contador-2;
                   end;
                   contador:=1;
                   repeat
                        temp:=contador*contador;
                        contador:=contador+1;
                   until (temp >= n);
                   if (temp = n) then
                      temp:=1
                   else
                      temp:=0;
                   if (capicua = 1) and (temp = 1) then
                      writeln(n, ' Numero capicua e quadrado perfeito!');
             end;
             pro2:=pro2+1;
           end
           else if (opcaomenu = 3) then
           begin
              writeln('Escreva dois numeros para o calculo do MDC');
              readln(n1, n2);
              if (n1 < n2) then
                 mdc:=n1
              else
                 mdc:=n2;
              while (n1 mod mdc <> 0) or (n2 mod mdc <> 0) do
                 mdc:=mdc-1;
              writeln('O MDC entre ', n1,' e ', n2,' eh: ',mdc);
              pro3:=pro3+1;
           end
           else if (opcaomenu = 4) then
           begin
              writeln('O programa 1 foi executado ', pro1, ' vezes');
              writeln('O programa 2 foi executado ', pro2, ' vezes');
              writeln('O programa 3 foi executado ', pro3, ' vezes');
           end;
           readln;
           clrscr;
     until (opcaomenu = 4);
end.

segunda-feira, 14 de março de 2011

Resposta - Exercício de Prática de algoritmos - descrição narrativa 14/03

a) - Trocar um pneu furado:
  1 - Colocar o macaco embaixo do carro e erguer o carro;
  2 - Utilizando a chave de roda, desapertar os parafusos do pneu danificado;
  3 - Retirar o pneu danificado;
  4 - Encaixar o pneu reserva;
  5 - Apertar os parafusos utilizando a chave de roda;
  6 - Soltar o macaco, abaixando o carro.

b) - Fazer um café usando coador:
  1 - Esquentar água;
  2 - Colocar o pó de café no coador, sobre a garrafa (se necessário adicionar açúcar);
  3 - Despejar a água quente dentro do coador;
  4 - Esperar que toda a mistura seja filtrada;
  5 - Retirar o coador.

c) - Ler dois números e apresentar o resultado da divisão do primeiro pelo segundo:
  1 - Ler o primeiro número;
  2 - Ler o segundo número e verificar se é diferente de zero;
  3 - Dividir o primeiro número pelo segundo;
  4 - Exibir resultado.

d) - Ler cinco números e calcular média aritmética. Ler outro número e compará-lo com a média, indicando o resultado:
  1 - Ler cinco números;
  2 - Somar os cinco números;
  3 - Dividir o resultado da soma do passo 2 por cinco;
  4 - Mostrar o resultado do passo 3;
  5 - Ler o outro número;
  6 - Verificar se o número do passo 5 é menor, igual ou maior que o resultado do passo 4;
  7 - Mostrar o resultado do passo 6.

e) - Ler duas notas de um aluno e indicar se ele está aprovado (>= 6) ou reprovado:
  1 - Ler os dois números indicadores da nota do aluno;
  2 - Somar os dois números apresentados no passo 1;
  3 - Verificar se o resultado do passo 2 é menor, igual, ou maior que 6;
  4 - Exibir resultado;
  5 - Caso o resultado seja menor que 6, o aluno está reprovado;
  6 - Caso o resultado seja maior ou igual a 6, o aluno está aprovado.

f) - Ler o preço de um produto e calcular seu novo preço com base numa porcentagem;
  1 - Ler o preço do produto;
  2 - Multiplicar o preço pela porcentagem;
  3 - Somar o valor do passo 2 no valor inicial;
  4 - Exibir resultado.

g) - Ler o salário de um funcionário e calcular o seu aumento. Para salários até R$420,00 - aumento de 20%; de 421,00 a 1.000,00 - aumento de 15%; acima de 1.000,00 - aumento de 10%:
  1 - Ler o salário do fúncionario;;
  2 - Caso o resultado do passo 1 seja menor ou igual a R$420,00, multiplica-lo por 0,2.
  3 - Caso o resultado do passo 1 seja maior ou igual a R$421,00 e menor ou igual a R$1.000,00, multiplica-lo por 0,15.
  4 - Caso o resultado do passo 1 seja maior que R$1.000,00, multiplica-lo por 0,1.
  5 - Exibir o resultado.