/* triangolo.h */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include "menu.h" class punto { double x,y; // Attributi del punto, coordinate public: // Costruttore di default: assegna due numeri random da -5.0 a 5.0 son due decimali punto () { x = (random () % 1000) / 100.0 - 5.0; y = (random () % 1000) / 100.0 - 5.0;}; // Costruttore: inizializza con due double punto (double X, double Y) { x=X; y=Y; }; // Costruttore per copia: per quello che fa, puteva bastare quello fornito dal sistema punto (const punto &p) { x = p.x; y = p.y; }; // Visualizza le coordinate del punto void show () { printf ("X %.2f Y %.2f\n", x, y);}; // Operatore -: usando Pitagora, calcola la distanza tra i due punti double operator - (const punto &g) { double a=x - g.x; double b=y -g.y; return sqrt (a*a+b*b); }; // Operatore +=: calcola la somma dei due punti (intesi come vettori) e la lascia nel punto punto &operator += (const punto &g) { y+=g.y; x+=g.x; return *this;}; // Operatore *=: moltiplica le coordinate per un numero, lasciando il risultato nel punto punto &operator *= (double s) { y*=s; x*=s; return *this;}; }; class triangolo { punto a,b,c; // I tre vertici del triangolo public : // Costruttore con tre punti come parametro, chiama l'inizializzatore degli attributi triangolo (const punto &A, const punto &B, const punto &C) : a (A), b (B), c (C) {}; // Metodo 'show' che stampa i vertici del triangolo, richiamando lo 'show' dei punti void show () { printf ("A - "); a.show (); printf ("B - "); b.show (); printf ("C - "); c.show ();}; // Metodo 'perimetro' che calcola il perimetro, sommando la dimensione dei tre lati double perimetro () { return (a-b) + (b-c) + (c-a) ; }; // Operatore +=: somma il punto ai tre vertici, con l'operator += di 'punto' triangolo &operator += (const punto &g) { a+=g; b+=g; c+=g; return *this;}; // Operatore *=: scala il triangolo scalndo tutti e tre i vertici, tramite il loro operatore *= triangolo &operator *= (double s) { a*=s; b*=s; c*=s; return *this;}; }; /* Menu: come al solito solo costruttore e 'action' */ class MenuShow : public menu { protected: virtual void action (void *par) { ((triangolo*)par) -> show (); }; // Invoca semplicemente la 'show' del triangolo public: MenuShow (menu **base,char *n) : menu ((menu**)base,n) {}; }; class MenuPerimetro : public menu { protected: // Calcola il perimetro, usando il metodo di 'triangolo' virtual void action (void *par) { printf ("Perimetro %.2f\n", ((triangolo*)par) -> perimetro ()); }; public: MenuPerimetro (menu **base,char *n) : menu ((menu**)base,n) {}; }; class MenuScala : public menu { protected: virtual void action (void *par); public: MenuScala (menu **base,char *n) : menu ((menu**)base,n) {}; }; void MenuScala::action (void *par) { char str [10]; // Posto per il numero scelto dall'utente double s; // Numero scritto dall'utente printf ("Fattore di scala: "); // Prompt fgets (str,9,stdin); // Legge la risposta dell'utente s = strtod (str,0); // Converte in double *((triangolo*)par) *= s; // Esegue l'operazione } class MenuTrasla : public menu { protected: virtual void action (void *par); public: MenuTrasla (menu **base,char *n) : menu ((menu**)base,n) {}; }; void MenuTrasla::action (void *par) { char str [10]; // Posto per il numero scelto dall'utente double x,y; // Numero scritto dall'utente printf ("X Traslazione: "); // Prompt fgets (str,9,stdin); // Legge la risposta dell'utente x = strtod (str,(char**)0); // Converte in double printf ("Y Traslazione: "); // Prompt fgets (str,9,stdin); // Legge la risposta dell'utente y = strtod (str,(char**)0); // Converte in double *((triangolo*)par) += punto (x,y); // Esegue l'operazione } /* Funzione principale */ int main () { srandom (time (NULL)); /* Inizializza il generatore di numeri casuali */ punto a,b,c; // Crea tre punti 'a caso' triangolo t (a , b, c); // Ci costruisce un triangolo menu *m = 0; // Il menu' principale // Le voci del menu' new menuexit (&m,"Termina"); new MenuShow (&m,"Visualizza Triangolo"); new MenuPerimetro (&m,"Calcola Perimetro"); new MenuScala (&m,"Scala il triangolo"); new MenuTrasla (&m,"Trasla il triangolo"); // Loop di esecuzione del meni' while (1) { m->doaction (m->print (1),&t); // Stampa il menu' ed esegue direttamente il numero trovato } }