Άσκηση #4 Η άσκηση μπορεί να γίνει με συνεργασία το πολύ δυο φοιτητών, οι οποίοι θα λάβουν τον ίδιο βαθμό στην εργασία. Βαθμολογούνται: 1. Η αποτελεσματική επίλυση του προβλήματος. Δηλ σωστή υλοποίηση του προβλήματος που ζητείται. (40%) 2. Η ορθή τεκμηρίωση του προγράμματος με χρήση σχολίων εντός του κώδικα (και σε ξεχωριστό αρχείο αν χρειάζεται). (30%) 3. Η δομή του κώδικα, η αναγνωσιμότητα, σωστή ονοματοθεσία μεταβλητών/σταθερών κτλ (30%). Για την αποστολή της άσκησης μπορείτε να χρησιμοποιήσετε το αρχείο template.doc που δίνεται στη σελίδα του εργαστηρίου #1. Σε περίπτωση αντιγραφής μηδενίζονται ΌΛΟΙ οι εμπλεκόμενοι φοιτητές. http://saam.mech.upatras.gr/courses/programming
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Η δημιουργία τυχαίων αριθμών είναι ένα σύνθετο ζήτημα στην επιστήμη των υπολογιστών και απαιτεί τη χρήση πολύπλοκων αλγορίθμων. Η αξιολόγηση μιας «γεννήτριας τυχαίων αριθμών» γίνεται με διάφορους τρόπους, ένας εκ των οποίων είναι ο εξής: 1. Επιλέγεται ένα εύρος αριθμών Α Β. 2. Μέσω μιας επαναληπτικής διαδικασίας, παράγονται τυχαίοι αριθμοί και υπολογίζεται το «ποσοστό εμφάνισης» κάθε αριθμού. 3. Με βάση τα ποσοστά που υπολογίστηκαν δημιουργείται το «ιστόγραμμα τυχαιότητας». Προφανώς, ανάλογα με τον αριθμό επαναλήψεων, μπορεί να προκύπτει διαφορετικό αποτέλεσμα. πχ αν το εύρος αριθμών είναι 1 10 και κάνουμε 5 επαναλήψεις (δηλ παράγουμε 5 τυχαίους αριθμούς), ακόμα και αν σε κάθε επανάληψη εμφανίζεται διαφορετικός αριθμός, θα υπάρχουν κάποιοι που δε θα εμφανιστούν ποτέ. Για τη δημιουργία ενός τυχαίου αριθμού στη C, χρησιμοποιούμε τις παρακάτω προτάσεις: srand( time(null) ) ; random_number = Kato_Orio + rand() % Ano_Orio; Οι συναρτήσεις rand() και srand() περιέχονται στη βιβλιοθήκη stdlib.h, ενώ η time() στην time.h H srand πρέπει να κληθεί μόνο μια φορά κατά την εκτέλεση του προγράμματος. Δημιουργείστε πρόγραμμα που να ελέγχει πόσο αξιόπιστη είναι η γεννήτρια τυχαίων αριθμών, υποθέτοντας ότι θα χρησιμοποιηθεί για την προσομοίωση «ρίψης ζαριού», δηλαδή θα ελέγχει τους αριθμούς 1-6. Το πρόγραμμα θα εκτελεί τις εξής λειτουργίες: 1. Θα ρωτάει το χρήστη πόσους τυχαίους αριθμούς θέλει να παράγει (έστω Ν). 2. Για κάθε αριθμό που παράγει θα γίνεται καταμέτρηση της εμφάνισής του με χρήση πίνακα. 3. Μετά το τέλος των επαναλήψεων θα υπολογίζεται το ποσοστό εμφάνισης κάθε αριθμού n i, ως ο λόγος του αριθμού εμφανίσεων του n i προς το συνολικό αριθμό ρίψεων του ζαριού (Ν). 4. Με χρήση κατάλληλων συναρτήσεων θα υπολογίζεται το μικρότερο και το μεγαλύτερο ποσοστό εμφάνισης. Αν η διαφορά τους είναι μεγαλύτερη από 5%, τότε η γεννήτρια τυχαίων αριθμών δεν είναι καλή. 5. Θα ενημερώνεται ο χρήστης, αν η γεννήτρια δίνει αξιόπιστα αποτελέσματα, με βάση τα παραπάνω ποσοστά.
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 3 Τέλος, 6. Δημιουργείστε το «ιστόγραμμα τυχαιότητας» μέσω κατάλληλης συνάρτησης ως εξής: a. Θα δημιουργήσετε οριζόντιο άξονα με χρήση «+» και «-». b. Κάτω από τον άξονα αυτό θα υπάρχουν οι τιμές των «υποψήφιων τυχαίων αριθμών» σε αύξουσα σειρά. c. Θα δημιουργήσετε κατακόρυφο άξονα με χρήση. d. Αριστερά του άξονα θα υπάρχει το αντίστοιχο ποσοστό. e. Πάνω από κάθε αριθμό θα εμφανίζονται αστέρια «*» σε κατακόρυφη στήλη. Το πλήθος τους θα εκφράζει το ποσοστό εμφάνισης του κάθε αριθμού (θεωρείστε ότι κάθε αστέρι αντιπροσωπεύει ποσοστό τέτοιο ώστε να εμφανίζονται το πολύ 5 αστέρια σε κάθε στήλη). Για τη δημιουργία του ιστογράμματος, δεν είναι απαραίτητο να ακολουθήσετε αυτή τη σειρά βημάτων, αρκεί το τελικό αποτέλεσμα να είναι σωστό. Παράδειγμα: 10% * 8% * * * 6% * * * * * 4% * * * * * * 2% * * * * * * +------------ 1 2 3 4 5 6 (Οι τιμές που εμφανίζονται στο σχήμα είναι ενδεικτικές) Προδιαγραφές: 1. Το πρόγραμμα θα πρέπει να υλοποιηθεί ΧΩΡΙΣ τη χρήση μεταβλητών με «εμβέλεια προγράμματος». Μόνο οι ρητές σταθερές (αν χρειαστείτε), μπορούν να έχουν εμβέλεια προγράμματος. 2. Δεν πρέπει να γίνεται σπατάλη μνήμης. 3. Για τον υπολογισμό του πλήθους των αστεριών, θα πρέπει να γίνουν οι απαραίτητες στρογγυλοποιήσεις. 4. Στο ιστόγραμμα προσέξτε τη στοίχιση των αριθμών στον κατακόρυφο άξονα.
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 4 Δώστε παράδειγμα εκτέλεσης του προγράμματος με τιμή για το Ν: α) Ν = Α, β) Ν = ΑΒ, γ) Ν=ΑΒΓ, δ) Ν = ΑΒΓΔ όπου ΑΒΓΔ είναι τα ψηφία του ΑΜ σας. πχ για ΑΜ = 1234, θα ισχύει: α) Ν = 1 επανάληψη, β) Ν = 12 επαναλήψεις, γ) Ν = 123 επαναλήψεις και δ) Ν = 1234 επαναλήψεις Παραδείγματα εκτέλεσης: Για Ν = 100 Προσοχή: Το γεγονός ότι εμφανίζεται αυξημένο το ποσοστό εμφάνισης του «1» και μειωμένο του «6», είναι τυχαίο. Σε επόμενη εκτέλεση του προγράμματος, μπορεί να υπάρχει «προτίμηση» σε άλλο νούμερο:
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 5 Για Ν = 1000 Πλέον η κατανομή έχει γίνει ομοιόμορφη και μέγιστη διαφορά στην ποσοστιαία εμφάνιση είναι περίπου 2%. Προφανώς η ομοιομορφία αρχίζει να εμφανίζεται για κάποια τιμή του Ν=Ν 0 μεταξύ του 100 και του 1000, για την οποία η διαφορά στα ποσοστά εμφάνισης «πέφτει» κάτω από το 5% (σύμφωνα με την εκφώνηση). Η τιμή αυτή μπορεί να προσεγγιστεί είτε με δοκιμές και να πάρουμε μια απλή εκτίμηση, είτε με μια πιο συστηματική μελέτη και να βρούμε μια ακριβή τιμή. Σε κάθε περίπτωση όταν έχουμε ένα πρόβλημα που εμπλέκει ρίξιμο ζαριού, θα πρέπει να οι ρίψεις να είναι περισσότερες από το Ν 0, αλλιώς η γεννήτρια θα εμφανίζει «προτίμηση» σε συγκεκριμένα νούμερα.