/* Programma 66cppCalcoloGiorni1.2 compilato con dev-c++ Riontino Raffaele 3AS INF I.T.I.S. Ettore Molinari . Programma che calcola quanti giorni ci sono tra due date 10-3-'10 15-3-'10 aggiunta del menu' e del calcolo della pasqua 17-3-'10 aggiunta della funzione determina giorno della settimana */ #include #include #include #include using namespace std; HANDLE hConsole; struct date{ int giorno; int mese; int anno; }; void pinizio(); char menu(); void calcologiorno(); void calcolopasqua(); struct date pasqua(int anno); void determinagiorno(); int inserimentogiorno(); int inserimentomese(int giorno,int mesi[]); int inserimentoanno(int mese,int giorno); 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[]); void fine(); main() { char scelta; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); do{ scelta = menu(); if (scelta == 'g') calcologiorno(); if (scelta == 'p') calcolopasqua(); if (scelta == 'd') determinagiorno(); }while (scelta != 'e'); fine(); }//chiusura main //funzione inizio void pinizio() { system("cls"); SetConsoleTextAttribute (hConsole, 3); cout << "\n\tProgramma 66cppCalcoloGiorni1.2 Riontino Raffaele 3 AS INF"; cout << "\n\n\tI.T.I.S. Ettore Molinari - Milano - 17 - 3 - '10\n\n"; }//chiusura inizio //funzione menu char menu() { char scelta; do{ pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\n\t\tMenu'\n\n\n"; SetConsoleTextAttribute (hConsole, 6); cout << "\n\t- G - Calcolo dei giorni\n"; cout << "\n\t- P - Calcolo Pasqua\n"; cout << "\n\t- D - Determina giorno della settimana\n"; cout << "\n\t- E - Esci\n"; SetConsoleTextAttribute (hConsole, 7); cout << "\n\n\tDigita la scelta : "; scelta = getch(); scelta = tolower(scelta); switch (scelta) { case 'g' : return 'g'; break; case 'd' : return 'd'; break; case 'p' : return 'p'; break; case 'e' : return 'e'; break; default : cout << "\n\n\tScelta non consentita!!\n\t"; system ("pause"); } }while(1); }//chiusura menu //funzione calcolopasqua void calcolopasqua() { date risultato; int anno,errore; char provvisorio[5],scelta; do{ pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\tCalcolo della Pasqua\n"; do{ //inserimento e controllo anno SetConsoleTextAttribute (hConsole, 6); cout << "\n\tInserisci l'Anno ( dal 1583 al 2499) : "; cin.getline(provvisorio,20); errore=controllocaratteri(provvisorio); anno=atoi(provvisorio); if (!errore) { if ((anno < 1583) || (anno > 2499)){ SetConsoleTextAttribute (hConsole, 4); cout << "\n\n !!Anno non consentito.Ripeti!!\n\n"; SetConsoleTextAttribute (hConsole, 7); errore=1; } } }while (errore); SetConsoleTextAttribute (hConsole, 7); risultato=pasqua(anno); cout << "\n\t" << risultato.giorno << " / " << risultato.mese << " / "<< risultato.anno; // gg-mm-aa SetConsoleTextAttribute (hConsole, 8); cout << "\n\n\tDigita (s) per effettuare un altro calcolo,\n"; cout << "\n\tqualsiasi tasto per tornare al menu' principale : "; scelta = getch(); }while (scelta == 's'); }//chiusura calcolopasqua //funzione pasqua struct date pasqua(int anno) { int giorno, mese; int a, b, c, d, e, m, n; struct date r; switch(anno/100) { case 15: // 1583 - 1599 (FALL THROUGH) case 16: // 1600 - 1699 m=22; n=2; break; case 17: // 1700 - 1799 m=23; n=3; break; case 18: // 1800 - 1899 m=23; n=4; break; case 19: // 1900 - 1999 (FALL THROUGH) case 20: // 2000 - 2099 m=24; n=5;break; case 21: // 2100 - 2199 m=24; n=6; break; case 22: // 2200 - 2299 m=25; n=0; break; case 23: // 2300 - 2399 m=26; n=1; break; case 24: // 2400 - 2499 m=25; n=1; break; } a=anno%19; b=anno%4; c=anno%7; d=(19*a+m)%30; e=(2*b+4*c+6*d+n)%7; giorno=d+e; if (d+e<10) { giorno+=22; mese=3; } else { giorno-=9; mese=4; if ((giorno==26)||((giorno==25)&&(d==28)&&(e==6)&&(a>10))) { giorno-=7; } } r.giorno=giorno; r.mese=mese; r.anno=anno; return(r); }//chiusura pasqua //funzione determinagiorno void determinagiorno() { int totale; char scelta; date inizio; date fine; inizio.giorno = 3; inizio.mese = 1; inizio.anno = 0; do{ int mesi[12]={31,29,31,30,31,30,31,31,30,31,30,31}; pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\tDetermina il giorno della settimana\n"; SetConsoleTextAttribute (hConsole, 6); //inserimento data inizio cout << "\n\n\tInserisci la data da determinare :\n\n"; fine.giorno=inserimentogiorno(); fine.mese=inserimentomese(fine.giorno,mesi); fine.anno=inserimentoanno(fine.mese,fine.giorno); SetConsoleTextAttribute (hConsole, 8); totale = 0; totale=conteggio(inizio,fine,mesi); totale = totale % 7; cout << "\n\n\tIl giorno e' : "; if (fine.giorno == 1 && fine.mese == 1 && fine.anno == 0) cout << "Sabato"; if (fine.giorno == 2 && fine.mese == 1 && fine.anno == 0) cout << "Domenica"; if (totale == 0) cout << "Lunedi'"; if (totale == 1) cout << "Martedi'"; if (totale == 2) cout << "Mercoledi'"; if (totale == 3) cout << "Giovedi'"; if (totale == 4) cout << "Venerdi'"; if (totale == 5) cout << "Sabato"; if (totale == 6) cout << "Domenica"; cout << "\n\n\tDigita (s) per effettuare un altro calcolo,\n"; cout << "\n\tqualsiasi tasto per tornare al menu' principale : "; scelta = getch(); }while (scelta == 's'); }//chiusura determinagiorno //funzione calcologiorno void calcologiorno() { int totale; char scelta; date inizio; date fine; do{ int mesi[12]={31,29,31,30,31,30,31,31,30,31,30,31}; pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\tCalcolo dei giorni tra due date\n"; 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 pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\tCalcolo dei giorni tra due date\n"; SetConsoleTextAttribute (hConsole, 6); visualizzadate(inizio,fine); controllaordine(inizio,fine); totale = 0; totale=conteggio(inizio,fine,mesi); cout << totale; SetConsoleTextAttribute (hConsole, 8); cout << "\n\n\tDigita (s) per effettuare un altro calcolo,\n"; cout << "\n\tqualsiasi tasto per tornare al menu' principale : "; scelta = getch(); }while (scelta == 's'); }//chiusura calcologiorno //funzione inserimento giorno int inserimentogiorno() { char provvisorio[5]; int giorno,errore; SetConsoleTextAttribute (hConsole, 7); do{ //inserimento e controllo giorno.inizio cout << "\tGiorno : "; 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 << "\tMese : "; 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 << "\tAnno : "; 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 fine void fine() { system("cls"); SetConsoleTextAttribute (hConsole, 9); cout << "\n\n\n\n\n\n\n\t\t\t PROGRAMMA TERMINATO"; Sleep(3000); }//chiusura fine //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, 6); 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