Προς το περιεχόμενο

Άσκηση στη C


kaizoku_oni

Προτεινόμενες αναρτήσεις

Kalh xronia se olous/es.

 

Loipon mia askhsh sthn C h opoia m leei 

 

 

 

Σκοπός της άσκησης είναι η δημιουργία ενός προγράμματος το οποίο θα ζητά από το χρήστη
3 ακεραίους αριθμούς οι οποίοι θα αντιστοιχούν σε ημέρα, μήνα και έτος μιας ημερομηνίας,
και θα έχει ως αποτέλεσμα τον υπολογισμό του ονόματος της ημέρας στην οποία αντιστοιχεί
η ημερομηνία αυτή. Για παράδειγμα, αν κάποιος εισάγει ημέρα 11, μήνα 12 και έτος 2012, το
αποτέλεσμα του προγράμματος θα είναι ”Tuesday”.
Το πρόγραμμα θα πρέπει να ορίσει μια συνάρτηση η οποία να δέχεται ως παράμετρο μια ακέ-
ραια τιμή έτους και να αποφασίζει αν το έτος αυτό είναι δίσεκτο ή όχι. Μια δεύτερη συνάρτηση
η οποία να δέχεται ως παραμέτρους 2 ακέραιες τιμές (μήνα και έτους) και να επιστρέφει το
πλήθος των ημερών του μήνα αυτού.
Χρησιμοποιώντας τις συναρτήσεις αυτές, το πρόγραμμά σας θα πρέπει να υπολογίζει πόσες
ημέρες έχουν περάσει από την 1/1/1800, όπου ήταν ημέρα Τετάρτη (Wednesday). Στη συνέχεια,
υπολογίζοντας το υπόλοιπο ως προς 7 του πλήθους αυτού, θα βρίσκει εύκολα τη μέρα στην οποία
αντιστοιχεί η δοθείσα ημερομηνία.
 
 
exw kanei mexri edw .
Parakalw na me helparei kapoios m leipei apoti katalavainw dld eimai k ligo asxetos
to na dinw mhna kai etos kai na vrei to programma poses meres exei o mhnas me parametrous mhna etos.
 
Euxaristwwwwwwwww poluuu
 
#include<stdio.h>
#include<stdlib.h>
main()
{
 
 int d,m,y,year,month,day,i,n,y1;
 
 
 printf("dwste ena etos :");
 scanf("%d",&y1);
 
  
  //Euresh etous ean einai disekto h oxi 
  // Arxh
  
if(y1%4 == 0 || y1%400 == 0)
{
printf("To etos einai disekto \n");
}
 
else if(y1%100 != 0)
{
printf("To etos %d den einai disekto \n");
}
//Telos
 
 
printf("Dwse mera mhna etos \n");
scanf("%d%d%d",&d,&m,y);
 if( d>31 || m>12 || (y< 0 || y>=3000) )
  {
   printf("INVALID INPUT");
   exit(0);
  }
 
 
 
 
 
 year = y-1900;
 year = year/4;
 year = year+y-1900;
 switch(m)
  {
   case 1:
   case 10:
            month = 1;
            break;
   case 2:
   case 3:
   case 11:
            month = 4;
            break;
   case 7:
   case 4:
           month = 0;
           break;
   case 5:
           month = 2;
           break;
   case 6:
           month = 5;
           break;
   case 8:
           month = 3;
           break;
   case 9:
   case 12:
           month = 6;
           break;
  }
 year = year+month;
 year = year+d;
 day  = year%7;
 switch(day)
  {
   case 0:
           printf("H mera einai Savvato -SATURDAY- \n");
           break;
   case 1:
           printf("H mera einai Kuriaki -SUNDAY- \n");
           break;
   case 2:
           printf("H mera einai Deutera -MONDAY- \n");
           break;
   case 3:
           printf("H mera einai Trith -TUESDAY- \n");
           break;
   case 4:
           printf("H mera einai Tetarth -WEDNESDAY- \n");
           break;
   case 5:
           printf("H mera einai Pempti -THURSDAY- \n");
           break;
   case 6:
           printf("H mera einai Paraskeuh -FRIDAY- \n");
           break;
  }
  system("pause");
}
 
 
 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κατ'αρχήν η άσκηση σου λέει να φτιάξεις δύο συναρτήσεις, η μία να βρίσκει αν το έτος είναι δίσεκτο και η άλλη να σου επιστρέφει τον αριθμό των ημερών ενός συγκεκριμένου μήνα κάποιου έτους. Πρέπει λοιπόν να φτιέξεις δύο συναρτήσεις της μορφής:

int is_leap(int year);
{ /* Κώδικας που θα βρίσκει αν ειναι δισεκτο ή όχι */

   return ( 1 ή 0 ) ανάλογα αν ειναι δίσεκτο ή όχι
}

int days_of_month (int month, int year)
{
   /* κωδικας που θα υπολογίζει τις ημέρες του μήνα (ελέγχωντας αν είναι δίσεκτο ή όχι) */

   return (number_of_days);
}

Αυτές τις συναρτήσεις πρεπει να τις καλεις από την main...

 

Επίσης μου φαίνεται ότι ο έλεγχος που κάνεις για τα δίσεκτα έτη είναι λάθος...

(Δεν έχω πολύ χρόνο τώρα για πιο αναλύτική περιγραφή... :S )

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ο υπολογισμός του δίσεκτου είναι σίγουρα λάθος μιας και είναι αμέσως φανερό πως αυτό δεν έχει νόημα:

 

 

if(y1%4 == 0 || y1%400 == 0)

 

Αν το y1 % 4 είναι μηδέν τότε προφανώς και το y1 % 400 είναι επίσης μηδέν, που σημαίνει ότι η σχέση είναι πλεονάζουσα και το y1 % 400 μπορεί να φύγει, που σημαίνει ότι κάτι πάει πολύ στραβά.

 

Ο αλγόριθμος είναι "αν διαιρείται με 4 είναι δίσεκτο, εκτός αν διαιρείται με 100 οπότε δεν είναι, εκτός αν διαιρείται με 400 οπότε τελικά είναι". Αυτό όμως ισχύει για το Γρηγοριανό ημερολόγιο που καθιερώθηκε το 1582, και πριν από αυτό το έτος ο υπολογισμός γίνεται διαφορετικά μέχρι και το έτος 8 μ.Χ., πριν το οποίο τα πράγματα γίνονται πολύ στραβά. Έχω απαντήσει λεπτομερώς σε μια σχετική ερώτηση στο StackOverflow όπου αναφέρω όλες τις λεπτομέρειες.

Επεξ/σία από defacer
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επειδη ειμαι χαρουμενος. Ειχα κανει παρομοια εργασια πριν 2 - 3 χρονια. ΟΛΗ ΔΙΚΗ ΣΟΥ:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int j, i, days = 0, month, year, day, daysofweek, daysofmonth;	/*  i, j einai voithitikes, days metraei poses meres perasan apo 1/1/2010 pou itan mera parakseui */
	/* daysofweek ti hrisimopoioume gia na vroume tis imeres tis prwtis ebdomadas */


	do {
		printf("Enter birthdate: (MM - YYYY)\n");
		scanf("%d - %d", &month, &year);	/* pernei etos kai mina apton xristi */
	} while (month < 1 || year < 1 || month > 12 || year > 2009);

	for (i = 2009; i >= year; i--)
		if (i % 400 == 0) {
			days = days + 366;
		}

		else if (i % 4 == 0 && i % 100 != 0) {	/* tsekarei an einai dusekto to etos */
			days = days + 366;
		}

		else {
			days = days + 365;
		}

	for (j = 1; j < month; j++) {
		if (year % 400 == 0) {
			if (j == 1 || j == 3 || j == 5 || j == 7 || j == 8 || j == 10 || j == 12) {
				days = days - 31;
			}

			else if (j == 4 || j == 6 || j == 9 || j == 11) {
				days = days - 30;
			}

			else {
				days = days - 29;
			}
		}
		/* tsekarei mina fevrouario klp */
		else if (year % 4 == 0 && year % 100 != 0) {
			for (j = 1; j < month; j++) {
				if (j == 1 || j == 3 || j == 5 || j == 7 || j == 8 || j == 10 || j == 12) {
					days = days - 31;
				}

				else if (j == 4 || j == 6 || j == 9 || j == 11) {
					days = days - 30;
				}

				else {
					days = days - 29;
				}
			}
		}

		else {
			for (j = 1; j < month; j++) {
				if (j == 1 || j == 3 || j == 5 || j == 7 || j == 8 || j == 10 || j == 12) {
					days = days - 31;
				}

				else if (j == 4 || j == 6 || j == 9 || j == 11) {
					days = days - 30;
				}

				else {
					days = days - 28;
				}
			}
		}
	}


	printf(" Mon Tue Wed Thu Fri Sat Sun\n");

	switch (days % 7) {
	case 0:
	case 1:
	case 2:					/* vazw ta katalila  kena gia na arhisei na metraei i prwti tou mina aptin swsti mera */
	case 3:
	case 4:{
		for (i = 0; i < 4 - days % 7; i++)
			printf("    ");
		break;
	}
	case 5:{
		for (i = 0; i < (days % 7) + 1; i++)
			printf("    ");
		break;
	}
	case 6:{
		for (i = 0; i < (days % 7) - 1; i++)
			printf("    ");
		break;
	}
	}

	if (month == 2) {
		if (year % 400 == 0) {
			daysofmonth = 29;
		}

		else if (year % 4 == 0 && year % 100 != 0) {
			daysofmonth = 29;
		}

		else {
			daysofmonth = 28;	/* upologizw tis meres tou kathe mina */
		}
	}

	else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
		daysofmonth = 31;
	}

	else {
		daysofmonth = 30;
	}

	daysofweek = i;

	for (day = 1; day <= daysofmonth; day++) {
		printf("%4d", day);
		/* emfanizw to mina */
		if (++daysofweek > 6) {
			daysofweek = 0;
			printf("\n");
		}
	}

	return (0);
}
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Εφόσον είσαι αρχάριος, κι εφόσον η άσκηση δώθηκε επί Ευρωπαϊκού εδάφους, τότε επειδή η συντριπτική πλειοψηφία των Ευρωπαϊκών χωρών έχει αποδεχτεί επίσημα το Γρηγοριανό Ημερολόγιο , αλλά και τεράστιες χώρες όπως η Κίνα, η Ινδία και η Αμερική (+Καναδάς) (http://www.webexhibits.org/calendars/year-countries.html) τότε θεωρώ πως δεν χρειάζεται να ασχοληθείς με άλλα ημερολόγια, κι απλώς να το επισημάνεις στην τεκμηρίωση της άσκησης. Άλλωστε μιλάμε για άσκηση.

 

Το "τρικ" είναι να μετατρέπεις την ημερομηνία εισόδου σε Julian Day Number κι απο εκεί και πέρα όλα τα υπόλοιπα γίνονται εύκολα (π.χ. το weekday το υπολογίζεις από το υπόλοιπο της διαίρεσης JDN % 7).

 

Σε αυτό το link θα βρεις ένα πρόγραμμα που είχα φτιάξει παλαιότερα, με διαφόρων ειδών υπολογισμούς μεταξύ Γρηγοριανών ημερομηνιών. Διατίθεται ελεύθερα με τεκμηρίωση (ρίξε μια ματιά και στην ενότητα Background για να ξέρεις τι ακριβώς πρέπει να περιμένεις από το πρόγραμμα) καθώς και με πλήρη πηγαίο κώδικα σε σκέτη, ANSI C.

 

EDIT:

 

Διόρθωση του 1ου link για το πρόγραμμα (παρέπεμπε στην τεκμηρίωση αντί για την σελίδα κατεβάσματος).

Επεξ/σία από migf1
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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




main()
{       int kurio;
        int y;                  /* year */
        int m;                  /* month */
        int d;                  /* date (day) */
        int zhtmera;            /* day of the week */
        int etos;
        
        START:
              
        printf("Poio thelete na ektelestei apo ta parakatw:\n 1:An ena etos einai disekto h oxi \n 2: Poses meres exoun perasei apo 1/1/1800 \n 3:Euresh meras apo dwsmenh hmerominia \n 4:Exit \n ---------------------------------------------------------------------- \n");
        scanf("%d", &kurio);
        
        switch (kurio)
        {
               case 1:
                    {
                    goto disekto;
                    break;
        }
               case 2:
                    {
                    goto meres1800;
                    break;
        }
               case 3:
                    {
                    goto zmera;
                    break;
        }
               case 4:
                   
                    {     
                          
                          puts("Kalh sas mera");
                          
                          exit(0);
        }
               default:
                {
                        printf("Lathos epilogh. \n");
                        puts("////////////////////////////////////////////////////////////////////////////////");
                        goto START;
                }
                }
                   
////////////////////////////////////////////////////////////////////////////////                    
        
        // Epilogh 1
        
        disekto: 
                 printf("Dwste to etos:\n");
                 scanf("%d", &etos);
                 
                 if(etos%4 == 0 || etos%400 == 0)
                      {
                        puts("To etos einai disekto \n");
                        
                          }
                         

                    else if(etos%100 != 0)
                        {
                       puts("To etos den einai disekto \n");
                       
                          }
                          goto START;
                      
                      
                      
////////////////////////////////////////////////////////////////////////////////
        
        
        //Epilogh 2
        meres1800:
        
        
        
                    
        // Epilogh 3 
        
        zmera:
                        
        printf("Dwste to etos:\n");
        scanf("%d", &y);
        printf("Dwste ton mhna:\n");
        scanf("%d", &m);

        if (m < 3)
                {
                        m = m + 12;
                        y = y - 1;
                }

        printf("Dwste thn mera: \n");
        scanf("%d", &d);


        zhtmera = (d + (2 * m) + ((6 * (m + 1)) / 10) + y + (y / 4) - 				

(y / 100) + (y / 400) + 1) % 7;

        switch (zhtmera)
        {
                case 0:
                {
                        puts("The day is Sunday.");
                        break;
                }
                case 1:
                {
                        puts("The day is Monday.");
                        break;
                }
                case 2:
                {
                        puts("The day is Tuesday.");
                        break;
                }
                case 3:
                {
                        puts("The day is Wednesday.");
                        break;
                }
                case 4:
                {
                        puts("The day is Thursday.");
                        break;
                }
                case 5:
                {
                        puts("The day is Friday.");
                        break;
                }
                case 6:
                {
                        puts("The day is Saturday.");
                        break;
                }
                default:
                {
                        puts("Kapou egine lathos");
                }
        }
        goto START;
        return 0;
        
}

 

Mexri edw exw kanei me merikes metatropes.To mono p mou leipei twra einai na valw sthn epilogh 2 poses meres exoun perasei apo 1/1/1800 mexri shmera ..... auto to mexri shmera to vlepw ligo dyskolo ... help :P  

Euxaristw gia thn vohtheia sas.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα,

 

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

 

Απο εκεί και πέρα, τα loops στην C δεν γίνονται με goto, αλλά με κάποιο ή κάποια από τα 3 loop structures που παρέχει η γλώσσα: for, while και do-while.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα,

 

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

 

Απο εκεί και πέρα, τα loops στην C δεν γίνονται με goto, αλλά με κάποιο ή κάποια από τα 3 loop structures που παρέχει η γλώσσα: for, while και do-while.

Bro se euxaristw apla egw den ta katalavainw auto me to jnd :/  kserw pws h goto einai gtp gia programatistes  apla thn evala gia pio eukolh katanohsh gia mena kai kanw terastio kwdika kai elpizw na mhn m afairesei monades apo thn ergasia :P 2 monades dinei , mou arkei na ektelei to programa oti zhtaei 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συνήθως οι καθηγητές μηδενίζουν όσες εργασίες περιέχουν goto αντί για loop.

Εστειλα μνμ στον καθηγητη για την goto ελπιζω να ειναι ενταξει με αυτο.

 

 


        //Epilogh 4
        mhnaetos:
                 printf("Dwste ton mhna \n");
                 scanf("%d", &mhna);
                 printf("Dwste to etos \n");
                 scanf("%d", &etos1);
                 
                 if (mhna == 4 || mhna == 6 || mhna == 9 || mhna == 11)
	                                numbdays = 30;
	                                
	                                else if (mhna == 02)
                                 	{
		                 disetos=(etos1 % 4 == 0 && etos1 % 100 != 0) || (etos1 % 400 == 0);
			
	                               	if (disetos == 0)
		                                  	numbdays = 29;
	                                              	else
		                                	numbdays = 28;
                                   	}
	                                            	else
	                                                	{
	                                       	numbdays = 31;
                                   printf("Meres: %d",numbdays);
                                    }
                  

 

 

 

πως σου φαινετε ? μετραω ποσες μερες εχει ο μηνας απο μηνα κ ετος. Αλλα μ βγαζει λαθος στο printf ειναι δηλωμενα σε int ολα

 

akuro eixa valei %numbdays ... :P alla pali den m leitourgei to kommati gia na vrw poses meres exei o mhnas apo mhna k etos :/

 

 

 

Επειδη ειμαι χαρουμενος. Ειχα κανει παρομοια εργασια πριν 2 - 3 χρονια. ΟΛΗ ΔΙΚΗ ΣΟΥ:


	if (month == 2) {
		if (year % 400 == 0) {
			daysofmonth = 29;
		}

		else if (year % 4 == 0 && year % 100 != 0) {
			daysofmonth = 29;
		}

		else {
			daysofmonth = 28;	/* upologizw tis meres tou kathe mina */
		}
	}

	else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
		daysofmonth = 31;
	}

	else {
		daysofmonth = 30;
	}


