/* Programma 66cppCalcoloGiorni1.3 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 19-3-'10 semplificazione della funzione determina giorno della settimana 20-3-'10 aggiunta delle funzioni per la visualizzazione di un calendario (mensile,annuale) */ #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[]); char continua(); void giornosettimana(int totale); void mensile(); void nomemese(int mese,int anno); void visu_mese(int mese,int anno,int totale,int mesi[]); void annuale(); 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(); if (scelta == 'm') mensile(); if (scelta == 'a') annuale(); }while (scelta != 'e'); fine(); }//chiusura main //funzione inizio void pinizio() { system("cls"); SetConsoleTextAttribute (hConsole, 3); cout << "\n\tProgramma 66cppCalcoloGiorni1.3 Riontino Raffaele 3 AS INF"; cout << "\n\n\tI.T.I.S. Ettore Molinari - Milano - 20 - 3 - '10\n\n"; }//chiusura inizio //funzione menu char menu() { char scelta; do{ pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\n\t\tMenu'\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[ M ] Calendario mensile\n"; cout << "\n\t[ A ] Calendario annuale\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 'm' : return 'm'; break; case 'a' : return 'a'; break; case 'e' : return 'e'; break; default : cout << "\n\tScelta non consentita!! "; 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 scelta = continua(); }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 = 1; 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, 6); totale=conteggio(inizio,fine,mesi); cout << "\n\n\tIl giorno e' : "; giornosettimana(totale);; scelta = continua(); }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; scelta = continua(); }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; SetConsoleTextAttribute (hConsole, 7); 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; SetConsoleTextAttribute (hConsole, 7); 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 //funzione continua char continua() { char scelta; 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(); return scelta; }//chiusura continua //funzione giornosettimana void giornosettimana(int totale) { char giorno[7][15]={{"Sabato"},{"Domenica"},{"Lunedi'"},{"Martedi'"},{"Mercoledi'"},{"Giovedi'"},{"Venerdi'"}}; cout << giorno[totale%7]; }//chiusura giornosettimana //funzione nomemese void nomemese(int mese,int anno) { char nome[12][15]={{"Gennaio"},{"Febbraio"},{"Marzo"},{"Aprile"},{"Maggio"},{"Giugno"},{"Luglio"},{"Agosto"},{"Settembre"},{"Ottobre"},{"Novembre"},{"Dicembre"}}; cout << "\n\n\t\t" << nome[mese-1] << "\t" << anno; }//chiusura nomemese //funzione mensile void mensile() { int totale; char scelta; date inizio; date fine; inizio.giorno = 1; 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\tVisualizza calendario mensile\n"; SetConsoleTextAttribute (hConsole, 6); //inserimento data inizio cout << "\n\n\tInserisci il mese :\n\n"; fine.giorno=1; fine.mese=inserimentomese(fine.giorno,mesi); SetConsoleTextAttribute (hConsole, 6); cout << "\n\n\tInserisci l'anno :\n\n"; fine.anno=inserimentoanno(fine.mese,fine.giorno); SetConsoleTextAttribute (hConsole, 6); totale=conteggio(inizio,fine,mesi); visu_mese(fine.mese,fine.anno,totale,mesi); scelta = continua(); }while (scelta == 's'); }//chiusura mensile //funzione visu_mese void visu_mese(int mese,int anno,int totale,int mesi[]) { int t,i,j; pinizio(); SetConsoleTextAttribute (hConsole, 6); nomemese(mese,anno); cout << "\n\n\t\tLun\tMar\tMer\tGio\tVen\tSab\tDom\n\n"; totale=totale-2; t=1; for (i=0 ; i<6 ; i++) { cout << "\t"; for (j=0 ; j<7 ; j++ ) { SetConsoleTextAttribute (hConsole, 7); if ((totale%7 == j) && (t < mesi[mese-1]+1)) { if (j == 6) SetConsoleTextAttribute (hConsole, 4); cout << " \t"; if (t < 10) cout << " "; cout << t; SetConsoleTextAttribute (hConsole, 7); t++; totale++; } else cout << " \t"; } cout << "\n"; } }//chiusura visu_mese //funzione annuale void annuale() { int totale,i,j,t,a; char scelta; do{ date inizio; date fine; inizio.giorno = 1; inizio.mese = 1; inizio.anno = 0; fine.giorno=1; fine.mese=1; int mesi[12]={31,29,31,30,31,30,31,31,30,31,30,31}; pinizio(); SetConsoleTextAttribute (hConsole, 4); cout << "\n\tVisualizza calendario annuale\n"; SetConsoleTextAttribute (hConsole, 6); cout << "\n\n\tInserisci l'anno :\n\n"; fine.anno=inserimentoanno(fine.mese,fine.giorno); do{ SetConsoleTextAttribute (hConsole, 6); totale=conteggio(inizio,fine,mesi); visu_mese(fine.mese,fine.anno,totale,mesi); SetConsoleTextAttribute (hConsole, 6); cout << "\n [p] Mese precedente - [s] Mese successivo - [t] Termina calendario"; a=0; do{ scelta = getch(); scelta = tolower(scelta); a=0; if (scelta == 'p') { if (fine.mese-1 == 0) fine.mese++; fine.mese--; a=1; } if (scelta == 's') { if (fine.mese+1 == 13) fine.mese--; fine.mese++; a=1; } if (scelta == 't') a=1; }while (a==0); }while (scelta == 's' || scelta == 'p'); scelta = continua(); }while (scelta == 's'); }//chiusura annuale