Τα πάντα για την C

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

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 19 Ιουν 2011, 21:28

ευχαριστώ για την εξήγηση...
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Ιουν 2011, 21:31

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 21 Ιουν 2011, 02:34

ρε συ μπορείς να μου δώσεις ένα πολύ απλό παράδειγμα χρήσης του αλγόριθμου μετατροπής ημερομηνίας σε Ιουλιανό αριθμό;
διάβασα τον κώδικα σου αλλά είναι λίγο δύσκολο να καταλάβω...
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 11:01

Προσπάθησα να στο απλοποιήσω, για ρίξε μια ματιά και πες μου (κάνω και έλεγχο μέσω των Ιουλιανών αριθμών ώστε να μη δέχεται 2η ημερομηνία μεγαλύτερη της 1ης στην είσοδο... επίσης χρειάζεται έλεγχος ώστε οι ημερομηνίες εισόδου να αντιστοιχούν σε έγκυρες ημερομηνίες, αλλά για να μη σε μπερδέψω με όλα μαζί θα το κάνω ξεχωριστά σε άλλο κώδικα).

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

#include <stdio.h>
#include <stdlib.h>

// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//
long int 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;

}

// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}

// ---------------------------------------------------------------------------------
int main( void )
{
int d1, m1, y1, d2, m2, y2;
long int jdn1, jdn2;

// διάβασε την 1η ημερομηνία
printf("1η ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn1);

// διάβασε τη 2η ημερομηνία
do {
printf("2η ημερομηνία (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn2);

// υπολόγισε τη διαφορά μεταξύ των ημερομηνιών σε ημέρες
printf("Οι ημερομηνίες απέχουν μεταξύ τους %ld ημέρες\n", jdn1-jdn2);

// υπολόγισε την ημερομηνία 10 μέρες πριν την 1η ημερομηνία
jdn_2date( &d1, &m1, &y1, jdn1-10);
printf("10 μέρες πριν από την 1η ημερομηνία είναι: %d %d %d\n", d1, m1, y1);

// υπολόγισε την ημερομηνία 15 μέρες μετά τη 2η ημερομηνία
jdn_2date( &d2, &m2, &y2, jdn2+15);
printf("15 μέρες μετά από την 2η ημερομηνία είναι: %d %d %d\n\n", d2, m2, y2);

printf("\npress ENTER to exit...");
fflush(stdin); getchar();

exit(0);
}



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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό medigeek » 21 Ιουν 2011, 12:23

Ορίστε κι ένα προγραμματάκι από εμένα για επεξεργασία της ημερομηνίας.
Το κυρίως πρόγραμμα (main) είναι αυτό εδώ: http://www.gnu.org/s/hello/manual/libc/ ... ample.html

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <time.h>

#define SIZE 256
char buffer[SIZE];

int xdays(time_t rawtime, int days, char sign)
{
/* Get date after / before X days */
struct tm *timeinfo;
timeinfo = localtime(&rawtime);
if (sign == '+') {
timeinfo->tm_mday = timeinfo->tm_mday + days;
sprintf(buffer, "Date after %d days: ", days);
}
else if (sign == '-') {
timeinfo->tm_mday = timeinfo->tm_mday - days;
sprintf(buffer, "Date before %d days: ", days);
}
mktime(timeinfo);

fputs(buffer, stdout);
strftime(buffer, SIZE, "%A, %B %d %Y.\n", timeinfo);
fputs(buffer, stdout);

return 0;
}

int tomorrow(time_t rawtime)
{
/* Get tomorrow's date */
struct tm *timeinfo;

rawtime = time(NULL);
timeinfo = localtime(&rawtime);
timeinfo->tm_mday = timeinfo->tm_mday + 1;
mktime(timeinfo);

strftime(buffer, SIZE, "Tomorrow will be: %A, %B %d %Y.\n", timeinfo);
fputs(buffer, stdout);

return 0;
}

int curtime(time_t rawtime)
{
struct tm *loctime;

/* Convert it to local time representation. */
loctime = localtime(&rawtime);

/* Print out the date and time in the standard format. */
fputs(asctime(loctime), stdout);

/* Print it out in a nice format. */
strftime(buffer, SIZE, "Today is %A, %B %d %Y.\n", loctime);
fputs(buffer, stdout);
strftime(buffer, SIZE, "The time is %I:%M %p.\n", loctime);
fputs(buffer, stdout);

return 0;
}

int main()
{
time_t rawtime;
rawtime = time(NULL);

curtime(rawtime);
tomorrow(rawtime);
xdays(rawtime, 30, '+');
return 0;
}
Τελευταία επεξεργασία από medigeek και 21 Ιουν 2011, 13:56, έχει επεξεργασθεί 1 φορά/ες συνολικά
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 13:33

Ωραίο :) Δείγμα χρήσης των έτοιμων συναρτήσεων της C. Μπορείς να το συνδυάσεις με την συνάρτηση setlocale() ώστε τα μηνύματα που βγάζει να βγαίνουν στη γλώσσα που είναι ρυθμισμένο το σύστημα του χρήστη (το πρόβλημα είναι πως δεν θα είναι portable o κώδικας στις διάφορες πλατφόρμες, μπορείτε να διαβάσετε λεπτομέρειες σε σχετικό νήμα που είχα ανοίξει στο insomnia, όταν το έψαχνα πρόσφατα... χωρίς πρόσβαση σε POSIX :( )

ΥΓ. Μια μικρή σημείωση αν μου επιτρέπεις, το στάνταρ "απαγορεύει" (εντός εισαγωγικών) την χρήση underbar μπροστά από τα ονόματα συναρτήσεων και μεταβλητών, με το σκεπτικό πως είναι reserved για συναρτήσεις ή καθολικές μεταβλητές που ενδέχεται να προστεθούν σε αναθεωρήσεις της γλώσσας (για τον ίδιο λόγο "απαγορεύει" και συναρτήσεις που το όνομά τους ξεκινάει με "str").

medigeek έγραψε:Ορίστε κι ένα προγραμματάκι από εμένα για επεξεργασία της ημερομηνίας.
Το κυρίως πρόγραμμα (main) είναι αυτό εδώ: http://www.gnu.org/s/hello/manual/libc/ ... ample.html

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <time.h>

#define SIZE 256
char buffer[SIZE];

int _xdays(time_t rawtime, int days, char sign)
{
/* Get date after / before X days */
struct tm *timeinfo;
timeinfo = localtime(&rawtime);
if (sign == '+') {
timeinfo->tm_mday = timeinfo->tm_mday + days;
sprintf(buffer, "Date after %d days: ", days);
}
else if (sign == '-') {
timeinfo->tm_mday = timeinfo->tm_mday - days;
sprintf(buffer, "Date before %d days: ", days);
}
mktime(timeinfo);

fputs(buffer, stdout);
strftime(buffer, SIZE, "%A, %B %d %Y.\n", timeinfo);
fputs(buffer, stdout);

return 0;
}

int _tomorrow(time_t rawtime)
{
/* Get tomorrow's date */
struct tm *timeinfo;

rawtime = time(NULL);
timeinfo = localtime(&rawtime);
timeinfo->tm_mday = timeinfo->tm_mday + 1;
mktime(timeinfo);

strftime(buffer, SIZE, "Tomorrow will be: %A, %B %d %Y.\n", timeinfo);
fputs(buffer, stdout);

return 0;
}

int _curtime(time_t rawtime)
{
struct tm *loctime;

/* Convert it to local time representation. */
loctime = localtime(&rawtime);

/* Print out the date and time in the standard format. */
fputs(asctime(loctime), stdout);

/* Print it out in a nice format. */
strftime(buffer, SIZE, "Today is %A, %B %d %Y.\n", loctime);
fputs(buffer, stdout);
strftime(buffer, SIZE, "The time is %I:%M %p.\n", loctime);
fputs(buffer, stdout);

return 0;
}

int main()
{
time_t rawtime;
rawtime = time(NULL);

_curtime(rawtime);
_tomorrow(rawtime);
_xdays(rawtime, 30, '+');
return 0;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 14:01

migf1 έγραψε:Προσπάθησα να στο απλοποιήσω, για ρίξε μια ματιά και πες μου (κάνω και έλεγχο μέσω των Ιουλιανών αριθμών ώστε να μη δέχεται 2η ημερομηνία μεγαλύτερη της 1ης στην είσοδο... επίσης χρειάζεται έλεγχος ώστε οι ημερομηνίες εισόδου να αντιστοιχούν σε έγκυρες ημερομηνίες, αλλά για να μη σε μπερδέψω με όλα μαζί θα το κάνω ξεχωριστά σε άλλο κώδικα).
[snip]
clepto έγραψε:ρε συ μπορείς να μου δώσεις ένα πολύ απλό παράδειγμα χρήσης του αλγόριθμου μετατροπής ημερομηνίας σε Ιουλιανό αριθμό;
διάβασα τον κώδικα σου αλλά είναι λίγο δύσκολο να καταλάβω...

Αν δεν έχεις απορίες στον απλοποιημένο προηγούμενο κώδικα, μπορείς να δεις την παρακάτω έκδοσή του που κάνει ελέγχους για έγκυρες ημερομηνίες, υπολογίζει και τυπώνει ημέρες εβδομάδας, δίσεκτα έτη και προσθήκη/αφαίρεση ημερών στις 2 ημερομηνίες.

Επειδή το κομμάτι του κώδικα που τυπώνει καλλωπισμένη την κάθε ημερομηνία επαναλαμβάνεται συνεχώς, σε επόμενο post θα το κάνω συνάρτηση για να είναι πιο ευανάγνωστη η main ;)

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

#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE !FALSE
#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )

// ---------------------------------------------------------------------------------
// Έλεγχος έγκυρης ημερομηνίας
//
int validdate( int d, int m, int y, int mdays[] )
{
if ( y < 1582 )
return FALSE;

if ( m < 1 || m > 12 )
return FALSE;

if ( d < 1 || d > mdays[ m-1 ] )
{
if ( isleap(y) && m == 2 && d == 29 )
return TRUE;
return FALSE;
}

return TRUE;
}

// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//
long int 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;

}

// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}

// ---------------------------------------------------------------------------------
int main( void )
{
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char *daynames[7] = {"Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"};
char *monthnames[12] = { "ΙΑΝ", "ΦΕΒ", "ΜΑΡ", "ΑΠΡ", "ΜΑΙ", "ΙΟΥΝ", "ΙΟΥΛ", "ΑΥΓ", "ΣΕΠ", "ΟΚΤ", "ΝΟΕ", "ΔΕΚ"};

int d1, m1, y1, d2, m2, y2;
long int jdn1, jdn2;

// διάβασμα 1ης ημερομηνίας (απαίτηση να είναι έγκυρη)
do {
printf("\n1η ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
if ( !validdate( d1, m1, y1, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
} while ( !validdate( d1, m1, y1, mdays ) );
jdn1 = date_2jdn( d1, m1, y1); // υπολογισμός Ιουλιανού αριθμού
printf( "\tΑντιστοιχεί σε: %s, %d %s %d (%ld) ",
daynames[ (jdn1 % 7) ], d1, monthnames[ m1-1], y1, jdn1
);
if ( isleap(y1) )
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');

// διάβασμα 2ης ημερομηνίας (απαίτηση να είναι έγκυρη και μικρότερη της 1ης)
do {
printf("\n2η ημερομηνία (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
if ( !validdate( d2, m2, y2, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
else {
jdn2 = date_2jdn( d2, m2, y2); // υπολογισμός Ιουλιανού αριθμού
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
}
} while ( !validdate(d2, m2, y2, mdays) || jdn2 > jdn1);
printf( "\tΑντιστοιχεί σε %s, %d %s %d (%ld) ",
daynames[ (jdn2 % 7) ], d2, monthnames[ m2-1], y2, jdn2
);
if ( isleap(y2) )
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');

// υπολόγισε τη διαφορά μεταξύ των ημερομηνιών σε ημέρες
printf("\n\nΟι ημερομηνίες απέχουν μεταξύ τους %ld ημέρες\n", jdn1-jdn2);

// υπολόγισε την ημερομηνία 10 μέρες πριν την 1η ημερομηνία
jdn_2date( &d1, &m1, &y1, jdn1-10);
printf("\n10 μέρες πριν από την 1η ημερομηνία είναι: %d %d %d\n", d1, m1, y1);
printf( "\tΑντιστοιχεί σε %s, %d %s %d (%ld) ",
daynames[ (jdn1-10) % 7 ], d1, monthnames[ m1-1], y1, jdn1-10
);
if ( isleap(y1) )
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');

// υπολόγισε την ημερομηνία 15 μέρες μετά τη 2η ημερομηνία
jdn_2date( &d2, &m2, &y2, jdn2+15);
printf("\n15 μέρες μετά από την 2η ημερομηνία είναι: %d %d %d\n", d2, m2, y2);
printf( "\tΑντιστοιχεί σε %s, %d %s %d (%ld) ",
daynames[ (jdn2+15) % 7 ], d2, monthnames[ m2-1], y2, jdn2+15
);
if ( isleap(y2) )
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');

printf("\npress ENTER to exit...");
fflush(stdin); getchar();

exit(0);
}

Τελευταία επεξεργασία από migf1 και 21 Ιουν 2011, 14:24, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 14:22

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

#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE !FALSE
#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )

// ---------------------------------------------------------------------------------
// Έλεγχος έγκυρης ημερομηνίας
//
int validdate( int d, int m, int y, int mdays[] )
{
if ( y < 1582 )
return FALSE;

if ( m < 1 || m > 12 )
return FALSE;

if ( d < 1 || d > mdays[ m-1 ] )
{
if ( isleap(y) && m == 2 && d == 29 )
return TRUE;
return FALSE;
}

return TRUE;
}

// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//
long int 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;

}

// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}

// ---------------------------------------------------------------------------------
// Καλλωπισμένο τύπωμα ημερομηνίας
//
void print_prettydate( int d, int m, int y, char *monthnames[], char *daynames[] )
{
long int jdn = date_2jdn( d, m, y ); // υπολογισμός Ιουλιανού αριθμού

// σημείωση: jdn % 7 δίνει την ημέρα της εβδμάδας ( 0=Δευ, ..., 6=Κυρ)
printf( "\tΑντιστοιχεί σε %s, %d %s %d (%ld) ",
daynames[ (jdn % 7) ], d, monthnames[ m-1], y, jdn
);
if ( isleap(y) ) // έχουμε δίεσκτο έτος
printf("ΔΙΣΕΚΤΟ ΕΤΟΣ");
putchar('\n');

return;
}
// ---------------------------------------------------------------------------------
int main( void )
{
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char *daynames[7] = {"Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"};
char *monthnames[12] = { "ΙΑΝ", "ΦΕΒ", "ΜΑΡ", "ΑΠΡ", "ΜΑΙ", "ΙΟΥΝ", "ΙΟΥΛ", "ΑΥΓ", "ΣΕΠ", "ΟΚΤ", "ΝΟΕ", "ΔΕΚ"};

int d1, m1, y1, d2, m2, y2;
long int jdn1, jdn2=0L;

// διάβασμα 1ης ημερομηνίας (απαίτηση να είναι έγκυρη)
do {
printf("\n1η ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
if ( !validdate( d1, m1, y1, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
} while ( !validdate( d1, m1, y1, mdays ) );

// καλλωπισμένο τύπωμα της 1ης ημερομηνίας
print_prettydate( d1, m1, y1, monthnames, daynames);

// διάβασμα 2ης ημερομηνίας (απαίτηση να είναι έγκυρη και μικρότερη της 1ης)
jdn1 = date_2jdn( d1, m1, y1);
do {
printf("\n2η ημερομηνία (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
if ( !validdate( d2, m2, y2, mdays ) )
puts("\tάκυρη ημερομηνία, δοκιμάστε ξανά");
else {
jdn2 = date_2jdn( d2, m2, y2); // υπολογισμός Ιουλιανού αριθμού
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
}
} while ( !validdate(d2, m2, y2, mdays) || jdn2 > jdn1);

// καλλωπισμένο τύπωμα της 2ης ημερομηνίας
print_prettydate( d2, m2, y2, monthnames, daynames);

// υπολόγισε & τύπωσε τη διαφορά μεταξύ των ημερομηνιών σε ημέρες
printf("\n\nΟι ημερομηνίες απέχουν μεταξύ τους %ld ημέρες\n", jdn1-jdn2);

// υπολόγισε & τύπωσε καλλωπισμένα την ημερομηνία 10 μέρες πριν την 1η ημ/νία
puts("10 μέρες πριν την 1η ημερμηνία....");
jdn_2date( &d1, &m1, &y1, jdn1-10);
print_prettydate( d1, m1, y1, monthnames, daynames);

// υπολόγισε & τύπωσε καλλωπισμένα την ημερομηνία 15 μέρες μετά την 2η ημ/νία
puts("15 μέρες μετά την 2η ημερμηνία....");
jdn_2date( &d2, &m2, &y2, jdn2+15);
print_prettydate( d2, m2, y2, monthnames, daynames);

printf("\npress ENTER to exit...");
fflush(stdin); getchar();

exit(0);
}

Τελευταία επεξεργασία από migf1 και 21 Ιουν 2011, 14:34, έχει επεξεργασθεί 2 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό medigeek » 21 Ιουν 2011, 14:28

Διορθώθηκε! Για το setlocale είναι νωρίς ακόμη. :P
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 14:28

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

ΠροηγούμενηΕπόμενο

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