#include <stdio.h> /* for input/output */
#include <math.h> /* for power */

#define MaxNumberOfStudents 100+1
#define DataFile "fmark.dat"

float marks[MaxNumberOfStudents];
int NumDatum;

void readData() {
  FILE *file;
  float CurrentDatum;

  printf("Reading data from \"%s\"...\n", DataFile);

  file = fopen(DataFile, "r");
  if (file) {
    NumDatum = 0;
    printf("Point\tValue\n");
    while (fscanf(file, "%f", &CurrentDatum) != EOF) {
      printf("%d\t%f\n", NumDatum, CurrentDatum);
      marks[NumDatum++] = CurrentDatum;
      if (NumDatum > MaxNumberOfStudents) {
        printf("ERROR: Maximum number of datum (%d) reached, aborting...\n", MaxNumberOfStudents);
        exit(-1);
      }
    }
  } else {
    printf("ERROR: Error reading file %s.\n", DataFile);
    exit(-2);
  }
  if (NumDatum <= 0) {
    printf("ERROR: No data in datafile %s!\n", DataFile);
    exit(-4);
  }
  fclose(file);

}

main() {

  int PositionInArray;
  float MaximumMark = 0;
  float Average = 0;
  float Variance = 0;
  float StandardDeviation = 0;

  printf("Lab Session 7, Question II\n"); /* Display program header */

  readData();

  for (PositionInArray = 0; PositionInArray < NumDatum; PositionInArray++) {
    if (MaximumMark < marks[PositionInArray]) MaximumMark = marks[PositionInArray];
    Average += marks[PositionInArray];
  }
  Average /= NumDatum;
  for (PositionInArray = 0; PositionInArray < NumDatum; PositionInArray++) {
    Variance += (marks[PositionInArray] - Average) * (marks[PositionInArray] - Average);
  }
  Variance /= NumDatum;
  StandardDeviation = sqrt(Variance);
  printf("\
   The Number Of Student is...: %d\n\
   The Maximum Mark is........: %f\n\
   The Average Mark is........: %f\n\
   The Variance is............: %f\n\
   The Standard Deviation is..: %f\n", NumDatum, MaximumMark, Average, Variance, StandardDeviation);
}
