Η Μέρα της Εβδομάδας. Πες Μου Πότε

Σχετικά έγγραφα
Μάντεψε τον Αριθμό. Έχω Ένα Μυστικό. Το Βρήκα;

Τι είναι υποπρόγραμμα; Τμήμα προγράμματος το οποίο επιτελεί ένα αυτόνομο υπολογιστικό έργο (γράφεται χωριστά από το υπόλοιπο πρόγραμμα)

Τυχαίοι αριθμοί ρίξε μια «ζαριά»

Το Παιχνίδι της Αφαίρεσης

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Σημειωματάριο Τετάρτης 11 Οκτ. 2017

ΘΕΜΑ 1ο. Μονάδες 10. Β. ίνεται το παρακάτω τμήμα αλγορίθμου: Όσο Ι < 10 επανάλαβε Εμφάνισε Ι Ι Ι + 3 Τέλος_επανάληψης ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

Επικοινωνία:

Το Παιχνίδι της Αφαίρεσης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Τελικό επαναληπτικό διαγώνισμα Επιμέλεια: Δρεμούσης Παντελής

ΘΕΜΑ 1ο. Μονάδες 10. Β. ίνεται το παρακάτω τμήμα αλγορίθμου: Όσο Ι < 10 επανάλαβε Εμφάνισε Ι Ι Ι + 3 Τέλος_επανάληψης ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

for for for for( . */

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Mπαρμπούτι. Φύλλο Εργασίας. Τυχαιότητα

ΤΡΙΩΡΗ ΓΡΑΠΤΗ ΔΟΚΙΜΑΣΙΑ

ΑΣΚΗΣΕΙΣ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Mπαρμπούτι. Ενδεικτικές Απαντήσεις Φύλλου Εργασίας. Τυχαιότητα

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Διαδικασίες και συναρτήσεις. 22 Νοε 2008 Ανάπτυξη εφαρμογών/ Υποπρογράμματα 1

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Δομές ελέγχου ροής προγράμματος

Λύσεις για τις ασκήσεις του lab5

ΚΕΦΑΛΑΙΟ 1ο 3ο. ΚΕΦΑΛΑΙΟ 5ο 6ο. ΚΕΦΑΛΑΙΟ 7ο. Δομημένος Προγραμματισμός - Γενικές Ασκήσεις Επανάληψης

Μάντεψε τον Αριθμό Φύλλο Εργασίας 2

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ. ii) Πόσες φορές θα εκτελεστεί η εντολή ΔΙΑΒΑΣΕ Α[μ,λ] στον αλγόριθμο της προηγούμενης ερώτησης; α) 35 β) 12 γ) 20

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

Πληροφορική 2. Αλγόριθμοι

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Μεθοδολογία προβλημάτων με Δομή Επανάληψης

Εισαγωγή στον Προγραμματισμό

Εντολές ελέγχου ροής if, for, while, do-while

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

Μπαρμπούτι 2. Τα Κόκκαλα Στον Μάστορα

1. Δεν μπορεί να γίνει κλήση μίας διαδικασίας μέσα από μία συνάρτηση.

Διαδικασιακός Προγραμματισμός

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

Κεφάλαιο 10 ο Υποπρογράµµατα

Να μυηθούν οι μαθητές στην υλοποίηση του τμηματικού προγραμματισμού

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ 23/04/2012. Α. Να απαντήσετε με Σ ή Λ στις παρακάτω προτάσεις:

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

3. Γράψτε μία εντολή που να εμφανίζει π.χ. «Πόσα είναι τα κορίτσια του;» και μία που να εμφανίζει: «Τα κορίτσια του Τζειμς Μποντ είναι 4»

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

ΘΕΜΑ Α. Α2. Να αναφέρετε από τι εξαρτάται η επιλογή του καλύτερου αλγορίθμου ταξινόμησης. Μονάδες 4. Σελίδα 1 από 8

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 13/12/07

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ. Πως γίνεται ο ορισμός μιας διαδικασίας; Να δοθούν σχετικά παραδείγματα. ΑΡΧΗ Εντολές ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

