Πριν από αρκετά χρόνια, όταν κάποιος φίλος μου, μου ζήτησε να του βρω τι ημέρα γεννήθηκε, ανέτρεξα σε ένα βιβλίο προγραμματισμού ενός συμφοιτητή μου στο οποίο όπως θυμόμουνα υπήρχε γραμμένος ο συγκεκριμένος αλγόριθμος. Υλοποίησα τον αλγόριθμο σε γλώσσα Βasic και έδωσα την απάντηση στον φίλο μου. Πρέπει όμως να ομολογήσω ότι δεν κατάλαβα την εξαγωγή του αλγορίθμου. Έτσι σκέφτηκα να αναπαράγω με τον δικό μου τρόπο τον αλγόριθμο.
Τι όμως είναι ο αλγόριθμος; Πως μπορούμε να δημιουργήσουμε έναν αλγόριθμο;. Πως μπορούμε να εισάγουμε αυτόν τον αλγόριθμο σε έναν H/Y; Αλγόριθμος μπορούμε να πούμε ότι είναι η πλήρης συνταγή για τη λύση ενός προβλήματος. Εδώ πρέπει να τονίσουμε ότι συνήθως για τη λύση ενός προβλήματος δεν υπάρχει συνήθως μία και μοναδική συνταγή, αλλά περισσότερες. Είναι σημαντικό να αναφέρουμε ότι όλες οι συνταγές που λύνουν ένα πρόβλημα δεν είναι μεταξύ τους ισοδύναμες, αφού σε πολλές από αυτές τα βήματα που απαιτούνται είναι πολύ λιγότερα και έτσι απαιτείται λιγότερος χρόνος από τον Η/Υ για να καταλήξει στη λύση.
Τα βασικά χαρακτηριστικά ενός αλγορίθμου είναι τα εξής:
1. Ένας αλγόριθμος έχει συνήθως μια είσοδο. Πχ στον αλγόριθμο που εμείς ψάχνουμε να βρούμε η είσοδος είναι η εισαγωγή της συγκεκριμένης ημερομηνίας. Υπάρχουν βέβαια και ορισμένες περιπτώσεις στις οποίες ο αλγόριθμος δεν έχει είσοδο όπως στην περίπτωση αλγορίθμου δημιουργίας ψευδοτυχαίων αριθμών.
2. Ένας αλγόριθμος έχει συνήθως μια έξοδο. Στην δική μας περίπτωση η έξοδος θα είναι η ημέρα της εβδομάδας που ψάχνουμε.
3. Σε έναν αλγόριθμο η κάθε εντολή θα πρέπει να είναι σαφώς καθορισμένη. Πχ σε μια συνταγή μαγειρικής η εντολή «ψήνουμε το φαγητό» δεν είναι καθορισμένη αφού δεν αναφέρει ούτε σε τι βαθμούς το ψήνουμε ούτε για πόση ώρα.
4. Για την ολοκλήρωση του αλγορίθμου θα πρέπει να απαιτούνται πεπερασμένα βήματα. Δεν θα πρέπει δηλαδή να υπάρχουν κλειστοί βρόχοι αρτέμονες.
5. Κάθε εντολή θα πρέπει να είναι πραγματοποιήσιμη. Πχ δεν θα πρέπει να υπάρχει διαίρεση με το μηδέν αφού μια τέτοια διαίρεση δεν είναι δυνατό να πραγματοποιηθεί.
Οι αλγόριθμοι μαζί με τις δομές δεδομένων αποτελούν τα προγράμματα δηλαδή αυτό που λέμε στους Η/Υ Software. Είναι αυτό ακριβώς που κάνει τους Η/Υ να φαίνονται έξυπνοι. Οι Η/Υ όμως αυτό που κάνουν είναι να εκτελούν έναν αλγόριθμο που τους βάζουμε εμείς. Δεν μπορούν να παράγουν κάποιο αλγόριθμο. Αν αυτό κάποτε πραγματοποιηθεί ( και δεν υπάρχει κάποιος φυσικός νόμος που να αποκλείει τη δυνατότητα πραγματοποίησης αλγορίθμων από μηχανές ) τότε οι Η/Υ θα έχουν πράγματι αποκτήσει ευφυΐα.
Για να γυρίσουμε στο πρόβλημά μας αρκεί να βάλουμε μια ημερομηνία ως αρχή πχ την 1η Μαρτίου 1900 και να βρούμε έναν αλγόριθμο που να υπολογίζει πόσες μέρες έχουν περάσει από τότε μέχρι τη συγκεκριμένη ημερομηνία που μας δίνεται. Αν αυτό γίνει κατορθωτό τότε μπορούμε να βρούμε και την ημέρα της συγκεκριμένης ημερομηνίας, αφού θα είναι το υπόλοιπο της διαίρεσης του αριθμού που βρήκαμε με το 7 ( επτά ημέρες της εβδομάδας ) προσαρμοσμένο σε μια γνωστή ημέρα, αφού δεν γνωρίζουμε τι ημέρα ήταν η αρχή μας η 1η Μαρτίου 1900.
Σαν αρχή πήραμε τον Μάρτιο ώστε οι μέρες που προσθέτουμε να είναι σταθερές και ανεξάρτητες του έτους αν αυτό είναι δίσεκτο ή απλό. Αφού είναι γνωστό ότι όταν το έτος διαιρείται με το 4 τότε είναι δίσεκτο δηλαδή ο Φεβρουάριος αυτού του έτους έχει 29 ημέρες ενώ όταν δεν διαιρείται με το 4 ο Φεβρουάριος έχει 28 ημέρες.
Για να βρούμε τις ημέρες που αντιστοιχούν στα έτη που απέχουμε από το 1900, αρκεί σε κάθε έτος από το 1900 έως τη δοθείσα ημερομηνία να ελέγχουμε αν το έτος διαιρείται με το 4 και αν δεν διαιρείται να προσθέτουμε τον αριθμό 365 ενώ αν διαιρείται να προσθέτουμε το 366.
Μπορούμε εναλλακτικά να υπολογίσουμε τις ημέρες των ετών που μεσολαβούν πολλαπλασιάζοντας το σύνολο των ετών με το 365,25 και παίρνοντας το ακέραιο μέρος του αριθμού που προκύπτει. Με αυτόν τον τρόπο προσθέτουμε 365 ημέρες κατ’ έτος αν το έτος δεν είναι δίσεκτο ενώ προσθέτουμε 366 ημέρες αν το έτος είναι δίσεκτο. Αυτά για το σύνολο των ημερών που αντιστοιχούν στα έτη.
Για τον υπολογισμό του συνόλου των ημερών που διαφέρει ο μήνας της ημερομηνίας που μας δίνεται από την 1η Μαρτίου αρκεί να σκεφτούμε το εξής:
Έστω m ο μήνας της ημερομηνίας που μας δίνεται.
Αν m=3 τότε προσθέτουμε 0 ημέρες αφού ξεκινάμε όπως είπαμε από το μήνα Μάρτιο.
Αν m=4 τότε προσθέτουμε 31 ημέρες που αντιστοιχούν στις ημέρες του Μαρτίου
Αν m=5 τότε προσθέτουμε 61 ημέρες που αντιστοιχούν στις ημέρες Μαρτίου και Απριλίου.
Αν m=6 τότε προσθέτουμε 92 ημέρες που αντιστοιχούν στις ημέρες Μαρτίου Απριλίου και Μαίου
Αν m=7 τότε προσθέτουμε 122 ημέρες
Αν m=8 τότε προσθέτουμε 153 ημέρες
Αν m=9 τότε προσθέτουμε 184 ημέρες
Αν m=10 τότε προσθέτουμε 214 ημέρες
Αν m=11 τότε προσθέτουμε 245 ημέρες
Αν m=12 τότε προσθέτουμε 275 ημέρες
Αν m=1 τότε προσθέτουμε 306 ημέρες αφού αφαιρέσουμε ένα έτος και ο Δεκέμβριος έχει 31 ημέρες
Αν m=2 τότε προσθέτουμε 337 ημέρες αφού αφαιρέσουμε ένα έτος και ο Ιανουάριος έχει 31 ημέρες
Τέλος προσθέτουμε και τις ημέρες της δοθήσης ημερομηνίας. Έτσι θα έχουμε:
Σύνολο ημερών = ημέρες_ετών+ημέρες_μηνών+ημέρες.
Στη συνέχεια βρίσκουμε το υπόλοιπο της διαίρεσης «Σύνολο ημερών /7». Ρυθμίζουμε το υπόλοιπο αυτό να αντιστοιχεί σε μια γνωστή ημέρα. Έτσι αν το υπόλοιπο για τις 11-5-2002 είναι πχ 4 αφού γνωρίζουμε ότι οι 11-5-2002 έπεφτε Κυριακή τοποθετούμε:
Υπόλοιπο 4 --> Κυριακή
Υπόλοιπο 5 --> Δευτέρα
Υπόλοιπο 6 --> Τρίτη
Υπόλοιπο 0--> Τετάρτη
Υπόλοιπο 1--> Πέμπτη
Υπόλοιπο 2 --> Παρασκευή
Υπόλοιπο 3--> Σάββατο
Ο αλγόριθμος που δημιουργήσαμε μπορεί να απλοποιηθεί αρκετά κάνοντας την εξής παρατήρηση για τις ημέρες που αντιστοιχούν στους μήνες:
Int(4*30,6)-122=0
Int(5*30,6)-122=31
Int(6*30,6)-122=61
Int(7*30,6)-122=92
Int(8*30,6)-122=122
Int(9*30,6)-122=153
Int(10*30,6)-122=184
Int(11*30,6)-122=214
Int(12*30,6)-122=245
Int(13*30,6)-122=275
Int(14*30,6)-122=306
Int(15*30,6)-122=337
Έτσι για να βρούμε τις ημέρες που αντιστοιχούν στο σύνολο των μηνών γράφουμε:
Εάν μήνας >2 τότε μήνας=μήνας +1
Αν μήνας <=2 τότε μήνας =μήνας +13
ημέρες_μήνα=int((μήνας+1)*30,6)-122
Αυτόν ακριβώς τον αλγόριθμο είχα διαβάσει και δεν είχα καταλάβει.