vstr.clu 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. bigint = word
  2. vstream = cluster is create, addnum, output
  3. ai = array[int]
  4. hi = heap[int]
  5. rep = record [
  6. name: string,
  7. sum: bigint,
  8. vals: hi
  9. ]
  10. create = proc (s: string) returns (cvt)
  11. return (rep${
  12. name: s,
  13. sum: int2big (0),
  14. vals: hi$create (int$lt)})
  15. end create
  16. addnum = proc (s: cvt, v: int)
  17. hi$insert (s.vals, v)
  18. s.sum := s.sum + int2big (v)
  19. end addnum
  20. output = proc (x: cvt, s: stream)
  21. a: ai := h2a (x.vals)
  22. stream$puts ("Statistics on ", s)
  23. stream$putl (x.name, s)
  24. stream$puts (" Count = ", s)
  25. stream$putl (int$unparse (ai$size(a)), s)
  26. stream$puts (" Nonzero Count = ", s)
  27. stream$putl (int$unparse (nzc (a)), s)
  28. stream$puts (" Total = ", s)
  29. stream$putl (bigint$unparse (x.sum), s)
  30. stream$puts (" Low Value = ", s)
  31. stream$putl (int$unparse (ai$bottom (a)), s)
  32. stream$puts (" High Value = ", s)
  33. stream$putl (int$unparse (ai$top (a)), s)
  34. stream$puts (" Average = ", s)
  35. stream$putl (bigint$unparse (x.sum/int2big(ai$size(a))), s)
  36. stream$puts (" Median = ", s)
  37. stream$putl (int$unparse (a[ai$size(a)/2]), s)
  38. stream$puts (" 90% value = ", s)
  39. stream$putl (int$unparse (a[ai$size(a)*9/10]), s)
  40. stream$putl ("", s)
  41. end output
  42. h2a = proc (x: hi) returns (ai)
  43. a: ai := ai$create (0)
  44. while ~hi$empty (x) do
  45. ai$addh (a, hi$remove (x))
  46. end
  47. return (a)
  48. end h2a
  49. nzc = proc (a: ai) returns (int)
  50. c: int := 0
  51. for v: int in ai$elements (a) do
  52. if v ~= 0 then c := c + 1 end
  53. end
  54. return (c)
  55. end nzc
  56. int2big = proc (i: int) returns (bigint)
  57. if i>=0
  58. then return (bigint$create (0, i))
  59. else return (bigint$create (-1, i))
  60. end
  61. end int2big
  62. end vstream