From b277d96c36508a69504713e4041240d9cc2ef843 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Sun, 2 Aug 2020 18:10:37 +0700 Subject: [PATCH] Add looping the menu --- real/README.md | 4 + real/q1.c | 275 ++++++++++++++++++++++++++++++++++++++++++++++ real/students.txt | 37 +++++++ work1/single.c | 56 +++++----- 4 files changed, 346 insertions(+), 26 deletions(-) create mode 100644 real/README.md create mode 100644 real/q1.c create mode 100644 real/students.txt diff --git a/real/README.md b/real/README.md new file mode 100644 index 0000000..027e92f --- /dev/null +++ b/real/README.md @@ -0,0 +1,4 @@ +```shell +gcc q1.c -o q1 +./q1 +``` \ No newline at end of file diff --git a/real/q1.c b/real/q1.c new file mode 100644 index 0000000..1b1c9cf --- /dev/null +++ b/real/q1.c @@ -0,0 +1,275 @@ +#include "stdio.h" +#include "stdlib.h" + +#define BUFFER_SIZE 128 + +const char *FILE_STUDENT_DATA_PATH = "./students.txt"; + +struct person_tag +{ + char name[20]; + char id[10]; +}; + +struct course_tag +{ + char course_name[20]; + int no_of_units; + int marks[4]; + float avg; +}; + +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(); +void search_student(); +void find_maximum(); +void find_failed(); +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) +{ + // variable use for menu selected + int selected; + + print_welcome(); + + display_menu(); + + printf("Enter your option: "); + scanf("%d", &selected); + + switch (selected) + { + case 1: + display_students(); + break; + case 2: + search_student(); + break; + case 3: + find_maximum(); + break; + case 4: + find_failed(); + break; + case 5: + update_file(); + break; + case 6: + quite(); + break; + default: + printf("cannot find your option!"); + break; + } +} + +void print_welcome() +{ + printf("Welcome!\n"); +} + +void display_students() +{ + read_student_to_data(); +} + +void display_menu() +{ + 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\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 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; +} + +void search_student() +{ + printf("\nNot implement yet!"); +} + +void find_maximum() +{ + printf("\nNot implement yet!"); +} + +void find_failed() +{ + printf("\nNot implement yet!"); +} + +void update_file() +{ + FILE *file; + file = fopen(FILE_STUDENT_DATA_PATH, "a"); + printf("\nNot implement yet!"); +} + +void read_file() +{ + printf("\nNot implement yet!"); +} + +void quite() +{ + printf("\nGoodbye!"); + exit(EXIT_SUCCESS); +} \ No newline at end of file diff --git a/real/students.txt b/real/students.txt new file mode 100644 index 0000000..211c67e --- /dev/null +++ b/real/students.txt @@ -0,0 +1,37 @@ +Jon +1101825 +Computer +4 +88 +98 +52 +95 +Peter +112152 +Electrical +3 +67 +40 +59 +Mary +1201925 +Mechanical +4 +78 +55 +79 +75 +Sherin +1201925 +Civil +4 +69 +53 +34 +88 +Jose +34567 +Software +2 +34 +56 \ No newline at end of file diff --git a/work1/single.c b/work1/single.c index 001413c..e70ab3e 100644 --- a/work1/single.c +++ b/work1/single.c @@ -3,7 +3,7 @@ #define BUFFER_SIZE 128 -const char *FILE_STUDENT_DATA_PATH = "./data/students.test.txt"; +const char *FILE_STUDENT_DATA_PATH = "./data/students.txt"; struct person_tag { @@ -58,32 +58,35 @@ int main(void) display_menu(); - printf("Enter your option: "); - scanf("%d", &selected); - - switch (selected) + while (1) { - case 1: - display_students(); - break; - case 2: - search_student(); - break; - case 3: - find_maximum(); - break; - case 4: - find_failed(); - break; - case 5: - update_file(); - break; - case 6: - quite(); - break; - default: - printf("cannot find your option!"); - break; + printf("Enter your option: "); + scanf("%d", &selected); + + switch (selected) + { + case 1: + display_students(); + break; + case 2: + search_student(); + break; + case 3: + find_maximum(); + break; + case 4: + find_failed(); + break; + case 5: + update_file(); + break; + case 6: + quite(); + break; + default: + printf("cannot find your option!"); + break; + } } } @@ -94,6 +97,7 @@ void print_welcome() void display_students() { + printf("\n"); read_student_to_data(); }