Σου πηρα κωδικα ευχαριστω

 

Συνήθως οι καθηγητές μηδενίζουν όσες εργασίες περιέχουν goto αντί για loop.

 

Κανενα προβλημα απο τον καθηγητη με την goto καλυμενος ειμαι ευχαριστω για την πρειδοποιηση .

 

Μπορεις να βε βοηθησεις λιγο με το κομματι στο ποσες μερες εχουν περασει απο 1/1/1800 μεχρι σημερα?

Αν φυσικα εχεις χρονο.

Ευχαριστω ξανα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

[..]Μπορεις να βε βοηθησεις λιγο με το κομματι στο ποσες μερες εχουν περασει απο 1/1/1800 μεχρι σημερα?

Αν φυσικα εχεις χρονο.

Ευχαριστω ξανα

Αν και θεωρώ ως καλύτερη λύση το JulianDate (JD) αφού είσαι υποχρεωμένος να την λύσεις με τις προαναφερθείσες συναρτήσεις τότε..

 

01. Καταρχήν μετράμε όλες τις ημέρες όλων των μηνών από το 1800 ως έναν χρόνο πριν το τρέχον έτος της ημερομηνίας μας.

 

02. Ύστερα μετράμε όλες τις ημέρες όλων των μηνών του έτους μας μέχρι τον προηγούμενο μήνα από τον μήνα της ημερομηνίας μας.

 

