Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-08-2008, 22:01   #1
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
[c++]contare i giorni...

sto provando a fare un programma che conti i giorni tra due date....
sono arrivato a questo punto
codice:

Codice:
#include <iostream>  
using namespace std;
/////////////////////////////////////////////////
//prototipi/////////////////////////////////////
////////////////////////////////////////////////
bool bisestile(int a);
 int bisinint(int a,int b);
 bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1);
 int totgiorni(int gg,int mm,int aa);
 

int main(){ 

int gg,mm,aa; //variabili della prima data (giorni, mesi, anni)
int gg1,mm1,aa1; //variabili della seconda data (giorni, mesi, anni)

int giornitot0,giornitot1; //totale giorni dall'anno 0 della prima e della seconda data

cout<<"Inserire due date per conoscere il numero di giorni tra di esse"<<endl;

 //l'inserimento delle date 
cin>>gg; cout<<"/"; 
cin>>mm; cout<<"/"; 
cin>>aa; cout<<endl;
cin>>gg1; cout<<"/"; 
cin>>mm1; cout<<"/"; 
cin>>aa1;

//la parte che dovrebbe stampare il numero di giorni dall'anno 0 della prima data 

cout<< totgiorni(gg,mm,aa); 

 return 0; 
}
/////////////////////////////////////// // 
le funzioni 
///////////////////////////////////////

//è un anno bisestile??? 
bool bisestile(int a){     
if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return true;    
 else return false; } 

//quanti anni bisestili ci sono in quell'intervallo 
int bisinint(int a,int b){    
 int numbis=0;     
if (a<b){while(a<b)    
if (bisestile (a)==true) numbis=numbis+1;   
  else a++;        
 }        
 else if (a==b){            
 if (bisestile(a)==true) numbis=1;
             else numbis=0;
}               
else if (a>b) {while(a>b)     
if (bisestile (a)==true) numbis=numbis+1;
     else b++;  
       }  
} 

 //quale delle due date è prima??? 
bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1){     
if (aa1<aa) return true;     
else if (aa1>aa) return false;     
else if (aa1==aa) {         
if (mm1<mm) return true;         
else if (mm1>mm) return false;         
else if (mm1==mm){             
if (gg1<gg) return true;            
 else if (gg1>gg) return false;             
else if (gg1==gg) cout<<"Mi dispiace ma le due date sono uguali"<<endl;         
}     
}
 }  

//quanti giorni dall'anno 0??
 int totgiorni(int gg,int mm,int aa){ int giorninelmese; 
if (mm==1) giorninelmese=31; 
else if (mm==2) giorninelmese = 59; 
else if (mm==3) giorninelmese = 90; 
else if (mm==4) giorninelmese = 120; 
else if (mm==5) giorninelmese = 151;
 else if (mm==6) giorninelmese = 181; 
else if (mm==7) giorninelmese = 212;
 else if (mm==8) giorninelmese = 243; 
else if (mm==9) giorninelmese = 273; 
else if (mm==10) giorninelmese = 304; 
else if (mm==11) giorninelmese = 334; 
else if (mm==12) giorninelmese = 365;
 return gg + (giorninelmese-gg) + ((aa-bisinint(0,aa)*365)+bisinint(0,aa)*366); }
dopo aver inserito le due date però si ferma mentre mi dovrebbe stampare i giorni dall'anno zero alla prima data in modo che dopo faccio la stessa cosa con la seconda data, li sottraggo e... il gioco è fatto !!
qualche consiglio o magari se mi fate vedere qualche errore grossolano che non ho visto....
grazie a tutti
ciao

Ultima modifica di moritzplatz : 15-08-2008 alle 10:36.
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 01:54   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da moritzplatz Guarda i messaggi
EDIT: per rendere leggibile il codice come faccio a non farlo stare su una sola riga???
Magari andando a capo? Scritto così mi pare arabo, onestamente...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 10:37   #3
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
ok ora lo ho modificato
è più comprensibile?
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 13:04   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Non tanto, ma cerco di decifrare un po'.

A parte alcune cose riguardanti lo "stile", che non ti correggo qui perché sarebbe troppo lungo (se ti interessa, cerca delle vecchie discussioni riguardanti lo stile di programmazione in cui è intervenuto l'utente fek: sono davvero un'ottima lettura, se le riesco a ritrovare te le linko), ci sono delle cose che non capisco:
Codice:
return gg + (giorninelmese-gg) + ((aa-bisinint(0,aa)*365)+bisinint(0,aa)*366); }
Quel gg + giorninelmese - gg è, matematicamente, come fare a + b - a che equivale al solo b. Quindi giorninelmese è l'unica cosa che venga aggiunta.
Poi: ((aa-bisinint(0,aa)*365)+bisinint(0,aa)*366) è ok come ragionamento, direi, ma se noti, tu stai chiamando la stessa funzione per ben due volte, dandole gli stessi parametri: ovviamente ti darà gli stessi risultati ad ogni chiamata, quindi puoi salvare in una variabile il risultato e poi sostituire alla chiamata della funzione la sola variabile, guadagnandoci in velocità.
Ancora meglio: puoi notare che tutti gli anni sono costituiti da 365 giorni, mentre quelli bisestili ne hanno uno in più. Allora puoi semplicemente sommare il numero di "giorni bisestili" in eccedenza: (anno * 365) + bisestili(0, anno).

Altra cosa che mi lascia un po' "perplesso" è la funzione prima0(). A parte che logicamente non credo sia un "errore" se le due date sono uguali: alla funzione tu chiedi "la data 0 viene prima della data 1?", dove la risposta, se le date sono uguali, è semplicemente "falso". E poi mi sembra che venga restituito un risultato opposto a quello atteso: ovvero, restituisci "falso" se la prima data è precedente alla seconda, "vero" per il contrario. In più, se le date sono uguali, non restituisci alcun valore: ma la tua non è una funzione void, devi restituire qualcosa. Anzi, è strano che il compilatore non ti abbia messo in guardia: se usi gcc, attiva sempre tutti i warning.

A parte questi errori più o meno credo debba "funzionare", ovvero, ti deve almeno stampare un numero. Prova a rendere più esplicita la stampa:
Codice:
cout << "Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg, mm, aa) << "." << endl;
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 13:27   #5
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
grazie mille!
ho modificato come mi hai detto ma non mi scrive nulla.....
ora il programma è cosi:
Codice:
#include <iostream>

using namespace std;
bool bisestile(int a);
int bisinint(int a,int b);
bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1);
int totgiorni(int gg,int mm,int aa);
int main(){
int gg,mm,aa;
int gg1,mm1,aa1;
int giornitot0,giornitot1;
cout<<"Inserire due date per conoscere il numero di giorni tra di esse"<<endl;
//l'inserimento delle date
cin>>gg;
cout<<"/";
cin>>mm;
cout<<"/";
cin>>aa;
cout<<endl;
cin>>gg1;
cout<<"/";
cin>>mm1;
cout<<"/";
cin>>aa1;
cout << "Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg, mm, aa) << "." << endl;
 return 0;
}

///////////////////////////////////////
// le funzioni
///////////////////////////////////////
//è un anno bisestile???
bool bisestile(int a){
    if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return true;
    else return false;
}

//quanti anni bisestili ci sono in quell'intervallo
int bisinint(int a,int b){
    int numbis=0;
    if (a<b){while(a<b)
    if (bisestile (a)==true) numbis=numbis+1;
    else a++;
        }
        else if (a==b){
            if (bisestile(a)==true) numbis=1;
            else numbis=0;}
              else if (a>b) {while(a>b)
    if (bisestile (a)==true) numbis=numbis+1;
    else b++;
        }

}

//quale delle due date è prima???
bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1){
    if (aa1<aa) return true;
    else if (aa1>aa) return false;
    else if (aa1==aa) {
        if (mm1<mm) return true;
        else if (mm1>mm) return false;
        else if (mm1==mm){
            if (gg1<gg) return true;
            else if (gg1>gg) return false;
            else if (gg1==gg) cout<<"Mi dispiace ma le due date sono uguali"<<endl;
        }
    }
}

//quanti giorni dall'anno 0??
int totgiorni(int gg,int mm,int aa){
int giorninelmese;
if (mm==1) giorninelmese=31;
else if (mm==2) giorninelmese = 59;
else if (mm==3) giorninelmese = 90;
else if (mm==4) giorninelmese = 120;
else if (mm==5) giorninelmese = 151;
else if (mm==6) giorninelmese = 181;
else if (mm==7) giorninelmese = 212;
else if (mm==8) giorninelmese = 243;
else if (mm==9) giorninelmese = 273;
else if (mm==10) giorninelmese = 304;
else if (mm==11) giorninelmese = 334;
else if (mm==12) giorninelmese = 365;
return (giorninelmese + ((aa-bisinint(0,aa)*365)+bisinint(0,aa)*366));
}
parte, mi fa inserire i numeri e poi non mi dice nulla e si ferma...
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 13:36   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ehm a dire il vero io non vedo parecchia differenza da prima!

Comunque, una cosa che devi controllare è che la funzione totgiorni() riceva mm compreso tra 1 e 12 inclusi: se ciò non dovesse avvenire, giorninelmese a quanto sarebbe uguale? Inizializzala a zero.
In più, cosa ben più "grave" a livello logico, se la data fa riferimento ad un giorno di gennaio, in questo modo aggiungi subito 31 giorni a giorninelmese (e così via), che saranno poi aggiunti al risultato finale. Invece io direi di chiamare la variabile giornitrascorsi e aggiungere solo il numero di giorni trascorsi dall'inizio dell'anno al mese appena precedente, e al risultato finale potrai sommare il giorno del mese attuale senza altre modifiche.

Il resto delle modifiche importanti, per evitare un paio di errori che vedo ancora adesso, te le avevo segnalate nel post precedente.
Spiegami una cosa, però: che intendi con "non stampa niente"? Dubito che possa fermarsi senza stamparti niente, a meno che non ci siano bug che mandano il programma in crash. Che IDE usi, con quale compilatore e da quale sistema operativo?

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 13:56   #7
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
modificato ancora
Codice:
#include <iostream>

using namespace std;
bool bisestile(int a);
int bisinint(int a,int b);
bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1);
int totgiorni(int gg,int mm,int aa);
int main(){
int gg,mm,aa;
int gg1,mm1,aa1;
int giornitot0,giornitot1;
cout<<"Inserire due date per conoscere il numero di giorni tra di esse"<<endl;
//l'inserimento delle date
cin>>gg;
cout<<"/";
cin>>mm;
cout<<"/";
cin>>aa;
cout<<endl;
cin>>gg1;
cout<<"/";
cin>>mm1;
cout<<"/";
cin>>aa1;
cout << "Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg, mm, aa) << "." << endl;
 return 0;
}

///////////////////////////////////////
// le funzioni
///////////////////////////////////////
//è un anno bisestile???
bool bisestile(int a){
    if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return true;
    else return false;
}

//quanti anni bisestili ci sono in quell'intervallo
int bisinint(int a,int b){
    int numbis=0;
    if (a<b){while(a<b)
    if (bisestile (a)==true) numbis=numbis+1;
    else a++;
        }
        else if (a==b){
            if (bisestile(a)==true) numbis=1;
            else numbis=0;}
              else if (a>b) {while(a>b)
    if (bisestile (a)==true) numbis=numbis+1;
    else b++;
        }

}

//quale delle due date è prima???
bool prima(int gg,int mm, int aa,int gg1, int mm1, int aa1){
    if (aa1<aa) return false;
    else if (aa1>aa) return true;
    else if (aa1==aa) {
        if (mm1<mm) return false;
        else if (mm1>mm) return true;
        else if (mm1==mm){
            if (gg1<gg) return false;
            else if (gg1>gg) return true;
            else if (gg1==gg) return false;
        }
    }
}

//quanti giorni dall'anno 0??
int totgiorni(int gg,int mm,int aa){
int giorninelmese=0;
if (mm==1) giorninelmese=0;
else if (mm==2) giorninelmese = 31;
else if (mm==3) giorninelmese = 59;
else if (mm==4) giorninelmese = 90;
else if (mm==5) giorninelmese = 120;
else if (mm==6) giorninelmese = 151;
else if (mm==7) giorninelmese = 181;
else if (mm==8) giorninelmese = 212;
else if (mm==9) giorninelmese = 243;
else if (mm==10) giorninelmese = 274;
else if (mm==11) giorninelmese = 304;
else if (mm==12) giorninelmese = 334;
return ((giorninelmese + gg) + (aa*365)*bisinint(0,aa));
}
non stampa niente nel senso che quando inserisco l'ultimo valore (aa1) premo invio e si ferma.
ide: code::blocks 8.02
compilatore: gnu gcc
os: windows xp pro
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 13:59   #8
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ecco, Code::Blocks. Lo sapevo.

