// FILENAME: dogclass.cpp // ** NOTE in order for file to be "readable", // the racing program is cut down to one race, & all of the // 2-digit nums in one-eigth & stretch must be truncated // and the race header is also removed. #include "dogclass.h" #include //************************* Constructor/Destructor **************************** Dog::Dog(char *name, List dograces ) { dogname = name; races = dograces; inout = 'n'; // calcluate the individual dog's statistics geteffgrade(); calcform(); calculate(); } //--------------copy constructor --------- Dog::Dog(const Dog &source) { dogname = source.dogname; // problems here!! effective_grade = source.effective_grade; form = source.form; style = source.style; inout = source.inout; avg_time = source.avg_time; early_speed = source.early_speed; avg_oneeigth = source.avg_oneeigth; avg_finish = source.avg_finish; closing = source.closing; races = source.races; } //----------------------- Dog::~Dog( void ) { } //------------------------------------------------------ void Dog::operator =(const Dog &source) { dogname = source.dogname; // problems here!! effective_grade = source.effective_grade; form = source.form; style = source.style; inout = source.inout; avg_time = source.avg_time; early_speed = source.early_speed; avg_oneeigth = source.avg_oneeigth; avg_finish = source.avg_finish; closing = source.closing; races = source.races; } //------------------------------------------------------- // POSTCONDITION: Avg time, early speed, and // front/back runner info is calculated void Dog::calculate( void ) { Race race; int ctr, tot=0; float tot18=0.0, totfin=0.0; float tottime=0.0; float allsix=0.0, lastthree=0.0; //, pptimes=0.0; for(races->start();races->is_item();races->advance()) { race = races->current(); tot += race.gate; tot18 += race.oneeigth; totfin += race.finish; } early_speed = tot/races.size(); avg_oneeigth = tot18/races.size(); avg_finish = totfin/races.size(); closing = avg_oneeigth - avg_finish; /* ************************************************ // CALCULATION OF AVG_TIME TAKES INTO ACCOUNT RACE CONDITIONS // effective time.... // all races avg... for(races.start();races.is_item();races.advance()) { race = races.current(); tottime += (race.time / (race.dist / 1000.0)); } allsix = ((tottime/6.0) - (trackrecord / (recdist/1000.0 ))) * 10; tottime = 0; // last three avg... races.start(); for(ctr=0;ctr<3;ctr++) { if (!races.is_item()) break; race = races.current(); tottime += (race.time / (race.dist / 1000.0)); races.advance(); } lastthree = ((tottime/3.0) - (trackrecord / (recdist/1000.0 ))) * 10; tottime = 0; //----------- // pp avg... blah blah doesn't work for(races.start();races.is_item();races.advance()) { race = races.current(); if (race.pp == current racing pp) tottime += (race[ctr].time / (race[ctr].dist / 1000.0)); } pptimes = ((tottime/3.0) - (trackrecord / (recdist/1000.0 ))) * 10; //---------- // avg togther avg_time = (allsix + lastthree) / 2.0; // + pptimes */ calcstyle(early_speed); } //--------------------------------------------------------------- void Dog::geteffgrade(void) { // << " [A+]=1 [B+]=4 [C+]=7 [D+]=10 [E+]=13 "; Race race; int total = 0; int num = 0; float avg = 0.0; int i; for(races->start();races->is_item();races->advance()) { race = races->current(); if ((race.finish == 1)||(race.finish == 2)||(race.finish == 3)) { num++; if ((AnsiStrPos(race.grade.c_str(),"AA")!=NULL) || (AnsiStrPos(race.grade.c_str(),"TAA")!=NULL) || (AnsiStrPos(race.grade.c_str(),"SAA")!=NULL) ) total += 5; else if (StrScan(race.grade.c_str(),'A')) total += 4; else if (StrScan(race.grade.c_str(),'B')) total += 3; else if (StrScan(race.grade.c_str(),'C')) total += 2; else if (StrScan(race.grade.c_str(),'D')) total += 1; // if a grade M race, add no points... } } if ((num == 0)||(total == 0)) effective_grade = 15; // worst effective grade: E- else { avg = (float)total / (float)num; if (avg == 5.0) effective_grade = 1; // A+ else if (avg >= 4.75) effective_grade = 2; else if (avg >= 4.50) effective_grade = 3; else if (avg >= 4.10) effective_grade = 4; // B+ else if (avg >= 3.75) effective_grade = 5; else if (avg >= 3.50) effective_grade = 6; else if (avg >= 3.10) effective_grade = 7; // C+ else if (avg >= 2.75) effective_grade = 8; else if (avg >= 2.50) effective_grade = 9; else if (avg >= 2.10) effective_grade = 10; // D+ else if (avg >= 1.75) effective_grade = 11; else if (avg >= 1.50) effective_grade = 12; else if (avg >= 1.10) effective_grade = 13; // E+ else if (avg >= 0.75) effective_grade = 14; else effective_grade = 15; } } //-=---------------------------------------------------------------- void Dog::calcform(void) { Race race1, race2, race3; races->start(); if (!races->is_item()) { form = 'u'; return; } race1 = races->current(); races->advance(); if (!races->is_item()) { form = 'u'; return; } race2 = races->current(); races.advance(); if (!races->is_item()) { form = 'u'; return; } race3 = races->current(); if (((race1.finish <= race2.finish) && (race2.finish <= race3.finish)) && ((race1.finish <= 5) && (race2.finish <= 5) && (race3.finish <= 5))) form = 'g'; else form = 'u'; if ((race1.finish == 8) || (race2.finish == 8) || (race3.finish == 8)) form = 'i'; if (((race1.finish >= race2.finish) && (race2.finish >= race3.finish)) && ((race1.finish >= 4) && (race2.finish >= 4) && (race3.finish >= 4))) form = 'o'; // in case a good dog slipped through.... saftey net if ((race1.finish <= 3) && (race2.finish <= 3) && (race3.finish <= 3)) form = 'g'; } //------------------------------------------------------------------- void Dog::calcstyle(float early_speed) { Race race; int ctr; int incount = 0; int outcount = 0; if (early_speed <= 4) style = 'f'; else style = 'b'; if (style == 'f') { for(races->start();races->is_item();races->advance()) { race = races->current(); if ((race.pp == 1) || (race.pp == 2)) if ((race.finish == 1) || (race.finish == 2)) incount++; if ((race.pp == 7) || (race.pp == 8)) if ((race.finish == 1) || (race.finish == 2)) outcount++; } if (incount > outcount) // if happened twice... inout = 'i'; else if (incount < outcount) inout = 'o'; else inout = 'n'; incount = 0; outcount = 0; } }