________
Sysło(vii)
________
{$N-}
PROGRAM CzasSumowania;
USES CRT,DOS;
CONST MaxM=1000;
TYPE TablicaR=ARRAY[1..MaxM] OF REAL;
VAR j,m :INTEGER;
g1,m1,s1,r1,
g2,m2,s2,r2 :WORD;
r :REAL;
a :TablicaR;
FUNCTION Suma(m:INTEGER;x:TablicaR):REAL;
VAR i:INTEGER;
s:REAL;
BEGIN
{1.} s:=x[1];
FOR i:=2 TO m DO
{2.} s:=s+x[i];
{3.} Suma:=s
END; {Suma}
FUNCTION PrintTime:REAL;
{Wartoscia tej funkcji jest czas w sekundach jaki uplynal
od momentu (g1,m1,s1,r1) do momentu (g2,m2,s2,r2), gdzie
wielkosci okrslajace moment sa parametrami procedury stan-
dardowej GETTIME. Procedura daje poprawne wyniki z doklad-
noscia do 24 godzin.}
VAR x,y,z:INTEGER;
BEGIN
IF g2<g1 THEN g2:=g2+24;
IF m2<m1 THEN z:=-(m1-m2) ELSE z:=m2-m1;
IF s2<s1 THEN x:=-(s1-s2) ELSE x:=s2-s1;
IF r2<r1 THEN y:=-(r1-r2) ELSE y:=r2-r1;
PrintTime:=(g2-g1)*3600+z*60+x+y/100
END; {PrintTime}
BEGIN
CLRSCR;
REPEAT
WRITE('Podaj liczbe sumowanych elementow m (m=<',MaxM,') = ');
READLN(m);
IF m>MaxM THEN WRITELN('Musi byc m<',MaxM)
UNTIL m<=MaxM;
FOR j:=1 TO m DO a[j]:=RANDOM;
GETTIME(g1,m1,s1,r1);
r:=Suma(m,a);
GETTIME(g2,m2,s2,r2);
WRITELN('suma ',m,' liczb = ',r,'; ');
WRITELN('czas sumowania = ',PrintTime,' sek');
WRITELN;
WRITE('Nacisnij dowolny klawisz');
REPEAT UNTIL KEYPRESSED
END. {CzasSumowania}
FUNCTION Min(m:INTEGER;x:TablicaR):REAL;
VAR i:INTEGER;
y:REAL;
BEGIN
y:=x[1];
FOR i:=2 TO m DO
IF x[i]<y THEN y:=x[i];
Min:=y
END; {Min}
PROCEDURE ScalSort(Lewy,Prawy:INTEGER;VAR x:TablicaR);
VAR Srodek:INTEGER;
PROCEDURE Scal(Poczatek,Granica,Koniec:INTEGER;
VAR x:TablicaR);
VAR i,j,l:INTEGER;
z :TablicaR;
BEGIN
i:=Poczatek; j:=Granica; l:=Poczatek;
WHILE (i<Granica) AND (j<=Koniec) DO BEGIN
IF x[i]<=x[j] THEN BEGIN
z[l]:=x[i]; i:=i+1 END
ELSE BEGIN z[l]:=x[j]; j:=j+1 END;
l:=l+1
END;
{dolaczanie koncowki pierwszego podciagu}
WHILE i<Granica DO BEGIN
z[l]:=x[i];
l:=l+1; i:=i+1
END;
{dolaczanie koncowki drugiego podciagu}
WHILE j<=Koniec DO BEGIN
z[l]:=x[j];
l:=l+1; j:=j+1
END;
{kopiowanie wyniku z powrotem do tablicy x}
FOR i:=Poczatek TO Koniec DO
x[i]:=z[i]
END; {Scal}
BEGIN {ScalSort}
IF Lewy<Prawy THEN BEGIN
Srodek:=(Lewy+Prawy) DIV 2;
ScalSort(Lewy,Srodek,x);
ScalSort(Srodek+1,Prawy,x);
Scal(Lewy,Srodek+1,Prawy,x)
END
END; {ScalSort}
Uwaga! Brak wcięć i odstępów jest zamierzony:)