Duvida em uma função DELPHI.... alguém pode ajudar

24/11/2015

0

Olá, bom dia.
Estou com uma duvida em um teste que eu tive que fazer, gostaria de verificar as alternativas e verificar se a minha lógica esta correta; tive que fazer uma Função AlterarData(data: string; operacao: string; valor: integer), com as seguintes regras;

- Data e uma string no formato dd/MM/yyyy HH24:mi
- Operação e uma string so pode ser '+' ou '-'
- Valor e um integer que valem ao MINUTOS.

- Não é permitida a utilização de nenhuma classe ou biblioteca não nativa.
- Não é permitida a utilização da classe DateTime ou TimeSpan.
- Se o Valor ( minutos ) for menor que 0, ignorar o sinal e tratar como positivo.
- Ignore o fato de fevereiro possuir 28 ou 29 dias, considere sempre como 28.
- Ignore o horario de verão.


Exemplo de entrada/resultado:
AlterarData('30/01/2015 14:10','+',4000) = '02/02/2015 08:50'




function AlterarData(Data: string; Operacao: char;
valor: integer): string;
var
Dia, Mes, Ano, Hora, Minuto, TotalDiasMes: integer;
DiaFinal, MesFinal, AnoFinal, HoraFinal, MinutoFInal: integer;
{ Funcao para verificar a quantidade de dias que um mes especifico possui,
a variavel Mes deve ser preenchida com o numero do mes. }
function TotalDiaMes(Mes: integer): integer;
begin
Result := 31;
case Mes of
4, 6, 9, 11:
Result := 30;
2:
Result := 28;
end;
end;

begin
try
// Resultado caso saia da funcao sem terminar
Result := 'VER. VLR DIG.';

if (Data = '') then
exit;

valor := abs(valor);

// Verifica Formato
if (Length(Data) <> 16) and (Data[3] <> '/') and (Data[6] <> '/') and
(Data[11] <> ' ') and (Data[14] <> ':') then
exit;

// Verifica se o dia, mes, ano hora e minuto sao valores corretos;
Mes := strtoint(copy(Data, 4, 2));
Hora := strtoint(copy(Data, 12, 2));
Minuto := strtoint(copy(Data, 15, 2));

if not(Mes in [1 .. 12]) or not(Hora in [0 .. 23]) or
not(Minuto in [0 .. 59]) then
exit;

Dia := strtoint(copy(Data, 1, 2));
Ano := strtoint(copy(Data, 7, 4));

if TotalDiaMes(Mes) < Dia then
exit;

if Ano <0> 0 do
begin
if Operacao = '-' then
begin
// Se a operacao dor para decrementar os minutos
Dec(MinutoFInal);
if MinutoFInal = -1 then
begin
MinutoFInal := 59;
Dec(HoraFinal);
if HoraFinal = -1 then
begin
HoraFinal := 23;
Dec(DiaFinal);
if DiaFinal = -1 then
begin
Dec(MesFinal);
if MesFinal = -1 then
begin
MesFinal := 12;
Dec(AnoFinal);
end;
DiaFinal := TotalDiaMes(MesFinal);
end;
end;
end;
end
else
begin
// Se a operacao for para acrescentar os minutos
inc(MinutoFInal);
if MinutoFInal = 60 then
begin
MinutoFInal := 0;
inc(HoraFinal);
if HoraFinal = 24 then
begin
HoraFinal := 0;
inc(DiaFinal);
if DiaFinal > TotalDiaMes(MesFinal) then
begin
inc(MesFinal);
if MesFinal = 13 then
begin
MesFinal := 1;
inc(AnoFinal);
end;
DiaFinal := 1;
end;
end;
end;
end;
valor := valor - 1;
end;

// Retorna os resultados da funcao
Result := Format('%.2d/%.2d/%.4d %.2d:%.2d', [DiaFinal,MesFinal,AnoFinal, HoraFInal, MinutoFInal]);
except
on e: exception do begin
Result := 'Erro: ' + e.Message;
end;
end;

end;



ALGUEM AI CONHECE ALGUMA FORMA MAIS SIMPLES
Estevão Sousa

Estevão Sousa

Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar