/******************************************************************************* DOMES DEDOMENWN 2011 - ASKISI 2 *******************************************************************************/ /******************************************************************************* Αρχεία υλοποίησης : main.c, BankQueueOA.c, BankQueueOA.h, TStoixeiouListas.c, TStoixeiouListas.h, TStoixeiouOuras.c, TStoixeiouOuras.h, prakseisListPointers.c, prakseisListPointers.h Ενδεικτικά αποτελέσματα : Customer.txt, Statistics.txt Όνομα/Επώνυμο : Νικόλαος Μπεγέτης A.M : 1115200700281 *******************************************************************************/ Λειτουργικότητα: ****************** Το πρόγραμμα είναι η επέκταση-βελτίωση της προσομοίωση της ουρας πελατών μίας τράπεζας χρησιμοποιώντας λίστες με δείκτες για εξοικείωση με τις λίστες και τις εφαρμογές τους. Υλοποίηση Ζητουμένων: 1. Το πρόγραμμα υλοποιείται με τον ΑΤΔ Λίστα με δείκτες εφαρμοσμένο σαν Ουρά(τα αρχεία που αναπτύχθηκαν είναι τα main.c(επέκταση), BankQueueOA.c(ολική ανάπτυξη), BankQueueOA.h(δίνεται), TStoixeiouListas.c(ολική ανάπτυξη), TStoixeiouListas.h(ολική ανάπτυξη), TStoixeiouOuras.c(επέκταση με μεταβλητή θέσης), TStoixeiouOuras.h(επέκταση με μεταβλητή θέσης), prakseisListPointers.c(εργαστήριο), prakseisListPointers.h(εργαστήριο)). 2. Έχει υλοποιηθεί και δοκιμαστεί επιτυχώς η μετατροπή μιας ουράς σε λίστα στο BankQueueOA.c μαζί με όλες τις συναρτήσεις που υπάρχουν στο αρχείο BankQueueOA.h που δινόταν. 3. Επεκτάθηκε o ΑΤΔ TStoixeiouOuras και οι πράξεις του ώστε να περιλαμβάνει τη θέση πελάτη στην ουρά, τον αύξοντα αριθμό πελάτη και τον προβλεπόμενο χρόνο αναμονής. Χρησιμοποιήθηκε παντού Ολική απόκρυψη δεδομένων είτε μέσω συναρτήσεων για αλλαγή των στοιχείων των structs είτε με δήλωση δεικτών μέσα στα header files και υλοποίηση των structs μεσά στα .c files 4. Το πρόγραμμα υλοποιεί όλες τις προδιαγραφές που περιγράφονται στην αρχή της άσκησης: i. επιτρέπει αποδοτικές διαγραφές από οποιοδήποτε σημείο της ουράς εφόσον ένας πελάτης αποφασίσει να αποχωρήσει και άμεσα όλοι οι μετέπειτα από αυτόν πελάτες προχωρούν μία θέση μπροστά ii. δημιουργείται και δεύτερη ουρά για τα ΑΜΕΑ και τα άτομα της ουράς αυτής προηγούνται της κανονικής ουράς, η οποία θα εξυπηρετηθεί μόνο εφόσον δεν υπάρχει κανένα ΑΜΕΑ iii. υπολογίζεται η θέση του καθενός ΑΜΕΑ και κανονικού πελάτη μετά από κάθε ανακατάταξη στις ουρές και πάροδο ενός λεπτού. iv. υπάρχουν αποχωρήσεις από την ουρά που γίνονται με μία ξεχωριστή πιθανότητα για οποιοδήποτε άτομο ξεχωριστά v. δίνονται από κατά την διάρκεια λειτουργίας του προγράμματος από το χρήστη η πιθανότητα να γίνει κάποια αποχώρηση σε ένα λεπτό οτυ χρόνου και η πιθανότητα να εισέλθει στην τράπεζα ένα ΑΜΕΑ vi. Στο αρχείο Customer.txt τυπώνονται σε μία γραμμή για κάθε πελάτη που εισέρχεται στην ουρά τα στοιχεία του(+την θέση) *εδώ να σημειωθεί ότι ο αύξων αριθμός πελάτη ξεκινάει απο το 0 μιας και ο πρώτος(0) υποτίθεται ότι μπαίνει και βγαίνει αμέσως από την ουρά οπότε δεν χρειάζεται να πάρει το χαρτάκι με τον αριθμό 1 **επίσης στους πελάτες σε αναμονή που εκτυπώνονται στο χαρτάκι δεν συμπεριλαμβάνεται ο ίδιος ο πελάτης που τράβηξε το χαρτάκι αλλά ο αριθμός των πελατών που προηγούνται αυτού στην ουρά(όπως δηλαδή συμβαίνει και στην πραγματικότητα) vii. Κατά την έξοδο των πελατών από την τράπεζα τυπώνονται στο αρχείο Statistics.txt σε μία γραμμή για τον καθένα όλα όσα αναφέρονται στο Customer.txt καθώς επίσης και ο πραγματικός χρόνος αναμονής, ο οποίος στην προκειμένη περίπτωση πάντα συμπίπτει με τον προβλεπόμενο αφού ο χρόνος εξυπηρέτησης στο ταμείο είναι στάνταρ και όχι random(αν ο χρόνος εξυπηρέτησης στο ταμείο ήταν random +-2 από αυτόν που εκχωρεί ο χρήστης κατά την εκτέλεση του προγράμματος τότε προφανώς θα άλλαζε) *να σημειωθεί και εδώ για τον ίδιο λόγο που περιέγραψα και παραπάνω ότι κατά την έξοδο του πελάτη από την ουρά η θέση του είναι 0 οπότε πάντα εκτυπώνεται 0(στην εκφώνηση της άσκησης δίνεται το 1 αλλά είναι καθαρά θέμα από που ξεκινάει η αρίθμιση).... **παρόλα αυτά στο Statistics έχω βάλει να εκτυπώνονται και οι πελάτες που αποχώρησαν από την ουρά οπότε σε αυτή την περίπτωση θα υπάρχουν μεμονομένες περιπτώσεις όπου η θέση δεν θα είναι 0 αλλά (κάτι != 0) viii. Mέσα στη main.c μετριέται ο χρόνος που ο ταμίας μένει αδρανής έχοντας εξυπηρετήσει όλους τους πελάτες που είναι στην τράπεζα μέχρι να έρθει ο επόμενος(αυτό γίνεται με τη μεταβλητή int tamias η οποία αυξάνει όταν ικανοποιείται η συνθήκη που γράφω παραπάνω) ix.περιλαμβάνονται ενδεικτικά αρχεία εκτέλεσης για το Customer.txt και το Statistics.txt με τα εξής δοθέντα στοιχεία από το χρήστη: χρόνος λειτουργίας τραπέζης = 480, πιθανότητα άφιξης πελάτη = 0.55, πιθανότητα AMEA = 0.15, πιθανότητα αποχώρησης = 0.08 kai χρόνος εξυπηρέτησης = 2.(Για να μην μπερδευτείτε κατά την εκτέλεση του προγράμματος καλό είναι κάθε φορά να σβήνετε αυτά τα 2 αρχεία ώστε να ξαναδημιουργούνται και να περιέχουν μόνο τα αποτελέσματα της τελευταίας εκτέλεσης) *να σημειωθεί ότι την πιθανότητα να έρθει ΑΜΕΑ την έχω κάνει εξαρτημένη μεταβλητή από την πιθανότητα άφιξης πελάτη ώστε η πιθανότητα που δίνεται από το χρήστη να είναι πιθανότητα στο συνολικό πλήθος των πελατών extras: ********* 1. Δημιουργία και χρησιμοποίηση της συνάρτησης "void inspectQbyOrder (BankOurasPtr oura);" η οποία εμφανίζει την κανονική ουρά των πελατών ή/και των ΑΜΕΑ(ανάλογα με την κλήση) όπως διαμορφώνεται μετά τις αλλαγές και εκτύπωση αυτής στην οθόνη κατά το τρέξιμο του εκτελέσιμου. 2. στο Statistics δεν εκτυπώνονται μόνο οι πελάτες που πήγαν στο ταμείο αλλά και οι πελάτες που αποχώρησαν από την ουρά 3. Στο Statistics.txt επιπλεόν εκτυπώνεται ο αριθμός των πελατών που εξυπηρετήθηκαν, καθώς επίσης και ο μέσος χρόνος αναμονής τους. 4. Επίσης στην οθόνη κατά την εκτέλεση του προγράμματος εμφανίζεται το τρέχον λεπτό και όλες οι διαδικασίες που γίνονται συμπεριλαμβανομένων των πελατών που είναι ήδη στην ουρά και περιμένουν όπου φαίνεται τι γράφουν τα χαρτάκια που τους εκδόθηκαν κατά την είσοδο τους στην τράπεζα. Οδηγίες χρήσης προγράμματος: ****************************** Το πρόγραμμα μεταγλωττίζεται με την εντολή gcc -o trapeza main.c BankQueueOA.c TStoixeiouListas.c TStoixeiouOuras.c prakseisListPointers.c(απλούστερα gcc -o trapeza *.c) ή με την εντολή gcc main.c BankQueueOA.c TStoixeiouListas.c TStoixeiouOuras.c prakseisListPointers.c(απλούστερα gcc *.c) και το εκτελέσιμο που δημιουργείται τρέχει με το ./trapeza ή το ./a.out αντίστοιχα. Επίσης έχω συμπεριλάβει και το εκτελεσιμο αρχείο trapeza καθώς και το αρχείο a.out εκτελέσιμο. Περιβάλλον υλοποίησης και Δοκιμών: ************************************ Το πρόγραμμα αναπτύχθηκε σε gcc σε linux και δοκιμάστηκε και στα linux και τα sun της σχολής