system/std.zusatz/1.7.3/src/vector

Raw file
Back to index

PACKET vector DEFINES VECTOR, :=, vector,         (* Autor : H.Indenbirken *)
                      SUB, LENGTH, length, norm,  (* Stand : 21.10.83      *)
                      nilvector, replace, =, <>,
                      +, -, *, /,
                      get, put :

LET n = 4000;

TYPE VECTOR = STRUCT (INT lng, TEXT elem);
TYPE INITVECTOR = STRUCT (INT lng, REAL value);

INT VAR i;
TEXT VAR t :: "12345678";
VECTOR VAR v :: nilvector;

(****************************************************************************
PROC dump (VECTOR CONST v) :
  put line (text (v.lng) + " Elemente :");
  FOR i FROM 1 UPTO v.lng
  REP put line (text (i) + ": " + text (element i)) PER  .

element i :
  v.elem RSUB i  .

END PROC dump;
****************************************************************************)

OP := (VECTOR VAR l, VECTOR CONST r) :
  l.lng := r.lng;
  l.elem := r.elem

END OP :=;

OP := (VECTOR VAR l, INITVECTOR CONST r) :
  l.lng := r.lng;
  replace (t, 1, r.value);
  l.elem := r.lng * t

END OP :=;

INITVECTOR PROC nilvector :
   vector (1, 0.0)

END PROC nilvector;

INITVECTOR PROC vector (INT CONST lng, REAL CONST value) :
  IF lng <= 0
  THEN errorstop ("PROC vector : lng <= 0") FI;
  INITVECTOR : (lng, value)

END PROC vector;

INITVECTOR PROC vector (INT CONST lng) :
  vector (lng, 0.0)

END PROC vector;

REAL OP SUB (VECTOR CONST v, INT CONST i) :
  test ("REAL OP SUB : ", v, i);
  v.elem RSUB i

END OP SUB;

INT OP LENGTH (VECTOR CONST v) :
  v.lng

END OP LENGTH;

INT PROC length (VECTOR CONST v) :
  v.lng

END PROC length;

REAL PROC norm (VECTOR CONST v) :
  REAL VAR result :: 0.0;
  FOR i FROM 1 UPTO v.lng
  REP result INCR ((v.elem RSUB i)**2) PER;
  sqrt (result)  .

END PROC norm;

PROC replace (VECTOR VAR v, INT CONST i, REAL CONST r) :
  test ("PROC replace : ", v, i);
  replace (v.elem, i, r)

END PROC replace;

BOOL OP = (VECTOR CONST l, r) :
  l.elem = r.elem
END OP =;

BOOL OP <> (VECTOR CONST l, r) :
  l.elem <> r.elem
END OP <>;

VECTOR OP + (VECTOR CONST v) :
  v
END OP +;

VECTOR OP + (VECTOR CONST l, r) :
  test ("VECTOR OP + : ", l, r);
  v := l;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (l.elem RSUB i) + (r.elem RSUB i)) PER;
  v

END OP +;

VECTOR OP - (VECTOR CONST a) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, - (a.elem RSUB i)) PER;
  v

END OP -;

VECTOR OP - (VECTOR CONST l, r) :
  test ("VECTOR OP - : ", l, r);
  v := l;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (l.elem RSUB i) - (r.elem RSUB i)) PER;
  v
END OP -;

REAL OP * (VECTOR CONST l, r) :
  test ("REAL OP * : ", l, r);
  REAL VAR x :: 0.0;
  FOR i FROM 1 UPTO l.lng
  REP x INCR ((l.elem RSUB i) * (r.elem RSUB i)) PER;
  x

END OP *;

VECTOR OP * (VECTOR CONST v, REAL CONST r) :
  r*v

END OP *;

VECTOR OP * (REAL CONST r, VECTOR CONST a) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, r*(a.elem RSUB i)) PER;
  v

END OP *;

VECTOR OP / (VECTOR CONST a, REAL CONST r) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (a.elem RSUB i)/r) PER;
  v

END OP /;

TEXT VAR error :: "";
PROC test (TEXT CONST proc, VECTOR CONST v, INT CONST i) :
  IF i > v.lng
  THEN error := proc;
       error CAT "subscript overflow (LENGTH v=";
       error CAT text (v.lng);
       error CAT ", i=";
       error CAT text (i);
       error CAT ")";
       errorstop (error)
  ELIF i < 1
  THEN error := proc;
       error CAT "subscript underflow (i = ";
       error CAT text (i);
       error CAT ")";
       errorstop (error)
  FI  .

END PROC test;

PROC test (TEXT CONST proc, VECTOR CONST a, b) :
  IF a.lng <> b.lng
  THEN error := proc;
       error CAT "LENGTH a (";
       IF a.lng <= 0
       THEN error CAT "undefined"
       ELSE error CAT text (a.lng) FI;
       error CAT ") <> LENGTH b (";
       error CAT text (b.lng);
       error CAT ")";
       errorstop (error)
  FI

END PROC test;

PROC get (VECTOR VAR v, INT CONST lng) :
  v.lng := lng;
  v.elem := lng * "12345678";
  REAL VAR x;
  FOR i FROM 1 UPTO lng
  REP get (x);
      replace (v.elem, i, x)
  PER  .

END PROC get;

PROC put (VECTOR CONST v, INT CONST length, fracs) :
  FOR i FROM 1 UPTO v.lng
  REP put (text (v.elem RSUB i, length, fracs)) PER

END PROC put;

PROC put (VECTOR CONST v) :
  FOR i FROM 1 UPTO v.lng
  REP put (text (v.elem RSUB i)) PER

END PROC put;

END PACKET vector;