[C] conta giorni

Pubblicità

e_ale92

Utente Èlite
Messaggi
17,014
Reazioni
5,013
Punteggio
228
ragazzi devo scrivere un algoritmo che conta i giorni trascorsi da una certa data (fissa).
non vorrei un aiuto vero e proprio, ma sono un consiglio... voi come lo fareste??
io avevo pensato:


parto dalla data fissa e inizio a sommare +1 al giorno fino ad arrivare a 28/30/31 a seconda del mese. a questo punto passo al mese successivo e continuo a contare con lo stesso criterio, fino ad incrementare gli anni se questi trascorrono, fin quando non arrivo alla data inserita.
a ogni incremento terrei conto dei giorni sommati e quindi alla fine i giorni trascorsi sarebbero quelli contenuti nella variabile contatore (quella somma +1 ecc)


il problema è che dovrei tenere presente anche gli anni bisestili * e, poi, non so se quell'algoritmo funziona o è corretto ed efficiente :look:


per ora, datemi solo qualche consiglio, vorrei farlo da solo dato che l'esame si avvicina... poi, quando sarò riuscito a fare tutto posterò il mio programma e vedremo insieme cosa ne pensate.

* ho già realizzato le funzioni che controllano se la data è corretta e se l'anno inserito è bisestile, quindi dovrei fare solo la funzione (da richiamare nel main) che conti i giorni.
 
Beh prima controlli quanti anni passano tra le due date.. così arrivi direttamente all'anno in questione aggiungendo 365 così non stai a fare +1
per x anni..es

data fissa 10-1-2000
data 11-5-2010

allora ci sono 10 anni tra le due date quindi hai già 365*10 (da calcolare gli anni bisestili)..
Ora hai 5 mesi tra le due date: da gennaio(1) a maggio(5) quindi aggiungi questi 5 mesi. I mesi magari li gestisci con uno switch xk ovviamente non tutti i mesi hanno lo stesso numero di giorni..Una volta che hai anche il mese tra le due date rimangono 11 giorni che ottieni con +1.
Io farei così in quanto diventerebbe un processo a dir poco superfluo se stiamo parlando di date distanti come quelle del mio esempio..
 
allora, la data fissa è 1-1-1901...

1) come conto gli anni bisestili? io devo riutilizzare la funzione che ho già scritto (questo è il terzo di una lista di programmi da svolgere in sequenza) e che mi calcola se l'anno inserito (vabbè io inserisco giorno mese e anno) è bisestile o meno.
facendo come dici tu, io so che tra 2010 e 2000 ci sono 10 anni, ma non so quali e quanti sono bisestili... dovrei cmq fare il controllo su 2001, 2002, 2003 fino ad arrivare a 2010...

2) mmm... più o meno come la funzione del primo programma che calcolava se la data era corretta... io fatto una serie di if (con lo switch avevo un problema che forse mi puoi risolvere... trovi la discussione in questa sezione... [C] chiamata di funzione] e se il mese era 2, sapevo che i giorni andavano da 1 a 28 e così via.
ora, però, devo vedere come fare, tenendo conto degli anni bisestili in cui febbraio ha 29gg

3) ok
 
:skept: Beh credo che fare +1 per arrivare a date tipo 2011 sia un pò.......sconveniente :D come ho già scritto ti conviene sottrarre prima gli anni.. poi i mesi e infine i giorni..
 
si in effetti è vero e credo che farò così, però sottraendo (cosa che avevo pensato inizialmente e poi scartato per i bisestili) come tengo conto dei bisestili trascorsi? :boh:
 
Io il problema dei bisestili lo gestirei diversamente. Farei [(anno inserito-anno fisso)/4]+1. In questo modo trovi il numero dei giorni(bisestili) da aggiungere.
Esempio. anno fisso 2000
anno inserito 2003
[(2003-2000)/4]=0+1=1 effetivamente di bisestile c'è solo il 2000

anno fisso 2000
anno inserito 2012
[(2012-2000)/4]=3+1=4 bisestile c'è solo il 2000,2004,2008,2012

mi sembra giusto come algoritmo.
 
perchè fai [(anno-anno fisso)/4] +1???
quel +1 con che criterio lo hai messo??

e poi,
/ = diviso
% = modulo
tu volevi dire proprio /??

in tal caso non potrei riutilizzare la funzione di prima che serve per vedere se un anno è bisestile o meno perchè così sarei vincolato alle due date...

dovrei fare [(2012-2012)/4]+1 = è bisestile

:boh: mmm... non mi convince molto
 
Ultima modifica:
"La regola del calendario gregoriano è la seguente:

Un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione degli anni secolari (quelli divisibili per 100) che sono bisestili solo se divisibili per 400." cit. Wikipedia!
Quindi ecco il codice:

Codice:
if (anno%100==0){
        if ((anno%4==0)&&(anno%400==0)){
            return 1;
        }else{
            return 0;
        }
    }else{
        if (anno%4==0){
            return 1;
        }else{
            return 0;
        }
    }
 
"La regola del calendario gregoriano è la seguente:

Un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione degli anni secolari (quelli divisibili per 100) che sono bisestili solo se divisibili per 400." cit. Wikipedia!
Quindi ecco il codice:

Codice:
if (anno%100==0){
        if ((anno%4==0)&&(anno%400==0)){
            return 1;
        }else{
            return 0;
        }
    }else{
        if (anno%4==0){
            return 1;
        }else{
            return 0;
        }
    }

questo lo so e già l'ho fatto... il mio problema è tenere conto dei bisestili quando conto quanti gg passano dal 1-1-1901 alla data inserita
 
Un modo potrebbe essere quello di cicalare ogni anno tra le due date e controllare attraverso quella funzione se l'anno è bisestile o meno..con questo procedimento vai sul sicuro..ti consiglierei altrimenti il codice di fedux ma non mi convince molto..
 
perchè fai [(anno-anno fisso)/4] +1???
quel +1 con che criterio lo hai messo??

e poi,
/ = diviso
% = modulo
tu volevi dire proprio /??

in tal caso non potrei riutilizzare la funzione di prima che serve per vedere se un anno è bisestile o meno perchè così sarei vincolato alle due date...

dovrei fare [(2012-2012)/4]+1 = è bisestile

:boh: mmm... non mi convince molto

Allora fai così:

x=annoinserito-annofisso;
int Annibisestili=0;
for (i=0;i<=x;i++){
if [(annoinserito+i)%100==0]{
if [((annoinserito+i)%4==0)&&(annoinserito+i)%400==0)]
{ Annibisestili=Annibisestili+1;}
else{
if [(annoinserito+i)%4==0]{ Annibisestili=Annibisestili+1;}
}
Alla fine dovresti avere tutti gli anni bisestili.
 
Pubblicità
Pubblicità
Indietro
Top