Code:
#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 i);
float final_score_calc (float student_grades[][3], int x);
char letter_grade (float x, int y);
float G_P_A (char grades[], int x, 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 x, char y, float z, int i);
float high_score_calc (float x, float y);
float low_score_calc (int x, float y, float z);
int main () {
menu();
return 0;
}
void menu (void) {
char c;
float final_score, 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 i = -1; // Start at -1 so it does not equal 1 and the array later skips the 0 element
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 GPA;
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("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':
i++; /*This is done so that when take_score(i) is called, the array in the function
knows to start on the next element, and it doesn't erase old elements.*/
final_score = take_score(first_names, middle_names, last_names, i);
grades[i] = letter_grade(final_score, i);
GPA = G_P_A(grades, MAX_STUDENTS, i);
//printf("%f %c %f\n\n", final_score, grades[i], GPA);
print_scores(first_names, middle_names, last_names, final_score, (grades[i]), GPA, i);
student_counter ++;
switch (grades[i]) {
case 'A': ACounter++;
break;
case 'B': BCounter++;
break;
case 'C': CCounter++;
break;
case 'D': DCounter++;
break;
case 'F': FCounter++;
break;
}
total_final_score += final_score;
average_final_score = (total_final_score / student_counter);
high_score = high_score_calc(final_score, high_score);
low_score = low_score_calc(student_counter, low_score, final_score);
total_Grade_Count = ACounter + BCounter + CCounter + DCounter + FCounter;
A_Percentage = (( float ) ACounter / 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;
break;
case 'D':
printf("\nStatistical result of your class:\n\n");
printf("\n\tTotal Students Number:\t%d", student_counter);
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;
}
getchar ();
}while (c != 'Q' );
printf("\nBye!\n\n");
}
float final_score_calc (float student_grades[MAX_STUDENTS][3], int x)
{
float final_score;
final_score = (student_grades[x][0]) / 3.0 * 0.3 + (student_grades[x][1]) * 0.3 + (student_grades[x][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 i) {
float final_score;
float student_grades[MAX_STUDENTS][3];
char c;
int j = 0, k= 0;
printf("\nEnter a student's name (first middle last), total assignment, midterm and final exam scores:");
scanf("%s %s %s", first_names[i], middle_names[i], last_names[i]);
scanf("%f %f %f", &student_grades[i][j], &student_grades[i][j+1], &student_grades[i][j+2]);
while (student_grades[i][j] > TOTAL_ASSIGNMENT_MAX_SCORE || student_grades[i][j] < MIN_SCORE)
{
printf("\nPlease re-enter total assignment score (0~300) :");
scanf("%f", &student_grades[i][j]);
}
while (student_grades[i][j+1] > MAX_SCORE || student_grades[i][j+1] < MIN_SCORE)
{
printf("\nPlease re-enter midterm score (0~100) :");
scanf("%f", &student_grades[i][j + 1]);
}
while (student_grades[i][j+2] > MAX_SCORE || student_grades[i][j+2] <MIN_SCORE)
{
printf("\nPlease re-enter final exam score (0~100) :");
scanf("%f", &student_grades[i][j+2]);
}
final_score = final_score_calc (student_grades, i);
return final_score;
}
char letter_grade (float x, int i) {
float final_score = x;
float final_scores[MAX_STUDENTS];
char grade;
final_scores[i] = final_score;
if (final_scores[i] >= 90)
grade='A';
else if (final_scores[i] < 90 && final_scores[i] >= 80)
grade='B';
else if (final_scores[i] < 80 && final_scores[i] >= 70)
grade='C';
else if (final_scores[i] < 70 && final_scores[i] >= 60)
grade='D';
else if (final_scores[i] < 60)
grade='F';
return grade;
}
float G_P_A (char grades[], int x, int y) {
float GPAs[MAX_STUDENTS];
int i = y;
switch ( grades[i]) {
case 'A': GPAs[i] = 4;
break;
case 'B': GPAs[i] = 3;
break;
case 'C': GPAs[i] = 2;
break;
case 'D': GPAs[i] = 1;
break;
case 'F': GPAs[i] = 0;
break;
}
return GPAs[i];
}
void print_scores (char first_names[][MAX_LETTERS],
char middle_names[][MAX_LETTERS],
char last_names[][MAX_LETTERS],
float x, char y, float z, int i) {
printf("\n%s %s %s's final_score: %.2f letter grade:%c GPA:%d\n\n", first_names[i], middle_names[i],
last_names[i], x, y, z);
}
float high_score_calc (float x, float y) {
if (x > y)
y = x;
return y;
}
float low_score_calc (int x, float y, float z) {
/* x = student_counter
y = low_score
z = final_score */
switch (x) {
case 1:
y = z;
break;
default:
if (y > z)
y = z;
break;
}
return y;
}