È un'IDE che mi piace molto, ma ha un solo grande difetto: se il tuo programma va in crash per qualche motivo, ti si chiude la finestra dell'esecuzione senza segnalarti niente. Avvia il tuo programma con il debugging attivato: al 99% ti va in crash in qualche punto, e potrai scoprire dove, a quel punto possiamo correggere l'errore.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:01   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ah comunque:
Codice:
return ((giorninelmese + gg) + (aa*365)*bisinint(0,aa));
Questo è scorretto, rileggi quanto avevo scritto: devi aggiungere il numero di anni bisestili (che corrisponde ai giorni in eccedenza).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:03   #10
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
lo ho fatto partire col debugger mi dice
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.7.50.20071127
Child process PID: 2264
Program exited with code 030000000472.
Debugger finished with status 0

ma fa le stesse identiche cose di prima...

hai ragione mi ero sbagliato
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:07   #11
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
potrebbe essere questo??

main.cpp|53|warning: control reaches end of non-void function|

main.cpp|68|warning: control reaches end of non-void function|

...
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:07   #12
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Program exited with code 030000000472.
WTF!!!

Dal momento che tu dai un return 0 al termine della main(), quel valore dovrebbe essere 0... No, c'è decisamente qualcosa che non va.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:11   #13
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Be', certo che potrebbe essere, tra l'altro sono cose che ti avevo già segnalato.

Guarda bene che prima() non restituisce un bel niente se per qualche motivo superi tutti quei blocchi if (non dovrebbe poter mai succedere, ma come valore di default in questo caso metti un return false al termine della funzione e fai contento il compilatore).

Allo stesso modo, e qui è ben più grave, bisinint() calcola in numbis gli anni bisestili ma... non li restituisce mai!
Metti un return numbis alla fine della funzione.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 14:16   #14
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
Codice:
#include <iostream>

using namespace std;
bool bisestile(int a);
int bisinint(int a,int b);
bool prima0(int gg,int mm, int aa,int gg1, int mm1, int aa1);
int totgiorni(int gg,int mm,int aa);
int main(){
int gg,mm,aa;
int gg1,mm1,aa1;

cout<<"Inserire due date per conoscere il numero di giorni tra di esse"<<endl;
//l'inserimento delle date
cin>>gg;
cout<<"/";
cin>>mm;
cout<<"/";
cin>>aa;
cout<<endl;
cin>>gg1;
cout<<"/";
cin>>mm1;
cout<<"/";
cin>>aa1;
cout << "Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg, mm, aa) << "." << endl;
 return 0;
}

///////////////////////////////////////
// le funzioni
///////////////////////////////////////
//è un anno bisestile???
bool bisestile(int a){
    if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return true;
    else return false;
}

//quanti anni bisestili ci sono in quell'intervallo
int bisinint(int a,int b){
    int numbis=0;
    if (a<b){while(a<b)
    if (bisestile (a)==true) numbis=numbis+1;
    else a++;
        }
        else if (a==b){
            if (bisestile(a)==true) numbis=1;
            else numbis=0;}
              else if (a>b) {while(a>b)
    if (bisestile (a)==true) numbis=numbis+1;
    else b++;
        }
return numbis;
}

//quale delle due date è prima???
bool prima(int gg,int mm, int aa,int gg1, int mm1, int aa1){
    if (aa1<aa) return false;
    else if (aa1>aa) return true;
    else if (aa1==aa) {
        if (mm1<mm) return false;
        else if (mm1>mm) return true;
        else if (mm1==mm){
            if (gg1<gg) return false;
            else if (gg1>gg) return true;
            else if (gg1==gg) return false;

        }
    }
return false;
}

