diff --git a/data/students.test.txt b/data/students.test.txt new file mode 100644 index 0000000..eed169b --- /dev/null +++ b/data/students.test.txt @@ -0,0 +1,16 @@ +Jon +1101825 +Computer +4 +88 +98 +52 +95 +Jon +1101825 +Computer +4 +88 +98 +52 +95 \ No newline at end of file diff --git a/work1/single.c b/work1/single.c index 12f216a..914f33a 100644 --- a/work1/single.c +++ b/work1/single.c @@ -1,6 +1,10 @@ #include "stdio.h" #include "stdlib.h" +#define BUFFER_SIZE 128 + +const char *FILE_STUDENT_DATA_PATH = "./data/students.test.txt"; + struct person_tag { char name[20]; @@ -20,7 +24,12 @@ struct student_tag struct person_tag student_info; struct course_tag course_info; struct student_tag *next; -}; +} * head; + +// typedef for declared to use as data type +typedef struct person_tag PERSON; +typedef struct course_tag COURSE; +typedef struct student_tag STUDENT; // core functions void display_students(); @@ -31,27 +40,189 @@ void update_file(); void read_file(); void quite(); +// Linked list functions +void add_student(char *student_name, char *student_id, char *course_name, int no_of_units, int *marks); +int count(); + // util functions void display_menu(); +void read_student_to_data(); +void print_welcome(); int main(void) { - // varibales + // variable use for menu selected int selected; - printf("Welcome!\n"); + print_welcome(); display_menu(); + display_students(); + + int c = count(); + + printf("Count: %d", c); + printf("\nGoodbye!"); } +void print_welcome() +{ + printf("Welcome!\n"); +} + +void display_students() +{ + read_student_to_data(); +} + void display_menu() { - printf("(1) Display students’ details\n"); + printf("\n(1) Display students’ details\n"); printf("(2) Search for a student’s mark\n"); printf("(3) Find the details of student with the largest average\n"); printf("(4) Find the details of failed students\n"); printf("(5) Add new student to the record\n"); - printf("(6) Quit program\n"); + printf("(6) Quit program\n\n"); +} + +void add_student(char *student_name, char *student_id, char *course_name, int no_of_units, int *marks) +{ + STUDENT *temp, *iterator; + temp = (struct student_tag *)malloc(sizeof(struct student_tag)); + PERSON info = {student_name, student_id}; + COURSE course = {course_name, no_of_units, marks}; + int sum = 0; + for (int i = 0; i < no_of_units; i++) + { + sum += marks[i]; + } + course.avg = sum / no_of_units; + temp->student_info = info; + temp->course_info = course; + // reference in head + iterator = head; + + if (head == NULL) + { + head = temp; + head->next = NULL; + } + else + { + while (iterator->next != NULL) + { + iterator = iterator->next; + } + temp->next = NULL; + iterator->next = temp; + } +} + +void update_file() +{ + FILE *file; + file = fopen(FILE_STUDENT_DATA_PATH, "a"); +} + +void read_student_to_data() +{ + // init head to null + head = NULL; + + FILE *file; + file = fopen(FILE_STUDENT_DATA_PATH, "r"); + + if (file == NULL) + { + printf("cannot read file: %s", FILE_STUDENT_DATA_PATH); + exit(EXIT_FAILURE); + } + + char student_name[BUFFER_SIZE]; + char student_id[BUFFER_SIZE]; + char course_name[BUFFER_SIZE]; + int no_of_units; + int marks[4]; + + int i; + while (!feof(file)) + { + char no[BUFFER_SIZE]; + + fgets(student_name, sizeof student_name, file); + fgets(student_id, sizeof student_id, file); + fgets(course_name, sizeof course_name, file); + fgets(no, sizeof no, file); + + i = 0; + while (student_name[i] != '\n') + { + i++; + } + + student_name[i] = '\0'; + + i = 0; + while (student_id[i] != '\n') + { + i++; + } + + student_id[i] = '\0'; + + i = 0; + while (course_name[i] != '\n') + { + i++; + } + + course_name[i] = '\0'; + + printf("Student Name: %s\n", student_name); + printf("Student ID: %s\n", student_id); + printf("Course Name: %s\n", course_name); + printf("No of units: %s", no); + + no_of_units = atoi(no); + for (int j = 0; j < no_of_units; j++) + { + char d[BUFFER_SIZE]; + + fgets(d, sizeof d, file); + sscanf(d, "%d", &marks[j]); + } + + printf("Marks: [ "); + for (int x = 0; x < no_of_units; x++) + { + printf("%d ", marks[x]); + } + printf("]\n\n"); + + // add into linked list + add_student(student_name, student_id, course_name, no_of_units, marks); + } + + fclose(file); +} + +int count() +{ + int n = 1; + STUDENT *temp; + temp = head; + if (head == NULL) + { + return 0; + } + + while (temp->next != NULL) + { + n++; + temp = temp->next; + } + + return n; } \ No newline at end of file