3 Φύλλο Εργασίας 3 Στο φύλλο εργασιών 3 θα ασχοληθούμε με τις λίστες μια δομή της γλώσσας python που έχει την δομή ενός πίνακα. Θα χρησιμοποιήσουμε τις βασικές εντολές από τις λίστες και θα κατασκευάσουμε ένα πρόγραμμα που θα προσομοιώνει το παιχνίδι Λόττο με χρήση των λιστών. Έννοιες: δομή επανάληψης, συναρτήσεις και λίστες. Σκοπός αυτού του φύλλου είναι να γνωρίσουμε καλύτερα τις δυνατότητες της δομή επανάληψης της καλύτερης χρήσης των συναρτήσεων και τις λίστες. Μια γρήγορη επανάληψη από τα προηγούμενα If Παράδειγμα: 1) print("δώσε έναν αριθμό:",end='')# end='' δεν αλλάζει γραμμή num = int(input()) if num >= 0 : print("θετικός αριθμός") 2) print("δώσε έναν αριθμό:",end='')# end='' δεν αλλάζει γραμμή num = int(input()) if num >= 0 : print("θετικός αριθμός") else: print("αρνητικός") Σελίδα 1 από 12
While Παράδειγμα: num = 0 while num<10: print("num =",num) num = num + 1 Ορισμός συνάρτησης Παράδειγμα: def increment(n): n = n + 1 return n print("δώσε έναν αριθμό:", end='') γραμμή num = int(input()) num2 = increment(num) print(num2) # end='' δεν αλλάζει Σελίδα 2 από 12
Δομή λίστας και βασικές λειτουργίες Τι είναι μια λίστα Μια λίστα έχει την δομή ενός πίνακα σχηματικά έχει την παρακάτω διάταξη: Παράδειγμα: Αν θεωρήσουμε ότι αυτή η λίστα έχει όνομα monty τότε το στοιχείο monty[0] έχει τιμή M ενώ το στοιχείο monty[6] έχει τιμή P. Στις θέσεις monty[6:10] έχει τιμές ["P","y","t","h"] και προσοχή στις θέσεις monty[-12:-7] έχει τιμές ["M","o","n","t","y"] Σελίδα 3 από 12
Δημιουργία λίστας Οι τιμές που θα περιέχονται στη λίστα εσωκλείονται σε αγκύλες [ ] και χωρίζονται με κόμμα. Οι τιμές καταχωρούνται ακολουθιακά, η μια μετά την άλλη. Τρόποι δημιουργίας λίστας. Παραδείγματα: nums = [3,5,8,13,21,34,55] users = ["Αργυρώ", "Γιάννης", "Κυριάκος"] empty = [] Τώρα εκτελέστε τις παρακάτω εντολές για να δείτε το περιεχόμενο τους: print(nums) print(users) print(empty) Πρόσβαση σε στοιχείο της λίστας Αποκτούμε πρόσβαση σε ένα στοιχείο της λίστας γράφοντας το όνομα της λίστας και τη θέση του στοιχείου μέσα σε [ ]. Η αρίθμηση των θέσεων ξεκινάει πάντα από το 0 και φτάνει μέχρι το πλήθος των στοιχείων της λίστας μειωμένο κατά 1. Μέσα στις αγκύλες μπορούμε να γράψουμε οποιαδήποτε ακέραια έκφραση. Σε περίπτωση που αναφερθούμε σε μια θέση που δεν υπάρχει στη λίστα, δηλαδή σε έναν αριθμό μεγαλύτερο ή ίσο με το πλήθος των στοιχείων της τότε προκύπτει σφάλμα. Παραδείγματα: nums[3] = 1 # δίνει στο τέταρτο στοιχείο την τιμή 1 nums[-1] = 89 # δίνει στο τελευταίο στοιχείο την τιμή 89 print(nums[0]) # εμφανίζει το πρώτο στοιχείο της λίστας Συνάρτηση len Λειτουργία: Επιστρέφει το πλήθος των στοιχείων μιας Σελίδα 4 από 12 ακολουθίας, όπως η λίστα.
Πλήθος στοιχείων print(len(nums)) print(len(users)) print(len(empty)) Παράδειγμα: nums = [] if len(nums) == 0: print("η λίστα είναι κενή" Απαρίθμηση στοιχείων λίστας Παράδειγμα: nums = [3,5,8,13,21,34,55] for ar in nums: print(ar) Πράξεις Τεμαχισμός λίστας Λειτουργία: Δημιουργεί μια νέα λίστα που αντιστοιχεί σε ένα «τεμαχισμένο» τμήμα της αρχικής Για να τεμαχίσουμε μια λίστα γράφουμε μέσα σε αγκύλες [ ] τρεις αριθμούς: την αρχική θέση του τεμαχισμού, τη θέση τερματισμού του τεμαχισμού (που δεν περιλαμβάνεται στο τελικό τμήμα) και ανά πόσα στοιχεία θα περιλαμβάνονται στο τεμαχισμένο τμήμα, ξεκινώντας από την αρχική θέση. Παραδείγματα nums = [3,5,8,13,21,34,55] nums2=nums[1:4] # δημιουργεί μια νέα λίστα που περιέχει τα στοιχεία στις θέσεις 1 έως και 3 της Σελίδα 5 από 12
#αρχικής λίστας print(nums2) for ar in nums2: print(ar) print("*********************************") for ar in nums: print(ar) Αν παραλείψουμε την αρχική θέση, ο τεμαχισμός ξεκινάει από το πρώτο στοιχείο της λίστας. 1. nums = [23,15,28,413,221] nums2=nums[:3] # δημιουργεί μια νέα λίστα που περιέχει τα στοιχεία #στις θέσεις 1 έως και 2 της #αρχικής λίστας for ar in nums2: print(ar) Αν παραλείψουμε την τελική θέση τότε ο τεμαχισμός φτάνει μέχρι το τέλος της λίστας. nums = [23,15,28,413,221] nums2=nums[2:] # δημιουργεί μια νέα λίστα που περιέχει τα στοιχεία στις θέσεις 2 έως και το # τελευταίο της αρχικής λίστας for ar in nums2: print(ar) Συνένωση και πολλαπλασιασμός Παραδείγματα n = [1,2,3] + [4,5,6] #το n θα περιέχει τα [1,2,3,4,5,6] n1 = [1,2,3] * 3 #το n περιέχει τα [1,2,3,1,2,3,1,2,3] Ο τελεστής + (συνένωση) χρησιμοποιείται ανάμεσα σε δύο λίστες και δημιουργεί μια νέα λίστα που περιέχει όλα τα στοιχεία των αρχικών. Ο τελεστής * έχει ως αποτέλεσμα τη δημιουργία μιας νέας λίστας που περιέχει πολλές φορές τα στοιχεία της αρχικής. Σελίδα 6 από 12
Πως θα διαπιστώσετε με την χρήση της print το περιεχόμενο από τις λίστες n και n1:.. Έλεγχος ύπαρξης τιμής σε λίστα O Τελεστής in ελέγχει αν η τιμή βρίσκεται στη λίστα και επιστρέφει αντίστοιχα την τιμή True ή False. Παράδειγμα nums = [23,15,28,413,21] if 21 in nums: print("το βρήκα") Δοκιμάστε να κάνετε αναζήτηση και του στοιχείου 15, και του στοιχείου 23:.. Πως θα αλλάξετε την εντολή if να μας λέει ότι δεν το βρήκε και δοκιμάστε να κάνετε αναζήτηση των στοιχείων 10, και 2:.. Σελίδα 7 από 12
Εφαρμογή των λιστών στο παιχνίδι Λόττο Η ιστορία του Λόττο ξεκινάει από την αρχαιότητα. Στην Αρχαία Κίνα σύμφωνα με όλους τους ιστορικούς που ασχολούνται με το θέμα του λόττο και των τυχερών παιχνιδιών φαίνεται ότι πρωτοπαίχτηκε ένα παιχνίδι που έμοιαζε στο σημερινό κίνο και είναι ο πρώτος πρόγονος του Λόττο στην Ιστορία. Το Λόττο στην Ελλάδα παίχθηκε πρώτη φορά τον Δεκέμβριο του 1990 και το κόστος συμμετοχής για τους παίκτες ήταν 30 δραχμές ανά στήλη. Από το 1994 και για τα επόμενα 15 χρόνια η στήλη του Λόττο κόστιζε 0,15. Το 2009 άλλαξε η τιμή της στήλης και διαμορφώθηκε στα 0,50. Οι σημαντικές αλλαγές που έχουν γίνει όλα αυτά τα 20 χρόνια στον λόττο στην Ελλάδα είναι ότι το 1997 καθιερώθηκε νέα κατηγορία για τους νικητές (3 σωστές επιλογές αριθμών) και ότι το 2009 καθιερώθηκε ακόμη μια κατηγορία νικητών ( 5 σωστές επιλογές +μία). Επίσης στο ελληνικό λόττο που διοργανώνει ο ΟΠΑΠ το 2009 καθιερώθηκαν προκαθορισμένα κέρδη ανά επιτυχία και παρουσιάστηκαν τα καινούργια δελτία του λόττο. Αρκετά με την ιστορική αναδρομή. Στα δικά μας τώρα. Σκοπός του συγκεκριμένου φύλλου εργασίας είναι να λειτουργήσει επαναληπτικά σε έννοιες που αφορούν στις εντολές εισόδου, εξόδου στις έννοιες των μεταβλητών, στις δομές επιλογής, να εισάγει την έννοια της επανάληψης και του υποπρογράμματος ώστε να κάνουμε το πρόγραμμά μας όσο γίνεται μικρότερο, ευέλικτο και πιο κατανοητό και τέλος να μας εισάγει σε μια καινούργια έννοια, τις λίστες. Μια δομή δεδομένων είναι ένα σύνολο δεδομένων, μαζί με ένα σύνολο επιτρεπτών λειτουργιών (πράξεων) επί αυτών, όπως προσπέλαση, εισαγωγή, διαγραφή, αναζήτηση, ταξινόμηση, συγχώνευση και διαχωρισμό. Οι λίστες είναι τέτοιες δομές δεδομένων και συγκεκριμένα είναι μια διατεταγμένη συλλογή τιμών, οι οποίες αντιστοιχίζονται σε δείκτες. Τα στοιχεία μιας λίστας δεν χρειάζεται να είναι του ίδιου τύπου. Σελίδα 8 από 12
Στο τυχερό παιχνίδι Λόττο, ο παίκτης επιλέγει έξι αριθμούς από 1 έως 49. Στη συνέχεια κληρώνονται έξι αριθμοί με τυχαίο τρόπο. Ανάλογα με το πλήθος που κατάφερε να μαντέψει ο παίκτης έχει και τα αντίστοιχα κέρδη. Να θυμηθούμε τις εντολές, συναρτήσεις, input, print, input, int, float, random με το παρακάτω παράδειγμα. 1. Δημιουργήστε ένα πρόγραμμα με τις παρακάτω εντολές import random name=input("πως σε λένε") age=int(input("ποιά είναι η ηλικία σου;")) height=float(input("ποιό είναι το ύψος σου σε μέτρα (η υποδιαστολή με.")) num=random.randint(1,49) print ("Σε λένε ",name) print ("Είσαι ", age, " χρονών") print ("Και το ύψος σου μέτρα είναι ", height) print ("Ο Η/Υ έδωσε τυχαία τον αριθμό ", num) Όπως ξέρουμε τα στοιχεία μιας λίστας διαχωρίζονται με κόμμα και περικλείονται σε αγκύλες. Μία λίστα που είναι άδεια συμβολίζεται με []. Για παράδειγμα: numbers= [6, 3,-5,9] numbers=[3, 6, μήλο, πορτοκάλι, 9] numbers=[ ] Με όσα έχουμε μάθει ας δοκιμάσουμε τις παρακάτω εντολές import random usernum=[1, 5, 3, 9,7] print(usernum[1]) print(usernum[0]) print(usernum[2]) print(usernum[3]) print(usernum[4]) usernum =[] print (usernum) usernum =[22] usernum =[33] print(usernum) usernum =[] num=random.randint(1,49) usernum = usernum +[num] print(usernum) Σελίδα 9 από 12
num=random.randint(1,49) usernum = usernum +[num] 2. Δοκιμάζουμε τώρα να κατασκευάσουμε ένα πρόγραμμα το οποίο να παράγει 5 τυχαίους αριθμούς από το 1 έως το 49 και να τα βάζει σε μια λίστα αριθμών. import random lottonum =[] len=0 while len<6: num=random.randint(1,49) lottonum = lottonum +[num] len=len+1 print (lottonum) Υπάρχει ένα πρόβλημα που θα πρέπει να λύσουμε και αυτό είναι ότι δεν εξασφαλίσουμε ότι οι αριθμοί στην λίστα είναι μοναδική δηλαδή κάθε νέος αριθμός που παράγεται τυχαία δεν θα είναι μέσα στην λίστα δηλαδή όχι μέσα δηλαδή not in. 3. Επίλυση του προβλήματος import random lottonum =[] len=0 while len<6: num=random.randint(1,49) if num not in lottonum: lottonum = lottonum +[num] len=len+1 print(num) Αυτό είναι το τμήμα του προγράμματος που παράγει τους 6 τυχαίους αριθμούς και δημιουργεί με αυτούς την λίστα των αριθμών του Λοττο. 4. Τώρα πρέπει να κατασκευάσουμε το τμήμα του προγράμματος που παράγει ο χρήστης 6 αριθμούς, δηλαδή τη συμπλήρωση του δελτίου. Συμπλήρωση δελτίου Λόττο, οι 6 αριθμοί που περνά ο χρήστης στο δελτίο του Σελίδα 10 από 12
usernum=[] len=0 while len<6: # ότι κάνει στην ουσία η random.randint(1,49) num=int(input("δώσε αριθμό 1..49:")) while num<1 or num>49: num=int(input("δώσε σωστό αριθμό 1..49:")) if num not in usernum: usernum= usernum + [num] len = len + 1 print(usernum) 5. Τώρα έστω ότι παράγαμε δυο λίστες από τιμές μια από τις τιμές του Λόττο και μια από τον παίχτη usernum=[1,2,3] lottonum=[3,1,3] if usernum==lottonum: print("iσες λίστες") else: print("δεν είναι ισες λίστες") Τι παρατηρούμε μετά την σύγκριση της λίστας usernum και lottonum.. 6. Έστω ότι είχαν την ίδια σειρά και τους ίδιους αριθμούς δηλαδή usernum=[1,2,3] lottonum=[1,2,3] if usernum==lottonum: print("ίσες λίστες") else: print("δεν είναι ίσες λίστες") Τι παρατηρούμε μετά την σύγκριση της λίστας usernum και lottonum.. Δηλαδή αν είχαμε έναν τρόπο ταξινόμησης των λιστών θα ήταν εύκολη η σύγκριση τους. Υπάρχει ή δεν υπάρχει τρόπος ταξινόμησης λιστών???? Σελίδα 11 από 12
7. Και όμως υπάρχει η sorted() και γράφεται sorted(όνομα_λίστας) και μας δίνει μια ταξινομημένη λίστα άρα πριν την σύγκριση θα πρέπει να ταξινομήσουμε τις λίστες ως εξής: usernum=[1,2,3] lottonum=[3,1,3] usernum=sorted(usernum) lottonum=sorted(lottonum) if usernum==lottonum: print("iσες λίστες") else: print("δεν είναι ισες λίστες") 8. Τώρα να δημιουργήσετε τις παρακάτω συναρτήσεις: a) Το μηχάνημα υπολογίζει τους 5 αριθμούς του Λόττο def createlottonumbers() και επιστρέφει την λίστα με τους 5 αριθμούς που έχουν επιλεγεί, lottonum[] (δες 3 βήμα) b) Ο παίχτης γράφει στο χαρτί τους 5 αριθμούς def insertusernumber() και επιστρέφει τους αριθμούς που έχει εισάγει ο παίκτης usernum[] (δες 4 βήμα) c) Το μηχάνημα συγκρίνει τους αριθμούς του μεταξύ τους και βρίσκει τον νικητή def isequallists(list1,list2) δέχεται σαν είσοδο 2 λίστες και επιστρέφει την λογική μεταβλητή true (αλήθεια) αν είναι ίση και false (ψέμα) αν είναι διαφορετικές. (δες 7 βήμα) Δραστηριότητα Προσπαθήστε να φτιάξετε το πρόγραμμα βασιζόμενοι στις οδηγίες που σας έχουν δοθεί, το τέλος της 2 ης ώρας θα σας δοθεί η σωστή λύση και άσκηση για την επόμενη φορά. Σελίδα 12 από 12