Δίσεκτα έτη - C

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

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

Δίσεκτα έτη - C

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

Πως μου ήρθε η ιδέα για τέτοιο πρόγραμμα δεν ξέρω αλλά όπως και να έχει εδώ είναι ο κώδικας:
Κώδικας: Επιλογή όλων

#include <stdio.h>

int main (void)
{
int a, b, c;

printf ("Α.Ε > 400 | Τ.Ε < 9999 | Α.Ε < Τ.Ε\n");

do {

do {
printf ("Αρχικό έτος: ");
scanf ("%d", &a);
} while (a < 400);

do {
printf ("Τελικό έτος: ");
scanf ("%d", &b);
} while (b > 9999);

} while (a > b);

for (c = a; c <= b; c++) {
if (c % 4 == 0 && c % 100 != 0)
printf ("Το έτος %d είναι δίσεκτο.\n", c);
else if (c % 400 == 0)
printf ("Το έτος %d είναι δίσεκτο.\n", c); }


return 0;
}
Τελευταία επεξεργασία από UnKnown96 και 12 Απρ 2012, 16:08, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Δίσεκτα έτη - C

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

Βασικά ο ολοκληρωμένος τύπος για το αν είναι ένα έτος δίσεκτο ή όχι μπορεί να εκφραστεί με ένα macro (ή μια συνάρτηση):

Κώδικας: Επιλογή όλων
#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )

Οπότε απλοποιείς το loop σου, σε κάτι σαν το παρακάτω:

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

for (c = a; c <= b; c++)
if ( isleap(c) )
printf ("Το έτος %d είναι δίσεκτο.\n", c);

Αυτό και πάρα πολλά περισσότερα σχετικά με ημερομηνίες μπορείς να δεις και στο κώδικα του προγράμματος που έχω ποστάρει εδώ: viewtopic.php?f=6&t=18996
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Δίσεκτα έτη - C

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

Μια παραπλήσια υλοποίηση, που δεν επηρεάζεται από τη σειρά με την οποία θα δοθούν το αρχικό και το τελικό έτος και δεν υποφέρει και από το γνωστό πρόβλημα της scanf με τα απομεινάρια στο buffer της κύριας εισόδου ;)

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

#include <stdio.h>

#define validyear(y) ( (y) > 399 && (y) < 10000 )
#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )

int main (void)
{
char inbuf[256]="";
int y1, y2, y, dummy;

puts ("ΣΗΜΕΙΩΣΗ: έγκυρα έτη από 400 έως 9999\n");
do {
printf("Δώστε αρχικό & τελικό έτος (π.χ. 400 9999 ): ");
fgets(inbuf, 256, stdin);
dummy = sscanf(inbuf, "%d %d", &y1, &y2);
} while ( dummy < 2 || !validyear(y1) || !validyear(y2) );

if ( y1 > y2 ) {
dummy = y1;
y1 = y2;
y2 = dummy;
}

puts("\nΔίσεκτα Έτη:");
for (y = y1; y < y2+1; y++)
if ( isleap(y) )
printf ("%4d ", y);
puts("\n");

return 0;
}

Δείγμα Εξόδου:

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

Re: Δίσεκτα έτη - C

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

Ένας πιο καλός και καθαρός κώδικας από τον αρχικό μου.

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

#include <stdio.h>

int main (void) {

int a, b, c;

do {
printf ("Years range: ");
scanf ("%d %d", &a, &b);
} while (a < 400 || b > 9999 || a > b);

puts ("\nLeap years:\n===========\n");

for (c = a; c <= b; c++) {
if ( (c % 4 == 0 && c % 100 != 0) || (c % 400 == 0) )
printf ("%4d ", c); }

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

Re: Δίσεκτα έτη - C

Δημοσίευσηαπό gr.ant » 18 Αύγ 2011, 14:07

Άνοιξε kernighan ritcie να βρεις το πρόγραμμα.
gr.ant
babeTUX
babeTUX
 
Δημοσιεύσεις: 15
Εγγραφή: 04 Ιούλ 2011, 16:47
Εκτύπωση


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

cron