PROGRAMMIAMO
C++ - Figure geometriche 2
Semplici modifiche su un programma ad oggetti

Proseguendo nello studio del programma sulle figure geometriche, supponiamo ora di volerlo modificare per aggiungere la possibilità di calcolare oltre all'area anche il perimetro di rettangolo, cerchio e triangolo. Nel caso della classe rettangoli e cerchi, la modifica è molto semplice poiché basta aggiungere alla classe un nuovo metodo perimetro:

class rettangoli {
    private:
        double l1,l2;

    public:
        void set()
            {
            cout<<"Primo lato: ";
            cin>>l1;
            cout<<"Secondo lato: ";
            cin>>l2;
            }

        double area()
            {
            return l1*l2;
            }

        double perimetro()
            {
            return 2*l1+2*l2;
            }
};

class cerchi {
    private:
        double r;

    public:
        void set()
            {
            cout<<"Raggio: ";
            cin>>r;
            }

        double area()
            {
            return 3.14159*r*r;
            }

        double perimetro()
            {
            return 2*3.14159*r;
            }

};

Per quanto riguarda i triangoli, il calcolo del perimetro non può essere fatto a partire da base e altezza, ma richiede la conoscenza dei tre lati del triangolo. D'altra parte, fornendo i tre lati del triangolo invece di base e altezza, si presenta il problema di non poter calcolare più l'area con la formula:

Area = 0.5 * base * altezza;

Il problema può essere risolto calcolando l'area con una formula alternativa, detta di Erone, la quale fa uso delle misure dei tre lati a, b e c e del semiperimetro (p/2, uguale alla metà del perimetro) per il calcolo:

Usando tale formula, la classe triangoli può essere così riscritta:

class triangoli {
    private:
        double a,b,c;

    public:
        void set()
            {
            cout<<"Fornisci le misure dei tre lati: ";
            cin>>a;
            cin>>b;
            cin>>c;
            }
    double perimetro()
        {
        return a+b+c;
        }
    double area()
        {
        double sp;
        sp = perimetro()/2;
        return sqrt(sp*(sp-a)*(sp-b)*(sp-c));
        }
};

Osserviamo subito che il metodo area() della classe triangoli usa al proprio interno il metodo perimetro() della stessa classe:

    double area()
        {
        double sp;
        sp = perimetro()/2; //uso di un altro metodo della stessa classe
        return sqrt(sp*(sp-a)*(sp-b)*(sp-c));
        }

Ancora più interessante è forse osservare che, nonostante la classe triangoli sia stata completamente modificata, la struttura del main è praticamente rimasta la stessa (a parte l'aggiunta della chiamata al metodo perimetro):

int main(int argc, char *argv[])
{
rettangoli ret;
triangoli tri;
cerchi cer;
int scelta;
double a,p;

cout<<"Scegli la figura geometrica:\n";
cout<<"1) rettangolo\n2) triangolo\n3)cerchio\n";
cout<<"Scelta? ";
cin>> scelta;

switch (scelta)
    {
    case 1:
        ret.set();
        a = ret.area();
        p = ret.perimetro();
        break;
    case 2:
        tri.set();
        a = tri.area();
        p = tri.perimetro();
        break;
    case 3:
        cer.set();
        a = cer.area();
        p = cer.perimetro();
        break;
    }
}

Questo è un importante vantaggio della programmazione ad oggetti: siccome il funzionamento e la struttura interna degli oggetti sono incapsulati dentro gli oggetti stessi e non sono visibili all'esterno, è possibile modificare un oggetto anche profondamente, lasciandone però immutata l'interfaccia verso l'esterno. Ciò in particolare può essere fatto senza dover riscrivere il programma, ma modificando solo la classe.

 

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it