//quanti giorni dall'anno 0??
int totgiorni(int gg,int mm,int aa){
int giorninelmese=0;
if (mm==1) giorninelmese=0;
else if (mm==2) giorninelmese = 31;
else if (mm==3) giorninelmese = 59;
else if (mm==4) giorninelmese = 90;
else if (mm==5) giorninelmese = 120;
else if (mm==6) giorninelmese = 151;
else if (mm==7) giorninelmese = 181;
else if (mm==8) giorninelmese = 212;
else if (mm==9) giorninelmese = 243;
else if (mm==10) giorninelmese = 274;
else if (mm==11) giorninelmese = 304;
else if (mm==12) giorninelmese = 334;
return ((giorninelmese + gg) + (aa*365)+bisinint(0,aa));
}
ok ho modificato come mi hai detto e ora non mi da più warning...
ma perchè non vuole funzionare!!!
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 15:22   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Aspetta, questa mi sembra grave:
Codice:
    if (a<b){while(a<b)
    if (bisestile (a)==true) numbis=numbis+1;
    else a++;
        }
In pratica non appena incontri un anno bisestile... smetti di incrementare la a e ripeti il controllo sempre sullo stesso anno?

Io direi di fare così:
Codice:
/* Queste due macro mettile nell'intestazione del file, sotto gli #include, per separarle un po' dal codice */
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define Max(a,b) (((a) < (b)) ? (b) : (a))

int bisinint(int a, int b)
{
  int first = min(a, b);
  int second = Max(a, b);
  int result = 0;

  for (int x = first; x <= second; ++x)
  {
    if (bisestile(x))
    {
      ++result;
    }
  }
  return result;
}
In questo modo consideri tutti i casi in un ciclo solo ed eviti di incrementare infinitamente quella variabile.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 15:36   #16
moritzplatz
Senior Member
 
Iscritto dal: Jul 2008
Città: roma (monti)
Messaggi: 808
grazie mille ora restituisce il numero dei giorni
ecco il programma in versione quasi definitiva...
Codice:
#include <iostream>
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define Max(a,b) (((a) < (b)) ? (b) : (a))

using namespace std;
bool bisestile(int a);
int bisinint(int a,int b);
bool prima(int gg,int mm, int aa,int gg1, int mm1, int aa1);
int totgiorni(int gg,int mm,int aa);
int main(){
int giorni;
int gg,mm,aa;
int gg1,mm1,aa1;
cout<<"Inserire due date per conoscere il numero di giorni tra di esse"<<endl;
//l'inserimento delle date
cin>>gg;
cout<<"/";
cin>>mm;
cout<<"/";
cin>>aa;
cout<<endl;
cin>>gg1;
cout<<"/";
cin>>mm1;
cout<<"/";
cin>>aa1;
if (prima(gg,mm,aa,gg1,mm1,aa1)==true) giorni=totgiorni(gg1, mm1, aa1)-totgiorni(gg, mm, aa);
else giorni=totgiorni(gg, mm, aa)-totgiorni(gg1, mm1, aa1);
cout << "Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg, mm, aa) << "." << endl;
cout <<"Il numero di giorni trascorsi dall'anno zero sembra essere: " << totgiorni(gg1, mm1, aa1) << "." << endl;
cout <<"Il numero di giorni trascorsi tra le due date sembra essere: " << giorni << "." << endl;
 return 0;
}

///////////////////////////////////////
// le funzioni
///////////////////////////////////////
//è un anno bisestile???
bool bisestile(int a){
    if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return true;
    else return false;
}

//quanti anni bisestili ci sono in quell'intervallo
int bisinint(int a, int b)
{
  int first = min(a, b);
  int second = Max(a, b);
  int result = 0;

  for (int x = first; x <= second; ++x)
  {
    if (bisestile(x))
    {
      ++result;
    }
  }
  return result;
}
//quale delle due date è prima???
bool prima(int gg,int mm, int aa,int gg1, int mm1, int aa1){
    if (aa1<aa) return false;
    else if (aa1>aa) return true;
    else if (aa1==aa) {
        if (mm1<mm) return false;
        else if (mm1>mm) return true;
        else if (mm1==mm){
            if (gg1<gg) return false;
            else if (gg1>gg) return true;
            else if (gg1==gg) return false;

        }
    }
return false;
}

