Advertisement
MagnusArias

SBO | Kolo C# Gr. B

Jan 18th, 2020
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.30 KB | None | 0 0
  1. using Microsoft.SqlServer.Server;
  2. using System;
  3.  
  4. [Serializable]
  5. [SqlUserDefinedAggregate(Format.Native,
  6.     IsInvariantToDuplicates = false,
  7.     IsInvariantToNulls = true,
  8.     IsInvariantToOrder = true,
  9.     IsNullIfEmpty = false,
  10.     Name = "WskKoncentracji")]
  11. public struct WskKoncentracji
  12. {
  13.     private double sumaX;
  14.     private double sumaX_Pow2;
  15.     private double sumaX_Mul2;
  16.     private double sumaX_Pow4;
  17.     private double sumaX_Mul4_Pow3;
  18.     private double sumaX_Mul6_Pow2;
  19.     private double sumaX_Mul4;
  20.  
  21.     private int licznik;
  22.  
  23.     public void Init()
  24.     {
  25.         sumaX = 0;
  26.         sumaX_Pow2 = 0;
  27.         sumaX_Mul2 = 0;
  28.         sumaX_Pow4 = 0;
  29.         sumaX_Mul4_Pow3 = 0;
  30.         sumaX_Mul6_Pow2 = 0;
  31.         sumaX_Mul4 = 0;
  32.         licznik = 0;
  33.     }
  34.  
  35.     public void Accumulate(double? value)
  36.     {
  37.         if (value == null) return;
  38.  
  39.         sumaX += value.Value;
  40.         sumaX_Pow2 += Math.Pow(value.Value, 2);
  41.         sumaX_Mul2 += 2 * value.Value;
  42.         sumaX_Pow4 += Math.Pow(value.Value, 4);
  43.         sumaX_Mul4_Pow3 += 4 * Math.Pow(value.Value, 3);
  44.         sumaX_Mul6_Pow2 += 6 * Math.Pow(value.Value, 2);
  45.         sumaX_Mul4 += 4 * value.Value;
  46.         licznik++;
  47.     }
  48.  
  49.     public void Merge(WskKoncentracji Group)
  50.     {
  51.         this.sumaX += Group.sumaX;
  52.         this.sumaX_Pow2 += Group.sumaX_Pow2;
  53.         this.sumaX_Mul2 += Group.sumaX_Mul2;
  54.         this.sumaX_Pow4 += Group.sumaX_Pow4;
  55.         this.sumaX_Mul4_Pow3 += Group.sumaX_Mul4_Pow3;
  56.         this.sumaX_Mul6_Pow2 += Group.sumaX_Mul6_Pow2;
  57.         this.sumaX_Mul4 += Group.sumaX_Mul4;
  58.         this.licznik += Group.licznik;
  59.     }
  60.  
  61.     public double? Terminate()
  62.     {
  63.         if (licznik == 0) return null;
  64.         else
  65.         {
  66.             double srednia = sumaX / licznik;
  67.  
  68.             if (licznik - 1 == 0) return null;
  69.             else
  70.             {
  71.                 double odchylenie = Math.Sqrt((sumaX_Pow2 - sumaX_Mul2 * srednia + Math.Pow(srednia, 2)) / (licznik - 1));
  72.  
  73.                 if (licznik - 3 == 0)  return null;
  74.                 else
  75.                 {
  76.                     double up = sumaX_Pow4 -
  77.                         sumaX_Mul4_Pow3 * srednia +
  78.                         sumaX_Mul6_Pow2 * Math.Pow(srednia, 2) -
  79.                         sumaX_Mul4 * Math.Pow(srednia, 3) +
  80.                         Math.Pow(srednia, 4);
  81.                     double down = licznik * Math.Pow(odchylenie, 4);
  82.  
  83.                     if (down == 0.0) return null;
  84.                     double wsk = up / down;
  85.                  
  86.                     return (double?)wsk;
  87.                 }
  88.             }
  89.         }
  90.     }
  91.  
  92.     public void Read(System.IO.BinaryReader r)
  93.     {
  94.         sumaX = r.ReadDouble();
  95.         sumaX_Pow2 = r.ReadDouble();
  96.         sumaX_Mul2 = r.ReadDouble();
  97.         sumaX_Pow4 = r.ReadDouble();
  98.         sumaX_Mul4_Pow3 = r.ReadDouble();
  99.         sumaX_Mul6_Pow2 = r.ReadDouble();
  100.         sumaX_Mul4 = r.ReadDouble();
  101.         licznik = r.ReadInt32();
  102.     }
  103.  
  104.  
  105.     public void Write(System.IO.BinaryWriter w)
  106.     {
  107.         w.Write(sumaX);
  108.         w.Write(sumaX_Pow2);
  109.         w.Write(sumaX_Mul2);
  110.         w.Write(sumaX_Pow4);
  111.         w.Write(sumaX_Mul4_Pow3);
  112.         w.Write(sumaX_Mul6_Pow2);
  113.         w.Write(sumaX_Mul4);
  114.         w.Write(licznik);
  115.     }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement