Your program should be split up into several files as explained below:
o prog4.c : This will hold the main function
o prog4Fns.c: This file will consist of the component functions
o prog4.h: Header file for your program
prog4Fns.h would have been a better name for the header file.
/* BEGIN prog4.h */
#ifndef H_PROG4_H
#define H_PROG4_H
#define MAX_GRADES 80
int get_grades(int *grade);
void process_grades(int *grade, int grade_counter);
#endif
/* END prog4.h */
/* BEGIN prog4.c */
#include "prog4.h"
int main(void)
{
int grade[MAX_GRADES], grade_counter;
grade_counter = get_grades(grade);
process_grades(grade, grade_counter);
return 0;
}
/* END prog4.c */
/* BEGIN prog4Fns.c */
#include "prog4.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int get_grades(int *grade)
{
enum states {
Waiting_for_digits = 0,
Reading_digits,
Waiting_for_space,
letter_grade
} state;
char number[sizeof"100"];
int rc, grade_counter, char_counter;
grade_counter = 0;
state = Waiting_for_digits;
puts("Enter grades separated by spaces (min: 0, max: 100 ):");
while((rc = getchar()) != EOF) {
switch (state) {
case Waiting_for_digits:
if (isdigit(rc)) {
char_counter = 0;
number[char_counter] = (char)rc;
++char_counter;
++state;
}
if (isalpha(rc)) {
state = letter_grade;
}
break;
case Reading_digits:
if (isdigit(rc)) {
if (char_counter == sizeof number - 1) {
grade[grade_counter] = -1; /* Too Big */
++grade_counter;
++state;
} else {
number[char_counter] = (char)rc;
++char_counter;
}
} else {
if (isspace(rc)) {
state = Waiting_for_digits;
number[char_counter] = '\0';
grade[grade_counter] = strtol(number, NULL, 10);
++grade_counter;
} else {
grade[grade_counter] = -1; /* alpha numeric */
++grade_counter;
++state;
}
}
break;
case Waiting_for_space:
if (isspace(rc)) {
state = Waiting_for_digits;
}
break;
case letter_grade:
if (rc == '\n') {
puts("Invalid input; try again:");
state = Waiting_for_digits;
}
break;
default:
puts("switch default error.");
exit(EXIT_FAILURE);
break;
}
if (grade_counter == MAX_GRADES) {
puts("Too many grades.");
break;
}
}
if (state == Reading_digits) {
number[char_counter] = '\0';
grade[grade_counter] = strtol(number, NULL, 10);
++grade_counter;
}
return grade_counter;
}
void process_grades(int *grade, int grade_counter)
{
int index, invalid, sum;
double average;
sum = invalid = 0;
if (grade_counter == 0) {
puts("No grades entered. Exiting program");
return;
}
for (index = 0; index != grade_counter; ++index) {
if (0 > grade[index] || grade[index] > 100) {
++invalid;
} else {
sum += grade[index];
}
}
if (invalid == grade_counter) {
puts("No valid grades entered. Exiting program");
return;
}
average = (double)sum / (grade_counter - invalid);
if (invalid != 0) {
printf("Discarding the %d invalid grade(s) entered\n",
invalid);
}
puts("Grade Average Deviation from Average\n"
"===================================================");
printf("%3d %.2f %.2f\n",
grade[0], average, grade[0] - average);
for (index = 1; index != grade_counter; ++index) {
if (!(0 > grade[index] || grade[index] > 100)) {
printf("%3d %.2f %.2f\n",
grade[index], average, grade[index] - average);
}
}
}
/* END prog4Fns.c */