23) Să se definească un subprogram care va:
a) aduna două intervale de timp (exprimate în secunde, minute, ore, zile, săptămâni);
b) scădea două intervale de timp;
c) înmulți un interval de timp cu un număr natural;
d) împărți cu rest două intervale de timp;
e) compara două intervale de timp.
Rezolvati-o cineva in Pascal, imi trebuie urgent, mersi.
Răspunsuri la întrebare
Răspuns de
2
program intervale_timp;
type timp=array[1..5] of integer;
//limitele de timp pentru zile/ore/minute/secunde
const limite_timp:array[1..4] of integer=(7,24,60,60);
//prelucrare timp 01:03:16:42:24 este sapt 1, ziua 3,ora 16 minutul 42 sec 24
//prelucrarea ia fiecare dintre acesti termeni si ii pune in vectorul integer timp
procedure prel_timp(timp_citit:string;var timp_proc:timp);
var first_ch,nr_unitate,i,count:integer;
begin
first_ch:=1;
nr_unitate:=1;
for i:=1 to length(timp_citit) do
if timp_citit[i]=':' then
begin
count:=i-first_ch;
timp_proc[nr_unitate]:=strtoint(copy(timp_citit,first_ch,count));
inc(nr_unitate);
first_ch:=i+1;
end;
timp_proc[nr_unitate]:=strtoint(copy(timp_citit,first_ch,length(timp_citit)-first_ch+1));
end;
//negare a timpului in vederea adunarii ulterioare
function neg_timp(var moment_timp:timp):timp;
var i:integer;
negativ_timp:timp;
begin
for i:=1 to 5 do
negativ_timp[i]:=(-1)*moment_timp[i];
neg_timp:=negativ_timp;
end;
//adunarea celor 2 timpi. Rezultatul final este salvat in rezultat
procedure adunare_timp(timp_start,timp_sfarsit:timp;var rezultat:timp);
var i,cat,rest:integer;
begin
cat:=0;
for i:=5 downto 2 do
begin
rezultat[i]:=(cat+timp_start[i]+timp_sfarsit[i]) MOD limite_timp[i-1];
if rezultat[i]<0 then
rezultat[i]:=rezultat[i]+limite_timp[i-1];
if cat+timp_start[i]+timp_sfarsit[i]<0 then
begin
cat:=(cat+timp_start[i]+timp_sfarsit[i]) DIV limite_timp[i-1];
cat:=cat-1;
end
else
begin
cat:=(cat+timp_start[i]+timp_sfarsit[i]) DIV limite_timp[i-1];
end;
end;
rezultat[1]:=cat+timp_start[1]+timp_sfarsit[1];
end;
//inmultire timp
//asemanator cu produsul doar ca inmultim cu scala in loc sa adunam
procedure inmultire_timp(timp_start:timp;scala:integer;var rezultat:timp);
var i,cat,rest:integer;
begin
cat:=0;
for i:=5 downto 2 do
begin
rezultat[i]:=(cat+timp_start[i]*scala) MOD limite_timp[i-1];
if rezultat[i]<0 then
rezultat[i]:=rezultat[i]+limite_timp[i-1];
if cat+timp_start[i]*scala<0 then
begin
cat:=(cat+timp_start[i]*scala) DIV limite_timp[i-1];
cat:=cat-1;
end
else
begin
cat:=(cat+timp_start[i]*scala) DIV limite_timp[i-1];
end;
end;
rezultat[1]:=cat+timp_start[1]*scala;
end;
//comparatie timp.
//Comparam pas cu pas: saptaman vs saptamana, daca sunt egale zi cu zi...
procedure compara_timp(interval1,interval2:timp);
var i,ordine:integer;
begin
ordine:=0;
for i:=1 to 5 do
if interval1[i]<interval2[i] then
begin
ordine:=-1;
break;
end
else if interval1[i]>interval2[i] then
begin
ordine:=1;
break;
end;
if ordine=1 then
write(' mai mare ')
else if ordine=-1 then
write(' mai mic ')
else
write(' egala ');
end;
//afisam timpul tot in forma saptamana:zi:ora:minute:secunde
procedure afisare_timp(timp_scris:timp);
var i:integer;
begin
for i:=1 to 5 do
begin
if timp_scris[i]<10 then
write('0');
if (i=2) and (timp_scris[i]=0) then
inc(timp_scris[i]);
write(timp_scris[i],':');
end;
writeln;
end;
var start,sfarsit:string;
timp_start,timp_sfarsit,rezultat,neg_timp_start:timp;
scala:integer;
begin
writeln('Introduceti timpul de start:');
readln(start);
writeln('Introduceti timpul de sfarsit:');
readln(sfarsit);
prel_timp(start,timp_start);
prel_timp(sfarsit,timp_sfarsit);
writeln('a)');
adunare_timp(timp_start,timp_sfarsit,rezultat);
afisare_timp(rezultat);
writeln('b)');
neg_timp_start:=neg_timp(timp_start);
adunare_timp(neg_timp_start,timp_sfarsit,rezultat);
afisare_timp(rezultat);
writeln('c)');
writeln('Introduceti scala:');
readln(scala);
inmultire_timp(timp_start,scala,rezultat);
afisare_timp(rezultat);
writeln('e)');
write('Intervalul 1 este');
compara_timp(timp_start,timp_sfarsit);
write('fata de intervalul 2');
end.
type timp=array[1..5] of integer;
//limitele de timp pentru zile/ore/minute/secunde
const limite_timp:array[1..4] of integer=(7,24,60,60);
//prelucrare timp 01:03:16:42:24 este sapt 1, ziua 3,ora 16 minutul 42 sec 24
//prelucrarea ia fiecare dintre acesti termeni si ii pune in vectorul integer timp
procedure prel_timp(timp_citit:string;var timp_proc:timp);
var first_ch,nr_unitate,i,count:integer;
begin
first_ch:=1;
nr_unitate:=1;
for i:=1 to length(timp_citit) do
if timp_citit[i]=':' then
begin
count:=i-first_ch;
timp_proc[nr_unitate]:=strtoint(copy(timp_citit,first_ch,count));
inc(nr_unitate);
first_ch:=i+1;
end;
timp_proc[nr_unitate]:=strtoint(copy(timp_citit,first_ch,length(timp_citit)-first_ch+1));
end;
//negare a timpului in vederea adunarii ulterioare
function neg_timp(var moment_timp:timp):timp;
var i:integer;
negativ_timp:timp;
begin
for i:=1 to 5 do
negativ_timp[i]:=(-1)*moment_timp[i];
neg_timp:=negativ_timp;
end;
//adunarea celor 2 timpi. Rezultatul final este salvat in rezultat
procedure adunare_timp(timp_start,timp_sfarsit:timp;var rezultat:timp);
var i,cat,rest:integer;
begin
cat:=0;
for i:=5 downto 2 do
begin
rezultat[i]:=(cat+timp_start[i]+timp_sfarsit[i]) MOD limite_timp[i-1];
if rezultat[i]<0 then
rezultat[i]:=rezultat[i]+limite_timp[i-1];
if cat+timp_start[i]+timp_sfarsit[i]<0 then
begin
cat:=(cat+timp_start[i]+timp_sfarsit[i]) DIV limite_timp[i-1];
cat:=cat-1;
end
else
begin
cat:=(cat+timp_start[i]+timp_sfarsit[i]) DIV limite_timp[i-1];
end;
end;
rezultat[1]:=cat+timp_start[1]+timp_sfarsit[1];
end;
//inmultire timp
//asemanator cu produsul doar ca inmultim cu scala in loc sa adunam
procedure inmultire_timp(timp_start:timp;scala:integer;var rezultat:timp);
var i,cat,rest:integer;
begin
cat:=0;
for i:=5 downto 2 do
begin
rezultat[i]:=(cat+timp_start[i]*scala) MOD limite_timp[i-1];
if rezultat[i]<0 then
rezultat[i]:=rezultat[i]+limite_timp[i-1];
if cat+timp_start[i]*scala<0 then
begin
cat:=(cat+timp_start[i]*scala) DIV limite_timp[i-1];
cat:=cat-1;
end
else
begin
cat:=(cat+timp_start[i]*scala) DIV limite_timp[i-1];
end;
end;
rezultat[1]:=cat+timp_start[1]*scala;
end;
//comparatie timp.
//Comparam pas cu pas: saptaman vs saptamana, daca sunt egale zi cu zi...
procedure compara_timp(interval1,interval2:timp);
var i,ordine:integer;
begin
ordine:=0;
for i:=1 to 5 do
if interval1[i]<interval2[i] then
begin
ordine:=-1;
break;
end
else if interval1[i]>interval2[i] then
begin
ordine:=1;
break;
end;
if ordine=1 then
write(' mai mare ')
else if ordine=-1 then
write(' mai mic ')
else
write(' egala ');
end;
//afisam timpul tot in forma saptamana:zi:ora:minute:secunde
procedure afisare_timp(timp_scris:timp);
var i:integer;
begin
for i:=1 to 5 do
begin
if timp_scris[i]<10 then
write('0');
if (i=2) and (timp_scris[i]=0) then
inc(timp_scris[i]);
write(timp_scris[i],':');
end;
writeln;
end;
var start,sfarsit:string;
timp_start,timp_sfarsit,rezultat,neg_timp_start:timp;
scala:integer;
begin
writeln('Introduceti timpul de start:');
readln(start);
writeln('Introduceti timpul de sfarsit:');
readln(sfarsit);
prel_timp(start,timp_start);
prel_timp(sfarsit,timp_sfarsit);
writeln('a)');
adunare_timp(timp_start,timp_sfarsit,rezultat);
afisare_timp(rezultat);
writeln('b)');
neg_timp_start:=neg_timp(timp_start);
adunare_timp(neg_timp_start,timp_sfarsit,rezultat);
afisare_timp(rezultat);
writeln('c)');
writeln('Introduceti scala:');
readln(scala);
inmultire_timp(timp_start,scala,rezultat);
afisare_timp(rezultat);
writeln('e)');
write('Intervalul 1 este');
compara_timp(timp_start,timp_sfarsit);
write('fata de intervalul 2');
end.
anabuzenco:
Mersi, mult! Chiar m-ai salvat.
Alte întrebări interesante
Matematică,
8 ani în urmă
Biologie,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă