MODULE Main; IMPORT IO, Scan, Fmt, Text, FloatMode, Lex; TYPE Matrix = REF ARRAY OF ARRAY OF REAL; PROCEDURE Add(m1, m2 : Matrix) : Matrix = VAR rows := NUMBER(m1^); cols := NUMBER(m1[0]); res := NEW(Matrix, rows, cols); BEGIN IF NUMBER(m1^) # NUMBER(m2^) OR NUMBER(m1[0]) # NUMBER(m2[0]) THEN <* ASSERT FALSE *> END; FOR i := 0 TO rows - 1 DO FOR j := 0 TO cols - 1 DO res[i,j] := m1[i,j] + m2[i,j] END END; RETURN res END Add; PROCEDURE Sub(m1, m2 : Matrix) : Matrix = VAR rows := NUMBER(m1^); cols := NUMBER(m1[0]); res := NEW(Matrix, rows, cols); BEGIN IF NUMBER(m1^) # NUMBER(m2^) OR NUMBER(m1[0]) # NUMBER(m2[0]) THEN <* ASSERT FALSE *> END; FOR i := 0 TO rows - 1 DO FOR j := 0 TO cols - 1 DO res[i,j] := m1[i,j] + m2[i,j] END END; RETURN res END Sub; PROCEDURE Dump(m : Matrix) = BEGIN FOR i := FIRST(m^) TO LAST(m^) DO FOR j := FIRST(m[0]) TO LAST(m[0]) DO IO.Put("m("&Fmt.Int(i)&","&Fmt.Int(j)&") = " & Fmt.Real(m[i,j])&"\n") END END END Dump; <* FATAL IO.Error, FloatMode.Trap, Lex.Error *> VAR rows, cols : CARDINAL; m1, m2 : REF ARRAY OF ARRAY OF REAL; op : TEXT; BEGIN IO.Put("Matrix 1 Rows?\n"); rows := Scan.Int(IO.GetLine()); IO.Put("Matrix 1 Columns?\n"); cols := Scan.Int(IO.GetLine()); m1 := NEW(REF ARRAY OF ARRAY OF REAL, rows, cols); FOR i := 0 TO rows - 1 DO FOR j := 0 TO cols - 1 DO IO.Put("m1(" & Fmt.Int(i) & "," & Fmt.Int(j) & ")?\n"); m1[i,j] := Scan.Real(IO.GetLine()) END END; IO.Put("Matrix 2 Rows?\n"); rows := Scan.Int(IO.GetLine()); IO.Put("Matrix 2 Columns?\n"); cols := Scan.Int(IO.GetLine()); m2 := NEW(REF ARRAY OF ARRAY OF REAL, rows, cols); FOR i := 0 TO rows - 1 DO FOR j := 0 TO cols - 1 DO IO.Put("m2(" & Fmt.Int(i) & "," & Fmt.Int(j) & ")?\n"); m2[i,j] := Scan.Real(IO.GetLine()) END END; IO.Put("Operation?\n"); op := IO.GetLine(); CASE Text.GetChar(op,0) OF '+' => Dump(Add(m1,m2)) | '-' => Dump(Sub(m1,m2)) | '*' => ELSE <* ASSERT FALSE *> END END Main.