ΓΕ0170 -Αλγόριθμοι και Προηγμένες Προγραμματικές Τεχνικές Η γλώσσα προγραμματισμού Python Νίκος Αθανάσης e-mail: athanasis@geo.aegean.gr
Η έννοια του αλγορίθμου Αλγόριθμος είναι ένα πεπερασμένο σύνολο εντολών, αυστηρά καθορισμένων και εκτελέσιμων σε πεπερασμένο χρόνο, οι οποίες όταν ακολουθηθούν επιτυγχάνεται ένα επιθυμητό αποτέλεσμα ή επιλύεται ένα συγκεκριμένο πρόβλημα. Ο όρος αυτός χρησιμοποιείται, για να δηλώσει ένα συγκεκριμένο σύνολο βημάτων-ενεργειών για την επίλυση προβλημάτων
Κριτήρια Αλγορίθμων Είσοδος (input). Καμία, μία ή περισσότερες ποσότητες να δίνονται ως είσοδοι στον αλγόριθμο. Έξοδος (output). Ο αλγόριθμος να δημιουργεί τουλάχιστον μία ποσότητα ως αποτέλεσμα. Καθοριστικότητα (definiteness). Κάθε εντολή να καθορίζεται χωρίς καμία αμφιβολία για τον τρόπο εκτέλεσής της. Δηλαδή η μηχανή επεξεργασίας δεδομένων που θα κλιθεί να τη διεκπεραιώσει να καταλάβει τι ζητάμε να γίνει. Μπορούμε να το συνδέσουμε με τη σωστή σύνταξη.
Κριτήρια Αλγορίθμων Περατότητα (finiteness). Ο αλγόριθμος να τελειώνει μετά από πεπερασμένα βήματα εκτέλεσης των εντολών του.
Κριτήρια Αλγορίθμων Αποτελεσματικότητα (effectiveness). Κάθε μεμονωμένη εντολή του αλγορίθμου να είναι επαρκώς απλή, έτσι ώστε να μπορεί να εκτελεστεί από ένα άτομο με χρήση χαρτιού και μολυβιού. Δεν αρκεί δηλαδή να είναι ορισμένη (κριτήριο 3), αλλά πρέπει να είναι και εκτελέσιμη. Η αποτελεσματικότητα έχει να κάνει με την εκτελεσιμότητα. Αν εκτελείται μια σαφώς ορισμένη εντολή. Για παράδειγμα στην εντολή x=1/y όπου ψ=0, το πρόγραμμα καταλαβαίνει τι πρέπει να κάνει, αλλά δεν μπορεί να το εκτελέσει. Άρα η εντολή είναι μη αποτελεσματική γιατί δεν παράγει αποτέλεσμα.
Η εξίσωση των Αλγορίθμων Από τον Niklaus Wirth (που παρουσίασε την πρώτη δομημένη γλώσσα προγραμματισμού, την Pascal) διατυπώθηκε το 1976 η εξής εξίσωση: Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα
Η εξίσωση των Αλγορίθμων Δηλώνει ότι οι αλγόριθμοι συνυφασμένοι με τις απαραίτητες δομές σε μία αδιάσπαστη ενότητα αποτελούν τη βάση κάθε προγράμματος, ουσιαστικά δηλαδή τη βάση κάθε εφαρμογής. Η ανάλυση των αλγορίθμων μπορεί να διεκπεραιωθεί μόνο έχοντας στο υπόβαθρο ότι οι αλγόριθμοι επενεργούν σε κάποιες συγκεκριμένες δομές δεδομένων.
Δομές Δεδομένων Ένα σύνολο αποθηκευμένων δεδομένων που υφίστανται επεξεργασία από ένα σύνολο λειτουργιών Στατικές Δομές Δεδομένων Δυναμικές Δομές Δεδομένων
Στατικές δομές δεδομένων Το μέγεθος της μνήμης που απαιτείται καθορίζεται από την αρχή του προγραμματισμού και όχι κατά την εκτέλεση του προγράμματος Στις στατικές δομές δεδομένων αφού γνωρίζουμε εκ των προτέρων το μέγεθός τους, τα στοιχεία αποθηκεύονται σε συνεχόμενες θέσεις μνήμης
Δυναμικές δομές δεδομένων Δεν έχουν σταθερό μέγεθος Ο αριθμός των κόμβων τους αυξομειώνεται ανάλογα με το αν εισάγουμε ή διαγράφουμε δεδομένα Δεν αποθηκεύονται σε συνεχόμενες θέσεις μνήμης
Αλγόριθμοι και Προγράμματα Η έννοια του αλγόριθμου δεν ταυτίζεται με την έννοια του προγράμματος. Το δεύτερο είναι μία υλοποίηση του πρώτου με τη βοήθεια των εντολών και των εργαλείων ενός προγραμματιστικού περιβάλλοντος. Σε σχέση με τα ανωτέρω κριτήρια, ένα πρόγραμμα δεν ικανοποιεί αναγκαστικά το 4ο κριτήριο της περατότητας (για παράδειγμα, ένα λειτουργικό σύστημα εκτελεί διαρκώς έναν ατέρμονα βρόχο περιμένοντας εντολές να εισέλθουν στο σύστημα).
Τρόποι παρουσίασης των αλγορίθμων Με την περιγραφή του αλγόριθμου σε φυσική γλώσσα (natural language) Με ελεύθερο κείμενο (free text). Μπορεί να παραβιασθεί το τρίτο κριτήριο του ορισμού. Με τη χρήση ενός διαγράμματος ροής (flow chart). Με κωδικοποίηση (coding), δηλαδή με ένα πρόγραμμα που, όταν εκτελεσθεί, θα δώσει τα ίδια αποτελέσματα με τον αλγόριθμο.
Γλώσσα μηχανής Το πρόγραμμα περιέχει εντολές που είναι σε δυαδική μορφή, άμεσα κατανοητή από τον Η/Υ (όχι όμως από τον άνθρωπο). Δηλαδή, το πρόγραμμα αποτελείται από ακολουθίες 0 και 1 π.χ. 10101000 00001010 11000000 00000001 Πλεονεκτήματα : Ταχύτατη εκτέλεση των εντολών. Δεν απαιτείται μεταφραστικό πρόγραμμα. Μειονεκτήματα : Το γράψιμο του προγράμματος είναι μία ιδιαίτερα επίπονη και χρονοβόρα διαδικασία. Απαιτείται βαθιά γνώση της αρχιτεκτονικής του Η/Υ. Το πρόγραμμα «τρέχει» μόνο στο συγκεκριμένο τύπο του Η/Υ.
Γλώσσες χαμηλού επιπέδου ή Συμβολικές γλώσσες Οι εντολές που είναι σε μορφή 0 και 1 αντικαθίστανται από μνημονικά (συμβολικά) ονόματα. Για παράδειγμα, η εντολή 100001100 αντικαθίστανται από το ADD. Ένα δείγμα χρήσης θα ήταν : INDEX =$01 {βάλε στην INDEX την τιμή 1} ADD INDEX {πρόσθεσε την τιμή της INDEX στον συσσωρευτή} LDA #10 {φόρτωσε στο συσσωρευτή την τιμή 10} CLA {καθάρισε το συσσωρευτή}.. Πλεονεκτήματα : Ταχύτατη εκτέλεση των εντολών. Η μορφή του προγράμματος είναι καλύτερα κατανοητή από τον άνθρωπο σε σχέση με τη γλώσσα μηχανής. Μειονεκτήματα : Η αντιστοιχία 1 προς 1 με τις εντολές της γλώσσας παρέμενε. Απαιτείται η χρήση ενός μεταφραστικού προγράμματος ώστε οι συμβολικές εντολές να μετατραπούν στις αντίστοιχες δυαδικές. Το ειδικό αυτό πρόγραμμα ονομάζεται συμβολομεταφραστής (assembler). Το γράψιμο του προγράμματος εξακολουθεί να είναι μία ιδιαίτερα επίπονη και χρονοβόρα διαδικασία. Απαιτείται βαθιά γνώση της αρχιτεκτονικής του Η/Υ. Το πρόγραμμα «τρέχει» μόνο στο συγκεκριμένο τύπο του Η/Υ.
Γλώσσες υψηλού επιπέδου Λέγονται έτσι διότι τα προγράμματα διατυπωμένα σε μία τέτοια γλώσσα είναι άμεσα κατανοητά από τον άνθρωπο (αλλά όχι από τον Η/Υ) αφού χρησιμοποιείται μία γλώσσα που είναι αρκετά περιγραφική όπως μία φυσική γλώσσα. Παράδειγμα, INPUT Δώσε την τελική τιμή ; N SUM = 0 For INDEX = 1 to N SUM = SUM + INDEX Next Πλεονεκτήματα : Η μορφή του προγράμματος είναι εύκολα κατανοητή από τον άνθρωπο σε σχέση με τη γλώσσα μηχανής ή τη συμβολική γλώσσα. Το γράψιμο του προγράμματος δεν είναι πλέον μία ιδιαίτερα επίπονη και χρονοβόρα διαδικασία όπως συμβαίνει με τη γλώσσα μηχανής ή τη συμβολική γλώσσα. Δεν απαιτείται σχεδόν καμία γνώση της αρχιτεκτονικής του Η/Υ. Συνεπώς, είναι ανεξάρτητα από την αρχιτεκτονική του Η/Υ. Το πρόγραμμα «τρέχει» σε όλους τους τύπους Η/Υ αρκεί να υπάρχει το κατάλληλο μεταφραστικό πρόγραμμα. Συνεπώς ένα χαρακτηριστικό τους είναι η μεταφερσιμότητα, δηλαδή ένα πρόγραμμα υψηλού επιπέδου να εκτελείται, με ελάχιστες μετατροπές, σε πολλούς τύπους Η/Υ. Η εκμάθηση της γλώσσας είναι εύκολη. Η διόρθωση λαθών και η συντήρηση των προγραμμάτων είναι ευκολότερη. Μειονεκτήματα : Απαιτείται η χρήση ενός μεταφραστικού προγράμματος ώστε οι εντολές να μετατραπούν σε πολλές δυαδικές εντολές (δεν έχουμε εδώ αντιστοιχία 1 προς 1). Έχουμε δύο ειδών μεταφραστικά προγράμματα: τους μεταγλωττιστές (compilers) και τους διερμηνείς (interpreters). Το πρόγραμμα «τρέχει» πιο αργά σε σχέση με τα προγράμματα των συμβολικών γλωσσών ή της γλώσσας μηχανής.
Μεταφραστικά Προγράμματα Ο προγραμματισμός είναι η διατύπωση του αλγορίθμου σε μορφή κατανοητή από τον Η/Υ ώστε να τον εκτελέσει («τρέξει» όπως λέμε στην ορολογία της Πληροφορικής). Ένα πρόγραμμα που φτιάχνεται σε μία γλώσσα υψηλού επιπέδου δεν είναι άμεσα κατανοητό από τον Η/Υ. Θα πρέπει να μεταφραστεί σε ισοδύναμο πρόγραμμα σε γλώσσα μηχανής (δυαδική μορφή). Την διαδικασία μετάφρασης την πραγματοποιούν τα μεταφραστικά προγράμματα. Είναι δύο ειδών: Μεταγλωττιστές (Compilers) Διερμηνευτές (Interpreters)
Μεταφραστικά Προγράμματα Μεταγλωττιστής : Παίρνει, ως είσοδο, το πηγαίο πρόγραμμα και αναλαμβάνει να το μεταφράσει εξ ολοκλήρου παράγοντας το αντικείμενο πρόγραμμα.
Μεταφραστικά Προγράμματα Διερμηνευτής : Παίρνει, ως είσοδο, μία-μία εντολή του πηγαίου, την μεταφράζει και την εκτελεί αμέσως. Η λειτουργία του μοιάζει με τον άνθρωπο-διερμηνέα που μεταφράζει επί τόπου κάθε πρόταση.
Η Γλώσσα Προγραμματισμού Python Object oriented Interpreted language Αντικειμενοστραφής μεταφραστική γλώσσα Μεταφερσιμότητα προς όλα τα γνωστά Λειτουργικά Συστήματα (Windows, Linux, MacOS) Υποστηρίζει βασικούς τύπους δεδομένων (αριθμούς, αλφαριθμητικά) αλλά και σύνθετους τύπους δεδομένων (πχ λίστες, ευρετήρια) που απλοποιούν την ανάπτυξη λογισμικού Η νέα έκδοση της Python (3), διαθέτει σημαντικές διαφορές με την έκδοση 2. Η Python2 θα συνεχίσει να υποστηρίζεται για λίγα χρόνια ακόμη Είναι μια από τις 4 επίσημες γλώσσες τις Google (Java, Javascript, C++, Python)
Η Γλώσσα Προγραμματισμού Python https://www.youtube.com/watch?v=jrd EMERq8MA (Στο διάλλειμα)!
Κέλυφος Python (Python Shell)
(1) print ("Hello world!") greeting = "Hello" name = "Nikos" print (greeting + " " + name) Αποθήκευση (example1.py) Εκτέλεση με F5 (2) a = 1 b = 2 c = a+b print (c) print (1+2) print () for i in range(10): print(i) for i in range(10): print(i, end=" ") Εκτέλεση σε cmd mode (python example1.py) (3) name = input("what is your name?") age = input("what is your age?") print ("Name\tAGE") print (name+"\t"+age) Τροποποιείστε:
(4) (4Ok) name = input("what is your name?") age = 40#input("What is your age?") print ("Name\tAGE") print (name+"\t"+age) Τι παρατηρείτε; (5) name = input("what is your name?") age = input("what is your age?") print ("Name\tAGE") print (name+"\t"+str(age)) print (name+"\t"+"{0}". format(age)) name = input("what is your name?") age = input("what is your age?") print ("Name\tAGE") print (name+"\t"+ str(age)) (6) name = input("what is your name?") age = input("what is your age?") print ("Name:\t"+name) print ("Age:\t"+str(age)) print ("Name:\t{0}". format(name)) print ("Age:\t{0}". format(age)) print ("""Name:\t{0}. Age:\t{1}""". format(name, age)) Γράψτε πρόγραμμα το οποίο θα δέχεται το όνομα και το επίθετο του χρήστη και θα τα εμφανίζει σε αντίστροφη σειρά
a = 10 b = 3 print (a/b) print(a//b) print(a%b) (9) (7) name = input("what is your name?") print (name) print ("Length of your name:{0}". format(len(name))) print ("Starts with "+name[0]) print ("Ends with "+name[len(name)-1]) print ("Ends with "+name[-1]) print ("First 3 [0:3]"+name[0:3]) print ("First 3 [:3]"+name[:3]) print ("Last 3 [-3:]"+name[-3:]) print ("From 3 to end:"+name[3:]) (8) a = 12 b = 3 for i in range(1, a//b): print (i,end=" ") print() print (a + b / 3-4 * 12) print (a + b // 3-4 * 12) print ("Third character from the end:"+name[-3]) print ("Two characters starting from the third character from the end:"+name[-3:-1])
(10) (11) number = "9,123,456,789" print(number[1::4]) number = "1, 2, 3, 4, 5, 6, 7, 8, 9" print(number[0::3]) print("-"*30) for i in range(10): print("{0} squared is {1}, cubed {2}".format(i, i**2, i**3)) for i in range(1,10): print("{0} squared is {1}, cubed {2}".format(i, i**2, i**3)) for i in range(1,10): print("{0}:2 squared is {1:<4} Cubed {2}".format(i, i**2, i**3)) for i in range(1,10,2): print("{0}:2 squared is {1:<4} Cubed {2}".format(i, i**2, i**3))
(12) (13) name = input("name:") age = int(input("age:")) if age>=18: print("welcome " + name) else: print ("Come back in {0} years".format(18-age)) name = input("name:") if not name: print("please specify name") else: print("hello {}".format(name)) (14) age = int(input("age:")) if 0<=age<30: print("you are younger than 30") elif 30<=age<40: print(" You are between 30-40") else: print("older than 40") Τι παρατηρούμε για age = -10? Διορθώστε το σφάλμα (15) for season in ["Spring", "Summer", "Autumn", "Winter"]: print("season" + season)
Λύση age = int(input("age:")) if age<0: print("invalid age") elif 0<=age<30: print("you are younger than 30") elif 30<=age<40: print(" You are between 30-40") else: print("older than 40")
Άσκηση: Ο Δείκτης Μάζας Σώματος ΔΜΣ υπολογίζεται από τον τύπο ΔΜΣ = Β/Υ 2 για άτομα πάνω από 18 ετών. Να γράψετε πρόγραμμα όπου θα διαβάζει την ηλικία, το βάρος και το ύψος του ατόμου και θα υπολογίζει το ΔΜΣ και θα εμφανίζει κατάλληλο μήνυμα σύμφωνα με τον παρακάτω πίνακα. ΔΜΣ<18.5 18.5<=ΔMΣ<=25 25<=ΔΜΣ<30 30<=ΔΜΣ Αδύνατο άτομο Κανονικό άτομο Βαρύ άτομο Υπέρβαρο άτομο
import sys try: weight = float(input("give weight :")) height = float(input("give height :")) age = int(input("give age :")) if age<18: print("age must be greater than 18. Aborting") sys.exit() dms = round(weight / (height * height), 2) print (dms) except (Exception): print( "Invalid response")
(16) i = 1 while i<=10: print(i, end="\t") i+=1 Υλοποιήστε το ισοδύναμο με for Να γράψετε πρόγραμμα όπου θα ζητείται η ηλικία του χρήστη και θα γίνεται έλεγχος εγκυρότητας Άσκηση: Να αναπτυχθεί αλγόριθμος που θα υλοποιεί το παιχνίδι «Μάντεψε τον αριθμό» στον οποίο με δεδομένο έναν αριθμό κωδικό 1-100, διαβάζονται επαναληπτικά αριθμοί μέχρι να εντοπιστεί ο κωδικός. Σε κάθε προσπάθεια πρέπει να εμφανίζεται αν ο αριθμός που διαβάστηκε είναι μεγαλύτερος ή μικρότερος από τον κωδικό. Στο τέλος ο αλγόριθμος θα πρέπει να εμφανίζει το μήνυμα «Συγχαρητήρια, χρειάστηκες Ν προσπάθειες μέχρι να βρεθεί ο κωδικός», όπου Ν το πλήθος των προσπαθειών μέχρι να βρεθεί ο κωδικός. Χρησιμοποιήστε τη συνάρτηση import random target = random.randint(1,100)
(18) reply = input( Enter x and y, separated by spaces: ) pieces = reply.split( ) x = float(pieces[0]) y = float(pieces[1]) print (x+y) (19) def personal_details(): name, age = Nikos", 40 address = Mytilini" print("name: {}\nage: {}\naddress: {}".format(name, age, address)) personal_details() Να γράψετε πρόγραμμα όπου θα ζητείται το όνομα ενός αρχείου και θα επιστρέφει την κατάληξη του
Λύση filename = input("input the Filename: ") extension = filename.split(".") print ("The extension of the file is : " + extension[-1])
(20) #formal parameters def scale(val,factor): val = val*factor val = 5 factor = 2 #actual parameters print(val) scale(val,factor) print(val) (21) def scale(data, factor): for j in range(len(data)): data[j] = factor factor = 2 data = [1,2,3] print(data) scale(data,factor) print(data)
(24) (25) try: val = int(input( "Give me a number:" )) except (Exception): print( "Invalid response") try: filename = input("give Filename: ") fp = open(filename) print ("Content of the file: ". format (fp.name)) line = fp.readlines() print ("Read Line: {0}". format (line)) fp.close() except IOError as e: print("unable to open the file:", e)
(21) Να γραφτεί πρόγραμμα στην Python που θα δίνεται ένα string και να υπολογίζει το πλήθος των ψηφίων και το πλήθος των γραμμάτων s = input("input a string") d=l=0 for c in s: if c.isdigit(): d=d+1 elif c.isalpha(): l=l+1 else: pass print("letters", l) print("digits", d)
(Ι) Να γράψετε μια συνάρτηση που θα υπολόγίζει το άθροισμα τριών δοθέντων αριθμών εάν οι τιμές δεν είναι ίσες μεταξύ τους και το τριπλάσιο τους σε περίπτωση που είναι ίσες. (ΙΙ) Δίνεται μια σειρά από αριθμούς χωρισμένους από, πχ 4,5,6,2 από όπου θα κατασκευάζετα το παρακάτω σχήμα **** ***** ****** ** (ΙΙΙ) Να γράψετε μια συνάρτηση που θα ελέγχει αν μια διεύθυνση IP είναι έγκυρη. Για περισσότερες πληροφορίες σχετικά με την εγκυρότητα IPs: http://www.noip.com/support/knowledg ebase/what-is-a-valid-ip-address/ (ΙV) Να γράψετε μια συνάρτηση που θα δέχεται μια φράση και θα την αντιστρέφει