Η ηλικία σας σε... μέρες - C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό UnKnown96 » 22 Αύγ 2011, 22:23

Να 'με και πάλι με την νέα μου δημιουργία :lol:
Αυτήν την φόρα έφτιαξα ένα πρόγραμμα σε C που βρείσκει την ηλικία σας... σε ημέρες!
Για την ακρίβεια βρίσκει πόσων ημερών θα είστε στις 12:00 τα μεσάνυχτα :P

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

Και μετά αυτό θα βγάλει πόσες μέρες ζείτε!

Εδώ είναι ο κώδικας:

Κώδικας: Επιλογή όλων

#include <stdio.h>

int main (void) {

struct {int day; int month; int year;} born, today;

int born_month_to_days = 0, years_lived_in_days = 0, months_of_this_year_in_days = 0, is_leap, year_checker, counter, age_in_days;
const int months_in_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

printf ("Birth date (dd/mm/yyyy): ");
scanf ("%d/%d/%d", &born.day, &born.month, &born.year);

printf ("Today date (dd/mm/yyyy): ");
scanf ("%d/%d/%d", &today.day, &today.month, &today.year);

for (year_checker = born.year; year_checker < today.year; year_checker++) {
if ( (year_checker % 4 == 0 && year_checker % 100 != 0) || (year_checker % 400 == 0) ) is_leap = 1;
else is_leap = 0;

if (is_leap == 1) years_lived_in_days += 366;
else years_lived_in_days += 365;
}

for (counter = 1; counter <= born.month; counter++)
born_month_to_days += months_in_days[counter - 1];

for (counter = 1; counter <= today.month; counter++)
months_of_this_year_in_days += months_in_days[counter - 1];

age_in_days = (years_lived_in_days + months_of_this_year_in_days + today.day) - (born_month_to_days + born.day);

if ( (born.year % 4 == 0 && born.year % 100 != 0) || (born.year % 400 == 0) ) is_leap = 1;
else is_leap = 0;

if (born.month > 2 && is_leap == 1) age_in_days--;

if ( (today.year % 4 == 0 && today.year % 100 != 0) || (today.year % 400 == 0) ) is_leap = 1;
else is_leap = 0;

if (today.month < 2 && is_leap == 1) age_in_days--;

printf ("Today you are %d days old.\n", age_in_days);

return 0;
}


Βρείτε πόσων ημερών είστε! :)
Τελευταία επεξεργασία από UnKnown96 και 01 Ιούλ 2012, 11:20, έχει επεξεργασθεί 11 φορά/ες συνολικά
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό roman » 22 Αύγ 2011, 23:57

Το έτρεξα και μετά έκανα διαίρεση με το 365 και με έβγαζε ένα χρόνο μεγαλύτερο από όσο είμαι. Στο παρακάτω παράδειγμα φαίνεται ξεκάθαρα το πρόβλημα.
Κώδικας: Επιλογή όλων
$ ./a.out
Born date: 1 1 2000
Today date: 1 1 2001
Your age in days is 732.


Για περαιτέρω εκπαίδευση θα μπορούσες να παίρνεις την σημερινή ημερομηνία από το σύστημα.
No LSB modules are available.
roman
punkTUX
punkTUX
 
Δημοσιεύσεις: 178
Εγγραφή: 11 Φεβ 2009, 15:09
Τοποθεσία: Θεσσαλονίκη
IRC: rwmanos
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό migf1 » 23 Αύγ 2011, 02:24

Ο τρόπος για να υπολογίζεις διαφορά ημερομηνιών σε ημέρες, είναι να τις μετατρέπεις σε Julian Day Numbers και να τις αφαιρείς.

Στο έχω ξαναπεί νομίζω και αν το θυμάμαι καλά σου έχω δώσει και τον τύπο.. αν όχι...
Κώδικας: Επιλογή όλων

