Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    153

    giorno progressimo dal 1/1 e della settimana

    salve, volevo sapere se qualcuno sapeva calcolare il numero progressivo di una data dall'inizio dell'anno. Per esempio il 31/gennaio è il 31-esimo giorno ecc. E sapere il giorno della settimana di una qualsiasi data che va dal 1900 fino al 2099.

    Per il giorno progressivo dal 1/1 non so da dove partire!!!!
    ---edit ho provato a scrivere questo ma non da i risultati sperati:
    anzi sembra che dia i risultati sperati ma non sono sicuro!
    Codice PHP:
        int giorno=4;
        
    int mese=12;
        
    int anno=2008;

        
    int n=0;

        for(
    int i=1;i<12;i++){
            if(
    i<mese)
                switch(
    i){
                    case 
    1:n=n+31;break;
                    case 
    2:anno%4==0?n+=29:n+=28;break;
                    case 
    3:n+=31;break;
                    case 
    4:n+=30;break;
                    case 
    5:n+=31;break;
                    case 
    6:n+=30;break;
                    case 
    7:n+=31;break;
                    case 
    8:n+=31;break;
                    case 
    9:n+=30;break;
                    case 
    10:n+=31;break;
                    case 
    11:n+=30;break;
                }
            else{
                
    n+=giorno;
                break;
            }

        }

        
    cout<<n
    Per il giorno della settimana ho invece pensato di usare questa formula trovata in rete
    Codice PHP:

    Metodo della formula per stabilire il giorno della settimana

    Si può stabilire il giorno della settimana relativo a qualsiasi data successiva al 15
    -10-1582 anche mediante l'applicazione di questa formula:

    x = N + (q)(N - 1) : 4 - (q)(N - 1) : 100 + (q)(N - 1) : 400 + t
    dove N è l'
    anno relativo alla data che interessa, (q)(1) : , (q)(1) : 100 e (q)(1) : 400 sono la parte intera dei quozienti delle tre divisioni di (1rispettivamente per 4per 100 e per 400 e t rappresenta la data annuale del giorno consideratoovvero il numero di giorni trascorsi dall'inizio dell'anno fino al giorno stesso (compreso).

    Una volta calcolato xoccorrerà trovare il resto della divisione

    7
    fonte
    cogli l'attimo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    153
    ok ci sono riuscito da solo se a qualcuno può interessare ecco le due funzioni:
    Codice PHP:
    int GIORNO::calcola_giorno_anno(int giorno,int mese,int anno){//calcola il numero del giorno dal 1/1
        
    int n=0;

        for(
    int i=1;i<12;i++){
            if(
    i<mese)
                switch(
    i){
                    case 
    1:n=n+31;break;
                    case 
    2:anno%4==0?n+=29:n+=28;break;
                    case 
    3:n+=31;break;
                    case 
    4:n+=30;break;
                    case 
    5:n+=31;break;
                    case 
    6:n+=30;break;
                    case 
    7:n+=31;break;
                    case 
    8:n+=31;break;
                    case 
    9:n+=30;break;
                    case 
    10:n+=31;break;
                    case 
    11:n+=30;break;
                }
            else{
                
    n+=giorno;
                break;
            }

        }

        return 
    n;

    e

    Codice PHP:
    int GIORNO::calcola_giorno_set(int giorno,int mese,int anno){//calcola il giorno della settimana in base
        //ai valori di giorno, mese e anno, è valido solo dalla riforma gregoriana in avanti! per il calendario giuliano c'è un'altra formula più semplice
        
    int s;
        
    s=anno+(anno-1)/4-(anno-1)/100+(anno-1)/400+n;//formula presa da internet
        
    s=s%7;
        switch(
    s){
            case 
    0:s=6;break;//sabato
            
    case 1:s=7;break;//domenica
            
    case 2:s=1;break;//lunedi
            
    case 3:s=2;break;//martedi
            
    case 4:s=3;break;//mercoledi
            
    case 5:s=4;break;//giovedi
            
    case 6:s=5;break;//venerdi
        
    }
        return 
    s;

    cogli l'attimo

  3. #3
    Originariamente inviato da c_junior
    ok ci sono riuscito da solo se a qualcuno può interessare ecco le due funzioni:
    Codice PHP:
                    case 2:anno%4==0?n+=29:n+=28;break; 
    Questa è certamente errata, perché considera bisestili tutti gli anni che sono divisibili per 4, ma:

    http://it.wikipedia.org/wiki/Anno_bisestile
    Un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione che gli anni secolari (quelli divisibili per 100) sono bisestili solo se divisibili per 400.

  4. #4
    Inoltre tutti quegli switch possono essere ottimizzati:
    codice:
    // calcola il numero del giorno dal 1/1
    int GIORNO::calcola_giorno_anno(int giorno,int mese,int anno)
    {
        const static int giorniMese[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int n=0;
        if (mese<1 || mese>12)
        {
            // argomento non valido, gestisci l'errore
            // (puoi ad esempio sollevare un'eccezione std::out_of_range o restituire un valore negativo)
        }
        mese-=2;
        for (;mese>=0;mese--)
        {
            n+=giorniMese[mese];
            if (mese==1 && anno%4==0 && (anno%100!=0 || anno%400==0))
                n++;
        }
        return n+giorno;
    }
    
    
    // calcola il giorno della settimana in base ai valori di giorno, mese e anno
    // è valido solo dalla riforma gregoriana in avanti! per il calendario giuliano c'è un'altra formula più semplice
    int GIORNO::calcola_giorno_set(int giorno,int mese,int anno)
    {
        return ((anno+(anno-1)/4-(anno-1)/100+(anno-1)/400+calcola_giorno_anno(giorno, mese, anno))-2)%7+1;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    153
    @MacApp si si lo sapevo quella per la divisione per 400 però di solito si usano gli anni che vanno dal 1900 al 2100 esclusi. Almeno io quasi mai uso anni diversi.

    si si le funzioni possono essere ottimizzate era solo per dare una idea se a qualcuno poteva interessare.
    cogli l'attimo

  6. #6
    Be', né il 2100 né il 1900 sono bisestili come il tuo codice invece direbbe ; per il 2000 ti va ancora bene perché, pur essendo divisibile per 100, è anche divisibile per 400, per cui è bisestile.
    Per il resto, comunque, è sempre meglio scrivere codice corretto, specie in questo caso, in cui non costava praticamente niente farlo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    153
    si si hai ragione ma avevo messo "esclusi" :-) cmq più tardi le scrivo con i vostri miglioramenti e le poste!
    cogli l'attimo

  8. #8
    Per il calcolo del giorno dell'anno, se non hai bisogno di reinventare la ruota, puoi utilizzare la struct tm:

    Codice PHP:
    #include <iostream>
    #include <ctime>

    using namespace std;

    int yday(int dayint monthint year)
    {
        
    tm date = {001daymonth-1year-19000};    
        
    mktime(&date);
        return 
    date.tm_yday+1;
    }

    int main()
    {
        
    cout << yday(1,32012) << endl;    



  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    153
    si si lo so ma il fatto era che mi dovevo creare io una classe data(era un esercizio) dovevo si potevano usare solo tipi dati primitivi o definiti da me, tm non è definita da me quindi non potevo usarla.
    cogli l'attimo

  10. #10
    Si si, per questo ho specificato di usare tm se era amessa come soluzione.
    Avevo immaginato potesse essere un esercizio


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.