/* TMA02 q3d */ /*author: Chan Chi Ming, s93504843, dtae of authoring: 29/1/2001, this program is used to print out the analysis of the data about the assignmnent submission pattern of MT258 students.*/ #include <condefs.h> #pragma hdrstop #include <stdio.h> #include <stdlib.h> #define SIZE 2048 //--------------------------------------------------------------------------- #pragma argsused struct TMARecord { /* A structure for holding student records*/ char studentid[8]; int group; int daysLate; int articlesRead; int articlesPosted; }; struct TMARecord records[SIZE]; /* the actual store */ int recordCount = 0; /* number of records currently in the store */ void LateAndEarlyGroups(struct TMARecord records[], int size){ /*function body of LateAndEarlyGroups*/ int i; /*index*/ int gpnumber=0; /*group number*/ int Latecount[24]; /*array stores the number of late student*/ int maxLate=0; /*variable used to store the maximum late day*/ int maxgp=0; /*variable used to store the group number of largest late day*/ float sumLate [24]; /*array stores the sum of late submission day*/ float avgLate[24]; /*array use to calculae the average late day*/ for (i = 0; i < 24; i++){ /*initiate the value of arrays*/ Latecount[i] = 0; sumLate[i] = 0.0; } for (i = 0; i < recordCount; i++) { gpnumber = records[i].group; /*match the group number*/ if (records[i].daysLate > 0) { Latecount[gpnumber-1] = Latecount[gpnumber-1] + 1; /*increment no of late*/ sumLate[gpnumber-1] = sumLate[gpnumber-1] + records[i].daysLate; /*increment no of late day*/ } } for (i = 0; i<24; i++) { if (Latecount[i] > 0) { avgLate[i] = sumLate[i] / Latecount[i]; } /*calculate the average late day*/ else { avgLate[i] = 0.0; } if (Latecount[i] > maxLate) { /*find out the larest late count and its group*/ maxLate = Latecount[i]; maxgp = i; } } /*print out result*/ printf("| Group No | No of Late submission | Average No of days late |\n"); for (i = 0; i < 9; i++){ printf("| %2d | %2d | %4.1f |\n", i+1, Latecount[i], avgLate[i]); } printf("\n"); printf("Group %d has the largest number of late submission students.\n", maxgp); } void AnalyseDiscussion(struct TMARecord records[], int size) { /*function body of AnalyseDiscussion*/ int IDmaxAR; /*variable stores index of student with maximum articles read*/ int IDmaxAP; /*variable stores index of student with maximum articles posted*/ int i, maxAR = 0, maxAP = 0, sumAR = 0, sumAP = 0; float averAR, averAP; /*variables store average articles read and average articles posted*/ for (i=0; i<recordCount; i++){ if (records[i].articlesRead > maxAR){ /*find out the student with largest articlesRead*/ maxAR = records[i].articlesRead; IDmaxAR = i; } if (records[i].articlesPosted > maxAP){ /*find out the student with largest articlesPosted*/ maxAP = records[i].articlesPosted; IDmaxAP = i; } sumAR = sumAR + records[i].articlesRead; /*find out the sum of articlesRead*/ sumAP = sumAP + records[i].articlesPosted; /*find out the sum of articlesPosted*/ } averAR = sumAR / recordCount; /*find out the average of articlesRead*/ averAP = sumAP / recordCount; /*find out the average of articlesPosted*/ /*print out result*/ printf("The StudentID with largest number of articles read: %s\n", records[IDmaxAR].studentid); printf("The StudentID with largest number of articles posted: %s\n", records[IDmaxAP].studentid); printf("The sum of articles read of all records: %d\n", sumAR); printf("The sum of articles posted of all records: %d\n", sumAP); printf("The average number of articles read per student: %.1f\n", averAR); printf("The average number of articles posted per student: %.1f\n", averAP); } void AnalyseAdvanced(struct TMARecord records[], int size) { /*Function body of AnalyseAdvanced*/ int i, j; /*index*/ int gpnumber; /*group number*/ bool result; /*flag to check the theory testing result*/ int Readcount[8][4]; /*array hold the number of article read*/ float StudentCount[8][4]; /*array holds the number of student*/ float AvgRead[9][4]; /*array holds the average number of article read*/ for(i=0; i<=7; i++) { /*initiate the value of arrays*/ for(j=0; j<=3; j++) { Readcount[i][j]=0; StudentCount[i][j]=0.0; }} for(i=0; i<=8; i++) { for(j=0; j<=3; j++) { AvgRead[i][j] =0.0;}} for(i=0; i<recordCount; i++) { gpnumber = records[i].group; /*match the group number*/ if (records[i].daysLate <= 0) { /*increment articles Read of student with no late submission*/ Readcount[gpnumber-1][0] = Readcount[gpnumber-1][0] + records[i].articlesRead; StudentCount[gpnumber-1][0] = StudentCount[gpnumber-1][0] + 1; } if ((records[i].daysLate > 0) && (records[i].daysLate <= 7)){ /*increment articles Read of students with 1-7 late days*/ Readcount[gpnumber-1][1] = Readcount[gpnumber-1][1] + records[i].articlesRead; StudentCount[gpnumber-1][1] = StudentCount[gpnumber-1][1] + 1; } if ((records[i].daysLate > 7) && (records[i].daysLate <= 14)){ /*increment articles Read of students with 8-14 late days*/ Readcount[gpnumber-1][2] = Readcount[gpnumber-1][2] + records[i].articlesRead; StudentCount[gpnumber-1][2] = StudentCount[gpnumber-1][2] + 1; } if (records[i].daysLate > 14){ /*increment articles Read of students with more than 14 late days*/ Readcount[gpnumber-1][3] = Readcount[gpnumber-1][3] + records[i].articlesRead; StudentCount[gpnumber-1][3] = StudentCount[gpnumber-1][3] + 1; } } for(i=0; i<=7; i++) { /*fill the table with average article read for each group & late day group*/ for(j=0; j<=3; j++) { AvgRead[i][j] = Readcount[i][j] / StudentCount[i][j]; }} for(j=0; j<=3; j++) { /*find out the overall average article read*/ for(i=0; i<7; i++) { AvgRead[8][j] = AvgRead[8][j] + AvgRead[i][j]; } } if ((AvgRead[8][3]<AvgRead[8][2])&&(AvgRead[8][2]<AvgRead[8][1])&&(AvgRead[8][1]<AvgRead[8][0])){ result = true; } /* check whether the theory is true or not by compare the ovarage average*/ else { result = false; } /*print out the result*/ printf("Table of analysis of articlesRead and daysLate: \n"); printf("|days Late| Gp1 | Gp2 | Gp3 | Gp4 | Gp5 | Gp6 | Gp7 | Gp8 |Overall|"); printf("\n| < 0 |"); for (i=0; i<=8; i++){ printf("%5.1f |",AvgRead[i][0]); } printf("\n| 1-7 |"); for (i=0; i<=8; i++){ printf("%5.1f |",AvgRead[i][1]); } printf("\n| 8-14 |"); for (i=0; i<=8; i++){ printf("%5.1f |",AvgRead[i][2]); } printf("\n| >14 |"); for (i=0; i<=8; i++){ printf("%5.1f |",AvgRead[i][3]); } printf("\n"); printf("By analyse the overall result, the theory that reading more articles \n"); printf("can reduce the extent of late submisison is "); if (result == true){ printf("TRUE.\n"); } else { printf("FALSE.\n"); } } /* Prints all the records currently stored in the array records */ void printRecords() { for (int i=0; i<recordCount; i++) { printf("%s %d %d %d %d\n", records[i].studentid, records[i].group, records[i].daysLate, records[i].articlesRead, records[i].articlesPosted); } } /* Loads records from a file and stores in the array records */ void loadRecordFile(char* f) { FILE* infile; char buffer[256]; /* open the file first and report errors if necessary */ if ((infile = fopen(f, "r")) == NULL) { fprintf(stderr, "Error in loading '%s'.\n", f); getchar(); exit(1); } /* read the file line by line and add every record to the array */ while (fgets(buffer, 256, infile) != NULL) { if (sscanf(buffer, "%s %d %d %d %d", records[recordCount].studentid, &(records[recordCount].group), &(records[recordCount].daysLate), &(records[recordCount].articlesRead), &(records[recordCount].articlesPosted)) != 5) { fprintf(stderr, "Error in reading file at record line %d.\n", recordCount); getchar(); exit(1); } recordCount++; } fclose(infile); } /* main driving program */ int main(int argc, char **argv) { int choose; loadRecordFile("q3ddata.txt"); printf("Choose the funtion number: \n"); /*show the menu*/ printf("1. print out all record\n"); printf("2. Late and Early Group\n"); printf("3. Analyse Discussion\n"); printf("4. Analyse Advanced\n"); scanf("%d", &choose); switch (choose) /*call suitable function according to user choose*/ { case 1: printRecords(); break; case 2: LateAndEarlyGroups(records, recordCount); break; case 3: AnalyseDiscussion(records, recordCount); break; case 4: AnalyseAdvanced(records, recordCount); break; } fflush(stdin); getchar(); return 0; }