Code:
// Don't forget to +1 MAX_LETTERS
#include <stdio.h>
#include <ctype.h>
#define MAX_SCORE 100
#define MIN_SCORE 0
#define TOTAL_ASSIGNMENT_MAX_SCORE 300
#define MAX_STUDENTS 150
#define MAX_LETTERS 30
void menu (void);
float take_score (char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
int student_num);
float final_score_calc (float student_grades[][3], int x);
char letter_grade (float final_scores[], int y);
float G_P_A (char grades[], int y);
void info_display (void);
void print_scores (char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
float final_scores[],
char grades[], float GPAs[],
int student_num);
float high_score_calc (float final_scores[], int student_num);
float low_score_calc (float final_scores[], int student_num);
void grade_list (float student_grades[][3],
char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
int x, int y);
void Load ( int *p );
// Global Variables
char grades[MAX_STUDENTS];
char first_names [MAX_STUDENTS][MAX_LETTERS];
char middle_names [MAX_STUDENTS][MAX_LETTERS];
char last_names [MAX_STUDENTS][MAX_LETTERS];
float student_grades[MAX_STUDENTS][3];
float GPAs[MAX_STUDENTS];
float final_scores[MAX_STUDENTS];
char input_name[50];
FILE *input_ptr; // Input file's pointer
int main () {
menu();
return 0;
}
void menu (void) {
char c;
float total_final_score = 0, average_final_score = 0, high_score = 0, low_score = 0 ;
float A_Percentage = 0, B_Percentage = 0, C_Percentage = 0, D_Percentage = 0, F_Percentage= 0;
int student_counter = 0, ACounter = 0, BCounter = 0, CCounter = 0, DCounter = 0, FCounter = 0,
total_Grade_Count = 0;
int student_num = -1; // Start at -1 so it does not equal 1 and the array later skips the 0 element
int low_range, high_range;
int i = 0, j = 0;
float sum = 0;
do{
printf("A/a - Add a student's record\n");
printf("I/i - load students record from an input file\n");
printf("O/o - Save students record to an output file\n");
printf("L/l - display a list of students score\n");
printf("F/f - Find a student's record from the spreadsheet and display his/her record\n");
printf("S/s - Reorder the student's record based on final scores\n");
printf("D/d - Display current statistical results\n");
printf("Q/q - Quit\n");
printf("\nPlease enter a key for one of the above options:");
c=getchar();
c=toupper(c);
switch (c) {
case 'A':
student_num++;
final_scores[student_num] = take_score(first_names, middle_names, last_names, student_num);
grades[student_num] = letter_grade(final_scores, student_num);
GPAs[student_num] = G_P_A(grades, student_num);
print_scores(first_names, middle_names, last_names, final_scores, grades, GPAs, student_num);
break;
case 'D':
//Going through grade array for letter grade count
for ( ; i <= student_num; i++ )
{
switch (grades[i])
{
case 'A': ACounter++;
break;
case 'B': BCounter++;
break;
case 'C': CCounter++;
break;
case 'D': DCounter++;
break;
case 'F': FCounter++;
break;
}
}
total_Grade_Count = ACounter + BCounter + CCounter + DCounter + FCounter;
if (ACounter == 0)
A_Percentage = 0;
else
A_Percentage = (( float ) ACounter / total_Grade_Count) * 100;
if (BCounter == 0)
B_Percentage = 0;
else
B_Percentage = (( float ) BCounter / total_Grade_Count) * 100;
if (CCounter == 0)
C_Percentage = 0;
else
C_Percentage = (( float ) CCounter / total_Grade_Count) * 100;
if (DCounter == 0)
D_Percentage = 0;
else
D_Percentage = (( float ) DCounter / total_Grade_Count) * 100;
if (FCounter == 0)
F_Percentage = 0;
else
F_Percentage = (( float ) FCounter / total_Grade_Count) * 100;
/*B_Percentage = (( float ) BCounter / total_Grade_Count) * 100;
C_Percentage = (( float ) CCounter / total_Grade_Count) * 100;
D_Percentage = (( float ) DCounter / total_Grade_Count) * 100;
F_Percentage = (( float ) FCounter / total_Grade_Count) * 100;*/
//Gets the average final score, switch statement is there in case of no score being entered or only
//one score being entered.
switch (student_num)
{
case -1: average_final_score = 0;
break;
case 0: average_final_score = final_scores[student_num];
break;
default:
for ( ; j <= student_num; j++ )
sum += final_scores[j];
average_final_score = (sum / (student_num + 1));
break;
}
//High Score
high_score = high_score_calc (final_scores, student_num);
//Low Score
low_score = low_score_calc(final_scores, student_num);
//Prints Statistical Results
printf("\nStatistical result of your class:\n\n");
printf("\n\tTotal Students Number:\t%d", student_num+1);
printf("\n\tAverage score:\t%.2f",average_final_score);
printf("\n\tHighest score:\t%.2f",high_score);
printf("\n\tLowest score:\t%.2f",low_score);
printf("\n\tTotal A grade: %d, percentage %.2f%%", ACounter, A_Percentage);
printf("\n\tTotal B grade: %d, percentage %.2f%%", BCounter, B_Percentage);
printf("\n\tTotal C grade: %d, percentage %.2f%%", CCounter, C_Percentage);
printf("\n\tTotal D grade: %d, percentage %.2f%%", DCounter, D_Percentage);
printf("\n\tTotal F grade: %d, percentage %.2f%%\n\n", FCounter, F_Percentage);
break;
case 'I':
Load(&student_num);
break;
case 'L':
printf("\nPlease enter range of index number of record you wish to display:\n");
scanf("%d %d", &low_range, &high_range);
grade_list(student_grades, first_names, middle_names, last_names, low_range, high_range);
break;
}
getchar ();
}while (c != 'Q' );
printf("\nBye!\n\n");
}
float final_score_calc (float student_grades[MAX_STUDENTS][3], int student_num)
{
float final_score;
final_score = (student_grades[student_num][0]) / 3.0 * 0.3 + (student_grades[student_num][1]) * 0.3 + (student_grades[student_num][2]) * 0.4;
return final_score;
}
float take_score (char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
int student_num) {
float final_score;
//float student_grades[MAX_STUDENTS][3];
int j = 0, k= 0;
printf("\nindex %d> Enter a student's name (first middle last), total assignment, midterm and final exam scores:", student_num + 1);
scanf("%s %s %s", first_names[student_num], middle_names[student_num], last_names[student_num]);
scanf("%f %f %f", &student_grades[student_num][j], &student_grades[student_num][j+1], &student_grades[student_num][j+2]);
while (student_grades[student_num][j] > TOTAL_ASSIGNMENT_MAX_SCORE || student_grades[student_num][j] < MIN_SCORE)
{
printf("\nPlease re-enter total assignment score (0~300) :");
scanf("%f", &student_grades[student_num][j]);
}
while (student_grades[student_num][j+1] > MAX_SCORE || student_grades[student_num][j+1] < MIN_SCORE)
{
printf("\nPlease re-enter midterm score (0~100) :");
scanf("%f", &student_grades[student_num][j + 1]);
}
while (student_grades[student_num][j+2] > MAX_SCORE || student_grades[student_num][j+2] <MIN_SCORE)
{
printf("\nPlease re-enter final exam score (0~100) :");
scanf("%f", &student_grades[student_num][j+2]);
}
final_score = final_score_calc (student_grades, student_num);
return final_score;
}
char letter_grade (float final_scores[], int student_num) {
//float final_scores[MAX_STUDENTS];
char grade;
if (final_scores[student_num] >= 90)
grade='A';
else if (final_scores[student_num] < 90 && final_scores[student_num] >= 80)
grade='B';
else if (final_scores[student_num] < 80 && final_scores[student_num] >= 70)
grade='C';
else if (final_scores[student_num] < 70 && final_scores[student_num] >= 60)
grade='D';
else if (final_scores[student_num] < 60)
grade='F';
return grade;
}
float G_P_A (char grades[], int student_num) {
switch ( grades[student_num]) {
case 'A': GPAs[student_num] = 4;
break;
case 'B': GPAs[student_num] = 3;
break;
case 'C': GPAs[student_num] = 2;
break;
case 'D': GPAs[student_num] = 1;
break;
case 'F': GPAs[student_num] = 0;
break;
}
return GPAs[student_num];
}
void print_scores (char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
float final_scores[],
char grades[], float GPAs[],
int student_num) {
printf("\nindex %d> %s %s %s's final_score: %.2f letter grade:%c GPA:%f\n\n", student_num + 1, first_names[student_num],
middle_names[student_num],last_names[student_num], final_scores[student_num],
grades[student_num], GPAs[student_num]);
}
float high_score_calc (float final_scores[], int student_num) {
int i;
float high_score;
switch (student_num)
{
case -1: high_score = 0;
break;
case 0: high_score = final_scores[student_num];
break;
default:
for ( i = 0; i < student_num; i++ ) {
if ( final_scores[i] > final_scores[i+1] )
high_score = final_scores[i];
else
high_score = final_scores[i+1];
}
break;
}
return high_score;
}
float low_score_calc (float final_scores[], int student_num) {
int i;
float low_score;
switch (student_num)
{
case -1: low_score = 0;
break;
case 0: low_score = final_scores[student_num];
break;
default: for ( i = 0; i < student_num; i++ )
if ( final_scores[i] > final_scores[i+1] )
low_score = final_scores[i+1];
else
low_score = final_scores[i];
}
return low_score;
}
void grade_list (float student_grades[][3],
char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
int x, int y) {
printf("\nIndex Name Assign Mid Final_Exam Final_Score LG GPA\n");
for ( ; x <= y;){
printf("%-6d", x);
printf("%-6s, %-5s, %-6s", last_names[x-1], first_names[x-1], middle_names[x-1]);
printf("%-7.0f %-4.0f %-11.0f",student_grades[x-1][0], student_grades[x-1][1], student_grades[x-1][2]);
printf("%-11.2f", final_scores[x-1]);
printf("%-5c", grades[x-1]);
printf("%.0f", GPAs[x-1]);
x++;
printf("%c", '\n');
}
printf("%c", '\n');
}
void Load ( int *student_numptr )
{
int i, j, k, file_counter;
char c, d, e;
printf("\nPlease enter input file name: ");
scanf("%s", input_name);
if ((input_ptr = fopen(input_name, "r")) == NULL )
printf("\nThe file could not be opened.\n");
else
file_counter = 0;
while ( !feof(input_ptr)) {
(*student_numptr)++;
i = 0;
j = 0;
k = 0;
do{
c = (fgetc(input_ptr));
first_names[*student_numptr][i] = c;
i++;
}while(!isspace(c));
do{
d = (fgetc(input_ptr));
middle_names[*student_numptr][j] = d;
j++;
}while(!isspace(d));
do{
e = (fgetc(input_ptr));
last_names[*student_numptr][k] = e;
k++;
}while(!isspace(e));
fscanf(input_ptr, /*"%s "%s %s*/" %f %f %f", /*&first_names[*student_numptr], &middle_names[*student_numptr],
&last_names[*student_numptr],*/ &student_grades[*student_numptr][0], &student_grades[*student_numptr][1],
&student_grades[*student_numptr][2]);
final_scores[*student_numptr] = final_score_calc (student_grades, *student_numptr);
grades[*student_numptr] = letter_grade (final_scores, *student_numptr);
GPAs[*student_numptr] = G_P_A(grades, *student_numptr);
file_counter++;
}
printf("\n%d Students' record have been successfully added from %s.\n\n", file_counter, input_name);
fclose(input_ptr);
}
I have commented out the way I used to do it, becuase it would mess up if there was no middle name.