RationalNumber rncAverage(RationalNumberCollection* c){
    if(c->totalCount != 0) {
        RationalNumber divisor = {c->totalCount,1};
        return rnDivide(c->rnSum, divisor);
    } else {
        RationalNumber rn = {0, 1};
        return rn;
    }
}
Ejemplo n.º 2
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 rncCalcMedian(RationalNumberCollection *c) {

    // Länge der Collection bestimmen
    int len = rncTotalUniqueCount(*(&c));

    // Wenn Collection leer
    if (len == 0) {
        RationalNumber result = { 0, 1 };
        c->median = result;
    }

    // Zeiger auf Collection
    RationalNumber (*ptr)[2] = c->rn;

    // Wenn Länge der Collection == 1
    if (len == 1) {
        c->median = ptr[0][0];
    }

    // Wenn Länge der Collection == 2
    if (len == 2) {
        RationalNumber r = { 2, 1 };
        c->median = rnShorten(rnDivide(rnAdd(ptr[0][0], ptr[1][0]), r));
    }

    // Wenn Länge der Collection gerade
    if (len%2 == 0) {
        RationalNumber r = { 2, 1 };
        int lowerMedian = (len / 2) - 1;
        int upperMedian = len / 2;
        c->median = rnShorten(rnDivide(rnAdd(ptr[lowerMedian][0], ptr[upperMedian][0]), r));
    }
    // Wenn Länge der Collection ungerade
    else {
        int median = len / 2;
        c->median = ptr[median][0];
    }

}
int main()
{

    printf("Performing unit tests for RationalNumber...");
    fflush(stdout);

    /* Part 1 - RationalNumber data type */
    RationalNumber  n1 = { 3, 4 },
                    n2 = { 6, 4 },
                    n3 = { 3, 2 },
                    n4 = { -9, -6 },
                    n5 = { 9, -6 },
                    n6 = { 9, 4 },
                    n0 = { 0, 4 },
                    nn = { 4, 0 };

    assert( rnIsValid(n0) );   
    assert( !rnIsValid(nn) );

    assert( rnEqual( n2, n3) );
    assert( rnEqual( rnAdd(n1,n1), n2) );
    assert( rnEqual( n2,n4) );
    assert( !rnEqual( n4,n5) );
    assert( rnLessThan( n5,n3) );

    RationalNumber t1 = rnAdd(n1,n2);
    RationalNumber t2 = rnDivide(n3,n3);
    RationalNumber t3 = rnDivide(n2,n2);
    RationalNumber t4 = rnDivide(n6,n0);

    assert( rnEqual(t1, n6) );
    assert( rnEqual(t2, t3) );
    assert( !rnIsValid(t4) );

    printf(" successful!\n");

    return 0;
}
Ejemplo n.º 5
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;
}
Ejemplo n.º 6
0
/*
calculates the median for the given collection
*/
void rncCalcMedian(RationalNumberCollection* c) {
    if (c->totalCount == 0) {
        RationalNumber rnZero = { 0,1 };
        c->median = rnZero;
        return;
    } else if (c->totalCount == 1) {
        c->median = c->rnList[0];
        return;
    } else if (c->totalCount % 2 == 0) {
        int medianDeepness = c->totalCount / 2;
        for (int i = 0; i < c->totalUniqueCount*2; i = i+2) {
            int count = c->rnList[i+1].numerator;
            while(count > 0) {
                medianDeepness--;
                count--;
                if(medianDeepness == 0) {
                    RationalNumber rn1 = c->rnList[i];
                    RationalNumber rn2 = c->rnList[i+2];
                    RationalNumber rnDivisor = { 2,1 };
                    if (count != 0) {
                        rn2 = c->rnList[i];
                    }
                    c->median = rnDivide(rnAdd(rn1,rn2),rnDivisor);
                    return;
                }
            }
        }
        return;
    } else {
        int medianDeepness = c->totalCount / 2 + 1;
        for (int i = 0; i < c->totalUniqueCount*2; i = i+2) {
            medianDeepness = medianDeepness - c->rnList[i+1].numerator;
            if (medianDeepness <= 0) {
                c->median = c->rnList[i];
                return;
            }
        }
        return;
    }
}
void rncCalcAverage(RationalNumberCollection *c) {

    // Zeiger auf Collection
    RationalNumber (*ptr)[2] = c->rn;

    // Alle Brüche in der Collection zählen und sie summieren
    int i = 0;
    RationalNumber count =  { 0, 1 };
    RationalNumber result = { 0, 1 };
    while(ptr[i][1].numerator > 0) {
        result = rnAdd(result, rnMultiply(ptr[i][0], ptr[i][1]));
        count.numerator += ptr[i][1].numerator;
        i++;
    }

    // Wenn keine Brüche gespeichert
    if (count.numerator == 0) {
        count.numerator = 1;
    }

    // Gekürzte RationalNumber zurückgeben
    c->average = rnShorten(rnDivide(result, count));

}