/* calculates the new values for the members of the given collection, after a rational number was added */ void rncAdded(RationalNumberCollection* c, RationalNumber r, bool isNew){ if(isNew){ c->totalUniqueCount++; } c->totalCount++; c->sum = rnAdd(c->sum, r); RationalNumber rnDivisor = { c->totalCount, 1 }; c->average=rnDivide(c->sum, rnDivisor); rncCalcMedian(c); return; }
void rncAdd(RationalNumberCollection *c, RationalNumber rn) { // Wenn rn ungültig -> return if (!rnIsValid(rn)) { return; } // Länge der Collection ermitteln int len = rncTotalUniqueCount(*(&c)); // rn kürzen rn = rnShorten(rn); // Zeiger auf Collection RationalNumber (*ptr)[2] = c->rn; // Falls Bruch bereits vorhanden int i = rncSearch(*(&c), rn, 0, len-1); if (i >= 0) { // Erhöhe Counter des Bruchs ptr[i][1].numerator++; // Erhöhe totalCount der Collection c->totalCount++; // Erhöhe sum der Collection c->sum = rnShorten(rnAdd(c->sum,rn)); // Berechne average der Collection rncCalcAverage(*(&c)); return; } // Falls nocht nicht alle Elemente des Arrays belegt sind if (len < MAXSIZE) { // Trage den Bruch ein und erhöhe den Counter des Bruchs ptr[len][0] = rn; ptr[len][1].numerator++; // Erhöhe totalUniqueCount der Collection c->totalUniqueCount++; // Erhöhe totalCount der Collection c->totalCount++; // Erhöhe sum der Collection c->sum = rnShorten(rnAdd(c->sum,rn)); // Berechne average der Collection rncCalcAverage(*(&c)); } // Collection sortieren wenn Länge der Collection > 0 if (len > 0) { rncSort(*(&c), len+1); } // Berechne median der Collection rncCalcMedian(*(&c)); }
void rncRemove(RationalNumberCollection *c, RationalNumber rn) { // Wenn rn ungültig -> return if (!rnIsValid(rn)) { return; } // Länge der Collection ermitteln int len = rncTotalUniqueCount(*(&c)); // Wenn Collection leer -> return if (len == 0) { return; } // rn kürzen rn = rnShorten(rn); // Zeiger auf Collection RationalNumber (*ptr)[2] = c->rn; // Falls Bruch bereits vorhanden int i = rncSearch(*(&c), rn, 0, len-1); if (i >= 0) { // Veringere Counter des Bruchs ptr[i][1].numerator--; // Veringere totalCount der Collection c->totalCount--; // Verringere sum der Collection c->sum = rnShorten(rnSubtract(c->sum,rn)); // Wenn Counter anschließend == 0, entferne Bruch aus Collection if (ptr[i][1].numerator == 0) { ptr[i][0].numerator = 0; ptr[i][0].denominator = 0; // Verringere totalUniqueCount der Collection c->totalUniqueCount--; // Collection sortieren wenn Bruch nicht letzter Bruch in der Collection war if (len > 1) { rncSort(*(&c), len); } // Berechne median der Collection rncCalcMedian(*(&c)); } // Berechne average der Collection rncCalcAverage(*(&c)); } }
/* calculates the new values for the members of the given collection, after a rational number was removed */ void rncRemoved(RationalNumberCollection* c, RationalNumber r, bool isZero){ if(isZero){ c->totalUniqueCount--; } c->totalCount--; if(rncTotalCount(c) < 1) { RationalNumber rnZero = { 0,1 }; c->sum = rnZero; c->average = rnZero; } else { c->sum = rnSubtract(c->sum, r); RationalNumber rnDivisor = { c->totalCount, 1 }; c->average = rnDivide(c->sum, rnDivisor); } rncCalcMedian(c); return; }