Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Calcolo giorno della settimana

    ok allora....

    devo fare una funz che riceve tre interi per giorno mese ed anno e restituisce un intero che rappresenti un giorno della settimana

    un qualcosa del genere


    int clc_sett( const int& g, const int& m, const int& a ) {
    }

    ho gia una funzione del genere, ma su alcuni mesi sbaglia di -1 mha


    attendo vostra risposta
    GRAZIE!!!!!!

  2. #2
    ciao
    Premetto che FORSE (non vorrei dire una cazzataimmensa, ma mi sa che lo faccio) è PROBABILE che la funzione date restituisca anche il giorno della settimana, sapendo il numero, ma ne dubito. é complessa coem funz, quindi non lo escludo.

    Cmq il calcolo non è difficile, ora ho poco tempo e non lo faccio on-line. se domani sera nn ha postato nessun altro, lo metto io.
    Ciao
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  3. #3
    Vabbe posto io. L'ho Testato e funziona (con 3 date)

    #include <stdio.h>

    char *ggSettimana(int gg, int mm, int aaaa)
    {
    int ngg[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* i gg di ogni mese */

    /* LA data di riferimento è esatta: ho usato il giorno del compleanno di mio padre*/
    int fGior = 20; // 20° gg del mese
    int fMese = 2; // mese di rif Febbraio
    int fSett = 7; // Domenica
    int fAnno = 1955; // anno di riferimento
    int fBise = 1956; // Primo anno bisestile (1956 è troppo presto)
    // Anno corrente aaaa
    // mese corrente mm
    // gg corrente gg

    int ggBise = (aaaa - fBise) / 4 ; /* sono i gg in + di ogni anno bisestile */
    int anni = (aaaa - 1) - fAnno; /* anni trascorsi */
    int ggAnno = 0;
    for (int i = 0; i < mm - 1; i++)
    ggAnno += ngg[i];

    ggAnno += gg;

    int ggAnnoBis = 0;
    for (int i = 0; i < fMese -1; i++)
    ggAnnoBis += ngg[i];

    ggAnnoBis += fGior -1;

    int ggTotali = ggAnno + 365*anni + ggBise - ggAnnoBis; // ecco tutti i gg trascorsi! (credo sia giusto)

    // ora dobbiamo calcolare il giorno della settimana
    int ggSettimana = (ggTotali % 7) + 1; // Il resto ci indica il giorno della settimana -1: oscilla tra 0-6
    ggSettimana += fSett; // secondo il giorno di riferimento

    if (ggSettimana > 7)
    ggSettimana -=7; // eliminiamo eventuali avanzi...

    switch(ggSettimana)
    {
    case 1: return "Lunedi'"; break;
    case 2: return "Martedi'"; break;
    case 3: return "Mercoledi'"; break;
    case 4: return "Giovedi'"; break;
    case 5: return "Venerdi'"; break;
    case 6: return "Sabato"; break;
    case 7: return "Domenica"; break;
    deafult: return "ERRORE!";
    }
    }

    void main()
    {
    printf("%s", ggSettimana(17, 5, 1985)); // esce venerdì: il mio compleanno -> GIUSTOOO OLLEEEE
    getchar();
    }

    DITEMI GRAZIEEEEEE
    Ah, gli ho messo il copyright. Così nessuno oltre me la può usare!
    ahahahah sarebbe davvero una bastardata! Datela a chi volete... Ha una licenza GNU.
    Muuuahahaha
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  4. #4
    hai avuto na bella idea
    praticamente cosa fai calcoli il giorno della sett pertendo da uno base???


    nn l'ho letto perbene ma come lo calcoli l'anno bisestile?

    andrebbe calcolato così:

    - sono bisestili tutti gli anni divisibili per 4
    - non sono bisestili tutti quelli divisibili per 100 tranne che siano divisibili per 400


    il codice dovrebbe essere:

    bool Ebisest( int a ) {

    if( a <= 0 ) return false; // i punti sono indentature

    .....if( a % 100 == 0 )
    ..........if( a % 400 == 0 ) return true;

    .....if( a % 4 == 0 ) return true;

    .....return false;
    }
    L'uomo si illude di essere il fautore della propria vita, ma esistono elementi superiori che guidano e controllano il destino di ognuno di noi. Chiamateli forze sovrannaturali, intervento divino, ciò che è certo è che le nostre azioni non sono il risultato del libero arbitrio.

    See you, space cowboy...

  5. #5

    Certo che...

    sei davvero un campione a complicarti la vita! :gren:
    certo, è giusto il ragionamento che hai fatto, ma non bastava prendere il numero di anni e dividerlo per 4?
    io ho fatto così, e credo che funzioni più che bene, inoltre è matematicamente corretto.
    Cioè, il tuo ragionamento ha uno scopo diverso dal mio:
    mentre io mi chiedo: "quanti anni bisestili ci sono in X anni?"
    tu ti chiedi "l'anno X è bisestile?"
    però noi abbiamo bisogno di sapere QUANTI sono stati gli anni bisestili: una semplicissima divisione intera.

    int ggBise = (aaaa - fBise)
    Semplice.
    Cmq il ragionamento di base è questo:
    calcolo dei giorni trascorsi dalla data indicata (sia quella di partenza che quella attuale).
    Poi calcoliamo i giorni in + x gli anni bisestili. Poi vediamo quanti anni sono passati e li moltiplichiamo x 365.
    Gli aggiungiamo i giorni delgi anni bisestili, i giorni dell'anno corrente e quelli dell'anno di riferimento.
    Poi, sapendo il giorno della settimana della data di riferimento, dividiamo tutto per 7 e aggiungiamo l'offset del giorno (cioè il giorno della settimana: i lunedi, 2 martedì ecc...)
    ecco fatto
    uno switch che vede il resti della divisione ed ecco fatto.
    Semplice
    Ciao
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

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.