ΕΚΦΩΝΗΣΕΙΣ ΘΕΜΑ Α. β. Οι πληροφορίες είναι δεδομένα τα οποία δεν έχουν υποστεί επεξεργασία.

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ 2019 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΘΕΜΑ Α

Επαναληπτική δοκιμασία στην Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Τεχνολογικής Κατεύθυνσης Μάιος 2013

Φάσμα προπαρασκευή για Α.Ε.Ι. & Τ.Ε.Ι.

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ Γ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ

Γ.Κονδύλη 1 & Όθωνος-Μαρούσι Τηλ. Κέντρο: ,

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Τύποι δεδομένων, τελεστές, μεταβλητές

ΛΥΜΕΝΕΣ ΑΣΚΗΣΕΙΣ - ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 3/12/2018, 23:59

Γ ΤΑΞΗ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ ΚΑΙ ΕΠΑΛ (ΟΜΑΔΑ Β

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΓΛΩΣΣΟΜΑΘΕΙΑ

Πληρουορική Γ Γσμμασίοσ

Α4. Δίδεται ο παρακάτω αλγόριθμος

Ασκήσεις στα υποπρογράμματα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Α2. Να γράψετε στο τετράδιο απαντήσεών σας το κατάλληλο τμήμα κώδικα, κάνοντας τις απαραίτητες αλλαγές σύμφωνα με την εκάστοτε εκφώνηση:

Συναρτήσεις. Εισαγωγή

Θέματα Προγραμματισμού Η/Υ

Προγραμματισμός I (Θ)

Ακρότατα πίνακα, χωρίς min, max, μόνο με pos

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΤΑΞΗ / ΤΜΗΜΑ : Γ ΛΥΚΕΙΟΥ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΑΠΡΙΛΙΟΣ 2019 ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ : 7 (ΕΠΤΑ)

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Μάντεψε τον Αριθμό. Φύλλο Εργασίας. Μάντεψε!

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ

ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

CSD Univ. of Crete Φθινόπωρο Άσκηση 1 Εκφώνηση

Α2. Να γράψετε στο τετράδιο σας τον αριθμό 1-4 κάθε πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

Εισαγωγή στην πληροφορική

Θέματα ΑΕΠΠ Πανελλήνιες Εξετάσεις 2008

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Ημερομηνία: 1/03/15 Διάρκεια διαγωνίσματος: 180 Εξεταζόμενο μάθημα: Προγραμματισμός (Δομή Επανάληψης) Υπεύθυνος καθηγητής: Παπαδόπουλος Πέτρος

Κεφάλαιο 10. Ερωτήσεις ανάπτυξης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Γ ΛΥΚΕΙΟΥ ΗΜΕΡΟΜΗΝΙΑ: 6/04/2014

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Μάντεψε τον Αριθμό. Ενδεικτικές Απαντήσεις Φύλλου Εργασίας. Μάντεψε!

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Λύσεις Θεμάτων Επαναληπτικών Εξετάσεων Ενιαίου Λυκείου 2007

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

Προγραμματισμός Ι (ΗΥ120)

Transcript:

Η Μέρα της Εβδομάδας Στο κεφάλαιο αυτό θ αναπτύξουμε ένα πρόγραμμα για να υπολογίζουμε σε ποια ημέρα της εβδομάδας αντιστοιχεί μια συγκεκριμένη ημερομηνία. Θα δανειστούμε τη μέθοδο υπολογισμού από τον Gauss. Στην πορεία θα έχουμε την ευκαιρία να εξασκηθούμε σε όλα τα προγραμματιστικά εργαλεία που έχουμε συναντήσει μέχρι τώρα. Έννοιες: δομή επιλογής, δομή επανάληψης, υποπρογράμματα, πλειάδες 4 29 Οκτωβρίου 2015 22:07 Η επίλυση ημερολογιακών και αστρονομικών προβλημάτων ήταν ένα από τα πρώτα πεδία εφαρμογής υπολογιστικών μεθόδων. Η μέτρηση του χρόνου και η πρόβλεψη των κινήσεων των ουράνιων σωμάτων ήταν προβλήματα εξαιρετικής σημασίας καθ όλη την ιστορία της ανθρωπότητας, με πρακτικές εφαρμογές αλλά κι επιπτώσεις πολιτικές, επιστημονικές και φιλοσοφικές. Η ύπαρξη του μηχανισμού των Αντικυθήρων δείχνει από πόσο νωρίς επιδιώχθηκε η αυτοματοποίηση τέτοιου είδους υπολογισμών. Το να υπολογίσει κανείς την ημέρα της εβδομάδας για μια συγκεκριμένη ημερομηνία είναι ένα καλά μελετημένο πρόβλημα. Για την επίλυση του προβλήματος υπάρχουν πολλές προσεγγίσεις. Μερικές βασίζονται σε μνημονικούς κανόνες, με αποτέλεσμα ορισμένοι άνθρωποι να είναι σε θέση να λύσουν το πρόβλημα μέσα σε μερικά δευτερόλεπτα, κάνοντας υπολογισμούς μόνο με το μυαλό τους. Εμείς Carl Friedrich Gauss (1777-1855) θα χρησιμοποιήσουμε μια μέθοδο του Gauss, η οποία είναι απλούστατη στην υλοποίησή της, αν και ο τρόπος με τον οποίο λειτουργεί δεν είναι προφανής. Πες Μου Πότε Ας ξεκινήσουμε ρωτώντας το χρήστη ποια είναι η ημερομηνία για την οποία θα ήθελε να μάθει την αντίστοιχη ημέρα της εβδομάδας. 1 # είσοδος ημερομηνίας από το χρήστη 2 print("έτος: ", end="") 3 year = int(input()) 4 print("mήνας: ", end="") 5 month = int(input()) 6 print("ημέρα: ", end="") 7 day = int(input()) Ο ιδιοφυής μαθηματικός που ασχολήθηκε με αναρίθμητα προβλήματα σε πολλά διαφορετικά πεδία. 1

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 2 Εναλλακτικά: # είσοδος ημερομηνίας από το χρήστη year = int(input("έτος: ")) month = int(input("mήνας: ")) day = int(input("ημέρα: ")) Τί Μέρα Έχουμε Σήμερα; Και τώρα που έχουμε την ημερομηνία πώς θα υπολογίσουμε το ζητούμενο; Ποιά είναι η μέθοδος του Gauss; Οι γραμμές που ακολουθούν είναι μια υλοποίηση της μεθόδου του Gauss. Πρόκειται για εντολές που υπολογίζουν την τιμή ορισμένων αριθμητικών παραστάσεων, για να μας δώσουν τελικά το αποτέλεσμα που χρειαζόμαστε: έναν ακέραιο από το 0 μέχρι και το 6, που αντιστοιχεί στις ημέρες από την Κυριακή μέχρι και το Σάββατο. Ο τρόπος που λειτουργεί η μέθοδος δεν είναι προφανής, αλλά εδώ μας ενδιαφέρει να τη χρησιμοποιήσουμε, όχι να την αναλύσουμε. 8 # υπολογισμός ημέρας με την μέθοδο του Gauss 9 # προσαρμογή μήνα και έτους 2 μήνες προς τα πίσω 10 if month > 2: 11 month = month - 2 12 else: 13 month = month + 10 14 year = year - 1 15 # όρος για δίσεκτα έτη 16 leap = 5*(year%4) + 4*(year%100) + 6*(year%400) 17 # υπολογισμός ημέρας της εβδομάδας 18 weekday = (day + leap + int(2.6 * month - 0.2)) % 7 Μπορείτε να ελέγξετε αν οι εντολές λειτουργούν σωστά κάνοντας μια δοκιμή με την σημερινή ημερομηνία. Δεν θα πρέπει βέβαια να παραλείψουμε την εμφάνιση του αποτελέσματος στην οθόνη. 19 # εμφάνιση ημέρας της εβδομάδας (0:Κυριακή - 6:Σάββατο) 20 print("ημέρα της εβδομάδας:", weekday) src/weekday.1.py Κλεισμένη στο Κουτάκι Αυτή η μέθοδος είναι εντυπωσιακή: υπολογίζει το αποτέλεσμα με λίγες πράξεις, αν και το πρόβλημα είναι περίπλοκο. Ωστόσο με ενοχλεί να βλέπω μέσα στο πρόγραμμα αυτόν τον ακατάληπτο κώδικα. Μπορούμε να απομονώσουμε τον ομολογουμένως δυσνόητο υπολογισμό της ημέρας της εβδομάδας μέσα σ ένα υποπρόγραμμα. Αυτό θα δέχεται μια τριάδα παραμέτρων (ημέρα, μήνας, έτος) που αντιστοιχούν σε μια ημερομηνία και θα επιστρέφει έναν ακέραιο από το 0 μέχρι και το 6, που αντιστοιχεί σε μια ημέρα της εβδομάδας.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 3 1 def computeweekday(day, month, year): 2 """ Υπολογίζει με την μέθοδο του Gauss 3 την ημέρα της εβδομάδας στην οποία αντιστοιχεί 4 μια συγκεκριμένη ημερομηνία. 5 day, month, year: ορίζει την ημερομηνία 6 """ 7 # προσαρμογή μήνα και έτους 2 μήνες προς τα πίσω 8 if month > 2: 9 month = month - 2 10 else: 11 month = month + 10 12 year = year - 1 13 # όρος για δίσεκτα έτη 14 leap = 5*(year%4) + 4*(year%100) + 6*(year%400) 15 # υπολογισμός κι επιστροφή ημέρας της εβδομάδας 16 return (day + leap + int(2.6 * month - 0.2)) % 7 Ο κώδικας της μεθόδου δεν έχει αλλάξει, αλλά πλέον είναι «κλεισμένος» μέσα στο υποπρόγραμμα. Όποιος θέλει να το χρησιμοποιήσει δεν χρειάζεται να καταλαβαίνει πως λειτουργεί. Δεν χρειάζεται καν να γνωρίζει με ποια μέθοδο υπολογίζεται το αποτέλεσμα. Στο κύριο πρόγραμμα, απλά καλούμε την συνάρτηση, δίνοντας ως παραμέτρους τις τιμές που διαβάσαμε από το χρήστη. 17 # είσοδος ημερομηνίας από το χρήστη 18 print("έτος: ", end="") 19 year = int(input()) 20 print("mήνας: ", end="") 21 month = int(input()) 22 print("ημέρα: ", end="") 23 day = int(input()) 24 # κλήση υποπρογράμματος για υπολογισμό ημέρας 25 weekday = computeweekday(day, month, year) src/weekday.2.py Στις 32 Του Μηνός Ο χρήστης μπορεί να δώσει αυθαίρετους αριθμούς για το έτος, τον μήνα και την ημέρα. Δεν χρειάζεται κάποιος έλεγχος; Είναι απαραίτητο η τιμή που θα δοθεί για το μήνα να είναι ανάμεσα στο 1 και το 12. Επίσης, είναι απαραίτητο η τιμή που θα δοθεί για την ημέρα να είναι ανάμεσα στο 1 και το πλήθος των ημερών του μήνα. Για το έτος υπάρχει περιθώριο ελαστικότητας, αλλά και πάλι θα ήταν καλό να περιορίσουμε την τιμή σε λογικά όρια. Ας εξετάσουμε αρχικά πως θα μπορούσαμε να ελέγξουμε ότι η τιμή που δίνεται για τον μήνα είναι έγκυρη. Πιθανώς το πρώτο πράγμα που θα έγραφε κανείς να ήταν το εξής:

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 4 print("mήνας: ", end="") month = int(input()) if month < 1 or month > 12: # μήνυμα λάθους print("δώστε τιμή από 1 μέχρι 12") Όμως αυτό δεν αρκεί γιατί, σε περίπτωση μη-έγκυρης τιμής, ο χρήστης θα πρέπει και πάλι να πληκτρολογήσει μια τιμή για τον μήνα, η οποία θα πρέπει και πάλι να ελεγχθεί και, πιθανώς, να μην είναι ούτε αυτή την φορά έγκυρη, κ.ο.κ. Με άλλα λόγια, η ανάγνωση τιμής και ο έλεγχός της θα πρέπει να επαναλαμβάνονται, μέχρι να διαβαστεί έγκυρη τιμή. Θα χρειαστούμε λοιπόν μια δομή επανάληψης. # επανάληψη, όσο η τιμή είναι εκτός ορίων while True: print("mήνας: ", end="") month = int(input()) if month < 1 or month > 12: # μήνυμα λάθους print("δώστε τιμή από 1 μέχρι 12") else: break Εδώ ο χρήστης πρακτικά εγκλωβίζεται σ έναν κύκλο. Η ανάγνωση τιμής (μαζί με το σχετικό μήνυμα λάθους) επαναλαμβάνεται μέχρι ο χρήστης να παρέχει μια αποδεκτή τιμή. Μια εναλλακτική προσέγγιση της ίδιας ιδέας είναι η εξής: 20 print("mήνας: ", end="") 21 month = int(input()) 22 # επανάληψη, όσο η τιμή είναι εκτός ορίων 23 while month < 1 or month > 12: 24 # μήνυμα λάθους 25 print("δώστε τιμή από 1 μέχρι 12") 26 print("mήνας: ", end="") 27 month = int(input()) src/weekday.3.py Και σε πολλά άλλα προγράμματα θα χρειαστεί να διαβάσουμε από το χρήστη τιμές, εξασφαλίζοντας ότι οι τιμές αυτές είναι έγκυρες, δηλαδή ικανοποιούν κάποιους περιορισμούς. Μια Απ Τα Ίδια; Μου φαίνεται πως αυτό ακριβώς που κάναμε για το μήνα θα πρέπει να το κάνουμε για το έτος και για την ημέρα (αλλά με διαφορετικά όρια). Πάλι τα ίδια θα γράφουμε; Και για τις τρεις τιμές (έτος, μήνας, ημέρα) έχουμε το ίδιο ακριβώς πρόβλημα: θέλουμε να εμφανίζεται στο χρήστη μια προτροπή και στη συνέχεια να διαβάζεται από το χρήστη μια ακέραια τιμή που θα πρέπει να βρίσκεται εντός συγκεκριμένων ορίων.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 5 Θα λύσουμε αυτό το πρόβλημα με γενικό τρόπο, κατασκευάζοντας ένα υποπρόγραμμα που δέχεται σαν παραμέτρους την προτροπή και τα όρια κι επιστρέφει την τιμή που διαβάστηκε από το χρήστη. Ουσιαστικά θα γενικεύσουμε τον κώδικα που αναπτύξαμε λίγο πριν για τον έλεγχο της τιμής του μήνα. 17 def readint(prompt,lower,upper): 18 """ Εμφανίζει μια προτροπή και μετά διαβάζει 19 από το χρήστη κι επιστρέφει έναν ακέραιο αριθμό, 20 εξασφαλίζοντας ότι βρίσκεται εντός ορίων. 21 prompt: η προτροπή που εμφανίζεται στο χρήστη 22 lower, upper: τα όρια 23 """ 24 # εμφάνιση προτροπής και ανάγνωση τιμής 25 print(prompt, end="") 26 num = int(input()) 27 # επανάληψη, όσο η τιμή είναι εκτός ορίων 28 while num < lower or num > upper: 29 # μήνυμα λάθους 30 print("δώστε τιμή από",lower,"μέχρι",upper) 31 # εμφάνιση προτροπής και ανάγνωση τιμής 32 print(prompt, end="") 33 num = int(input()) 34 # η έγκυρη τιμή επιστρέφεται 35 return num Θα χρησιμοποιήσουμε αυτό το υποπρόγραμμα τρεις φορές, καλώντας το κάθε φορά με διαφορετικές παραμέτρους, για να εισάγουμε τιμές για το έτος, το μήνα και την ημέρα. 36 # είσοδος ημερομηνίας από το χρήστη 37 year = readint("έτος: ", 1923, 2999) 38 month = readint("mήνας: ", 1, 12) 39 day = readint("ημέρα: ", 1, 31) 40 # κλήση υποπρογράμματος για υπολογισμό ημέρας 41 weekday = computeweekday(day, month, year) src/weekday.4.py Το 1923 είναι η χρονιά που υιοθετήθηκε η χρήση του Γρηγοριανού ημερολογίου στην Ελλάδα. Το άνω όριο είναι αυθαίρετο. Αναπτύξαμε αυτό το υποπρόγραμμα γιατί ήταν απαραίτητο σε τρία διαφορετικά σημεία του προγράμματός μας να διαβάζουμε έναν ακέραιο αριθμό εντός συγκεκριμένων ορίων. Αντί να αντιγράψουμε τις ίδιες εντολές σε τρία σημεία, τις τοποθετήσαμε μέσα στο υποπρόγραμμα για να τις καλούμε όποτε τις χρειαζόμαστε. Όμως το υποπρόγραμμα που αναπτύξαμε δεν λειτουργεί μόνο για έτη, μήνες και ημέρες, αλλά μπορεί να χρησιμοποιηθεί και σε οποιαδήποτε άλλη περίπτωση θέλουμε να διαβάσουμε από το χρήστη έναν ακέραιο αριθμό εντός ορίων. Με άλλα λόγια, το υποπρόγραμμα λύνει το πρόβλημα με γενικό τρόπο και είναι επαναχρησιμοποιήσιμο.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 6 Πόσες Έχει Ο Μήνας; Δεν έχουν όμως όλοι οι μήνες 31 ημέρες. Αφού τον κάνουμε τον έλεγχο, ας τον κάνουμε σωστά. Στο σημείο αυτό χρειάζεται να υπολογίσουμε το πλήθος των ημερών ενός μήνα. Όπως φαντάζεστε, θα λύσουμε αυτό το υποπρόβλημα κατασκευάζοντας το αντίστοιχο υποπρόγραμμα, ένα ακόμα εξάρτημα που κάνει μια συγκεκριμένη δουλειά: δέχεται σαν παράμετρο το μήνα και το έτος κι επιστρέφει τον αριθμό των ημερών του μήνα. Οι κανόνες που καθορίζουν πόσες ημέρες έχει ο κάθε μήνας είναι οι εξής: πριν τον Αύγουστο, οι άρτιοι μήνες έχουν 30 ημέρες και οι περιττοί έχουν 31, ενώ από τον Αύγουστο και μετά ισχύει το αντίστροφο. Εξαίρεση αποτελεί ο Φλεβάρης που έχει 28 ημέρες, εκτός κι αν το έτος είναι δίσεκτο, οπότε έχει 29. Από τα παραπάνω φαίνεται πως τίθεται ένα ακόμα μικρότερο πρόβλημα: χρειάζεται να γνωρίζουμε αν ένα έτος είναι δίσεκτο ή όχι. Ας ξεκινήσουμε λοιπόν με την επίλυση αυτού του υποπροβλήματος, κατασκευάζοντας το αντίστοιχο υποπρόγραμμα, το οποίο θα δέχεται σαν παράμετρο ένα έτος και θα αποφαίνεται αν είναι δίσεκτο ή όχι. Εξ ορισμού, δίσεκτα είναι τα έτη που διαιρούνται με το 4, αλλά όχι με το 100, καθώς και τα έτη που διαιρούνται με το 400. def isleap(year): """ Επιστρέφει την τιμή True αν το έτος year είναι δίσεκτο, αλλιώς επιστρέφει False. """ if (year % 4 == 0 and year % 100 > 0) or year % 400 == 0: return True else: return False Στην πραγματικότητα, η δομή επιλογής δεν είναι απαραίτητη. Ορθότερη προσέγγιση είναι η εξής: 36 def isleap(year): 37 """ Επιστρέφει την τιμή True αν το έτος year 38 είναι δίσεκτο, αλλιώς επιστρέφει False. 39 """ 40 return ((year % 4 == 0 and year % 100 > 0) or 41 year % 400 == 0) Τώρα μπορούμε να υλοποιήσουμε το υποπρόγραμμα που υπολογίζει τον αριθμό των ημερών ενός μήνα. Το έτος είναι απαραίτητο σαν παράμετρος στο υποπρόγραμμα γιατί ο μήνας μπορεί να είναι ο Φλεβάρης, οπότε το έτος επηρρεάζει τον αριθμό των ημερών. Η τιμή μιας συνθήκης είναι είτε αληθής (True), είτε ψευδής (False). Εδώ λοιπόν επιστρέφεται απευθείας η τιμή της συνθήκης που ελέγχει αν το έτος year είναι δίσεκτο.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 7 42 def daysofmonth(m,y): 43 """ Επιστρέφει το πλήθος των ημερών ενός μήνα. 44 m: ο αριθμός του μήνα (1-12) 45 y: ο αριθμός του έτους (απαραίτητο όταν m=2) 46 """ 47 if m == 2: 48 # Φεβρουάριος 49 if isleap(y): 50 return 29 51 else: 52 return 28 53 elif m <= 7: 54 # Ιανουάριος - Ιούλιος (πλην Φεβρουαρίου) 55 if m % 2 == 1: 56 return 31 57 else: 58 return 30 59 else: 60 # Αύγουστος - Δεκέμβριος 61 if m % 2 == 1: 62 return 30 63 else: 64 return 31 H ανάγνωση τιμής για την ημέρα μπορεί πλέον να γίνει καθορίζοντας σωστά το πλήθος των ημερών του μήνα. 65 # είσοδος ημερομηνίας από το χρήστη 66 year = readint("έτος: ", 1923, 2999) 67 month = readint("mήνας: ", 1, 12) 68 day = readint("ημέρα: ", 1, daysofmonth(month,year)) src/weekday.5.py Από τα παραπάνω βγαίνει στην επιφάνεια το μεγαλύτερο πλεονέκτημα που προκύπτει από τη χρήση υποπρογραμμάτων. Είμαστε αναγκασμένοι να αναλύουμε τα προβλήματα και να τ αντιμετωπίζουμε τμηματικά. Κάθε φορά εστιάζουμε την προσοχή μας σε μικρότερα κι απλούστερα κομμάτια του γενικού προβλήματος. Στη συνέχεια, συνθέτουμε τη λύση, συναρμολογώντας τα κομμάτια αυτά. Και Κάτι Ακόμα Δεν μου αρέσει που το πρόγραμμα εμφανίζει έναν αριθμό και πρέπει ο χρήστης να σκέφτεται την αντιστοιχία με τις ημέρες. Υπάρχουν αρκετοί τρόποι ν αντιστοιχίσουμε τους ακέραιους από το 0 μέχρι και το 6 με τις ημέρες από την Κυριακή μέχρι και το Σάββατο. Ένας από αυτούς είναι να τοποθετήσουμε τα ονόματα των ημερών της εβδομάδας μέσα σε μια πλειάδα. Η πλειάδα είναι μια λίστα τιμών που δεν μπορεί να τροποποιηθεί.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 8 # πλειάδα με τα ονόματα των ημερών daynames = ('Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ') Είναι η πρώτη φορά που ένα όνομα, το daynames, δεν αντιστοιχεί σε μια μεμονωμένη τιμή αλλά σε μια συλλογή τιμών, όπως είναι εδώ η πλειάδα με τα ονόματα των ημερών. Η σειρά των ημερών μέσα στην πλειάδα έχει σημασία γιατί κάθε θέση είναι αριθμημένη, με την αρίθμηση να ξεκινάει από το μηδέν. Μπορούμε λοιπόν να χρησιμοποιήσουμε την (ακέραια) ημέρα της εβδομάδας που έχουμε υπολογίσει για να έχουμε πρόσβαση στην αντίστοιχη θέση της πλειάδας που περιέχει το όνομα της ημέρας. 69 # πλειάδα με τα ονόματα των ημερών 70 daynames = ('Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ') 71 # κλήση υποπρογράμματος για υπολογισμό ημέρας 72 weekday = computeweekday(day, month, year) 73 # εμφάνιση ημέρας της εβδομάδας (0:Κυριακή - 6:Σάββατο) 74 print("ημέρα της εβδομάδας:", daynames[weekday]) src/weekday.6.py Το πρώτο στοιχείο της πλειάδας είναι το daynames[0], με τιμή 'Κυρ', το δεύτερο είναι το daynames[1], με τιμή 'Δευ', ενώ το τελευταίο είναι το daynames[6], με τιμή 'Σαβ'. Η αρίθμηση μπορεί να είναι κι αντίστροφη, με το πρώτο στοιχείο από το τέλος να είναι το daynames[-1], με τιμή 'Σαβ', κ.ο.κ. Πλήρες Τελικό Πρόγραμμα 1 def computeweekday(day, month, year): 2 """ Υπολογίζει με την μέθοδο του Gauss 3 την ημέρα της εβδομάδας στην οποία αντιστοιχεί 4 μια συγκεκριμένη ημερομηνία. 5 day, month, year: ορίζει την ημερομηνία 6 """ 7 # προσαρμογή μήνα και έτους 2 μήνες προς τα πίσω 8 if month > 2: 9 month = month - 2 10 else: 11 month = month + 10 12 year = year - 1 13 # όρος για δίσεκτα έτη 14 leap = 5*(year%4) + 4*(year%100) + 6*(year%400) 15 # υπολογισμός κι επιστροφή ημέρας της εβδομάδας 16 return (day + leap + int(2.6 * month - 0.2)) % 7 συνεχίζεται στην επόμενη σελίδα.

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 9 17 def readint(prompt,lower,upper): 18 """ Εμφανίζει μια προτροπή και μετά διαβάζει 19 από το χρήστη κι επιστρέφει έναν ακέραιο αριθμό, 20 εξασφαλίζοντας ότι βρίσκεται εντός ορίων. 21 prompt: η προτροπή που εμφανίζεται στο χρήστη 22 lower, upper: τα όρια 23 """ 24 # εμφάνιση προτροπής και ανάγνωση τιμής 25 print(prompt, end="") 26 num = int(input()) 27 # επανάληψη, όσο η τιμή είναι εκτός ορίων 28 while num < lower or num > upper: 29 # μήνυμα λάθους 30 print("δώστε τιμή από",lower,"μέχρι",upper) 31 # εμφάνιση προτροπής και ανάγνωση τιμής 32 print(prompt, end="") 33 num = int(input()) 34 # η έγκυρη τιμή επιστρέφεται 35 return num 36 def isleap(year): 37 """ Επιστρέφει την τιμή True αν το έτος year 38 είναι δίσεκτο, αλλιώς επιστρέφει False. 39 """ 40 return ((year % 4 == 0 and year % 100 > 0) or 41 year % 400 == 0) 42 def daysofmonth(m,y): 43 """ Επιστρέφει το πλήθος των ημερών ενός μήνα. 44 m: ο αριθμός του μήνα (1-12) 45 y: ο αριθμός του έτους (απαραίτητο όταν m=2) 46 """ 47 if m == 2: 48 # Φεβρουάριος 49 if isleap(y): 50 return 29 51 else: 52 return 28 53 elif m <= 7: 54 # Ιανουάριος - Ιούλιος (πλην Φεβρουαρίου) 55 if m % 2 == 1: 56 return 31 57 else: 58 return 30 59 else: 60 # Αύγουστος - Δεκέμβριος 61 if m % 2 == 1: 62 return 30 63 else: 64 return 31

Η ΜΕΡΑ ΤΗΣ ΕΒΔΟΜΑΔΑΣ 10 65 # είσοδος ημερομηνίας από το χρήστη 66 year = readint("έτος: ", 1923, 2999) 67 month = readint("mήνας: ", 1, 12) 68 day = readint("ημέρα: ", 1, daysofmonth(month,year)) 69 # κλήση υποπρογράμματος για υπολογισμό ημέρας 70 weekday = computeweekday(day, month, year) 71 # εμφάνιση ημέρας της εβδομάδας (0:Κυριακή - 6:Σάββατο) 72 print("ημέρα της εβδομάδας:", weekday) src/weekday.final.py Δομες Δεδομενων Οργανωμένες συλλογές τιμών όπως οι πλειάδες ονομάζονται δομές δεδομένων. Μια δομή δεδομένων δεν είναι ένα απλό σύνολο από τιμές, δεν αποτελεί μια απλή γενίκευση των μεταβλητών, αλλά είναι δομημένη με συγκεκριμένο τρόπο. Τα διαφορετικά είδη δομών δεδομένων διαφοροποιούνται κυρίως από τον τρόπο με τον οποίο τα δεδομένα αποθηκεύονται, ανακτώνται και συσχετίζονται μεταξύ τους.