//quanti giorni dall'anno 0??
int totgiorni(int gg,int mm,int aa){
int giorninelmese=0;
if (mm==1) giorninelmese=0;
else if (mm==2) giorninelmese = 31;
else if (mm==3) giorninelmese = 59;
else if (mm==4) giorninelmese = 90;
else if (mm==5) giorninelmese = 120;
else if (mm==6) giorninelmese = 151;
else if (mm==7) giorninelmese = 181;
else if (mm==8) giorninelmese = 212;
else if (mm==9) giorninelmese = 243;
else if (mm==10) giorninelmese = 274;
else if (mm==11) giorninelmese = 304;
else if (mm==12) giorninelmese = 334;
return ((giorninelmese + gg) + (aa*365)+bisinint(0,aa));
}
come funziona quel linguaggio del preprocessore?
grazie ancora
p.s. per incrementare una variabile è indifferente scrivere a++ o ++a?

Ultima modifica di moritzplatz : 15-08-2008 alle 15:42.
moritzplatz è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 17:18   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
No, non è la stessa cosa. O, meglio, se il tuo intento è soltanto incrementare, allora sì, non ti fa differenza usare l'una o l'altra sintassi, ma attento a farlo quando vuoi anche leggere il valore della variabile.
La differenza, appunto, sta proprio nel fatto che variabile++ ti restituisce prima il valore e poi incrementa, ++variabile prima incrementa e poi ti restituisce il valore.

