Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α5.8 · Υπολογισμός ημέρας μίας δεδομένης ημερομηνίας

Εργαστήριο 3, Άσκηση 3 · Δυσκολία ★☆☆ · programming · Κεφάλαια: 5, 6

Ο ακόλουθος αλγόριθμος υπολογίζει την ημέρα που αντιστοιχεί σε μία δεδομένη ημερομηνία:

Έστω η ημερομηνία \(DD / MM / YYYY\) (δύο ψηφία για την μέρα DD - Day, δύο ψηφία για τον μήνα MM - Month, 4 ψηφία για τον χρόνο YYYY - Year).

Αν \(\text{MM} \leq 2\), τότε:

\[\begin{matrix} \text{NYYYY} = \text{YYYY} - 1 \\ \text{NMM} = 0 \\ \end{matrix}\]

Αν \(\text{MM} > 2\), τότε:

\[\begin{matrix} \text{NYYYY} = \text{YYYY} \\ \text{NMM} = \left\lfloor \frac{4 \cdot \text{MM} + 23}{10} \right\rfloor \\ \end{matrix}\] \[IDAY = 365 \cdot YYYY + DD + 31 \cdot (MM - 1) - NMM + \left\lfloor \frac{NYYYY}{4}\right\rfloor - \left\lfloor \frac{3}{4} \cdot \left(\left\lfloor \frac{NYYYY}{100} \right\rfloor + 1\right) \right\rfloor\]

Για τον υπολογισμό της ημέρας, αν:

Όπου, με \(\lfloor x \rfloor\) συμβολίζουμε τον μέγιστο ακέραιο αριθμό που δεν είναι μεγαλύτερος του αριθμού \(x\) - γνωστή και ως συνάρτηση floor (αντίστοιχα υπάρχει και η συνάρτηση ceil). Δεν είμαστε σίγουροι πώς λειτουργεί - πώς θα το βρούμε;

Εργασία: Γράψτε ένα πρόγραμμα birthdate.c το οποίο να χρησιμοποιεί τον αλγόριθμο παραπάνω και να υπολογίζει τι ημέρα γεννηθήκατε (ενσωματώστε την ημερομηνία γέννησής σας μέσα στο πρόγραμμα).

Ο παραπάνω υπολογισμός φαίνεται περίπλοκος; Δεν έχετε δει τίποτε ακόμη! Πραγματικές συναρτήσεις βιβλιοθήκης ημερομηνιών πρέπει να χειρίζονται ημερομηνίες και στο παρελθόν, με ιδιαίτερα περίπλοκες αλλαγές - τι γίνεται για παράδειγμα αν ο χρήστης θέλει να βρει την ημερομηνία 16 Φεβρουαρίου 1923 στην Ελλάδα [8];

Υπόδειξη

Για θετικούς αριθμούς, η ακέραια διαίρεση της C κάνει ήδη το \(\lfloor \cdot \rfloor\), οπότε δεν χρειάζεστε floor. Προσέξτε τον όρο \(\frac{3}{4} \cdot (\dots)\): αν τον γράψετε αφελώς σε ακέραια αριθμητική, το 3/4 βγαίνει 0, άρα αλλάξτε τη σειρά των πράξεων (πρώτα πολλαπλασιασμός, μετά διαίρεση). Για την ονομασία της ημέρας αρκεί μια αλυσίδα if/else if ή ένα switch πάνω στο υπόλοιπο.

Αριθμός στον οδηγό: Α5.8 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab03-birthdate · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab03-birthdate.html · Markdown (GitHub)