long date_2jdn( int d, int m, int y )
{
return
( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;

}
για ημερομηνίες μετά το 1582
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό UnKnown96 » 23 Αύγ 2011, 12:02

roman έγραψε:Το έτρεξα και μετά έκανα διαίρεση με το 365 και με έβγαζε ένα χρόνο μεγαλύτερο από όσο είμαι. Στο παρακάτω παράδειγμα φαίνεται ξεκάθαρα το πρόβλημα.
Κώδικας: Επιλογή όλων
$ ./a.out
Born date: 1 1 2000
Today date: 1 1 2001
Your age in days is 732.


Για περαιτέρω εκπαίδευση θα μπορούσες να παίρνεις την σημερινή ημερομηνία από το σύστημα.


Την ημερομηνία από το σύστημα ίσως να την παίρνει αργότερα αφού φτιάξω τα bugs...
Έφτιαξα το bug που είπες και μερικά άλλα που βρήκα.
Δοκίμασε τώρα να μου πεις.

migf1 έγραψε:Ο τρόπος για να υπολογίζεις διαφορά ημερομηνιών σε ημέρες, είναι να τις μετατρέπεις σε Julian Day Numbers και να τις αφαιρείς.

Στο έχω ξαναπεί νομίζω και αν το θυμάμαι καλά σου έχω δώσει και τον τύπο.. αν όχι...
Κώδικας: Επιλογή όλων

long date_2jdn( int d, int m, int y )
{
return
( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;

}
για ημερομηνίες μετά το 1582


MigF1 από αυτά που είπες, ίσως μία κότα να κατάλαβε πιο πολλά από εμένα :lol:
Δεν έχω ξανά δουλέψει με Julian Days, βασικά δεν ήξερα καν ότι υπήρχε κάτι τέτοιο...
Θα το κοιτάξω πάντος, σε ευχαριστώ!!!
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό migf1 » 23 Αύγ 2011, 12:24

:lol:

Γιατί, νομίζεις πως εγώ έχω κάτσει να δω πως και γιατί λειτουργεί ο τύπος, μου αρκεί που λειτουργεί :lol:

Δεν είναι τίποτα το να τον χρησιμοποιήσεις. Στη συνάρτηση που σου έγραψα d, m, y είναι η ημέρα, μήνας και έτος της ημερομηνίας που θες να μετατρέψεις σε JDN και η συνάρτηση σου επιστρέφει το JDN που της αντιστοιχεί (ένας long ακέραιος είναι).

Το κάνεις για τις 2 ημερομηνίες που θες και μετά αφαιρείς τα 2 JDN για να πάρεις τη διαφορά τους σε ημέρες:

Κώδικας: Επιλογή όλων

daydiff = date_2jdn( 23, 8, 2011 ) - date_2jdn( ημέρα_που γεννήθηκες, μήνας_που_γεννήθηκες, έτος_που_γεννήθηκες )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό gravitalsun » 23 Αύγ 2011, 12:52

Γιατί κουράζεστε ; από το command line

Κώδικας: Επιλογή όλων
perl -E'use Time::Local;say int(($^T-timelocal(0,0,0,$ARGV[0],($ARGV[1]-1),$ARGV[2]))/86400)' 31 12 2001
gravitalsun
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 08 Αύγ 2011, 16:44
Τοποθεσία: Αθήνα
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό migf1 » 23 Αύγ 2011, 13:01

Επειδή μας αρέσει η C :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό UnKnown96 » 23 Αύγ 2011, 13:51

gravitalsun έγραψε:Γιατί κουράζεστε ; από το command line

Κώδικας: Επιλογή όλων
perl -E'use Time::Local;say int(($^T-timelocal(0,0,0,$ARGV[0],($ARGV[1]-1),$ARGV[2]))/86400)' 31 12 2001


Error:
Can't find string terminator " ' " anywhere before EOF at -e line 1.

Γιατί κουράζεσε; Μάθε C :lol:
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό UnKnown96 » 23 Αύγ 2011, 13:54

migf1 έγραψε::lol:

Γιατί, νομίζεις πως εγώ έχω κάτσει να δω πως και γιατί λειτουργεί ο τύπος, μου αρκεί που λειτουργεί :lol:

Δεν είναι τίποτα το να τον χρησιμοποιήσεις. Στη συνάρτηση που σου έγραψα d, m, y είναι η ημέρα, μήνας και έτος της ημερομηνίας που θες να μετατρέψεις σε JDN και η συνάρτηση σου επιστρέφει το JDN που της αντιστοιχεί (ένας long ακέραιος είναι).

Το κάνεις για τις 2 ημερομηνίες που θες και μετά αφαιρείς τα 2 JDN για να πάρεις τη διαφορά τους σε ημέρες:

Κώδικας: Επιλογή όλων

daydiff = date_2jdn( 23, 8, 2011 ) - date_2jdn( ημέρα_που γεννήθηκες, μήνας_που_γεννήθηκες, έτος_που_γεννήθηκες )


:lol:

migf1 έγραψε:Επειδή μας αρέσει η C :)


Επειδή έχει τις καλίτερες ταχύτητες!
Επειδή χρησιμοποιείτε από σχεδόν όλες τις εταιρίες!
Επειδή φτιάχτηκε το '68 και μέχρι σήμερα χρησιμοποιήτε!
Επειδή ΕΊΝΑΙ γλώσσα!
Και επειδή είναι αυτή που δημιούργησε την δικιά σου... πατέντα, την Perl...
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Η ηλικία σας σε... μέρες - C

Δημοσίευσηαπό gravitalsun » 23 Αύγ 2011, 14:34

χρησιμοποιείς windows ε ... ;
gravitalsun
babeTUX
babeTUX
 
Δημοσιεύσεις: 16
Εγγραφή: 08 Αύγ 2011, 16:44
Τοποθεσία: Αθήνα
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron