Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    84

    [C] Programma calendario

    Ciao a tutti vorrei fare in C un semplice programmino che mi ricorda un appuntamento ogni tot giorni. Per esempio io decido che l'appuntamento è ogni 60 giorni. Inizialmente inserisco la data di oggi e quella dell'ultimo appuntamento e poi il programma automaticamente mi calcola quando sarà il prossimo appuntamento (gg/mm/aa). Sembra semplice ma i mesi non hanno tutti lo stesso numero di giorni. Come si potrebbe fare?

  2. #2
    ci sono innumerevoli sistemi per fare quello che desideri.
    Prova tu a buttare giù qualcosa e a proporlo (tip: vettore con numeri di giorni per mese; funzione che calcola se l'anno è bisestile)
    ciao
    sergio

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    84
    Quindi potrei fare un vettore per ogni mese dell'anno con i rispettivi giorni. Ma se per esempio devo inserire una data (es. 16/03/08) e l'appuntamento deve essere 20 giorni dopo questa data (cioè il 5 aprile), come si fa a spiegare al programma che alla fine del vettore marzo i 5 giorni che avanzano vanno contati in aprile?

  4. #4
    no, un vettore unico di 12 elementi che contenga per ogni elemento il numero di giorni che ha quel mese, vettore che chiamo giorniNelMese, che avrà 31,28,31,30 ......, rispettivamente per gennaio, febbraio ....
    Se tu sei al 15/3/08 e devi andare avanti di 20 giorni devi fare 15+20 -i giorni del mese che ci sono a marzo.
    Tieni presente che questo lo puoi fare come esercizio perchè le funzioni che cerchi già esistono.
    Comunque ti potresti scrivere due funzioni, una che ti calcola i giorni che sono trascorsi da una tua data di riferimento (se le tue date sono tutte maggiori del 1/1/2008) potresti partire da questa data. Questa funzione deve iterare su tutti i mesi dell'anno, tenendo conto dell'anno bisestile.
    Poi dovrai scrivere una funzione che, dato il numero di giorni trascorso dall'1/1/2008 ti ritorni una data.
    Per calcolarti la data trascorso un certo numero di giorni da una data prefisata ti calcoli prima il numero di giorni dall'1/1/2008 di questa data prefissata, ci sommi i giorni che vuoi che trascorrano, e decodifichi il tutto trovando la data.
    Per esempio la funzione che ti ritorna il numero di giorni trascorsi dal 1/1/2008 potrebbe essere del tipo
    codice:
    int giorniDa2008 (int giorno, int mese, int anno)
    {
      int giorni = 0;
      for (int i = 2008; i < anno; i++) {
        giorni += 365 + bisestile(i);
      }
      for (int j = 0; j < mese; j++)
        giorni += giorniNelMese[i] + (j==1) ? bisestile(anno)) ;
      return (giorni + giorno);
    }
    la funzione
    int bisestile(int anno) ;
    ritorna 1 se l'anno è bisestile, altrimenti 0.
    spero che ti serva
    ciao
    sergio

  5. #5
    Questa serie di funzioni dovrebbe esserti utile:

    codice:
    typedef struct tagData
    {
    	short Giorno;
    	short Mese;
    	short Anno;
    } Data;
    
    /*Restituisce 1 se l'anno è bisestile, 0 altrimenti*/
    int IsAnnoBisestile(short nAnno)
    {
    	if ( nAnno % 4 != 0 )
    	{
    		return 0;
    	}
    	else
    	{
    		if ( nAnno % 100 != 0 )
    			return 1;
    		else if ( nAnno % 400 != 0 )
    			return 0;
    		else
    			return 1;
    	}
    }
    
    int GiorniNelMese(short nMese, short nAnno)
    {
    	switch ( nMese )
    	{
    	case 2:
    		if ( IsAnnoBisestile(nAnno) )
    			return 29;
    		else
    			return 28;
    
    	case 4:
    	case 6:
    	case 9:
    	case 11:
    		return 30;
    
    	default:
    		return 31;
    	}
    }
    
    /* Somma nGiorni alla data dt e restituisce la data corrispondente*/
    Data SommaGiorni(Data dt, unsigned int nGiorni)
    {
    	Data dtRet;
    
    	dtRet.Giorno = dt.Giorno;
    	dtRet.Mese = dt.Mese;
    	dtRet.Anno = dt.Anno;
    
    	for ( int i = 0; i < nGiorni; i++ )
    	{
    		if ( dtRet.Giorno < GiorniNelMese(dtRet.Mese, dtRet.Anno) )
    		{
    			dtRet.Giorno++;
    		}
    		else
    		{
    			dtRet.Giorno = 1;
    			if ( dtRet.Mese != 12 )
    			{
    				dtRet.Mese++;
    			}
    			else
    			{
    				dtRet.Mese = 1;
    				dtRet.Anno++;
    			}
    		}
    	}
    
    	return dtRet;
    }
    
    /* Sottrae nGiorni alla data dt e restituisce la data corrisponente*/
    Data SottraiGiorni(Data dt, unsigned int nGiorni)
    {
    	Data dtRet;
    
    	dtRet.Giorno = dt.Giorno;
    	dtRet.Mese = dt.Mese;
    	dtRet.Anno = dt.Anno;
    
    	for ( int i = 0; i < nGiorni; i++ )
    	{
    		if ( dtRet.Giorno > 1 )
    		{
    			dtRet.Giorno--;
    		}
    		else
    		{
    			if ( dtRet.Mese > 1 )
    			{
    				dtRet.Mese--;
    				dtRet.Giorno = GiorniNelMese(dtRet.Mese, dtRet.Anno);
    			}
    			else
    			{
    				dtRet.Giorno = 31;
    				dtRet.Mese = 12;
    				dtRet.Anno--;
    			}
    		}
    	}
    
    	return dtRet;
    }
    
    /*
    ConfrontaDate restituisce:
    zero se le due date sono uguali;
    un valore maggiore di zero se dt1 > dt2;
    un valore minore di zero se dt1 < dt2.
    */
    int ConfrontaDate(Data dt1, Data dt2)
    {
    	if ( dt1.Anno == dt2.Anno && dt1.Mese == dt2.Mese && dt1.Giorno == dt2.Giorno )
    		return 0;
    	else if (dt1.Anno == dt2.Anno ?
    			dt1.Mese == dt2.Mese ?
    			dt1.Giorno > dt2.Giorno :
    			dt1.Mese > dt2.Mese :
    			dt1.Anno > dt2.Anno)
    		return 1;
    	else
    		return -1;
    }
    
    /* Calcola la differenza in giorni tra due date */
    int Differenza(Data dt1, Data dt2)
    {
    	int nRet = 0;
    	Data d1;
    	Data d2;
    
    	if ( ConfrontaDate(dt1, dt2) == 0 )
    		return 0;
    	else if ( ConfrontaDate(dt1, dt2) > 0 )
    	{
    		d1 = dt2;
    		d2 = dt1;
    	}
    	else
    	{
    		d1 = dt1;
    		d2 = dt2;
    	}
    
    	do
    	{
    		nRet++;
    		d1 = SommaGiorni(d1, 1);
    	} while ( ConfrontaDate(d1, d2) != 0 );
    
    	return nRet;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.