Informatică, întrebare adresată de anabuzenco, 9 ani în urmă

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 blindseeker90
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.

anabuzenco: Mersi, mult! Chiar m-ai salvat.
blindseeker90: asta mi se pare cea mai usoara dintre cele 3. O sa ma gandesc si la cea cu locomotiva.acum
blindseeker90: Nu am rezolvat exercitiul d) dina ceasta problema, pentru ca nu inteleg prea bine partea de impartire cu rest a intervalelor de timp. Dar oricum, punctele a,b si c) ar trebui sa te ajute sa il faci si pe d)
anabuzenco: bine, eu am facut aceasta problema in c++ si acolo am impartit doar intervalele
Alte întrebări interesante