This program is intended to ask the user what file to open then use a function to process the data. I am having trouble figuring out how to use the pointers and addresses to accomplish this. Any ideas?
Code:
#include <stdio.h>
#include <math.h>
#define MAX_CONTESTANTS 9
#define MAX_JUDGES 100
// Set this to 1 if running DevC++, or 0 otherwise.
#define DEVCPP 1
#define DEBUG 0
void ucfidol(FILE* ifp);
int main() {
//variable for file name
char fileName[80];
//ask for and read file name
printf("What is the name of the input file with the UCF Idol data?\n");
scanf("%s", fileName);
FILE* ifp;
ifp = fopen ("fileName", "r");
ucfidol(ifp);
system("PAUSE");
return 0;
}
/*
Pre-condition: ifp points to the beginning of a file that stores data
about UCF Idol shows, as specified in Program 4.
Post-condition: The results of all the shows in the file will be
printed to the screen and FILE pointed to by ifp will
be closed.
*/
void ucfidol(FILE* ifp){
int numCases;
int i,j,k;
// Open the text file.
//FILE* ifp
//fin = fopen ("*ifp", "r");
fscanf(ifp, "%d", &numCases);
int bestContestant = 1;
double bestScore = 0;
// Go through each show.
for (i=1; i<=numCases; i++) {
// Read in the parameters for this show.
int numContestants, numJudges, stdDevLimit;
fscanf(ifp, "%d%d%d", &numContestants, &numJudges, &stdDevLimit);
int allScores[MAX_CONTESTANTS][MAX_JUDGES];
// Read in all the scores given in this show.
for (j=0; j<numContestants; j++)
for (k=0; k<numJudges; k++)
fscanf(ifp, "%d", &allScores[j][k]);
// Go through and calculate the average for each judge.
double allAverages[MAX_JUDGES];
for (j=0; j<numJudges; j++) {
// Add up each score this judge gave.
int sum = 0, score;
for (k=0; k<numContestants; k++)
sum += allScores[k][j];
allAverages[j] = (double)sum/numContestants;
if (DEBUG)
printf("Judge %d avg = %lf\n", j+1, allAverages[j]);
}
// Now, go back and calculate the standard deviation of each judge.
double allStdDev[MAX_JUDGES];
for (j=0; j<numJudges; j++) {
// Add up each term in the sum for the standard deviation.
double sum = 0;;
for (k=0; k<numContestants; k++)
sum += pow(allAverages[j] - allScores[k][j], 2);
// This is part of the formula. After this line, sum = variance.
sum /= numContestants;
// The square root of this is the standard deviation.
allStdDev[j] = sqrt(sum);
}
// Calculate the number of cheating judges & store which ones are the
// cheaters.
int numCorruptJudges = 0;
int badJudges[MAX_JUDGES];
for (j=0; j<numJudges; j++) {
if (allStdDev[j] > stdDevLimit) {
badJudges[numCorruptJudges] = j;
numCorruptJudges++;
}
}
// According to the rules, if all the judges are corrupt, none are.
if (numCorruptJudges == numJudges)
numCorruptJudges = 0;
// Go through each contestant to find the best one.
double bestScore = 0;
int bestSinger = 0;
for (j=0; j<numContestants; j++) {
// Add up this contestant's VALID scores.
double sum = 0;
int judgeIndex = 0;
for (k=0; k<numJudges; k++) {
// These are the requirements of a corrupt judge.
// This only works since the corrupt judges are stored in
// numerical order.
if (judgeIndex < numCorruptJudges && badJudges[judgeIndex] == k) {
judgeIndex++;
continue;
}
sum += allScores[j][k];
}
// Based on the specs, this will never divide by 0.
double avg = sum/(numJudges - numCorruptJudges);
if (avg > bestScore) {
bestScore = avg;
bestSinger = j;
}
} // end j loop for all contestant scoring.
// First part of the output, add one because contestant numbers are one based.
printf("UCF IDOL SHOW #%d\n", i);
printf("Contestant #%d, you win with an average score of %.2lf.\n", bestSinger+1, bestScore);
// If all our judges behave.
if (numCorruptJudges == 0)
printf("All judges' scores were used.\n\n");
// This is if we have some bad ones.
else {
printf("The following judges' scores were thrown out: ");
for (j=0; j<numCorruptJudges; j++)
printf("%d ", badJudges[j] + 1);
printf("\n\n");
}
} // End numCases loop.
// Close the file.
fclose(ifp);
}