7 - Le classi
versione 12/02/2013
 
ESERCIZIO
 
Definire la classe delle date del calendario con:

– Un costruttore che inizializzi la data al capodanno del 2000;
– Un metodo che inizializzi la data con tre interi acquisiti da tastiera;
– Un metodo che visualizzi la data;
– Un metodo che faccia avanzare la data di una giornata.

Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante.

 
SOLUZIONE:
OSSERVAZIONI:

1) Per approfondimenti relativi alle classi clicca qui

1) Per approfondimenti relativi alle funzioni sui files utilizzate clicca sulle sintassi qui sotto elencate:

Soluzione con definizione delle funzioni membro esterna

Se il codice di un metodo si trova all'esterno della definizione della classe a cui appartiene, bisogna "qualificare" il nome della funzione associandogli il nome classe, tramite l'operatore :: di risoluzione di visibilità.

/**************************************************************************
 * Nome: casa1-data.c                                                     *
 * Autore: Alessandro Saetti                                              *
 * Data: 6/4/10                                                           *
 **************************************************************************/
#include <iostream>
using namespace std;

class Data 
{
   public:
     Data();
     void acquisisci();
     void stampa();
     void avanza();

   private:
     int gg, mm, aa;
     bool bisestile();
     int giorni(int mese);
     void normalizza();
};
/*
 * Nome: Data::Data
 * Scopo: Costruttore di default della classe Data
 * Input: -
 * Output: -
 */
Data::Data() 
{
   gg = mm = 1;
   aa = 2000;
}
/*
 * Nome: Data::acqusisci
 * Scopo: Inizializzazione della data con interi acquisiti da tastiera
 * Input: -
 * Output: -
 */
void Data::acquisisci() 
{
   cout << "Inserisci giorno: ";
   cin >> gg;
   cout << "Inserisci mese: ";
   cin >> mm;
   cout << "Inserisci anno: ";
   cin >> aa;
}
/*
 * Nome: Data::stampa
 * Scopo: Stampa la data
 * Input: -
 * Output: -
 */
void Data::stampa() 
{
   cout << gg << "/" << mm << "/" << aa << endl;
}
/*
 * Nome: Data::avanza
 * Scopo: Incrementa la data corrente di un giorno
 * Input: -
 * Output: -
 */
void Data::avanza() 
{
   gg++;
   normalizza();     
}
/*
 * Nome: Data::bisestile
 * Scopo: Determina se l'anno della data e' bisestile
 * Input: -
 * Output: TRUE, se l'anno e' bisestile
 *         FALSE, altrimenti
 */
bool Data::bisestile() 
{
   if (aa % 4 == 0 && aa % 100 != 0 || aa % 400 == 0) return true;
      return false;
}
/*
 * Nome: Data::giorni
 * Scopo: Restituisce il numero di giorni in un mese
 * Input: int mese: il mese da esaminare
 * Output: il numero di giorni di mese
 */
int Data::giorni(int mese) 
{
   int v[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   if (mese == 2 && bisestile()) 
        return 29; 
   else 
        return v[mese-1];
}
/*
 * Nome: Data::normalizza
 * Scopo: Normalizza la data
 * Input: -
 * Output: -
 * Note: Suppone che i giorni della data eccedano al piu' di una unita' il numero di giorni possibili
 */
void Data::normalizza() 
{
   if (gg > giorni(mm)) 
   {
      gg = 1;
      mm ++;       
   }     
   if (mm > 12) 
   {
      mm = 1;
      aa ++;
   }
}
/*
 * Nome: main
 * Scopo: Gestione delle date
 * Input: -
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    Data Giorno;
    int i;
        
    Giorno.acquisisci();
    for(i = 0; i < 15; i++) 
        Giorno.avanza();
    Giorno.stampa();
    
    system("pause");
    return 0;
}
Soluzione con definizione delle funzioni membro inline
/**************************************************************************
 * Nome: casa1-data.c                                                     *
 * Autore: Alessandro Saetti                                              *
 * Data: 6/4/10                                                           *
 **************************************************************************/
#include <iostream>
using namespace std;

class Data 
{
   public:
        Data() 
        {
            gg = mm = 1;
            aa = 2000;
        }
        void acquisisci() 
        {
           cout << "Inserisci giorno: ";
           cin >> gg;
           cout << "Inserisci mese: ";
           cin >> mm;
           cout << "Inserisci anno: ";
           cin >> aa;
        }
        void stampa() 
        {
           cout << gg << "/" << mm << "/" << aa << endl;
        }
        void avanza() 
        {
           gg++;
           normalizza();     
        }

   private:
        int gg, mm, aa;
        bool bisestile() 
        {
           if (aa % 4 == 0 && aa % 100 != 0 || aa % 400 == 0) return true;
              return false;
        }
        int giorni(int mese) 
        {
           int v[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
           if (mese == 2 && bisestile()) 
                return 29; 
           else 
                return v[mese-1];
        }
        void Data::normalizza() 
        {
           if (gg > giorni(mm)) 
           {
              gg = 1;
              mm ++;       
           }     
           if (mm > 12) 
           {
              mm = 1;
              aa ++;
           }
        }
};
/*
 * Nome: main
 * Scopo: Gestione delle date
 * Input: -
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    Data Giorno;
    int i;
        
    Giorno.acquisisci();
    for(i = 0; i < 15; i++) 
        Giorno.avanza();
    Giorno.stampa();
    
    system("pause");
    return 0;
}

ESERCIZIO
 
Testo esercizio
 
SOLUZIONE:
Soluzione C++
Soluzione JavaScript
Soluzione VBA
Soluzione ASP
Soluzione PHP