Παίζει να είναι στο top-3 των πιο χρήσιμων κεφαλαίων αυτό με τα struct/union/enums
Μόλις μπήκα σπίτι κι έκανα μονάχα μια ανάγνωση στον κώδικα που ποστάρισες (θα τον κοιτάξω κάποια άλλη στιγμή προσεχτικά) είδα όμως ότι αυτό εδώ...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
/*********************************************************************
* days_of_month: Returns the number of days in a month. *
*********************************************************************/
int days_of_month(int month, int year) {
if (month == FEBRUARY && is_leap(year))
return 29;
if (month == FEBRUARY)
return 28;
return month % 2 ? 31 : 30;
}
πρέπει να βγάζει σφάλμα στον Ιούλιο (γιατί παρότι μονός έχει 31 ημέρες
Άσχετα με το παραπάνω, σε προγράμματα με μήνες συνηθίζονται υλοποιήσεις με έναν πίνακα για τις ημέρες όλων των μηνών (συνδυασμένο με έναν enumerator για να τον κάνεις απευθείας indexing, αλλά για τη συγκεκριμένη συνάρτηση αρκεί απλά ένα: #define FEB 1)...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
enum { JAN=0, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Οπότε αμέσως-αμέσως...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
int days_in_month( int m, int y, int mdays[] )
{
return FEB == (--m) && Y_ISLEAP(y) ? 29 : mdays[ m ];
}
* το --m είναι επειδή σε αυτά τα προγράμματα ο χρήστης δίνει τους μήνες ως 1-indexed νούμερα, ενώ εσωτερικά τους μετατρέπουμε σε 0-indexed, για να κάνουμε indexing τον πίνακα (μπορείς την μετατροπή να την κάνεις έξω από τη συνάρτηση, οπότε δεν θα το χρειάζεσαι μέσα της).
Στην συγκεκριμένη εκφώνηση, για να μείνεις πιστός στο πρότυπο της συνάρτησης, ο mdays[] μπορεί να οριστεί καθολικά (αλλά γενικώς είναι καλό να τις αποφεύγουμε τις καθολικές μεταβλητές).


