/*************************************************************************/ /* */ /* Average results for training and test sets */ /* ------------------------------------------ */ /* */ /* This is a generic program that averages any numbers found on */ /* a set of lines of the same pattern. */ /* */ /*************************************************************************/ #include #define MAXLINE 200 /* max line length */ #define MAXVALS 10 /* max values to be averaged */ main() { char Line[MAXLINE], *p1, *p2; int Numbers=0, Lines=0, i, TrainTest; float Val, Sum[2][MAXVALS]; double strtod(); for ( i = 0 ; i < MAXVALS ; i++ ) { Sum[0][i] = Sum[1][i] = 0; } while ( fgets(Line, MAXLINE, stdin) ) { i = 0; TrainTest = Lines % 2; printf("%s", Line); /* Count the numbers appearing on the line */ for ( p1 = Line ; *p1 != '\n' ; p1++ ) { if ( *p1 < '0' || *p1 > '9' ) continue; Val = strtod(p1, &p2); Sum[TrainTest][i++] += Val; p1 = p2-1; } /* The number of numbers must match any previous lines */ if ( Lines ) { if ( i != Numbers ) exit(); } else { Numbers = i; } Lines++; } putchar('\n'); for ( TrainTest = 0 ; TrainTest <= 1 ; TrainTest++ ) { i = 0; printf("%s:\t", TrainTest ? "test" : "train"); for ( p1 = Line ; *p1 != '\n' ; p1++ ) { if ( *p1 < '0' || *p1 > '9' ) { putchar(*p1); } else { printf("%.1f", Sum[TrainTest][i++] / (0.5 * Lines)); strtod(p1, &p2); p1 = p2-1; } } putchar('\n'); } }