Bueno, anoche se me ocurrio hacer algo para sumar dos fechas como por ejemplo 2 años,3 meses,6 semanas,7dias, 33 horas, 0min y 88 segundos + 3 años,22 meses y 60 min.
Queria poner como condiciones que no se pudiera introducir(cuando te piden los minutos, horas etc.), por ejemplo una cifra superior a 52 semanas etc., y que al poner por ejemplo 13 meses saltara un mensaje que dijera "el mes debe estar comprendido entre 0 y 12"... pero eso es más laborioso; ya lo haré cuando se pase la ola de calor
![sonrisa [sonrisa]](/images/smilies/nuevos/risa_ani1.gif)
.
Entonces para hacerlo más sencillo, he puesto que se pueda introducir cualquier número positivo sin cota superior.Y ha salido esto:
program SumarTiempo;
Type duracion = record
seg,min,hor,dia,semana,mes,ano:integer;
end;
Var
d:duracion;
TotalSegundos,TotalSegundos1,TotalSegundos2,TotalSegundosT:extended;
TOTAL:qword;
procedure LeerAnoYComprobar(var a:integer);
Begin
Write('Escribe el n£mero de a¤os: ');
readln(a);
if a < 0 then begin
repeat
write('El n£mero de a¤os no es v lido. Vuelve a escribirlo: ');
readln(a);
until a >= 0;
end;
End;
procedure LeerMesYComprobar(var b:integer);
Begin
Write('Escribe el n£mero de meses: ');
readln(b);
While (b < 0) do
begin
Write('El n£mero de meses no es v lido. Vuelve a escribirlo: ');
readln(b);
end;
End;
procedure LeerSemanaYComprobar(var c:integer);
Begin
Write('Escribe el n£mero de semanas: ');
readln(c);
While (c < 0) do
begin
Write('El n£mero de semanas no es v lido. Vuelve a escribirlo: ');
readln(c);
end;
End;
procedure LeerDiaYComprobar(var d:integer);
Begin
Write('Escribe el n£mero de dias: ');
readln(d);
While (d < 0) do
begin
Write('El n£mero de dias no es v lido. Vuelve a escribirlo: ');
readln(d);
end;
End;
procedure LeerHorasYComprobar(var e:integer);
Begin
Write('Escribe el n£mero de horas: ');
readln(e);
While (e < 0) do
begin
Write('El n£mero de horas no es v lido. Vuelve a escribirlo: ');
readln(e);
end;
End;
procedure LeerMinutosYComprobar(var f:integer);
Begin
Write('Escribe el n£mero de minutos: ');
readln(f);
While (f < 0) do
begin
Write('El n£mero de minutos no es v lido. Vuelve a escribirlo: ');
readln(f);
end;
End;
procedure LeerSegundosYComprobar(var g:integer);
Begin
Write('Escribe el n£mero de segundos: ');
readln(g);
While (g < 0) do
begin
Write('El n£mero de segundos no es v lido. Vuelve a escribirlo: ');
readln(g);
end;
End;
function TodoASegundos(h,i,j,k,l,m,n:integer):extended;
Begin
TotalSegundos:=(h * 12 * 30.4166 * 24 * 60 * 60) + ( i * 30.4166 * 24 * 60 * 60) + (j * 7 * 24 * 60 * 60)+
(k * 24 * 60 * 60) + (l * 60 * 60) + (m * 60) + n
End;
procedure SegundosAUnidades(o:qword; var p,q,r,s,t,u,v:integer);
Var resto:qword;
Begin
p:= o DIV trunc (12 * 30.4166 * 24 * 60 * 60);
resto:= o MOD trunc (12 * 30.4166 * 24 * 60 * 60);
q:= resto DIV trunc (30.4166 * 24 * 60 * 60);
resto:= resto MOD trunc (30.4166 * 24 * 60 * 60);
r:= resto DIV (7 * 24 * 60 * 60);
resto:= resto MOD (7 * 24 * 60 * 60);
s:= resto DIV (24 * 60 * 60);
resto:= resto MOD (24 * 60 * 60);
t:= resto DIV (60 * 60);
resto:= resto MOD (60 * 60);
u:= resto DIV (60);
resto:= resto MOD (60);
v:= resto;
End;
Begin
Writeln(' SUMAR DOS DURACIONES DE TIEMPO');
Writeln(' ______________________________');
Writeln('Primera duraci¢n.');
LeerAnoYComprobar(d.ano);
LeerMesYComprobar(d.mes);
LeerSemanaYComprobar(d.semana);
LeerDiaYComprobar(d.dia);
LeerHorasYComprobar(d.hor);
LeerMinutosYComprobar(d.min);
LeerSegundosYComprobar(d.seg);
TodoASegundos(d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);
TotalSegundos1:=TotalSegundos;
Writeln('Segunda duraci¢n.');
LeerAnoYComprobar(d.ano);
LeerMesYComprobar(d.mes);
LeerSemanaYComprobar(d.semana);
LeerDiaYComprobar(d.dia);
LeerHorasYComprobar(d.hor);
LeerMinutosYComprobar(d.min);
LeerSegundosYComprobar(d.seg);
TodoASegundos(d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);
TotalSegundos2:=TotalSegundos;
TotalSegundosT:=TotalSegundos1 + TotalSegundos2;
TOTAL:= trunc (TotalSegundosT);
SegundosAUnidades(TOTAL,d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);
Write('La suma de las dos duraciones da como resultado ',TOTAL, ' segundos');
Write(' y en unidades de tiempo: ',d.ano, ' a¤os, ', d.mes, ' meses, ', d.semana, ' semanas,' , d.dia, ' dias,');
write(' ', d.hor, ' horas, ', d.min, ' minutos y ', d.seg, ' segundos.');
readln();
End.
Por último, pregunto si hay alguna forma para que el programa no se cierre al escribir una A cuando lo que se espera es un Entero, por ejmplo.
Saludoss.