My previous post was off the mark because I thought each struct in the array, represented a different student, not repetitions of the same student, with another test grade, entry.
Imo, it's awkward to deal with the data, when it's organized this way.
This is a one file version. I changed the struct's array to class1, and changed the Average function you wrote to ClassAverage, etc.
Enjoy!
Code:
#include <stdio.h>
/* #define class1_SIZE 100 */
struct student {
char *last_name;
unsigned long int student_id;
char grade;
};
void ClassAverage(struct student*, int length);
void StudentAverage(struct student*, int length);
int main(void)
{
int i;
struct student class1[10];
class1[0].grade = 'A';
class1[0].last_name = "Walker";
class1[0].student_id = 590017;
class1[1].grade = 'B';
class1[1].last_name = "Smith";
class1[1].student_id = 590118;
class1[2].grade = 'C';
class1[2].last_name = "Jones";
class1[2].student_id = 590219;
class1[3].grade = 'A';
class1[3].last_name = "Bubba";
class1[3].student_id = 590320;
class1[4].grade = 'B';
class1[4].last_name = "Johns";
class1[4].student_id = 590421;
class1[5].grade = 'C';
class1[5].last_name = "Walker";
class1[5].student_id = 590017;
class1[6].grade = 'D';
class1[6].last_name = "Smith";
class1[6].student_id = 590118;
class1[7].grade = 'B';
class1[7].last_name = "Jones";
class1[7].student_id = 590219;
class1[8].grade = 'A';
class1[8].last_name = "Bubba";
class1[8].student_id = 590320;
class1[9].grade = 'C';
class1[9].last_name = "Johns";
class1[9].student_id = 590421;
for (i = 0; i < 10; i++)
printf("\n%s %ld %c", class1[i].last_name, class1[i].student_id, class1[i].grade);
ClassAverage( class1, 10);
StudentAverage( class1, 10);
printf("\n\n\t\t Program Complete - Enter to Continue ");
getchar();
return 0;
}
void ClassAverage(struct student *class1, int length)
{
double sum=0.0,avg;
int i;
// int length = sizeof(class1)/sizeof(student);
for( i=0;i<length;++i )
{
if( class1[i].grade == 'A' )
sum+=4;
if( class1[i].grade == 'B' )
sum+=3;
if( class1[i].grade == 'C' )
sum+=2;
if( class1[i].grade == 'D' )
sum+=1;
/* anything that just adds zero may be eliminated from your code */
if( class1[i].grade == 'F' )
sum+=0;
}
avg = (sum/length);
printf("\n\nThe average for the class is %.2f.\n", avg);
}
void StudentAverage(struct student *class1, int length) {
int i, j, recnum;
unsigned long int target_id;
double average, sum;
for (i = 0, target_id = 0; i < length; i++) {
if (class1[i].student_id > target_id) { /* we have a new student */
target_id = class1[i].student_id;
printf("\n Student Found - Name: %8s ID #: %ld Average Grade: ", \
class1[i].last_name, class1[i].student_id);
recnum = sum = 0;
for (j = i; j < length; j++) { /* get all the matching records */
if (class1[j].student_id == target_id) { /* got one */
/* this is cute */
if (class1[j].grade < 'E')
sum += ((class1[j].grade - 'E') * - 1);
recnum++;
average = sum / recnum;
}
}
printf("%.2f ", average);
}
}
}