In this program I am suppose to read a file for records.ssv and print it out using an array of structures. However the average is to be calculated before printing out the array. The file contains Student Name, ID, Exam1, Exam2, Project 1, Project 2, Average, and Grade(letter, single).
Currently having problems printing out eh array and calculating the average. I will post my code and output below.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[25];
int I_D[9];
int exam[2];
int project[2];
char grade;
float avg;
} STUDENT;
void printStuAry(int size, STUDENT stuAry[]);
int main(void)
{
STUDENT stuAry[5];
FILE* f = fopen("records.ssv", "r");
if (f == NULL) {
printf("Error opening file records.ssv.\n");
exit(1);
}
char line[65];
int ind = 0;
while (fgets(line, sizeof(line), f) != NULL) {
sscanf(line, "%25[^,] ; %d ; %d ; %d ; %d ; %d ; %c",
stuAry[ind].name,
&stuAry[ind].I_D,
&stuAry[ind].exam[0],
&stuAry[ind].exam[1],
&stuAry[ind].project[0],
&stuAry[ind].project[1],
&stuAry[ind].grade);
ind++;
}
// calculates average
stuAry[ind].avg = (stuAry[ind].exam[0] + stuAry[ind].exam[1] +
stuAry[ind].project[0] + stuAry[ind].project[1]) /4.0;
printf("\t+---------+-------+-------+-------+---------+----------+----------+------+\n");
printf("\t| Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade|\n");
printf("\t+---------+-------+-------+-------+---------+----------+--------+--------+\n");
printStuAry(5, stuAry);
if (fclose(f) == EOF) {
printf("Error closing file records.ssv.\n");
exit(2);
}
int letter;
printf("Enter grade letter to search and q to quit");
scanf("%d", letter);
while (letter != -1){// tests for whether user wants to end program
printStuAry(5, stuAry);
}
return 0;
}
/*
*Function name: printStuAry
*
*Input Parameters: int size Student Ary
*
*Desription: prints out student Ary
*
*Return value: 0
*/
void printStuAry(int size, STUDENT stuAry[])
{
for (int i=0; i<size; i++) {
printf("\t| %d | %s | %d | %d | %d | %d | %d | %c |\n", //displays student information
i, stuAry[i].name, stuAry[i].exam[0],
stuAry[i].exam[1], stuAry[i].project[0],
stuAry[i].project[1], stuAry[i].avg,
stuAry[i].grade);
}
}
Output
+---------+-------+-------+-------+---------+----------+----------+------+
| Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade|
+---------+-------+-------+-------+---------+----------+--------+--------+
| 0 | Panzer | -544760936 | 32568 | -544762280 | 32568 | -27 | |
| 1 | Basler | -1718237240 | 32767 | -544747128 | 32568 | -104 | |
| 2 | Leaton | -1718237400 | 32767 | 118 | 0 | 9 | |
| 3 | Bishop | 4195301 | 0 | 194 | 0 | 62 | |
| 4 | Lucey | -1718237064 | 32767 | 4197349 | 0 | -96 | |
Enter grade letter to search and q to quit
What the correct Output should be:
Original:
+-------------------------+--------------+------+------+---------+---------+-------+-----+
| Student Name|Identification|Exam 1|Exam 2|Project 1|Project 1|Average|Grade|
+-------------------------+--------------+------+------+---------+---------+-------+-----+
| Holtkamp, Norman| N21102485| 83| 61| 62| 78| 71.00| C|
| Bellomy, Shavonda| N94185259| 74| 96| 80| 98| 87.00| B|
| Clutter, Loris| N68760306| 83| 68| 93| 70| 78.50| C|
| Rountree, Edythe| N76813896| 98| 91| 90| 81| 90.00| A|
| Waldeck, Marylee| N44293872| 88| 100| 70| 87| 86.25| B|
+-------------------------+--------------+------+------+---------+---------+-------+-----+