-Sorry, little tweaks after posting the code that I noticed. So before you have an aneurysm. I got rid of the -1 in the second for loop, and changed MAX_STUDENT to MAX_STUDENTS like it originally was. :)
Printable View
-Sorry, little tweaks after posting the code that I noticed. So before you have an aneurysm. I got rid of the -1 in the second for loop, and changed MAX_STUDENT to MAX_STUDENTS like it originally was. :)
-Never mind about the MAX_STUDENT part. Didn't realize that it was a numeric constant.... I'll change it back.
Ok more tweaks:
1. Move your array declarations from above main into main. We don't want to use global variables, it is generally bad practice.
2. In our sort function we don't want to sort MAX_STUDENTS, we want to sort the ACTUAL number of students (i.e. the number of student entries you read from the file). MAX_STUDENTS is just our upper margin, but we could have anywhere between 1 and 50 students. We need to change the third parameter in our sort to something that makes more sense like: numStudents. Then replace all entries of MAX_STUDENTS in the sort function with numStudents. This is probably the number you are returning from getScores(). For now just make those changes, then repost the code.
3. Remove & from our array params when calling the sort function in main(). That will get rid of the warnings.
Also, does this make sense so far? Do you understand what we are doing, and if you don't what do you need clarifications on?
Code:#include <stdio.h>
#define MAX_STUDENTS 50
int getScores();
int calculateScores(char P_N, int homeworkTotal, int midtermTotal, int final, int extraCredit);
void sortScores(int finalScores[], int stuID[], int num_student);
int printToFile();
int main (void)
{
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
int stu_num;
sortScores(&finalScores, &stuID, stu_num);
printToFile();
return 0;
}
/*scan the students ID's into an array and scan in each students scores*/
int getScores()
{
FILE* spGrades;
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
int final;
int extraCredit;
int ID;
int ret;
char P_N;
int stu_num;
if (!(spGrades = fopen ("BG_Scores.txt", "r")))
{
printf("\aError opening student grade file\n");
}
for(stu_num = 0; stu_num < MAX_STUDENTS; stu_num++){ // no more MAX_STUDENTS
//processing student ID's
ret=fscanf(spGrades, "%d\n", &ID);
if(ret != 1){//until no more student ID's
printf("Grades written to file successfully!\n");
return stu_num;
}
//process pass or no pass grade
fscanf(spGrades, "%c\n", &P_N);
//processing student homework scores
int homeworkTotal = 0;
int i;
int hw;
for (i = 0; i < 8; i++)
{
fscanf(spGrades, "%d ", &hw);
homeworkTotal = homeworkTotal + hw;
}
fscanf(spGrades, "%d\n", &hw);
homeworkTotal = homeworkTotal + hw;
homeworkTotal /= 9;
// processing midterms
int midtermTotal = 0;
int midterm;
{
fscanf(spGrades, "%d %d", &midterm, &midtermTotal);
midtermTotal = midtermTotal + midterm;
}
midtermTotal /= 2;
//processing final grade
fscanf(spGrades, "%d\n", &final);
//process extra credit
fscanf(spGrades, "%d\n", &extraCredit);
stuID[stu_num] = ID;
finalScores[stu_num] = calculateScores(P_N, homeworkTotal, midtermTotal, final, extraCredit);
}
fclose(spGrades);
}
int calculateScores(char P_N, int homeworkTotal, int midtermTotal, int final, int extraCredit)
{
int final_grade;
if(P_N != 'P')
return 0;
if(homeworkTotal <= 70)
return 0;
if(midtermTotal <= 60)
return 0;
if(final <= 60)
return 0;
final_grade = ((homeworkTotal + midtermTotal + final + extraCredit) / 3);
return(final_grade);
}
void sortScores(int finalScores[], int stuID[], int stu_num)
{
int current;
int walk;
int tempData;
for(current = 0; current < stu_num; current++)
{
for (walk = (current + 1); walk < stu_num; walk++)https://mail.google.com/mail/images/cleardot.gif
if(finalScores[current] < finalScores[walk])
{
tempData = finalScores[current];
finalScores[current] = finalScores[walk];
finalScores[walk] = tempData;
tempData = stuID[current];
stuID[current] = stuID[walk];
stuID[walk] = tempData;
}
}
}
int printToFile()
{
FILE* spSorted;
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
if (!(spSorted = fopen ("BG_Sorted.txt", "w")))
{
printf("\aError opening student grade file\n");
}
int i;
int stu_num;
fprintf(spSorted, "Spring 2012\n");
fprintf(spSorted, "CIS 15 BG\n");
fprintf(spSorted, "====\t======\t====\n");
fprintf(spSorted, "ID\tSCORE\tGRADE\n");
fprintf(spSorted, "====\t======\t====\n");
stu_num = getScores();
for (i =0; i < stu_num; i++){
fprintf(spSorted, "%d\t", stuID[i]);
fprintf(spSorted, "%d\t", finalScores[i]);
int finalScore = finalScores[i];
if(finalScore >= 97)
fprintf(spSorted, "A+");
else if(finalScore >=93 && finalScore <= 96.9)
fprintf(spSorted, "A");
else if(finalScore >= 90 && finalScore <= 92.9)
fprintf(spSorted, "A-");
else if(finalScore >= 87 && finalScore <=89.9)
fprintf(spSorted, "B+");
else if(finalScore >=83 && finalScore <=86.9)
fprintf(spSorted, "B");
else if(finalScore >=80 && finalScore <= 82.9)
fprintf(spSorted, "B-");
else if(finalScore >=77 && finalScore <=79.9)
fprintf(spSorted, "C+");
else if(finalScore >= 70 && finalScore <= 76.9)
fprintf(spSorted, "C");
else if(finalScore >= 67 && finalScore <= 69.9)
fprintf(spSorted, "D+");
else if(finalScore >= 63 && finalScore <= 66.9)
fprintf(spSorted, "D");
else if(finalScore >= 60 && finalScore <= 62.9)
fprintf(spSorted, "D-");
else
fprintf(spSorted, "F");
fprintf(spSorted,"\n");
}
}
-And the compiler is still returning the same two warnings are above.
You still haven't changed tweak number 3 above. Look at my post again, I said remove the & when calling the sort function in main().
Don't worry about that for now we are getting to the testing part in a bit, still need a few more changes.
1. Your print function needs to be able to know how many students you have, and so does your sort for that matter. Currently the only way to find that out is to call the getScores() function which I hope, returns correctly the number of students read from the input file. We have to pass our arrays as parameters to the other two functions: printScores and getScores.
getScores will take only the arrays as parameters. getScores() will return how many students we have read.
printScores will basically take the same params as the sort function (because we need to know how many students we are printing from the array)
2. In main, we will have our two arrays declared, and we will declare another variable called stu_num or whatever you call it which will be the number of students read from the file. In order to initialise it, we will call the getScores function with the new prototype(changed as per instructions in 1.) and we will store its return value in this new variable:
i.e. stu_num = getScores(finalScores, stuIDs) ---- (or whatever you call them)
3. Then we need to sort the results, so we pass finalScores,stuIDs and stu_num (NOT MAX_STUDENTS) to the sort function.
4. Then we call the print function and print the results.
Basically, main orchestrates everything. It tells the getScores function: "Hey function, I want to read two arrays of data, here are two arrays, store everything in them and tell me how many you have read". Then main says to the sortFunction: "Hey function, I have these two arrays with this many students (stu_num), please sort them for me". And then it tells the print function: "Hey print function I have two arrays with this many students, which unbeknownst to you are already sorted by another function, please print them out".
Code:#include <stdio.h>
#define MAX_STUDENTS 50
int getScores(int finalScores[], int stuID[]);
int calculateScores(char P_N, int homeworkTotal, int midtermTotal, int final, int extraCredit);
void sortScores(int finalScores[], int stuID[], int stu_num);
int printToFile(int finalScores[], int stuID[], int stu_num);
int main (void)
{
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
int stu_num;
stu_num = getScores(finalScores, stuID);
sortScores(finalScores, stuID, stu_num);
printToFile(finalScores, stuID, stu_num);
return 0;
}
/*scan the students ID's into an array and scan in each students scores*/
int getScores(int stuID[], int finalScores[])
{
FILE* spGrades;
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
int final;
int extraCredit;
int ID;
int ret;
char P_N;
int stu_num;
if (!(spGrades = fopen ("BG_Scores.txt", "r")))
{
printf("\aError opening student grade file\n");
}
for(stu_num = 0; stu_num < MAX_STUDENTS; stu_num++){ // no more MAX_STUDENTS
//processing student ID's
ret=fscanf(spGrades, "%d\n", &ID);
if(ret != 1){//until no more student ID's
printf("Grades written to file successfully!\n");
return stu_num;
}
//process pass or no pass grade
fscanf(spGrades, "%c\n", &P_N);
//processing student homework scores
int homeworkTotal = 0;
int i;
int hw;
for (i = 0; i < 8; i++)
{
fscanf(spGrades, "%d ", &hw);
homeworkTotal = homeworkTotal + hw;
}
fscanf(spGrades, "%d\n", &hw);
homeworkTotal = homeworkTotal + hw;
homeworkTotal /= 9;
// processing midterms
int midtermTotal = 0;
int midterm;
{
fscanf(spGrades, "%d %d", &midterm, &midtermTotal);
midtermTotal = midtermTotal + midterm;
}
midtermTotal /= 2;
//processing final grade
fscanf(spGrades, "%d\n", &final);
//process extra credit
fscanf(spGrades, "%d\n", &extraCredit);
stuID[stu_num] = ID;
finalScores[stu_num] = calculateScores(P_N, homeworkTotal, midtermTotal, final, extraCredit);
}
fclose(spGrades);
}
int calculateScores(char P_N, int homeworkTotal, int midtermTotal, int final, int extraCredit)
{
int final_grade;
if(P_N != 'P')
return 0;
if(homeworkTotal <= 70)
return 0;
if(midtermTotal <= 60)
return 0;
if(final <= 60)
return 0;
final_grade = ((homeworkTotal + midtermTotal + final + extraCredit) / 3);
return(final_grade);
}
void sortScores(int finalScores[], int stuID[], int stu_num)
{
int current;
int walk;
int tempData;
for(current = 0; current < stu_num; current++)
{
for (walk = (current + 1); walk < stu_num; walk++)
if(finalScores[current] < finalScores[walk])
{
tempData = finalScores[current];
finalScores[current] = finalScores[walk];
finalScores[walk] = tempData;
tempData = stuID[current];
stuID[current] = stuID[walk];
stuID[walk] = tempData;
}
}
}
int printToFile(int finalScores[], int stuID[], int stu_num)https://mail.google.com/mail/images/cleardot.gif
{
FILE* spSorted;
int stuID[MAX_STUDENTS];
int finalScores[MAX_STUDENTS];
if (!(spSorted = fopen ("BG_Sorted.txt", "w")))
{
printf("\aError opening student grade file\n");
}
int i;
int stu_num;
fprintf(spSorted, "Spring 2012\n");
fprintf(spSorted, "CIS 15 BG\n");
fprintf(spSorted, "====\t======\t====\n");
fprintf(spSorted, "ID\tSCORE\tGRADE\n");
fprintf(spSorted, "====\t======\t====\n");
stu_num = getScores();
for (i =0; i < stu_num; i++){
fprintf(spSorted, "%d\t", stuID[i]);
fprintf(spSorted, "%d\t", finalScores[i]);
int finalScore = finalScores[i];
if(finalScore >= 97)
fprintf(spSorted, "A+");
else if(finalScore >=93 && finalScore <= 96.9)
fprintf(spSorted, "A");
else if(finalScore >= 90 && finalScore <= 92.9)
fprintf(spSorted, "A-");
else if(finalScore >= 87 && finalScore <=89.9)
fprintf(spSorted, "B+");
else if(finalScore >=83 && finalScore <=86.9)
fprintf(spSorted, "B");
else if(finalScore >=80 && finalScore <= 82.9)
fprintf(spSorted, "B-");
else if(finalScore >=77 && finalScore <=79.9)
fprintf(spSorted, "C+");
else if(finalScore >= 70 && finalScore <= 76.9)
fprintf(spSorted, "C");
else if(finalScore >= 67 && finalScore <= 69.9)
fprintf(spSorted, "D+");
else if(finalScore >= 63 && finalScore <= 66.9)
fprintf(spSorted, "D");
else if(finalScore >= 60 && finalScore <= 62.9)
fprintf(spSorted, "D-");
else
fprintf(spSorted, "F");
fprintf(spSorted,"\n");
}
}
Here are the warnings:
HW1.c: In function 'getScores':
HW1.c:23: error: 'stuID' redeclared as different kind of symbol
HW1.c:20: error: previous definition of 'stuID' was here
HW1.c:24: error: 'finalScores' redeclared as different kind of symbol
HW1.c:20: error: previous definition of 'finalScores' was here
HW1.c: In function 'printToFile':
HW1.c:126: error: 'stuID' redeclared as different kind of symbol
HW1.c:123: error: previous definition of 'stuID' was here
HW1.c:127: error: 'finalScores' redeclared as different kind of symbol
HW1.c:123: error: previous definition of 'finalScores' was here
HW1.c:134: error: 'stu_num' redeclared as different kind of symbol
HW1.c:123: error: previous definition of 'stu_num' was here
HW1.c:143: error: too few arguments to function 'getScores'
-My brain can no longer figure out what the compiler wants this time.
Well it should be pretty obvious, you have the arrays redeclared as local variables in all the functions. Remove those, you are now passing them as parameters.
I also suggest you rest a bit and look at this with fresh eyes when you are feeling better. No need to work yourself to death, this is getting very close to being finished.
Ok, now all thats left is it tells me "too few variables in getScores"
You are calling getScores() in the print function. Remove that line.
Does your read function work? have you tested reading from a file like I said yesterday?