Пример #1
0
/*
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));
    }

}
Пример #4
0
/*
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;
}