Αφού είδαμε στο τελευταίο μάθημα πώς γίνεται να αλληλεπιδράσουμε με αρχεία του υπολογιστή μας μέσω της Python, θα εφαρμόσουμε σήμερα τις γνώσεις μας με ένα ακόμα project. Ας δούμε με ποιον τρόπο μπορούμε να κατασκευάσουμε ένα ερωτηματολόγιο, δημιουργώντας μαζικά αρχεία, γεμίζοντάς τα με περιεχόμενο, και επιλέγοντας με τυχαίο τρόπο τις ερωτήσεις του.
Προτάσεις συνεργασίας
Τα νέα άρθρα του PCsteps
Γίνε VIP μέλος στο PCSteps
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.
Project: Δημιουργία ερωτηματολογίου
Ας υποθέσουμε ότι εργαζόμαστε ως καθηγητής γεωγραφίας σε μια τάξη 30 μαθητών, και θέλουμε να τους εξετάσουμε στις πρωτεύουσες των νομών της Ελλάδας. Αν και θέλουμε το τεστ να είναι πολλαπλής επιλογής, εντούτοις δεν εμπιστευόμαστε τους σεσημασμένους μαθητές μας ότι δεν θα αντιγράψουν.
Αυτό που πρέπει να κάνουμε, λοιπόν, είναι να ανακατέψουμε τη σειρά των ερωτήσεων, έτσι ώστε κάθε μαθητής να έχει ένα μοναδικό σετ ερωτήσεων στο τεστ. Πρόκειται για μια βαρετή δουλειά που θα επιταχυνόταν σημαντικά με τη βοήθεια ενός προγράμματος. Και επειδή εκτός από γεωγραφία, ξέρουμε και Python, μπορούμε να το γράψουμε εμείς.
Αντικείμενο προγράμματος
Το πρόγραμμά μας πρέπει να:
- Δημιουργεί 30 διαφορετικά ερωτηματολόγια.
- Δημιουργεί 51 ερωτήσεις πολλαπλής επιλογής για κάθε ερωτηματολόγιο, με τυχαία σειρά.
- Παρέχει τη σωστή απάντηση και τρεις τυχαίες λάθος απαντήσεις για κάθε ερώτημα, επίσης σε τυχαία σειρά.
- Κάνει εγγραφή των ερωτηματολογίων σε 30 αρχεία κειμένου.
- Κάνει εγγραφή των απαντήσεων σε 30 αρχεία κειμένου.
Τα παραπάνω σημαίνουν ότι ο κώδικας θα πρέπει να εκτελεί, σε ένα γενικό πλαίσιο, τα εξής:
- Αποθηκεύει τους νομούς και τις πρωτεύουσές τους σε ένα λεξικό.
- Καλεί τις open(), write(), και close() για τα αρχεία κειμένου στα οποία θα αποθηκευθούν ερωτηματολόγια και απαντήσεις.
- Χρησιμοποιεί μια συνάρτηση του module random, ώστε να κατανέμεται τυχαία η σειρά των ερωτήσεων και των πολλαπλών επιλογών.
Βήμα 1: Αποθήκευση δεδομένων
Η πρώτη μας κίνηση είναι να κατασκευάσουμε έναν βασικό σκελετό του προγράμματός μας και να εισάγουμε, για αρχή, τα δεδομένα του τεστ. Δημιουργούμε ένα νέο αρχείο στον editor μας και γράφουμε:
Εφόσον το πρόγραμμα θα διαλέγει τυχαία τις ερωτήσεις και τις απαντήσεις, κάνουμε import και το random module, γιατί θα χρειαστούμε τις συναρτήσεις του.
Προσθέτουμε, τώρα, τα δεδομένα μας:
Η μεταβλητή capitals περιέχει ένα λεξικό με όλους τους νομούς ως κλειδιά, και τις αντίστοιχες πρωτεύουσες ως τιμές.
Από τη στιγμή που θέλουμε τα ερωτηματολόγια που θα δημιουργηθούν να είναι 30, ο κώδικας που θα δημιουργεί τα αρχεία ερωτηματολογίων και απαντήσεων μπαίνει σε έναν βρόχο for 30 επαναλήψεων.
Βήμα 2: Δημιουργία ερωτήσεων
Ας ξεκινήσουμε να συμπληρώνουμε με τη σειρά τα TODO του κώδικά μας.
Είπαμε ότι ο βρόχος θα εκτελεστεί 30 φορές, μία για κάθε ερωτηματολόγιο. Επομένως σε κάθε επανάληψη εργαζόμαστε με ένα σετ ερωτήσεων τη φορά.
Αρχικά δημιουργούμε το αρχείο δίνοντάς του, εκτός από όνομα, και μια κεφαλίδα με πεδία για να συμπληρώνονται στοιχεία όπως το ονοματεπώνυμο, η ημερομηνία, και η διδακτική περίοδος.
Έπειτα θα χρειαστεί να πάρουμε μια λίστα των νομών σε τυχαία σειρά. Τη λίστα θα χρησιμοποιήσουμε αργότερα για τη δημιουργία ερωτήσεων και απαντήσεων του ερωτηματολογίου.
Με βάση τα όσα είπαμε, πάμε να προσθέσουμε στον κώδικά μας τα εξής:
Τα ονόματα των αρχείων για τα ερωτηματολόγια θα είναι της μορφής capitalsquiz<N>.txt. Το <N> αυτό είναι ο μοναδικός αριθμός του συγκεκριμένου σετ ερωτήσεων που προέρχεται από το quiz_num, τον μετρητή του βρόχου for. Οι απαντήσεις για το capitalsquiz<N>.txt θα αποθηκεύεται σε ένα αρχείο κειμένου, που ονομάζουμε capitasquiz_answers<N>.txt.
Σε κάθε επανάληψη του βρόχου, το σύμβολο %s στα ‘capitalsquiz%s.txt' και ‘capitalsquiz_answers%s.txt' θα αντικαθίσταται από τον αριθμό (quiz_num+1). Έτσι, το πρώτο αρχείο ερωτήσεων και το πρώτο αρχείο απαντήσεων θα ονομάζονται capitalsquiz1.txt και capitalsquiz_answers1.txt, αντίστοιχα.
Τα αρχεία αυτά δημιουργούνται με κλήσεις της συνάρτησης open() και δεύτερη παράμετρο το ‘w', ώστε μετά τη δημιουργία τους, τα αρχεία να ανοίγουν σε λειτουργία εγγραφής.
Στη συνέχεια, με τις write() κατασκευάζουμε εντός του κάθε αρχείου, σαν κεφαλίδα, τα στοιχεία που θα ζητηθεί να εισάγει ο μαθητής. Τέλος, με τη random.shuffle() ανακατανέμουμε σε τυχαία σειρά τις τιμές της λίστας που τις περνάμε ως όρισμα.
Βήμα 3: Δημιουργία απαντήσεων
Η επόμενη εργασία που πρέπει να επιτελεί το πρόγραμμα είναι η δημιουργία επιλογών προς απάντηση για την κάθε ερώτηση, με τη μορφή πολλαπλής επιλογής, από το Α ως το Δ.
Θα χρειαστούμε άλλον έναν βρόχο, αυτή τη φορά για την παραγωγή περιεχομένου για καθεμία από τις 51 ερωτήσεις του ερωτηματολογίου. Εντός του βρόχου αυτού, θα τοποθετήσουμε έναν τρίτο βρόχο, για να δημιουργούνται οι επιλογές πολλαπλής επιλογής για κάθε ερώτηση.
Οπότε γράφουμε στον κώδικά μας τα παρακάτω:
Το εύκολο της υπόθεσης είναι να πάρουμε την ορθή απάντηση, και την αποθηκεύουμε ως τιμή στο λεξικό capitals. Ο βρόχος αυτός περνάει από όλους τους νομούς της (ανακατεμένης) λίστας counties, από το counties[0] ως το counties[50], βρίσκει κάθε νομό στην capitals, και αποθηκεύει την πρωτεύουσα του συγκεκριμένου νομού στην correct_answer.
Η λίστα με τα υπόλοιπα πιθανά στοιχεία πολλαπλής επιλογής είναι πιο πολύπλοκη. Για να την λάβουμε, ακολουθούμε την εξής τακτική:
- Αντιγράφουμε όλες τις τιμές του λεξικού capitals.
- Διαγράφουμε τη σωστή απάντηση μεταξύ αυτών.
- Επιλέγουμε τρεις τυχαίες τιμές από τη λίστα που απομένει.
Το τελευταίο γίνεται εύκολα με τη συνάρτηση random.sample(). Το πρώτο του όρισμα είναι η λίστα από την οποία θα γίνει η επιλογή, ενώ το δεύτερο ο αριθμός των τιμών που θα διαλέξουμε. Η τελική λίστα των πολλαπλών επιλογών κάθε ερώτησης είναι ο συνδυασμός των τριών εσφαλμένων απαντήσεων με τη μία σωστή.
Τέλος, για να αποφύγουμε τους μαθητές που παίζουν με σύστημα τις απαντήσεις, δεν θα ξεχάσουμε να ανακατέψουμε τη σειρά των σωστών απαντήσεων, μεταξύ των τεσσάρων πιθανών επιλογών. Σε διαφορετική περίπτωση, θα έχουμε όλες τις σωστές στο Δ.
Βήμα 4: Εγγραφή σε αρχεία
Το μόνο που απέμεινε είναι να γράψουμε την ερώτηση στο αρχείο του ερωτηματολογίου, και την απάντηση στο αρχείο των απαντήσεων.
Συμπληρώνουμε τον κώδικά μας με τα ακόλουθα:
Με έναν βρόχο for, περνάμε από τους αριθμούς 0 έως 3 για να γράψουμε τις επιλογές των απαντήσεων. Η έκφραση ‘ΑΒΔΓ'[i] χειρίζεται το string ‘ΑΒΓΔ' ως πίνακα. Επομένως, σε κάθε επανάληψη του βρόχου θα επιστρέφει ‘Α', ‘Β', ‘Γ', και ‘Δ'.
Στην τελευταία γραμμή, η έκφραση:
answer_options.index(correct_answer)
θα βρει τον ακέραιο δείκτη της ορθής απάντησης στις (τυχαία κατανεμημένες) επιλογές απάντησης, ενώ η έκφραση:
'ΑΒΓΔ'[answer_options.index(correct_answer)]
θα επιστρέψει το γράμμα της σωστής απάντησης, για να πάμε να το γράψουμε στο αρχείο απαντήσεων.
Εκτελώντας το πρόγραμμα, δεν θα δούμε κάτι στην κονσόλα του IDLE, πέρα από το γεγονός ότι δεν πήραμε κάποιο error.
Πηγαίνοντας όμως στον φάκελο όπου βρίσκεται το πρόγραμμά μας, και αφού προσέξουμε να επιλέξουμε εμφάνιση όλων των τύπων αρχείου…
…θα δούμε τα αρχεία που δημιούργησε η τελευταία εκτέλεση του προγράμματος.
Για παράδειγμα, το αρχείο capitalsquiz1.txt θα μοιάζει με το αρχείο αυτής της εικόνας.
Βέβαια οι ερωτήσεις και οι αντίστοιχες πιθανές απαντήσεις τους αναμένουμε να διαφέρουν από του δικού μας παραδείγματος, ανάλογα με το αποτέλεσμα των κλήσεων της random.shuffle().
Στο επόμενο μάθημα για τον προγραμματισμό Python
Θα μάθουμε – επιτέλους – πώς μπορούμε με τα προγράμματά μας να έρθουμε σε επαφή με το διαδίκτυο, να κατεβάζουμε περιεχόμενο από ιστοσελίδες, κοκ.
Σας άρεσε το σημερινό μάθημα για τον προγραμματισμό Python?
Γράψτε μας στα σχόλια για οποιαδήποτε ερωτήματα που σας γεννήθηκαν από το σημερινό μάθημα.
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.