COMP1711Coursework1-1
linux C
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char **argv ) {
// command line arguments
if(argc != 4)
{
printf("Incorrect arguments given. Expecting nStudents nGrades fileName. Exiting.\n");
exit(0);
}
int nStudents = atoi(argv[1]);
if( nStudents < 0 || nStudents > 100 )
{
printf("Requires 1 to 100 students. Exiting.\n");
exit(0);
}
int nGrades = atoi(argv[2]);
if( nGrades < 0 || nGrades > 8 )
{
printf("Requires 1 to 8 grades. Exiting.\n");
exit(0);
}
FILE *fp;
if((fp = fopen(argv[3], "r")) == NULL)
{
printf("Input file does not exist. Exiting.\n");
exit(0);
}
int student_id[nStudents];
int avgs[nStudents];
int grades[nStudents][nGrades];
// reading from file
printf("Input file. Opening.\n");
int k = 0;
int m = 0;
while(!feof(fp))
{
for(int i = 0; i < nStudents; i++)
{
for(int j = 0; j < nGrades + 1; j++)
{
if(j % 5 == 0)
{
fscanf(fp, "%d", &student_id[k]);
k++;
}else{
fscanf(fp, "%d", &grades[i][j-1]);
}
}
}
}
printf("Input file. Closing.\n");
fclose(fp);
// data processing
printf("Checking data.\n");
for(int i = 0; i < nStudents; i++)
{
for(int j = 0; j < nGrades; j++)
{
int grade = grades[i][j];
int id = student_id[i];
if (id < 2022000 || id > 2022099)
{
printf("Found an invalid student id: %d. Exiting.\n", id ); // requires student id
exit(0);
}
if(grade < 0 || grade > 100)
{
printf("Found an invalid grade: id %d grade %d. Exiting.\n", id,grade ); // requires student id and relevant grade
exit(0);
}
printf("Correcting student %d grade %d\n", id,grade ); // requires student id and relevant grade
}
}
// compute averages
printf("Computing averages.\n");
for(int i = 0; i < nStudents; i++)
{
int total = 0;
for(int j = 0; j < nGrades; j++)
{
int grade = grades[i][j];
if(grade > 90)
{
grade = 90;
}
if(grade < 20)
{
grade = 20;
}
total += grade;
}
int avg = 0;
avg = (int)(total * 1.0 / nGrades + 0.5);
avgs[i] = avg;
}
// writing to file
printf("Output file. Opening.\n");
FILE* out;
out = fopen("averages.txt", "w");
printf("Output file. Closing.\n");
for(int i = 0; i < nStudents; i++)
{
fprintf(out, "%d %d\n", student_id[i], avgs[i]);
}
fclose(out);
return 0;
}