I@n15 Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Καλησπερα σε ολου τους φιλους.Παρ οτι σε προχωρημενη ηλικια και μετα απο χρονια ενασχολησης με τους υπολογιστες ειπα κι εγω ν ασχοληθω με τον προγραμματισμο επιτελους λογο του οτι τοσο καιρο απλα δεν υπηρχε χρονος. Κατ αρχην οι γνωσεις μου φτανουνε μεχρι τις συναρτισεις,στιν απλουστερη τουσ μορφη ακομα.. Λοιπον η ασκηση εχει ως εξης ----> Αλγοριθμος που θα δεχεται τρεις αριθμους που θα εκφραζουν την μερα,τον μηνα και το ετος σημερα,καθως και αλλους 3 που θα εκφραζουν την ημερομηνια γεννησης σας. Το προγραμμα πρεπει να εμφανιζει ποσες μερες εισαστε γεννημενοι. 1)Να γραψετε συναρτηση ΔΙΣΕΚΤΟ ΕΤΟΣ η οποια θα δεχεται σαν παραμετρο ενα ετος και θα επιστρεφει την τιμη ΑΛΗΘΗΣ αν το ετος ειναι δισεκτο η την τιμη ΨΕΥΔΗΣ αν το ετος δεν ειναι δισεκτο. 2)Να γραψετε συναρτηση ΜΕΡΕΣ_ΜΗΝΑ η οποια θα δεχεται σαν παραμετρους εναν μηνα(1-12) και θα επιστρεφει το πληθος των ημερων που εχει ο σιγκεκριμενοσ μηνας. Οσο αφορα το σκελοσ 1 και 2 με τις συναρτησεις το εχω λυσει.Απλα δυσκολευομαι στο πως να βρω ποσες μερες ειμαστε γεννημενοι. #include <stdio.h> #include <stdbool.h> //Sianrtisi ipologismou disektou etous bool DISEKTO_ETOS(int etos) { if(etos%4 == 0 || etos%400 == 0) { return true; } else if(etos%100 != 0) { return false; } } //------------------------------------------------------------------------------ //Sinartisi ipologismou plithos imeron enos mina int MERES_MINA(int a,int { //int days[13]= {31,28,31,30,31,30,31,31,30,31,30,31} int f; if((a == 4) || (a == 6) || (a == 9) || (a == 11)) { f = 30; } else if(a == 2) /*pologismos disektou etous*/ { if(b%4 == 0 || b%400 == 0) { f = 29; } else { f = 28; } } else { f = 31; } return f; } //------------------------------------------------------------------------------ //Kirio programma int main() { int mera,minas,etos,disekto; int mera_xristi,minas_xristi,etos_xristi; int apotelesma; printf("Dose tin mera(1-31)\n"); do { scanf("%i",&mera); if(mera < 1 || mera > 31) { printf("Ksanadose sosti mera(1-31)\n"); } } while(mera < 1 || mera > 31); printf("\n"); //------------------------------------------------------------------------------ printf("dose ton mina(1-12):\n"); do { scanf("%i",&minas); if(minas < 1 || minas > 12) { printf("Ksanadose ton sosto mina(1-12)\n"); } } while(minas < 1 || minas > 12); printf("\n"); //------------------------------------------------------------------------------ printf("Dose to simerino etos(2008)\n"); do { scanf("%i",&etos); if(etos != 2008) { printf("Ksanadose to sosto etos(2008)\n"); } } while(etos != 2008); printf("\n"); //------------------------------------------------------------------------------ //Eisagogi imerominia geniseos tou xristi printf("Doste tin mera geniseos sas(1-31)\n"); do { scanf("%i",&mera_xristi); if(mera_xristi < 1 || mera_xristi > 31) { printf("Ksanadose sosti mera(1-31)\n"); } } while(mera_xristi < 1 || mera_xristi > 31); printf("\n"); //------------------------------------------------------------------------------ printf("Doste ton mina genisis sas(1-12)\n"); do { scanf("%i",&minas_xristi); if(minas_xristi < 1 || minas_xristi > 12) { printf("Ksanadose ton sosto mina(1-12)\n"); } } while(minas_xristi < 1 || minas_xristi > 12); printf("\n"); //------------------------------------------------------------------------------ printf("Doste to etos genisis sas\n"); scanf("%i",&etos_xristi); disekto = DISEKTO_ETOS(etos_xristi); if(disekto == true) { printf("To etos einai disekto\n"); } else { printf("To etos den einai disekto\n"); } //--------------------------------------------------------------------------- printf("Dose to etos:\n"); scanf("%i",&etos); printf("Dose ton mina(1-12):\n"); do { scanf("%i",&minas); if(minas > 0 && minas <= 12) { apotelesma = MERES_MINA(minas,etos); printf("o %ios minas exei %i meres\n",minas,apotelesma); } else { printf("Ksanadose ton sosto arithmo gia ton mina(1-12)\n"); } } while(minas < 0 || minas > 12); return 0; } Ευχαριστω για οποια βοηθεια οποτε και αν ερθει.
gtroza Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Καλησπερα σε ολου τους φιλους.Παρ οτι σε προχωρημενη ηλικια και μετα απο χρονια ενασχολησης καλώς ήρθες ευγενικέ νέε (υπάρχουν ακόμα πιό προχωρημένης ηλικίας) Το προγραμμα πρεπει να εμφανιζει ποσες μερες εισαστε γεννημενοι κάνεις τις 2 ημερομηνίες μέρες και τις αφαιρείς πρέπει να βρείς και πόσα δίσεκτα πέρασαν για να προσθέσεις τις μέρες ελπίζω να έχεις Debian:-D .
I@n15 Δημοσ. 26 Ιουνίου 2008 Μέλος Δημοσ. 26 Ιουνίου 2008 debian debian συντροφε,απλα δεν σ επιασα λιγο με την απαντηση,μην παρεξηγεις απλα καιω λιγο καρβουνακι ακομα..
gtroza Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 νεαρέ ¨καρβουνιάρη¨ ξεκινάμε από έτος γέννησης μέχρι το 2008 που έβαλες όριο και κάνουμε έλγχο αν είναι δίσεκτο ή όχι αν ναί, αυξάνουμε ένα μετρητή και πάμε στο επόμενο έτος μέχρι να φτάσουμε το 2008 όλα τα έτη έχουν 365 ημέρες + οι επιπλέον των δισέκτων μιά λύση είναι να βρούμε σε μέρες το σήμερα και να αφαιρέσουμε τις μέρες μέχρι την ημερομηνία γέννησης αυτή όμως ίσως δεν είναι η πιό ¨γρήγορη¨*, αλλά είναι μιά προσέγγιση του θέματος μιά άλλη είναι να αφαιρέσουμε χρόνια απο χρόνια μήνες απο μήνες και μέρες απο μέρες και να υπολογίσουμε το αποτέλεσμα αλλά μάλλον θα μπλέξουμε με αρνητικά αποτελέσματα και θα πρέπει να δανείζουμε χρόνια, μήνες και μέρες υπολογίζοντας και τις ιδιαιτερότητες των μηνών και των δίσεκτων ετών οπότε ίσως η ¨καρβουνιάρικη¨ μέθοδος, να είναι η πιό απλή και σίγουρη ! απο άποψη κώδικα, αδυνατώ, γιατί δεν έχει ανακαλυφθεί ακόμα η C ελπίζω να βοήθησα κάπως μηχανή του Watt:mrgreen: . σε λίγο θα εμφανιστούν τα υπερσύγχρονα τραίνα !
I@n15 Δημοσ. 27 Ιουνίου 2008 Μέλος Δημοσ. 27 Ιουνίου 2008 Χαχαχαχα ΟΧΙ ΑΛΛΟ ΚΑΡΒΟΥΝΟΟΟΟ. Να σαι καλα φιλαρα.Τεραστια η βοηθεια.Αυτο που με ξεμπλοκαρε ειναι στην 2η περιπτωση που λες οτι πρεπει να δανειστουμε χρονια,μηνες κ.τ.λ Ειναι πραγαμτικα το σημειο που ειχα κολησει σε περιπτωση που ειναι αρνητικος. Το πιασα το κολπο.Οποτε τρεχω για δανεικα. Να σαι καλα!!
Directx Δημοσ. 27 Ιουνίου 2008 Δημοσ. 27 Ιουνίου 2008 Ευκαιρίας δοθείσης – και αφού έχεις ήδη βρει την λύση στο πρόβλημα, θα μπορούσα να συμπληρώσω ότι . . . Για τον υπολογισμό των ημερών θα μπορούσες να χρησιμοποιήσεις τις ρουτίνες time, mktime και difftime που προσφέρει η C βιβλιοθήκη time.h –το γιατί όμως δεν συνιστώ αύτη την εύκολη μέθοδο θα φανεί στο τέλος του post Πριν ξεκινήσουμε να έχεις υπόψη σου ότι όλες αυτές οι ρουτίνες επιστρέφουν την ώρα και ημερομηνία σε μορφή δευτερολέπτων από τα μεσάνυχτα (00:00:00 GMT) της 1/1/1970 (το λέμε και Epoch), αποθηκευμένη σε μορφή long. Για να το πετύχεις αυτό, καταρχήν δηλώνεις την ημερομηνία των γενεθλίων που σε ενδιαφέρουν στην δομή tm την οποία θα πρέπει ύστερα να περάσεις στην εντολή mktime. Ύστερα θα πρέπει να περάσεις το αποτέλεσμα (time_t) της mktime στην difftime, μαζί με την τρέχουσα ημερομηνία, την οποία βρίσκεις με την εντολή time(NULL) -αντί της difftime μπορείς να κάνεις επίσης μια αφαίρεση του mktime(&tm) - time(NULL). Το αποτέλεσμα που θα λάβεις από την difftime είναι οι μέρες που μεσολαβούν μεταξύ των δυο ημερομηνιών που έχεις εισάγει, κωδικοποιημένες όμως σε δευτερόλεπτα. Συνεπώς για να λάβεις τον αριθμό τους σε ημέρες θα πρέπει να τα διαιρέσεις με το 86400 (24 * 60 * 60), δηλαδή τα δευτερόλεπτα που αντιστοιχούν σε ένα εικοσιτετράωρο δηλαδή σε μια ήμερα (περίπου. . .). Δυστυχώς αυτή η μέθοδος όμως έχει ένα σοβαρό μειονέκτημα, παρόλο που οι C ρουτίνες διαχειρίζονται για εμάς δίσεκτα κτλ, εξʼ ορισμού επιστρέφουν όπως σημείωσα τα αποτελέσματα τους ως long (32bit) πράγμα που σημαίνει ότι από το 2038 και μετά παύουν να δουλεύουν σωστά (το ίδιο συμβαίνει και για ημερομηνίες πριν το Epoch -1970), οπότε σε περίπτωση που θες να διαχειρίζεσαι μελλοντικές ημερομηνίες θα πρέπει να βασισθείς σε άλλες καλύτερες βιβλιοθήκες (αυτό έκανα εγώ) ή να γράψεις κάποιο δικό σου αλγόριθμο. Ακολουθεί ένα απλό παράδειγμα γραμμένο σε Borland C/C++ Builder 6. > /*-birthday day calculator (c) directx---------------------------------------*/ #include <stdio.h> #include <time.h> #include <mem.h> #ifdef __BORLANDC__ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { /* time structures */ struct tm tmBirthday; time_t ttBirthday; double dDays; /* set birthday into tmBirthday struct */ memset(&tmBirthday, 0, sizeof(tmBirthday)); /* * tm_year should be declared as Year - 1900. * tm_year bounds: 1970 .. 2038 */ tmBirthday.tm_year = 1990 - 1900; tmBirthday.tm_mon = 1; /* 0 = Jan | 11 = Dec */ tmBirthday.tm_mday = 5; /* make tmBirthday struct a time_t */ ttBirthday = mktime(&tmBirthday); /* I ignore negative dates as invalid */ if((dDays = difftime(time(NULL), ttBirthday))<0) printf(" Error: Invalid birthday or date out of bounds\n"); else /* Divid time difference with 86400sec (1 day seconds = 24*60*60) and print result */ printf("You live approx: %.2lf days\n", dDays / 86400.0); /* End of program */ printf(" Press enter to exit.."); getchar(); return 0; } /*---------------------------------------------------------------------------*/ Υ.Γ. Το πρόγραμμα, καθώς σπάνια χρησιμοποιώ την βιβλιοθήκη time.h για τέτοιες δουλειές μπορεί να περιέχει bugs ή άλλες αβλεψίες!
gtroza Δημοσ. 27 Ιουνίου 2008 Δημοσ. 27 Ιουνίου 2008 Directx μας έκανες ¨βίδες¨* καλημέρα *σε δευτερόλεπτα ! .
I@n15 Δημοσ. 27 Ιουνίου 2008 Μέλος Δημοσ. 27 Ιουνίου 2008 αγαπητε directx 1000 ευχαριστω κατ αρχην για την βοηθεια και τον χρονο σου απλα δεν εχω φτασει ακομα στα struct οποτε δεν μπορω να καταλαβω. Παντως thanks,να σαι καλα
gtroza Δημοσ. 27 Ιουνίου 2008 Δημοσ. 27 Ιουνίου 2008 σε λίγο θα εμφανιστούν τα υπερσύγχρονα τραίνα ! τι σου είπα ? .
I@n15 Δημοσ. 28 Ιουνίου 2008 Μέλος Δημοσ. 28 Ιουνίου 2008 Για τα υπερσυγχρονα τραινα ε?χαχαχα Διορατικοτατος..
bilco Δημοσ. 28 Ιουνίου 2008 Δημοσ. 28 Ιουνίου 2008 Αν και θα προτιμούσα και εγώ την λύση που έδωσε ο DirectX, μια άλλη προσέγγιση (για να έχουμε μεγαλύτερο χρονικό εύρος) θα μπορούσε να είναι η παρακάτω > #include <stdio.h> typedef struct _SimpleDate { int day; int month; int year; } SimpleDate, *PSimpleDate; // ceil(n / d) #define DIV_CEIL(n, d) (n % d? n / d + 1: n / d) // lookup table για τον αριθμό των ημερών μέχρι και τον μήνα index const int g_nMonthDays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; /* Υπολογίζει τον αριθμό των ημερών, από 1/1/1200 μέχρι τη δοσμένη ημ/νια pDate */ int daysFrom1200AD(PSimpleDate pDate) { int res, d = pDate->year - 1200; // οι μέρες από τα χρόνια που μεσολαβούν res = d * 365; // συν τις μέρες από τα δίσεκτα res += DIV_CEIL(d, 4); // πολ/σια του 4 res -= DIV_CEIL(d, 100); // αφαιρώ τα πολ/σια του 100 (δεν είναι δίσεκτα) res += DIV_CEIL(d, 400); // με εξαίρεση τα πολ/σια του 400 (είναι δίσεκτα) // συν τις ημέρες των μηνών res += g_nMonthDays[pDate->month - 1]; // συν ένα αν είμαστε μετά το Φεβρουάριο και το έτος είναι δίσεκτο if ((pDate->month > 2) && (pDate->year % 4 == 0) && ((pDate->year % 100 != 0) || (pDate->year % 400 == 0))) ++res; // συν τις μέρες του μήνα return res + pDate->day - 1; } int main() { SimpleDate d1 = { 15, 12, 1965 }; SimpleDate d2 = { 7, 8, 2003 }; printf("DIAFORA : %d\n", daysFrom1200AD(&d2) - daysFrom1200AD(&d1)); return 0; }
gtroza Δημοσ. 28 Ιουνίου 2008 Δημοσ. 28 Ιουνίου 2008 d = pDate->year - 1200; res += DIV_CEIL(d, 4); // πολ/σια του 4 τί σημαίνουν ? αν θέλεις απαντάς είμαι άσχετος κυριολεκτικά .
bilco Δημοσ. 28 Ιουνίου 2008 Δημοσ. 28 Ιουνίου 2008 τί σημαίνουν ?αν θέλεις απαντάς είμαι άσχετος κυριολεκτικά . Έστω y η χρονιά της ημερομηνίας που ψάχνω να βρώ ποσες μέρες απέχει από την 1/1/1200. Πρέπει καταρχήν να υπολογίσω πόσες ημέρες είναι τα χρόνια 1200, 1201, ... , y-2, y-1. Αυτά είναι d = y - 1200 χρόνια. Έτσι είναι d * 365 ημέρες συν τις επιπλέον ημέρες των δίσεκτων. Για να βρω πόσα δίσεκτα έχω διαιρώ το d με το 4. Επειδή όμως ξεκινάω από το 1200 που είναι πολ/σιο του 4, αν το d διαιρείται με το 4 έχω ακριβώς d/4 πολ/σια, αν όχι έχω d/4+1 πολ/σια, δηλαδή το ceiling της διαίρεσης d/4. Όμοια και για το 100 και το 400.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.