03. Τέλος προσθέτουμε όλες τις ημέρες του τρέχοντος μηνός ως την προτελευταία από την ημέρα της ημερομηνίας μας (ή και την τελευταία ημερομηνία - εξαρτάται αν θέλουμε να συνυπολογίζουμε και την τρέχουσα ημερομηνία στο μέτρημα).

 

Τελικά θα έχουμε το συνολικό αριθμό ημερών από την 1-1-1800, για να δουλέψουν τα παραπάνω προϋπόθεση είναι πως οι δυο συναρτήσεις μας λειτουργούν σωστά σε κάθε περίπτωση.

 

 

/* Days count, xdir. */

#include <stdio.h>

#define _WHOLE_DAY	/* Count whole days only */

#define _JAN	1
#define _DEC   12

unsigned char _leap_year(const int Y);
unsigned short _month_days(const int M, const int Y);
unsigned long _days_from(const D, const int M, const int Y);

int main(void)
{
	printf("Days from 01-01-1800 to 05-01-2013 = %ld\n", _days_from(5, 1, 2013));

	puts("\nPress Enter to exit..");

	getchar();
	return 0;
}

unsigned char _leap_year(const int Y)
{
	if(!(Y % 400))
		return 1;
	else
		if(!(Y % 100))
			return 0;
		else
			if(!(Y % 4))
				return 1;

	return 0;
}

unsigned short _month_days(const int M, const int Y)
{
	return M == 2 ? (_leap_year(Y) ? 29: 28): (M == 4 || M == 6  || M == 9 || M == 11) ? 30: 31;
}

unsigned long _days_from(const D, const int M, const int Y)
{
	int cy, cm, cd;

	unsigned long d = 0;

	/* Sum days up to last 'Y' year */
	for(cy = 1800; cy != Y; cy++)
		for(cm = _JAN; cm <= _DEC; cm++)
			d += _month_days(cm, cy);
	/* Sum days up to last 'M' month of year 'Y' */
	for(cm = _JAN; cm != M; cm++)
		d += _month_days(cm, Y);
	/* Sum days up to previous day 'D' (when _WHOLE_DAY) of month 'M' of year 'Y' */
	#ifdef _WHOLE_DAY
	for(cd = 1; cd < D; cd++)
	#else
	for(cd = 1; cd <=D; cd++)
	#endif
		d++;

	/* The days! */
	return d;
}
ΕΞΟΔΟΣ:

Με ενεργό το _WHOLE_DAY:

Days from 1-1-1800 to 05-01-2013 = 77801

Press Enter to exit..
Δίχως ενεργό το _WHOLE_DAY:
Days from 01-01-1800 to 05-01-2013 = 77802

Press Enter to exit..
* Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες (είναι γραμμένο στα γρήγορα, σε πραγματικά προγράμματα υπάρχουν θαυμάσιες & αξιόπιστες ρουτίνες για όλα τα παραπάνω :)).

** Αν έχει ορισθεί το _WHOLE_DAY τότε το πρόγραμμα υπολογίζει ως μια μέρα λιγότερη από την τρέχουσα, διαφορετικά υπολογίζει και την τρέχουσα.

*** Ο Editor του Insomnia προσθέτει μόνος του κενά στην αρχή του κώδικα!!

 

 

Επεξ/σία από Directx
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...