Esercitazioni di Informatica e Sistemi

Calcoli con le date.

La data e l'ora sono rappresentate in una forma codificata (o compressa) allo scopo di occupare un solo long integer.

Una data ammessa deve essere compresa tra 1-1-1979 e 19-01-2038

Il tipo di dati con cui si codifica una data è time_t, che è equivalente a long int.

Per elaborare date occorre includere il file di intestazione time.h (automaticamente incluso con iostream.

Nel file header time.h è definita anche la struttura per mantenere la data decodificata:

struct tm {
 	int	tm_sec;	   /* Secondi: 0-59 */
	int	tm_min;	   /* Minuti: 0-59 */
	int	tm_hour;   /* Ora: 0-23 */
	int	tm_mday;   /* Giorno del mese: 1-31 */
	int	tm_mon;	   /* Mese dell'anno: 0-11 (0=>Gennaio, 11=>Dic */
	int	tm_year;   /* Numero di anni trascorsi dal 1900 */
	int	tm_wday;   /* Giorno della settimana da 0=>Domenica, 6=>Sabato */
	int	tm_yday;   /* Giorno dell'anno a partire dal 1 gennaio: 0-365 */
	int	tm_isdst;  /* +1 si considera l'ora legale, 0 ora legale ignorata,
};

Le funzioni che operano sulle date, servendosi delle variabili di tipo struct time_t e tm sono:

La classe Data.

Creare un nuovo progetto C++. Per il momento non modificare il file contenente la funzione main.

Aggiungere un nuovo file al progetto: File->Nuovo->File sorgente e alla domanda: "aggiungere al progetto?" rispondere .

Dichiarazione della classe

data.h
class Data {
  public:
    Data(int g, int m, int a); // Costruttore
    Data();                    // Costruttore di default
    void mostra(); // 
    void calcGiorno();
    ~Data(); // Distruttore
  private:
    int giorno, mese, anno; // campi privati
    static char *nomeMese[12];
    static char *nomeGiorno[7];
    static int lung[12];
    inline int max( int a, int b) {
      if( a > b ) return a;
      return b;
    }
    inline int min( int a, int b) {
      if( a < b ) return a;
      return b;
    }
};

I campi membro giorno, mese e anno, essendo privati, sono accessibili solo alle funzioni della classe.

Anche gli array di puntatori a char nomeMese, nomeGiorno e l'array di interi lung sono accessibili aolo alle funzioni della classe. Inoltre questi array sono dichiarati static perchè verranno creati un'unica volta

Significato di static

La classe Data rappresenta un nuovo tipo, definito dal programmatore, con cui si possono creare variabili (dette oggetti o istanze) del tipo Data. Ad esempio un oggetto potrebbe memorizzare la data di scadenza dell'assicurazione, un altro oggetto potrebbe memorizzare la data di revisione del veicolo, ecc... Ogni oggetto creato possiederà i propri campi giorno, mese e anno.

Gli array nomeMese, nomeGiorno e lung, invece verranno creati un'unica volta e saranno comuni a tutti gli oggetti di classe Data. Se si dovesse decidere di cambiare la forma in cui sono scritti i nomi dei giorni (ad esempio dalla forma estesa alla forma abbreviata), è sufficiente che lo si faccia, tramite una funzione membro, da un oggetto che la modifica viene vista anche dagli altri oggetti.

Aggiungere un nuovo file al progetto: File->Nuovo->File sorgente e alla domanda: "aggiungere al progetto?" rispondere .

il file di implementazione della classe

Data.cpp
#include <iostream>
#include "data.h"

using namespace std;

char* Data::nomeMese[] = {
      "Gennaio", "Febbraio", "Marzo",
      "Aprile", "Maggio", "Giugno", "Luglio", "Agosto",
      "Settembre","Ottobre","Novembre","Dicembre"
    };
char* Data::nomeGiorno[] = {"Dom", "Lun", "Mar", "Mere", "Gio", "Ven", "sab"};
int Data::lung[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

Data::Data( int g, int m, int a ) {
  mese = max( 1, m );
  mese = min( mese, 11);
  giorno = max( 1, g );
  giorno = min( giorno, lung[mese] );
  anno = max( 1, a );
}
void Data::mostra() {
  cout << "data: " << giorno << ' ' << nomeMese[mese] << ' ' << anno;
}
Data::~Data() { }

Data::Data() {
  time_t secondi;
  tm *ora;
  secondi = time(0);
  ora = localtime(&secondi);
  cout << "Ora: " << ora->tm_hour << ':' << ora->tm_min << ':' << ora->tm_sec << endl;
  giorno = ora->tm_mday;
  mese = ora->tm_mon;
  anno = ora->tm_year + 1900;
}

void Data::calcGiorno () {
  time_t ggmmaa;
  struct tm *recData;

  time (&ggmmaa );
  recData = localtime ( &ggmmaa );
  
  recData->tm_mday = giorno;
  recData->tm_mon = mese - 1;
  recData->tm_year = anno - 1900;

  mktime (recData);

  cout << endl << giorno << "/" << mese << "/" << anno << ": " << nomeGiorno[recData->tm_wday] << endl;
}

Uso della classe: la funzione main.
#include <iostream>
#include "data.h"

using namespace std;

int main() {
  Data Oggi, Compleanno(15, 7, 2013);
  
  Oggi.mostra();
  Compleanno.calcGiorno();
  
  system("Pause");
  return EXIT_SUCCESS;
}

Problemi:

Calcolare il numero di giorni mancanti al compleanno.

Calcolare la data del prossimo lunedì

Calcolare il calendario del mese prossimo.