#include #define sqr(x) ((x)*(x)) #define max(a,b) (((a)>(b))?(a):(b)) double computeQuizGrade (int grades[5]) { double worst, floats[5]; int n; // normalize grades floats[0] = grades[0]/30.0; floats[1] = grades[1]/20.0; floats[2] = grades[2]/30.0; floats[3] = grades[3]/20.0; floats[4] = grades[4]/30.0; // drop worst normalized grade worst = floats[0]; for (n=1; n<5; n++) if (worst > floats[n]) worst = floats[n]; for (n=0; n<5; n++) if (floats[n] == worst) { floats[n] = floats[4]; floats[4] = worst; break; }; // now floats[0..3] contains the best 4 grades. // return average normalized grade with worst dropped return (floats[0]+floats[1]+floats[2]+floats[3])/4; } double computeMPsGrade (int grades[5]) { double floats[5]; // normalize grades floats[0] = grades[0]/24.0; floats[1] = grades[1]/30.0; floats[2] = grades[2]/30.0; floats[3] = grades[3]/30.0; floats[4] = grades[4]/20.0; return 0.05*floats[0] + 0.3*floats[1] + 0.3*floats[2] + 0.3*floats[3] + 0.05*floats[4]; } int main (void) { int plus[45], mp[45][5], quiz[45][5], final[45]; // raw data char firstname[45][20], lastname[45][20], id[45][5]; FILE *fhandle; int n; // stats int countAboveThreshold, l, m, printed[45]; float quizzes[45], mean, var, machineProblems[45], courseGrade[45], wavg, current_max; // open raw grades file fhandle = fopen ("grades-inputposted.txt", "r"); if (fhandle == NULL) { printf ("Could not open grades file... exiting.\n"); exit (1); }; // for each record for (n=0; n<45; n++) // 45 people who took the class { // read it in fscanf (fhandle, "%s %s %s %d %d %d %d %d %d %d %d %d %d %d %d\n", firstname[n], lastname[n], id[n], plus+n, mp[n], mp[n]+1, mp[n]+2, mp[n]+3, mp[n]+4, quiz[n]+0, quiz[n]+1, quiz[n]+2, quiz[n]+3, quiz[n]+4, final+n); // compute grades quizzes[n] = computeQuizGrade (quiz[n]); machineProblems[n] = computeMPsGrade (mp[n]); wavg = 0.1*quizzes[n] + 0.55*machineProblems[n] + 0.35*final[n]/100.0; courseGrade[n] = (quizzes[n] > 0.6667)? max(wavg,final[n]/100.0) : wavg; }; // print record memset (printed, 0, sizeof(printed)); for (n=0; n<45; n++) { current_max = -1; for (l=0; l<45; l++) if (!printed[l] && courseGrade[l] > current_max) { current_max = courseGrade[l]; m = l; }; printf ("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d -- %.4f %.4f | %.2f %c | | %4s %s %s\n", mp[m][0], mp[m][1], mp[m][2], mp[m][3], mp[m][4], quiz[m][0], quiz[m][1], quiz[m][2], quiz[m][3], quiz[m][4], final[m], quizzes[m], machineProblems[m], courseGrade[m], plus[m]?'+':'.', id[m], firstname[m], lastname[m]); printed[m] = 1; }; printf ("\n"); // Quiz statistics mean = 0; for (n=0; n<45; n++) mean += quizzes[n]; mean /= 45; var = 0; for (n=0; n<45; n++) var += sqr(quizzes[n]-mean); var /= 45; printf ("Quiz stats -- mean: %.2f, stdev: %.2f.\n", mean, sqrt(var)); countAboveThreshold = 0; for (n=0; n<45; n++) if (quizzes[n] > 0.6667) countAboveThreshold += 1; printf ("(# of people above the 2/3 threshold for quizzes: %d, out of 45).\n", countAboveThreshold); // MPs statistics mean = 0; for (n=0; n<45; n++) mean += machineProblems[n]; mean /= 45; var = 0; for (n=0; n<45; n++) var += sqr(machineProblems[n]-mean); var /= 45; printf ("MPs stats -- mean: %.2f, stdev: %.2f.\n", mean, sqrt(var)); // Final statistics mean = 0; for (n=0; n<45; n++) mean += final[n]; mean /= 45; var = 0; for (n=0; n<45; n++) var += sqr(final[n]-mean); var /= 45; printf ("Final stats -- mean: %.2f, stdev: %.2f.\n", mean, sqrt(var)); fclose (fhandle); exit (0); } // MP1 (24 points) MP2 (30 points) MP3 (30 points) MP4 (30 points) MP5 (20 points) Quiz 1 (30 points) Quiz 2 (20 points) Quiz 3 (30 points) Quiz 4 (20 points) Quiz 5 (30 points) Final Exam (100 points)