Classe figura

figura.h

#ifndef FIGURA_H
#define FIGURA_H

#include "def.h"

using namespace std;

/*classe punto definita al momento*/
class punto
{
	public:
		double x,y;
		punto(double x, double y)
		{
			this->x=x;
			this->y=y;
		}
	   
};


/*Classe astratta figura: si definisce astratta una classe in cui è dichiarato almeno un metodo virtuale puro.*/
/*Gestisce figure al massimo di otto lati*/

class figura
{
	
	private:
		string wat();
	
	public:
		figura();
		figura(int nlati);
		~figura();
	
		/*metodo virtuale perchè ridefinito su triangolo_rettangolo*/
	    virtual string toString();
	   
	    
	    /*metodi astratti non serve implementarli in figura, ma è neccessario farlo nelle classi derivate*/
		virtual double area()  = 0;
		virtual double perimetro()  = 0;
		
		
		
		/*metodi classici*/
		int getNlati();
		string lati();
		
		/*metodi statici ausiliari*/
		static string ItoS(int n);
		static string DtoS(double n);
		static string inv(string s);
		
	protected:
		/*attributi protetti*/
		int nlati;
		/*array che contiene i lati delle figure*/
		double l[DIM];
};

#endif

figura.cpp

#include "figura.h"

using namespace std;

figura::figura()
{
	
}
figura::figura(int nlati)
{
	this->nlati=nlati;
}
string figura::wat()
{
	switch (nlati)
	{
		case 0:
			return "Cerchio";
		case 1:
			case 2:
			return "Segmento";
			case 3:
			return "Triangolo";
			case 4:
				return "Quadrilatero";
				case 5:
					return "Pentagono";
					case 6:
						return "Esagono";
						case 7:
						return "Ettagono";
						case 8:
							return "Ottagono";
							
							 default:
								return "Figura indefinita";
			
	}
}
int figura::getNlati()
{
	return nlati;
}

string figura::toString()
{
	
  return "Figura: "+ wat();
}
figura::~figura()
{
	
}



string figura::lati()
{
	string tmp="";
	for(int i=0;i<nlati;i++)
	tmp+= "Lati: "+DtoS(l[i])+" ";
	
	return tmp;
}


/*metodi statici ausiliari*/
/*metodo che converte un intero in stringa*/

	     string figura::ItoS(int n)
	    {
	    	string tmp;
	    	while(n>0)
	    	{
	    		tmp+=(char)(n%10+48);
	    		n/=10;
			}
			
			return inv(tmp);
		}
		
		
		/*metodo che converte un double in stringa*/
		 string figura:: DtoS(double n)
	    {
	    	string tmpdeci="";
	    	string tmp="";
	    	double dec=n-(int)n;
	    	int deci=100*dec;
	    	int intera=(int)n;
	    	
	    	while(deci>0)
	    	{
	    		tmpdeci+=(char)(deci%10+48);
	    		deci/=10;
			}
			if(tmpdeci=="")
			tmpdeci="00";
			while(intera>0)
	    	{
	    		tmp+=(char)(intera%10+48);
	    		intera/=10;
			}
			
			return inv(tmp) + "," + inv(tmpdeci);
			
		}
		
		
		
         string figura::inv(string s)
		{
			int i=0,j=s.length()-1;
			while(i<j)
			{
				swap(s[i],s[j]);
				i++;
				j--;
			}
			
			return s;
		}		
		
		

triangolo.h

#ifndef TRIANGOLO_H
#define TRIANGOLO_H

#include "figura.h"




class triangolo : public figura
{
	private:
		
	public:
		triangolo();
		triangolo(double a, double b, double c);
		~triangolo();
		virtual double area();
		virtual double perimetro();
	   
	protected:
};

#endif

triangolo.cpp

#include "triangolo.h"

triangolo::triangolo()
{
}
triangolo::triangolo(double a, double b, double c)
{
	nlati=3;
	l[0]=a;
	l[1]=b;
	l[2]=c;
}
triangolo::~triangolo()
{
	nlati=3;
	
}
double triangolo::area()
{
	double sp=perimetro()/2;
			
	return sqrt(sp*(sp-l[0])*(sp-l[1])*(sp-l[2]));
}
		
double triangolo::perimetro()
{
	return l[0]+l[1]+l[2];
}

def.h

/*header file dove includiamo tutte le librerie*/
#define DIM 8
#include<math.h>
#include<iostream>
#include<string>
#define PI 3.14

triangolo_rettangolo.h

#ifndef TRIANGOLO_RETTANGOLO_H
#define TRIANGOLO_RETTANGOLO_H

#include "triangolo.h"

class triangolo_rettangolo : public triangolo
{
	public:
		triangolo_rettangolo();
		~triangolo_rettangolo();
		triangolo_rettangolo(double b, double a);
		string toString();
		double area();
	protected:
};

#endif

triangolo_rettangolo.cpp

#include "triangolo_rettangolo.h"

triangolo_rettangolo::triangolo_rettangolo()
{
}
triangolo_rettangolo::triangolo_rettangolo(double b, double a):triangolo(b,a,sqrt(a*a+b*b))
{
//	nlati=3; non serve perche passa attraverso il costruttore di triangolo che ha gia nlati=3
	l[0]=b;
	l[1]=a;
	l[2]=sqrt(a*a+b*b);
	
}
triangolo_rettangolo::~triangolo_rettangolo()
{
}
/*overriding metodo toString*/
string triangolo_rettangolo::toString()
{
	return "Figura: Triangolo Rettangolo";
}
double triangolo_rettangolo::area(){
	
	return l[0]*l[1]/2;
}

triangolo_isoscele.h

#ifndef TRIANGOLO_ISOSCELE_H
#define TRIANGOLO_ISOSCELE_H

#include "triangolo.h"

class triangolo_isoscele : public triangolo
{
	public:
		triangolo_isoscele(double b, double h);
		triangolo_isoscele();
		~triangolo_isoscele();
		string toString();
	protected:
};

#endif

triangolo_isoscele.cpp

#include "triangolo_isoscele.h"

triangolo_isoscele::triangolo_isoscele()
{
}
triangolo_isoscele::triangolo_isoscele(double b, double h):triangolo(b,sqrt((b/2)*(b/2)+h*h),sqrt((b/2)*(b/2)+h*h))
{
	l[0]=b;
	l[1]=sqrt((b/2)*(b/2)+h*h);
	l[2]=l[1];
}
triangolo_isoscele::~triangolo_isoscele()
{
}

string triangolo_isoscele::toString()
{
	return "Figura: Triangolo isoscele";
}

cerchio.h

#ifndef CERCHIO_H
#define CERCHIO_H

#include "figura.h"

class cerchio : public figura
{
	public:
		cerchio();
		cerchio(double r, punto c);
		~cerchio();
		virtual double area();
		virtual double perimetro();
	protected:
};

#endif

cerchio.cpp

#include "cerchio.h"

cerchio::cerchio()
{
}

cerchio::~cerchio()
{
}

cerchio::cerchio(double r,punto c):figura(0)
{
	l[0]=r;
	
}
double cerchio::area()
{
	double sp=perimetro()/2;
			
	return PI*l[0]*l[0];
}
		
double cerchio::perimetro()
{
	return 2*PI*l[0];
}