----------------------------------------------------------------------
-- Aufgabe: summiere 1..n.
-- Methode: tasks fuer Teilsummen 1..n/2, n/2+1..n,
--          Start u. Zusammenfassung durch Hauptprogramm
----------------------------------------------------------------------
with Stringpack; use Stringpack;
procedure Arbeitsteilung is

   task type Worker is
      entry Start(From, To: Integer);
      entry Result(Res: out Integer);
   end Worker;

   task body Worker is
      Local_From, Local_To, Local_Res: Integer;
   begin
      accept Start(From, To: Integer) do
         Local_From := From;
         Local_To := To;
      end Start;
      Local_Res := 0;
      for I in Local_From..Local_To loop
         Local_Res := Local_Res+I;
      end loop;
      accept Result(Res: out Integer) do
         Res := Local_Res;
      end Result;
   end Worker;

   W1, W2: Worker;
   N, Sum1, Sum2: Integer;

begin
   Print("give natural");
   N := Getint;
   W1.Start(1, N/2);
   W2.Start(N/2 +1, N);
   W1.Result(Sum1);
   W2.Result(Sum2);
   Print("Summe= " & (Sum1 + Sum2));
end Arbeitsteilung;

