diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..a4c3c7a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sbn.cassigment.iml b/.idea/sbn.cassigment.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/sbn.cassigment.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..9899cd8
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1596443802448
+
+
+ 1596443802448
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/a.out b/a.out
new file mode 100755
index 0000000..f66544b
Binary files /dev/null and b/a.out differ
diff --git a/work1/q3.c b/work1/q3.c
index 3b2baf6..c5adc90 100644
--- a/work1/q3.c
+++ b/work1/q3.c
@@ -1,6 +1,7 @@
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
+#include "time.h"
#define DEPOT_SIZE 10
@@ -11,7 +12,11 @@ struct Bus
time_t schedule;
} Depot[DEPOT_SIZE];
-typedef enum { true, false } bool;
+typedef enum
+{
+ true,
+ false
+} bool;
void createBuses();
void printBuses();
@@ -22,32 +27,260 @@ void emergency();
// utils variable
bool has_created = false;
+bool has_scheduled = false;
+bool has_aligned = false;
+int top = -1;
// utils function
-print_depot(struct Bus *depot);
+void clrscr();
+void print_depot(struct Bus *depot);
+time_t get_random_time();
+
+void confirm_on_finish();
+int quicksort_compare_func(const void *elem1, const void *elem2);
+bool isEmpty();
+int menu();
+
+void remove_index_of_array(int index);
+
+// Main Function
int main()
{
+ while (1)
+ {
+ int selection = menu();
+ clrscr();
+ printf("You Select : %d", selection);
+ printf("\n");
+
+ switch (selection)
+ {
+ case 1:
+ createBuses();
+ break;
+ case 2:
+ printBuses();
+ break;
+
+ case 3:
+ scheduleBuses();
+ break;
+ case 4:
+ alignupBuses();
+ break;
+
+ case 5:
+ releaseBuses();
+ break;
+
+ case 6:
+ emergency();
+ break;
+
+ default:
+ printf("You are enter incorrect option number");
+ }
+
+ confirm_on_finish();
+ };
+
return EXIT_SUCCESS;
}
+int menu()
+{
+ fflush(stdout);
+
+ clrscr();
+
+ printf("\nQuestion 3 ");
+ printf("\n=========================================");
+ printf("\n");
+ printf("\n1. Create Buses");
+ printf("\n2. Print Buses");
+ printf("\n3. Schedule Buses");
+ printf("\n4. Align up Buses");
+ printf("\n5. Release Buses");
+ printf("\n6. Emergency Buses");
+
+ int chosen;
+ printf("\n\nEnter Your Selection : ");
+ scanf("%d", &chosen);
+ return chosen;
+}
+
void createBuses()
{
+
+ if (has_created == true)
+ {
+ printf("\nYou have created already...");
+ return;
+ }
+
+ printf("\n\nStart Create Buses...");
+
for (int i = 0; i < DEPOT_SIZE; i++)
{
+ top++;
Depot[i].BusID = i + 1;
Depot[i].RouteID = 1000 + (i + i);
+ printf("\n - Starting Create Bus %d", i + 1);
}
has_created = true;
+
+ printf("\nFinish Created Buses");
}
-print_depot(struct Bus *depot) {
- int size = sizeof(depot) / sizeof(depot[0]);
+void printBuses()
+{
+ if (has_created == false)
+ {
+ printf("\nPlease Create Buses First!");
+ return;
+ }
+ print_depot(Depot);
+}
- printf("\n Depost size: %d", size);
- for (int i = 0; i < size; i++) {
+void scheduleBuses()
+{
+ if (has_created == false)
+ {
+ printf("\nPlease Create Buses First!");
+ return;
+ }
+
+ printf("\nStart Scheduling Buses...\n\n");
+
+ size_t currentLen = sizeof(Depot) / sizeof(Depot[0]);
+
+ for (int i = 0; i < currentLen; i++)
+ {
+ printf("\n - Start Random Schedule %d...", i);
+
+ Depot[i].schedule = get_random_time();
+ }
+
+ printf("\n\nEnd Scheduling Buses...");
+
+ has_scheduled = true;
+}
+
+void print_depot(struct Bus *depot)
+{
+
+ size_t currentLen = sizeof(Depot) / sizeof(*Depot);
+
+ for (int i = 0; i < top; i++)
+ {
printf("Bus ID: %d\n", depot[i].BusID);
printf("Route ID: %d\n", depot[i].RouteID);
+
+ char *scheduleForShow = "";
+ if (depot[i].schedule != 0)
+ {
+ scheduleForShow = ctime(&depot[i].schedule);
+ }
+
+ printf("Schdule Time : %s\n\n", scheduleForShow);
}
+}
+
+void alignupBuses()
+{
+ if (has_scheduled == false)
+ {
+ printf("\n\nYou are not scheduling buses yet ...");
+ return;
+ }
+ size_t currentLen = sizeof(Depot) / sizeof(Depot[0]);
+
+ qsort(Depot, sizeof(Depot) / sizeof(*Depot), sizeof(*Depot), quicksort_compare_func);
+
+ printf("\n\nFinish Align up Buses Schedule ... ");
+ has_aligned = true;
+}
+
+void releaseBuses()
+{
+ if (has_aligned == false)
+ {
+ printf("\n\nYou are not align buses schedule yet ...");
+ return;
+ }
+
+ int last_index = sizeof(Depot) / sizeof(*Depot) - 1;
+
+ remove_index_of_array(last_index);
+
+ printf("\n\nRelease Complete...\n\n");
+}
+
+void emergency()
+{
+ if (has_aligned == false)
+ {
+ printf("\n\nYou are not align buses schedule yet ...");
+ return;
+ }
+
+ remove_index_of_array(0);
+
+ printf("\n\nRelease Complete...\n\n");
+}
+
+void remove_index_of_array(int remove_index)
+{
+
+ int current_len = sizeof(Depot) / sizeof(*Depot);
+ memmove(Depot + remove_index, Depot + remove_index + 1, (sizeof(Depot) - remove_index - 1) * sizeof(*Depot));
+ top--;
+}
+
+time_t get_random_time()
+{
+ time_t currentTime;
+
+ time(¤tTime);
+
+ long currentTimeNumber = (long)localtime(¤tTime);
+
+ // Random in next 5 hours
+ long randomAddOnTime = rand() % (60 * 60 * 5);
+
+ long additionTime = currentTimeNumber + randomAddOnTime;
+
+ return additionTime;
+}
+
+void clrscr()
+{
+ system("clear");
+}
+
+void confirm_on_finish()
+{
+
+ printf("\n\nPress Enter to Back to Menu...");
+
+ getchar();
+ getchar();
+}
+
+bool isFull()
+{
+ return top == -1;
+}
+
+int quicksort_compare_func(const void *elem1, const void *elem2)
+{
+ struct Bus element1 = *((struct Bus *)elem1);
+ struct Bus element2 = *((struct Bus *)elem2);
+ if (element1.schedule > element2.schedule)
+ return -1;
+ if (element1.schedule < element2.schedule)
+ return 1;
+ return 0;
}
\ No newline at end of file