MODULE Equilibrium; (* Equilibrium index *) FROM STextIO IMPORT WriteLn, WriteString; FROM SWholeIO IMPORT WriteInt; TYPE (* These types are for easier initialization in the main program.*) TData7Items = ARRAY [0 .. 6] OF INTEGER; TData3Items = ARRAY [0 .. 2] OF INTEGER; VAR X1: TData7Items; X1Eqs: ARRAY [0 .. 6] OF BOOLEAN; X2: TData3Items; X2Eqs: ARRAY [0 .. 2] OF BOOLEAN; X3: TData3Items; X3Eqs: ARRAY [0 .. 2] OF BOOLEAN; X4: TData7Items; X4Eqs: ARRAY [0 .. 6] OF BOOLEAN; PROCEDURE WriteArray(Nums: ARRAY OF INTEGER; NL: BOOLEAN); VAR I: CARDINAL; BEGIN FOR I := 0 TO HIGH(Nums) DO WriteInt(Nums[I], 1); WriteString(" ") END; IF NL THEN WriteLn END END WriteArray; PROCEDURE WriteIndicesOfTrue(Bools: ARRAY OF BOOLEAN; NL: BOOLEAN); VAR I: CARDINAL; BEGIN FOR I := 0 TO HIGH(Bools) DO IF Bools[I] THEN WriteInt(I, 1); WriteString(" ") END; END; IF NL THEN WriteLn END END WriteIndicesOfTrue; PROCEDURE GetIndices(Nums: ARRAY OF INTEGER; VAR OUT Result: ARRAY OF BOOLEAN); VAR LeftSum, RightSum: INTEGER; I: CARDINAL; BEGIN LeftSum := 0; RightSum := 0; FOR I := 0 TO HIGH(Nums) DO RightSum := RightSum + Nums[I] END; FOR I := 0 TO HIGH(Nums) DO RightSum := RightSum - Nums[I]; Result[I] := (LeftSum = RightSum); LeftSum := LeftSum + Nums[I] END; END GetIndices; BEGIN X1 := TData7Items{-7, 1, 5, 2, -4, 3, 0}; GetIndices(X1, X1Eqs); X2 := TData3Items{2, 4, 6}; GetIndices(X2, X2Eqs); X3 := TData3Items{2, 9, 2}; GetIndices(X3, X3Eqs); X4 := TData7Items{1, -1, 1, -1, 1 ,-1, 1}; GetIndices(X4, X4Eqs); WriteString("Results:"); WriteLn; WriteLn; WriteString("X1: "); WriteArray(X1, TRUE); WriteString("Eqs: "); WriteIndicesOfTrue(X1Eqs, TRUE); WriteLn; WriteString("X2: "); WriteArray(X2, TRUE); WriteString("Eqs: "); WriteIndicesOfTrue(X2Eqs, TRUE); WriteLn; WriteString("X3: "); WriteArray(X3, TRUE); WriteString("Eqs: "); WriteIndicesOfTrue(X3Eqs, TRUE); WriteLn; WriteString("X4: "); WriteArray(X4, TRUE); WriteString("Eqs: "); WriteIndicesOfTrue(X4Eqs, TRUE); END Equilibrium.