Per la questione delle macro del preprocessore è un argomento un po' più delicato, provo a spiegartelo in maniera chiara, ma non contarci troppo.
Quando tu "definisci" un qualcosa tramite le direttive del preprocessore, associ una stringa alfanumerica o un'espressione ad un identificatore: il preprocessore la analizza e la memorizza, così da sostituire all'identificatore la stringa associata, ogni volta che questo viene incontrato nel file.
Un esempio classico: la costante matematica pi greco (la tronco a 3.14 ).
Codice:
#define PI 3.14
Quando tu dici questo al preprocessore, puoi fare poi riferimento a "PI", anziché 3.14, in tutto il codice seguente:
Codice:
int circonferenza = (2*PI) * raggio;
Il bello è che puoi fare anche macro che prendono degli argomenti, in modo simile alle funzioni:
Codice:
#define stampa(messaggio) printf("%s\n", messaggio)
E potrai quindi scrivere:
Codice:
stampa("Ciao!");
Che sarà sostituito con:
Codice:
printf("%s\n", "Ciao!");
Ad esempio, prima ho usato una macro come questa:
Codice:
#define min(a, b) (((a) < (b)) ? (a) : (b))
Che ti può apparire "oscura" a prima vista: niente paura, ti spiego come funziona con un esempio pratico:
Codice:
int minimo = min(5, 10);
Questa riga verrà tradotta in:
Codice:
int minimo = (((5) < (10) ? (5) : (10));
Dove ci sono parentesi superflue (per questo caso solamente, leggi più avanti...):
Codice:
int minimo = ((5 < 10) ? 5 : 10);
Non so se hai mai incontrato la sintassi condizione ? valore1 : valore2, ma significa semplicemente: "È vero che 'condizione'? Se sì, allora restituisci 'valore1', in caso contrario restituisci 'valore2'".
Quindi io lì sto dicendo: "È vero che 5 è minore di 10? Se sì, restituisci 5, in caso contrario restituisci 10". E ovviamente otterrò 5.

Ora che puoi capire come funziona quella macro, devi capire anche che ci sono alcuni problemi relativi al fatto che le macro operano per sostituzione diretta del testo.
Usando la stessa macro di prima, io posso dire:
Codice:
int x = 3;
int y = 5;
int minimo;

minimo = min(++x, y);
Che valore mi verrà restituito come minimo? E quanto varrà x alla fine? Se hai risposto 3 o 4, hai sbagliato: otterrò 5 come minimo e tale sarà anche il valore della x alla fine del confronto!

Infatti quel codice viene espanso nel seguente:
Codice:
int x = 3;
int y = 5;
int minimo;

minimo = (((++x) < (y)) ? (++x) : (y));
E come puoi notare, la x viene incrementata ben due volte. Questo non sarebbe successo se avessi definito min() come funzione, anziché come macro.

Un problema simile lo puoi avere anche se non circondi di parentesi i tuoi parametri. Altro piccolo esempio:
Codice:
#define mul(a, b) (a * b)
Dove ti aspetti che venga restituita la moltiplicazione tra a e b. Ma se io uso:
Codice:
int risultato = mul(3+2, 6);
Voglio ottenere come risultato (5 * 6) = 30. E invece?
Codice:
int risultato = (3+2 * 6);
Dal momento che la moltiplicazione è un operatore che ha precedenza superiore a quella della somma, l'espressione verrà valutata così:
Codice:
int risultato = (3+(2 * 6));
Che mi restituisce 15...

Scusa la lunghezza del post, ma queste cose come vedi sono un po' delicate, se le impari nel modo sbagliato poi ti vengono fuori dei bug che non riesci ad individuare.
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2008, 22:16   #18
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Un paio di cose.
Se ascolti i consigli di molti su questo forum, eviti di imparare a programmare il C++ e ti dedichi a linguaggi piu' consoni
Se te l'ha "Detto la maestra", questo e' l'ennesimo caso dimostrazione che il C o C++ non e' il linguaggio migliore da insegnare per primo.
Se non te l'ha detto nessuno e stai provando come autodidatta, ti invito quindi a tentare con qualcosa di simile (C#, ma anche altri)

Codice:
class Program
{
    static void Main(string[] args)
    {
        Console.Write("Inserire prima data,   formato dd/mm/yyyy :");
        string primastr=Console.ReadLine();
        Console.Write("Inserire Seconda data, formato dd/mm/yyyy :");
        string secondastr = Console.ReadLine();

        DateTime Prima = DateTime.Parse(primastr);
        DateTime Seconda = DateTime.Parse(secondastr);

        TimeSpan ts=Seconda-Prima;

        Console.WriteLine("Il numero di giorni di differenza e' {0}", ts.TotalDays);

        Console.ReadKey();
    }
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 10:37   #19
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Un paio di cose.
Se ascolti i consigli di molti su questo forum, eviti di imparare a programmare il C++ e ti dedichi a linguaggi piu' consoni
Se te l'ha "Detto la maestra", questo e' l'ennesimo caso dimostrazione che il C o C++ non e' il linguaggio migliore da insegnare per primo.
Se non te l'ha detto nessuno e stai provando come autodidatta, ti invito quindi a tentare con qualcosa di simile (C#, ma anche altri)
Come non essere d'accordo...

Non so se si è notato, ma col mio post precedente, oltre che spiegare come funzionavano macro e simili, ho voluto anche "spaventarlo a fin di bene", per indirizzarlo magari su qualcosa di diverso.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 16:58   #20
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Per calcolare i giorni trascorsi tra due date potevi usare i giorni giuliani:
un giorno giuliano consente di calcolare il numero di giorni trascorsi a partire da una certa data (qualcosa come il 4mila-e-qualcosa a.C.) fino ad uno specifico giorno-mese-anno. (Vedi anche su Wiki.)
Puoi quindi calcolare i giorni trascorsi tra due date semplicemente come differenza tra i due numeri giuliani delle due date stesse.

Questa è una funzione che ti calcola il numero giuliano di una data passata come argomento (sinceramente non l'ho testato ma dovrebbe funzionare):

Codice:
long date2jul(int day,int month,int year)
{
    long ctmp, dtmp, mtmp, ytmp;
    if(year < 100)
        year += 1900; // se anno = 82 si assume 1982
    if(year < 1000)
        year += 2000; // se anno = 182 si assume 2182
    if(month > 2) {
        mtmp = (long)(month-3);
        ytmp = (long)year;
    }
    else {
        mtmp = (long)(month+9);
        ytmp = (long)(year-1);
    }
    ctmp = (ytmp/100);
    dtmp = ytmp-(100*ctmp);
    return((146097L*ctmp)/4L+(1461L*dtmp)/4L+(153L*mtmp+2)/5L+1721119L+(long)day);
}

Questo pezzo di codice è tratto dal Tricky C (di Barninga Z), cercalo su internet. Il paragrafo è: "C come Cesare".

Ciao!
__________________
Quello che davvero mi interessa è se Dio, quando creò il mondo, aveva scelta.
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
2 portatili tuttofare con 32GB di RAM, n...
Stranger Things non è finito! Ecc...
iPhone 18, il mistero sul destino della ...
Motorola lavora al nuovo Razr 70 Ultra: ...
Il programma di ridimensionamento di One...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:04.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v