/* quiz7-1.c */
#include <stdio.h>
#include <stdlib.h>
/* filename of test-result. */
const char* g_filename = "quiz7-1.txt";
/* const char* g_filename = NULL; */
struct TestResult {
int length;
char kamoku1[6];
char kamoku2[6];
char kamoku3[6];
char kamoku4[6];
int tensu[100][5];
};
int die( const char* msg );
int check_eof(FILE* fp,int val);
int skip_if_zero(FILE* fp,int val);
int read_test_result(const char* filename,struct TestResult* out);
int print_test_result(struct TestResult* result);
int print_average_student(struct TestResult* result);
int print_average_subject(struct TestResult* result);
int main( int argc, char** argv){
struct TestResult result = {0};
const char* filename;
if( g_filename != NULL ){
filename = g_filename;
}
else if( argc > 1 ){
filename = argv[1];
}
else {
die("error: filename required.");
}
read_test_result( filename, &result );
puts("tensu ::::");
print_test_result(&result);
puts("\nStudent Average::::");
print_average_student(&result);
puts("\nSubject Average::::");
print_average_subject(&result);
return 0;
}
int read_test_result(const char* filename, struct TestResult* out){
int i;
FILE* fp;
int* pLine;
int retVal = 0;
if( ( fp = fopen(filename,"r") ) == NULL ){
die("error: cannot open file.");
}
while( retVal != 1 ){
retVal = fscanf(fp,"%d",&(out->length));
check_eof(fp,retVal);
skip_if_zero(fp,retVal);
}
if( out->length < 1 || out->length > 100 ){
fclose(fp);
die("error: invalid number of records.");
}
retVal = 0;
while( retVal != 4 ){
retVal = fscanf(fp,"%5s%5s%5s%5s",
out->kamoku1,
out->kamoku2,
out->kamoku3,
out->kamoku4
);
check_eof(fp,retVal);
skip_if_zero(fp,retVal);
}
for( i = 0; i < out->length; i++ ){
pLine = out->tensu[i];
retVal = 0;
while( retVal != 5 ){
retVal = fscanf(fp,"%d%d%d%d%d",
&(pLine[0]),
&(pLine[1]),
&(pLine[2]),
&(pLine[3]),
&(pLine[4])
);
check_eof(fp,retVal);
skip_if_zero(fp,retVal);
}
}
fclose(fp);
return 0;
}
/* redundant */
int print_test_result(struct TestResult* result){
int i;
int length;
length = result->length;
for( i = 0; i < length; i++ ){
printf("%d %d %d %d %d\n",
result->tensu[i][0],
result->tensu[i][1],
result->tensu[i][2],
result->tensu[i][3],
result->tensu[i][4] );
}
}
/* redundant */
int print_average_student(struct TestResult* result){
int i;
int j;
int length;
double sumStudent;
length = result->length;
for( i = 0; i < length; i++ ){
sumStudent = 0;
for( j = 1; j < 5; j++ ){
sumStudent += result->tensu[i][j];
}
printf("%d : %2.2f\n",
result->tensu[i][0],
(sumStudent/4) );
}
return 0;
}
/* redundant */
int print_average_subject(struct TestResult* result){
int i;
int j;
int length;
/* intmax >> 100*100 */
double sumSubject[4] = {0,0,0,0};
length = result->length;
for( i = 0; i < length; i++ ){
for( j = 0; j < 4; j++ ){
sumSubject[j] += result->tensu[i][j+1];
}
}
if( length != 0 ){
printf("%s : %2.1f\n", result->kamoku1, (sumSubject[0]/length));
printf("%s : %2.1f\n", result->kamoku2, (sumSubject[1]/length));
printf("%s : %2.1f\n", result->kamoku3, (sumSubject[2]/length));
printf("%s : %2.1f\n", result->kamoku4, (sumSubject[3]/length));
}
return 0;
}
int check_eof(FILE* fp,int val){
if( val == EOF ){
fclose(fp);
die("error: unexpected EOF.");
}
return 0;
}
int skip_if_zero(FILE* fp, int val){
if( val == 0 ){
fgetc(fp);
}
return 0;
}
int die( const char* msg ){
puts(msg);
exit(-1);
return 0;
}
/* quiz 7-1.txt
5
Mat Phys Chem Eng
8001 78 64 88 90
8004 34 40 52 67
8013 83 77 89 93
8025 98 81 69 77
8062 56 63 47 23
*/
/* $ ./a.out
tensu ::::
8001 78 64 88 90
8004 34 40 52 67
8013 83 77 89 93
8025 98 81 69 77
8062 56 63 47 23
Student Average::::
8001 : 80.00
8004 : 48.25
8013 : 85.50
8025 : 81.25
8062 : 47.25
Subject Average::::
Mat : 69.8
Phys : 65.0
Chem : 69.0
Eng : 70.0
*/