Εργαστήριο 1 στην Python
Θέματα που εξετάζονται στο εργαστήριο: συγγραφή και εκτέλεση απλών προγραμμάτων σε Python, ranges, δομή επανάληψης, δομή επιλογής, βασικές δομές δεδομένων (lists, tuples, dictionaries, sets), λεκτικά (μήκος λεκτικού, αντιστροφή λεκτικού, λήψη τμήματος λεκτικού με slice), αμυντικός προγραμματισμός, import και χρήση βιβλιοθηκών, ChatGPT prompts για παραγωγή κώδικα Python, χρήση του REPL (Read Evaluate Print Loop) της Python.
Εξάσκηση (εκφωνήσεις και λύσεις ασκήσεων)
Άσκηση E1A1 - Γράψτε πρόγραμμα που να υπολογίζει τα 10 πρώτα ψηφία του αποτελέσματος της πράξης \(\sqrt{\frac{2^{101}}{\pi^{53}+11^7}}\)
Λύση άσκησης Ε1Α1
1_1_sol.py |
---|
| import math
x = math.sqrt(2**101 / (math.pi**53 + 11**7))
# εμφάνιση πλήρους αριθμητικού αποτελέσματος
print(x)
# εμφάνιση 10 πρώτων ψηφίων
s = str(x)
s = s.replace(".", "")
print(s[:10])
|
Παράδειγμα εκτέλεσης:
$ python 1_1_sol.py
106.5474731672522
1065474731
Άσκηση E1A2 - Γράψτε πρόγραμμα που να εμφανίζει για τη συμβολοσειρά "How I want a drink alcoholic of course after the heavy lectures involving quantum mechanics" το πλήθος των χαρακτήρων κάθε λέξης. Παρατήρηση: η μέθοδος split() σε μια συμβολοσειρά επιστρέφει μια λίστα με τις λέξεις της.
Λύση άσκησης Ε1Α2
1_2_sol.py |
---|
| txt = "How I want a drink alcoholic of course after the heavy lectures involving quantum mechanics"
for w in txt.split():
print(len(w), sep="", end="")
|
Παράδειγμα εκτέλεσης:
$ python 1_2_sol.py
314159265358979
Άσκηση E1A3 - Γράψτε πρόγραμμα που να υπολογίζει το άθροισμα \(1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \ldots\) όπου ο χρήστης θα δίνει το πλήθος των όρων του αθροίσματος. Διασφαλίστε με αμυντικό προγραμματισμό ότι η τιμή που δίνει ο χρήστης είναι μια μη αρνητική ακέραια τιμή, αλλιώς να ζητείται επανεισαγωγή της τιμής.
Λύση άσκησης Ε1Α3
1_3_sol.py |
---|
| while True:
print("Εισάγετε έναν μη αρνητικό ακέραιο αριθμό: ", end="")
n = input()
if n.isdigit():
n = int(n)
if n >= 0:
break
print("Λάθος τιμή, προσπαθήστε ξανά!")
sum_ = 0.0
for i in range(n):
sum_ += 1 / 2**i
print(f"Οι {n} πρώτοι όροι έχουν άθροισμα {sum_:.7}")
|
Παράδειγμα εκτέλεσης:
$ python 1_3_sol.py
Εισάγετε έναν μη αρνητικό ακέραιο αριθμό: -1
Λάθος τιμή, προσπαθήστε ξανά!
Εισάγετε έναν μη αρνητικό ακέραιο αριθμό: α
Λάθος τιμή, προσπαθήστε ξανά!
Εισάγετε έναν μη αρνητικό ακέραιο αριθμό: 5
Οι 5 πρώτοι όροι έχουν άθροισμα 1.9375
Άσκηση E1A4 - Δώστε την εντολή import this
στο REPL (Read Evaluate Print Loop) του IDLE (Integrated Decelopmentv and Learning Environment) της Python και αντιγράψτε σε ένα λεκτικό το κείμενο που επιστρέφεται. Γράψτε πρόγραμμα που να εμφανίζει το πλήθος παρατηρήσεων των χαρακτήρων Α έως και Z, χωρίς διάκριση πεζών και κεφαλαίων, στο παραπάνω κείμενο.
Λύση άσκησης Ε1Α4 (α' τρόπος)
1_4_sol.py |
---|
| txt = """
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!"""
freq_dict = {}
for c in txt:
if c.isalpha():
c = c.upper()
freq_dict[c] = freq_dict.get(c, 0) + 1
for c in sorted(freq_dict.keys()):
print(f"Χαρακτήρας {c} εμφανίσεις {freq_dict[c]}")
|
Παράδειγμα εκτέλεσης:
$ python 1_4_sol.py
Χαρακτήρας A εμφανίσεις 53
Χαρακτήρας B εμφανίσεις 21
Χαρακτήρας C εμφανίσεις 17
Χαρακτήρας D εμφανίσεις 17
Χαρακτήρας E εμφανίσεις 92
Χαρακτήρας F εμφανίσεις 12
Χαρακτήρας G εμφανίσεις 11
Χαρακτήρας H εμφανίσεις 31
Χαρακτήρας I εμφανίσεις 53
Χαρακτήρας K εμφανίσεις 2
Χαρακτήρας L εμφανίσεις 33
Χαρακτήρας M εμφανίσεις 16
Χαρακτήρας N εμφανίσεις 42
Χαρακτήρας O εμφανίσεις 43
Χαρακτήρας P εμφανίσεις 22
Χαρακτήρας R εμφανίσεις 33
Χαρακτήρας S εμφανίσεις 46
Χαρακτήρας T εμφανίσεις 79
Χαρακτήρας U εμφανίσεις 21
Χαρακτήρας V εμφανίσεις 5
Χαρακτήρας W εμφανίσεις 4
Χαρακτήρας X εμφανίσεις 6
Χαρακτήρας Y εμφανίσεις 17
Χαρακτήρας Z εμφανίσεις 1
Λύση άσκησης Ε1Α4 (β' τρόπος)
1_4_sol_alt.py |
---|
| import string
txt = """
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!"""
for c in string.ascii_lowercase:
total = txt.count(c) + txt.count(c.upper())
print(f"Χαρακτήρας {c} εμφανίσεις {total}")
|
Παράδειγμα εκτέλεσης:
$ python 1_4_sol_alt.py
Χαρακτήρας a εμφανίσεις 53
Χαρακτήρας b εμφανίσεις 21
Χαρακτήρας c εμφανίσεις 17
Χαρακτήρας d εμφανίσεις 17
Χαρακτήρας e εμφανίσεις 92
Χαρακτήρας f εμφανίσεις 12
Χαρακτήρας g εμφανίσεις 11
Χαρακτήρας h εμφανίσεις 31
Χαρακτήρας i εμφανίσεις 53
Χαρακτήρας j εμφανίσεις 0
Χαρακτήρας k εμφανίσεις 2
Χαρακτήρας l εμφανίσεις 33
Χαρακτήρας m εμφανίσεις 16
Χαρακτήρας n εμφανίσεις 42
Χαρακτήρας o εμφανίσεις 43
Χαρακτήρας p εμφανίσεις 22
Χαρακτήρας q εμφανίσεις 0
Χαρακτήρας r εμφανίσεις 33
Χαρακτήρας s εμφανίσεις 46
Χαρακτήρας t εμφανίσεις 79
Χαρακτήρας u εμφανίσεις 21
Χαρακτήρας v εμφανίσεις 5
Χαρακτήρας w εμφανίσεις 4
Χαρακτήρας x εμφανίσεις 6
Χαρακτήρας y εμφανίσεις 17
Χαρακτήρας z εμφανίσεις 1
Επιπλέον εξάσκηση
Άσκηση E1A5 - Γράψτε πρόγραμμα που να δέχεται ένα κείμενο από τον χρήστη και να επιστρέφει το ίδιο κείμενο χωρίς κενά και ανεστραμμένο. Αναζητήστε λύση με "prompting", χρησιμοποιώντας το ChatGPT ή το Google Gemini ή το Microsoft Copilot ή κάποιο άλλο εναλλακτικό μοντέλο γλωσσικής επεξεργασίας φυσικής γλώσσας.
Λύση άσκησης Ε1Α5
1_5_sol.py |
---|
| user_input = input("Παρακαλώ εισάγετε ένα κείμενο: ")
text_no_spaces = user_input.replace(" ", "")
reversed_text = text_no_spaces[::-1]
print("Το ανεστραμμένο κείμενο χωρίς κενά είναι:", reversed_text)
|
Παράδειγμα εκτέλεσης:
$ python 1_5_sol.py
Παρακαλώ εισάγετε ένα κείμενο: Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Το ανεστραμμένο κείμενο χωρίς κενά είναι: νώινωνιοκιπεληΤιακςήκιροφορηλΠαμήμΤ
Άσκηση E1A6 - Αν προστεθεί ο ακέραιος αριθμός 28706162 στο τέλος του κειμένου "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ", το νέο κείμενο "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ28706162" θα έχει hash τιμή (με τη συνάρτηση κατακερματισμού SHA256) με τα 8 τελευταία ψηφία μηδέν. Αυτό φαίνεται στον ακόλουθο κώδικα:
1_6.py |
---|
| import hashlib
text = "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ"
hash1 = hashlib.sha256(
text.encode()
).hexdigest() # Καθορίζουμε την αρχική hash τιμή του κειμένου
print(hash1) # 05f4cd1984d18f7200e31891c2b66ba6752568a691ce077da8824c9e0ef05fe3
text = "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ28706162"
hash2 = hashlib.sha256(
text.encode()
).hexdigest() # Hash τιμή του κειμένου με την προσθήκη του αριθμού 28706162
print(hash2) # 5c4b9aaed7f48d66a643fc05665f868454c1517e9f5f108b0478305c00000000
|
Παράδειγμα εκτέλεσης:
$ python 1_6.py
05f4cd1984d18f7200e31891c2b66ba6752568a691ce077da8824c9e0ef05fe3
5c4b9aaed7f48d66a643fc05665f868454c1517e9f5f108b0478305c00000000
Ποιος θα είναι ο αριθμός που πρέπει να προστεθεί στο τέλος του κειμένου "ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ" για να έχει το νέο κείμενο hash τιμή με τα 7 τελευταία ψηφία μηδέν;
Ζητήστε από το ChatGPT ή άλλο να εξηγήσει αναλυτικά τον ρόλο της εντολής: hashlib.sha256(text.encode()).hexdigest()
.
Λύση άσκησης Ε1Α6
1_6_sol.py |
---|
| import hashlib
text = "ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ"
d = 7 # Ο αριθμός των μηδενικών που πρέπει να έχει η hash τιμή στο τέλος
# Επαναληπτική διαδικασία για τον έλεγχο ακεραίων μέχρι να βρεθεί ο επιθυμητός αριθμός
x = 0
while True:
x += 1
new_text = text + str(x)
new_hash = hashlib.sha256(new_text.encode()).hexdigest()
if new_hash[-d:] == "0" * d:
break
print("Ο επιθυμητός ακέραιος αριθμός είναι:", x)
print("Το νέο κείμενο είναι:", new_text)
print("Η hash τιμή του νέου κειμένου είναι:", new_hash)
|
Παράδειγμα εκτέλεσης:
$ python 1_6_sol.py
Ο επιθυμητός ακέραιος αριθμός είναι: 113357317
Το νέο κείμενο είναι: ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ113357317
Η hash τιμή του νέου κειμένου είναι: 392ea340cf29585a1043a190967e19815d39b7ff58486d8ba1ff9d0e00000000