Εντολή μεταγλώττισης: make Ενδεικτική εκτέλεση: ./main 3 30 25 10 ---> ./main <Classroom capacity> <Yard capacity> <Stairs capacity> <Corridor capacity> {Για την συγκεκριμένη main, επειδή έχει χρησιμοποιηθεί ο πίνακας με τους 36 μαθητές(2 μαθητές ανά αίθουσα), το 1ο όρισμα πρέπει να είναι == 3.} ### Αρχεία ### include/list.hpp - src/list.cpp --> Η υλοποίηση της λίστας include/school.hpp - src/school.cpp --> Η υλοποίηση των λειτουργιών του σχολείου που περιγράφονται στην εκφώνηση include/ids.hpp --> Το array με στοιχεία μαθητών/καθηγητών για την δοκιμαστική main src/main.cpp ./Makefile -> Για την μεταγλώττιση και τη σύνδεση όλων των αρχείων. ==================================================================================================================================================== ### Αναπαραστάσεις ### Στην άσκηση αυτή, υλοποιείται μια προσομοίωση της πρωινής άφιξης μαθητών σε ένα σχολικό κτήριο και εισόδου τους στις τάξεις. Το σχολικό κτήριο αποτελείται από 1 χώρο εισόδου(School), 1 αυλή(Yard), 1 κλιμακοστάσιο(Stairs), 3 ορόφους(Floor), καθένας από τους οποίους έχει έναν διάδρομο(Corridor) και 6 τάξεις(Classroom). Όλοι οι παραπάνω χώροι έχουν κάποια χωρητικότητα που καθορίζεται από την χρήστη, εκτός από τους ορόφους και τον χώρο εισόδου. Κάθε μαθητής(Student) αναπαρίσταται από το όνομα του, τον όροφο και την τάξη στην οποία ανήκει, καθώς και μια ένδειξη για το που βρίσκεται ανά πάσα στιγμή. Κάθε καθηγητής(Teacher) αναπαρίσταται από το όνομα του, τον όροφο και την τάξη στην οποία ανήκει, κάθως και μια ένδειξη για το αν βρίσκεται στην τάξη ή όχι. Η διαδικασία που ακολουθεί ο μαθητής είναι η εξής: Ακολουθεί την διαδρομή School-->Yard-->Stairs-->Corridor-->Classroom Κάθε φορά που μπαίνει(enter) σε έναν χώρο εκτυπώνεται και το μήνυμα "Student enters..", ενώ αντίστοιχα όταν βγαίνει από αυτόν "Student exits..". Κάθε χώρος αναπαρίσταται από μια κλάση, η οποία έχει σαν --private μέλη πληροφορίες όπως η χωρητικότητα, δείκτες σε άλλους χώρους που είναι άμεσα συνδεδεμένοι με εκείνους, και ένα δείκτη σε λίστα που κρατά όλους τους μαθητές που βρίσκονται στον συγκεκριμένο χώρο, --public μέλη, συναρτήσεις που διαχειρίζονται τα private δεδομένα, και ικανοποιούν τις ζητούμενες λειτουργίες της εκφώνησης(enter/place/exit/print). Οι βασικές κλασεις που διαχειρίζονται τους υπόλοιπους χώρους, είναι οι School και Floor. Η School συνδέεται με την Yard, την Stairs, και τα Floor, γιαυτό εχει και δείκτη σε Yard, Stairs, πίνακα από δείκτες σε Floor αντίστοιχα, ώστε να έχει πρόσβαση στις λειτουργίες των παραπάνω χώρων. Η Floor συνδέεται με το Corridor και τα Classroom, γιαυτό και έχει δείκτη σε Corridor, πίνακα από δείκτες σε Classroom. Επομένως και το σχολικό κτήριο που δημιουργεί ο χρήστης, θα έχει πρόσβαση στους επιμέρους χώρους μέσω της κλάσης School, και των μεθόδων της. Πιο συγκεκριμένα η κλάση Yard έχει δείκτη σε School, και η Corridor έχει δείκτη σε Floor, καθώς οι χώροι school,floor αποτελούν μεταβατικά στάδια στην πορεία ενός μαθητή μέσα στο σχολείο, και οι 2 πρώτες χρειάζεται να έχουν πρόσβαση στους χώρους όπου και ανήκουν. ==================================================================================================================================================== ### Αφηρημένοι τύποι δεδομένων ### Έχει υλοποιηθεί μια απλά συνδεδεμένη λίστα, όπου ο κάθε κόμβος έχει σαν δεδομένα δείκτες σε Student, και στον επόμενο κόμβο. Για να εξυπηρετηθούν οι λειτουργίες της εκφώνησης, και να βγαίνει πάντα ο πρώτος μαθητής που μπορεί από κάθε χώρο του σχολείου, κάθε μαθητής όταν μπαίνει σε έναν χώρο, μπαίνει στο τέλος της λίστας του χώρου αυτού μέσω της (push_back), ενώ βγαίνει από αυτόν, πάντα από την αρχή της λίστας μέσω της (pop_front). ==================================================================================================================================================== ### Δημιουργία/Καταστροφή ### Ο χρήστης μέσω της main αναλαμβάνει την δημιουργία μαθητών(Student), καθηγητών(Teacher), και του σχολείου(School). Ένας μαθητής/καθηγητής δημιουργείται αρχικοποιώντας τα στοιχεία του με στοιχεία από τον πίνακα studentInfo/teacherInfo (από το ids.hpp), εκτυπώνοντας "A new Student/Teacher has been created...", και καταστρέφεται εκτυπώνοντας το "A Student/Teacher to be destroyed.." Ένα σχολείο δημιουργείται με τον constructor της κλάσης School, να καλεί τον constructor της Yard, του Stairs, δημιουργώντας έτσι την αυλή και το κλιμακοστάσιο, και των Floor δημιουργώντας έτσι 3 ορόφους. Τα 3 floors αντίστοιχα, καλούν τους constructors των Corridor, Classroom, δημιουργώντας έτσι 1 διάδρομο και 6 τάξεις για κάθε όροφο αντίστοιχα. Με την σειρά αυτή εκτυπώνονται και τα μηνύματα " A new <Χώρος> has been created!", ενώ με την αντίστροφη σειρά που καταστρέφονται εκτυπώνονται τα μηνύματα "<Χώρος> to be destroyed". Κατά την δημιουργία και καταστροφή των υπολοίπων χωρών, δημιουργείται και καστρέφεται η λίστα από την οποία και αναπαρίστανται. Οι constructors κάθε χώρου παίρνουν σαν ορίσματα την χωρητικότητα που τους αντιστοιχεί σύμφωνα με τον χρήστη, δείκτη στον owner χώρο τους αν είναι τα Yard/Corridor, και το id που τους χαρακτηρίζει αν είναι τα Floor/Classroom. Αρχικοποιούν σύμφωνα με αυτά τα ορίσματα τα private μέλη δεδομένα τους με initializer list. ==================================================================================================================================================== ### Λειτουργίες κάθε χώρου/Ζητούμενα εκφώνησης ### Κάθε χώρος έχει σαν public λειτουργίες -> bool enter(Student*), η οποία προσθέτει τον μαθητή στο τέλος της λίστας του χώρου, εφόσον χωράει επιστρέφοντας true και εκτυπώνοντας το μήνυμα ότι μπήκε στον χώρο αυτόν, διαφορετικά απλα επιστρέφει false. -> Student* exit(), η οποία επιστρέφει τον πρώτο μαθητή που μπορεί να βγει από τον χώρο, δηλαδή τον πρώτο της λίστας, εκτυπώνοντας το μήνυμα ότι βγήκε από τον χώρο αυτόν. ---Ειδικές περιπτώσεις: 1. Αν ο μαθητής δεν χωράει στην αυλή, θα μείνει στον χώρο εισόδου School 2. Αν ο μαθητής χωράει στο Corridor θα μπει κατευθείαν εκεί, καθώς το floor δεν κρατάει μαθητές σε κάποια λίστα, ενώ αν δεν χωράει θα επιστρέψει στο Stairs. 3. Οι κλάσεις Classroom και Floor έχουν μόνο enter και όχι exit λειτουργίες. 4. Αν ο μαθητής που είναι στο Stairs δεν χωράει να μπει στον Corridor του, μπαίνει ξανά στο Stairs ως ο τελευταίος μαθητής εκεί, και όχι στο Floor. Οι χώροι Floor, Classroom, School έχουν την λειτουργία: -> void place(Teacher*), οι οποίες και προσθέτουν τους καθηγητές κατευθείαν, στην Classroom στην οποία ανήκουν. -> Η κλάση School έχει την λειτουργία enter, η οποία δέχεται έναν πίνακα μαθητών που παρέχει ο χρήστης, ο οποίος και επιλέγει το ποιους μαθητές θα προσθέσει, εισάγοντας στο σχολείο τους μαθητές που βρίσκονται στην start_index θέση του πίνακα, μέχρι και τους επόμενους studs_num. Επόμενως η enter παίρνει μερικούς μόνο μαθητές κάθε φορά, μέχρι είτε να έχουν μπει όλοι οι μαθητές στο σχολείο, είτε να μην μπορεί να μπει κανένας άλλος, και τους βάζει σε κάθε χώρο (χώρος->enter(Student*)) όσους χωράνε. Αντίστοιχα, όσοι κατάφεραν να μπουν στον χώρο αυτό, βγαίνουν(χώρος->exit()) ανάλογα με το πόσοι χωράνε στον επόμενο χώρο και μπαίνουν εκεί, αλλιώς ξαναμπαίνουν στον χώρο που ήταν πριν εφόσον δεν χώρεσαν, και περιμένουν να μπουν σε μια επόμενη επανάληψη. Κάθε φορά που κάποιος μαθητής μπήκε στον χώρο που ήθελε επιτυχώς, τότε αφαιρείται από την λίστα του χώρου, που βρισκόταν πριν. ==================================================================================================================================================== ### Δοκιμαστική main ### Κάθε Classroom έχει capacity=3 {2 μαθητές και 1 καθηγητής} δηλαδή οι μαθητές συνολικά είναι 36, και οι καθηγητές 18. Οι μαθητές και οι καθηγητές που εισάγονται στο σχολείο βρίσκονται στον πίνακα studentInfo του ids.hpp, και έχουν τα κατάλληλα δεδομένα ώστε να πληρούνται οι παραπάνω αριθμοί μαθητών και καθηγητών που απαιτούνται. Οι constructors των students,teachers, έχουν σαν ορίσματα τα δεδομένα του παραπάνω πίνακα, και κρατάνε τους μαθητές και καθηγητές στους πίνακες students, teachers αντίστοιχα. Για να εξασφαλιστεί η τυχαιότητα της εισαγωγής σύμφωνα με την εκφώνηση, οι παραπάνω πίνακες ανακατεύονται μέσω μιας βοηθητικής συνάρτησης shuffle, και ο αριθμός των μαθητών και καθηγητών είναι σε κάθε επανάληψη τυχαίος (random_students/teachers_index). Ετσι εισάγεται τυχαίος αριθμός, τυχαίων μαθητών κάθε φορά στο σχολείο. ---Ειδική περίπτωση: Επειδή κάθε φορά επιλέγεται τυχαίος αριθμός καθηγητών [0,18], υπάρχει περίπτωση να μην μπει μπορέσουν να μπουν μαθητές στο σχολείο, έχοντας έτσι την ένδειξη "Out of School" στο τέλος.
linachris/School-simulation
A simulation of students arriving at the school building and entering their classrooms.
C++