/* Programma 66cppCalcoloGiorni compilato con dev-c++ Riontino Raffaele 3AS INF I.T.I.S. Ettore Molinari . Programma che calcola quanti giorni ci sono tra due date 13-03-'10 */ #include #include #include #include using namespace std; HANDLE hConsole; struct date{ int giorno; int mese; int anno; }; void primapagina(); int inserimentogiorno(); int inserimentomese(int giorno,int mesi[]); int inserimentoanno(int mese,int giorno); void ultimapagina(); int controllocaratteri(char provvisorio[]); int controllogiorni(int giorno); int controllomese(int mese); int controllogiornimese(int giorni,int mese); int controllaanno(int anno); int controllobisestile(int mese,int giorno); void visualizzadate(struct date inizio, struct date fine); int bisestile(int anno); void controllaordine(struct date &inizio, struct date &fine); int conteggio(struct date inizio,struct date fine,int mesi[]); main() { hConsole = GetStdHandle(STD_OUTPUT_HANDLE); int totale; char scelta; date inizio; date fine; do{ int mesi[12]={31,29,31,30,31,30,31,31,30,31,30,31}; SetConsoleTextAttribute (hConsole, 3); primapagina(); SetConsoleTextAttribute (hConsole, 6); //inserimento data inizio cout << "\n\n\tData inizio :\n\n"; inizio.giorno=inserimentogiorno(); inizio.mese=inserimentomese(inizio.giorno,mesi); inizio.anno=inserimentoanno(inizio.mese,inizio.giorno); //inserimento data fine SetConsoleTextAttribute (hConsole, 6); cout << "\n\n\tData fine :\n\n"; fine.giorno=inserimentogiorno(); fine.mese=inserimentomese(fine.giorno,mesi); fine.anno=inserimentoanno(fine.mese,fine.giorno); //visualizzazione risultato visualizzadate(inizio,fine); controllaordine(inizio,fine); totale = 0; totale=conteggio(inizio,fine,mesi); cout << totale; SetConsoleTextAttribute (hConsole, 8); cout << "\n\n Vuoi effettuare un'altro calcolo ? (s / n)"; scelta = getch(); }while (scelta == 's'); ultimapagina(); }//chiusura main //funzione primapagina void primapagina() { system ("cls"); cout << "\n\tProgramma 66cppCalcoloGiorni Riontino Raffaele 3 AS INF"; cout << "\n\n\tI.T.I.S. Ettore Molinari - Milano - 10 - 3 - '10\n\n"; SetConsoleTextAttribute (hConsole, 4); cout << "\n\tProgramma che calcola i giorni tra due date\n"; }//chiusura primapagina //funzione inserimento giorno int inserimentogiorno() { char provvisorio[5]; int giorno,errore; SetConsoleTextAttribute (hConsole, 7); do{ //inserimento e controllo giorno.inizio cout << " Giorno : "; cin.getline(provvisorio,20); errore=controllocaratteri(provvisorio); giorno=atoi(provvisorio); if (!errore) { errore=controllogiorni(giorno);} }while (errore); return giorno; }//chiusura inserimento giorno //funzione inserimento mese int inserimentomese(int giorno,int mesi[]) { char provvisorio[5]; int errore,mese; do{ cout << " Mese : "; cin.getline(provvisorio,20); errore=controllocaratteri(provvisorio); mese=atoi(provvisorio); if (!errore) { errore=controllomese(mese);} if (!errore) { errore=controllogiornimese(giorno,mesi[mese-1]);} }while (errore); return mese; }//chiusura inserimento mese //funzione inserimento anno int inserimentoanno(int mese,int giorno) { char provvisorio[5]; int errore,anno; do{ cout << " Anno : "; cin.getline(provvisorio,20); errore=controllocaratteri(provvisorio); anno=atoi(provvisorio); if (!errore) {errore=controllaanno(anno);} if ((!errore) && (!bisestile(anno))){errore=controllobisestile(mese,giorno);} }while (errore); return anno; }//chiusura inserimetno anno //funzione ultimapagina void ultimapagina() { system("cls"); SetConsoleTextAttribute (hConsole, 9); cout << "\n\n\n\n\n\n\n\t\t\t PROGRAMMA TERMINATO"; Sleep(3000); }//chiusura ultima pagina //funzione controllocaratteri int controllocaratteri(char provvisorio[]) { int e=0,i,flag,k; flag=1; i = strlen(provvisorio); k=0; while ((flag) && (k 57)){ SetConsoleTextAttribute (hConsole, 4); cout << "\n !!Ci sono caratteri non consentiti.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); flag=0; e=1; } k++; } return e; }//chiusura controllocaratteri //funzione controllo giorni int controllogiorni(int giorno) { int e=0; if ((giorno > 31) || (giorno < 1)) { SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!Giorno non corretto.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); e=1; } return e; }//chiusura controllogiorni //funzione controllomese int controllomese(int mese) { int e=0; if ((mese > 12) || (mese < 1)) { SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!Mese non corretto.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); e=1; } return e; }//chiusura controllomese //funzione controllogiornimese int controllogiornimese(int giorni,int mese) { int e=0; if (giorni > mese){ SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!Il mese scelto non puo' avere il ."; cout << "\n numero di giorni inserito.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); e=1; } return e; }//chiusura controllogiornimese //funzione controllaanno int controllaanno(int anno) { int e=0; if ((anno > 9999) || (anno < 0)) { SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!Anno non consentito.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); e=1; } return e; }//chiusura controllaanno //funzione controllobisestile int controllobisestile(int mese,int giorno) { int e=0; if ((mese==2) && (giorno == 29)){ SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!L'anno inserito deve essere bisestile perche' sono"; cout << "\n stati inseriti 29 giorni a febbraio.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); e=1; } return e; }//chiusura controllobisestile //funzione visualizza void visualizzadate(struct date inizio, struct date fine) { SetConsoleTextAttribute (hConsole, 3); cout << "\n\tI giorni che passano dal : "; if (inizio.giorno < 10) {cout << " ";} cout << inizio.giorno << " / " ; if (inizio.mese < 10) {cout << " ";} cout << inizio.mese << " / "; cout << inizio.anno; cout << "\n\t\t\t\tal : "; if (fine.giorno < 10) {cout << " ";} cout << fine.giorno << " / " ; if (fine.mese < 10) {cout << " ";} cout << fine.mese << " / "; cout << fine.anno; cout << "\n\n\tsono = "; }// chiusura visualizza //funzione bisestile int bisestile(int anno) { int e; e=0; if ((anno%100==0)&&(anno%400==0) || (anno%100!=0)&&(anno%4==0)) {e=1;} return e; }//chiusura bisestile //controllaordine void controllaordine(struct date &inizio, struct date &fine) { int temp; if (inizio.anno > fine.anno) { temp = inizio.anno; inizio.anno = fine.anno; fine.anno = temp; temp = inizio.mese; inizio.mese = fine.mese; fine.mese = temp; temp = inizio.giorno; inizio.giorno = fine.giorno; fine.giorno = temp; } else {//else1 if ((inizio.anno == fine.anno) && (inizio.mese > fine.mese)) { temp = inizio.mese; inizio.mese = fine.mese; fine.mese = temp; temp = inizio.giorno; inizio.giorno = fine.giorno; fine.giorno = temp; } else {//else2 if ((inizio.anno == fine.anno) && (inizio.mese == fine.mese) && (inizio.giorno > fine.giorno)){ temp = inizio.giorno; inizio.giorno = fine.giorno; fine.giorno = temp; } }//else2 }//else1 }//chiudi controlla ordine //funzione conteggio int conteggio(struct date inizio,struct date fine,int mesi[]) { int totale=0; if ((inizio.anno == fine.anno) && (inizio.mese == fine.mese)){ if (bisestile(inizio.anno)){mesi[1] = 29;} else {mesi[1] = 28;} totale = fine.giorno - inizio.giorno; } else {//else1 if ((inizio.anno == fine.anno) && (inizio.mese != fine.mese)) { if (bisestile(inizio.anno)){mesi[1] = 29;} else {mesi[1] = 28;} totale = mesi[inizio.mese-1] - inizio.giorno; while(inizio.mese != fine.mese-1) { totale = totale + mesi[inizio.mese]; inizio.mese++; } totale = totale + fine.giorno; } }//else1 if (inizio.anno != fine.anno) { if (bisestile(inizio.anno)){mesi[1] = 29;} else {mesi[1] = 28;} totale = mesi[inizio.mese-1] - inizio.giorno; while (inizio.mese < 12) { totale = totale + mesi[inizio.mese]; inizio.mese++; } inizio.anno++; while (inizio.anno < fine.anno) { if (bisestile(inizio.anno)){totale = totale + 366;} else {totale = totale + 365;} inizio.anno++; } if (bisestile(fine.anno)) {mesi[1] = 29;} else {mesi[1] = 28;} inizio.mese = 0; while (inizio.mese < fine.mese-1) { totale = totale + mesi[inizio.mese]; inizio.mese++; } totale = totale + fine.giorno; } return totale; }//chiusura totale