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; } }
/* 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; }
/* 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; }
/* 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)); }