// chapitre 7 modèle classe.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"

#include <iostream>
using namespace std;

template<class T=float> class Matrice
{
protected:
	int nb_vecteur,t_vecteur;
	T*valeurs;

public:
	// constructeur
	Matrice(int nb,int t) : nb_vecteur(nb),t_vecteur(t)
	{
		valeurs=new T[nb_vecteur*t_vecteur];
	}

	// référence sur le type T
	T& at(int vecteur,int valeur);

	
	// transtypage de double vers T
	void random()
	{
	int vect,val;
		for(vect=0; vect<nb_vecteur; vect++)
		{
			for(val=0; val<t_vecteur; val++)
				at(vect,val)=(T) (((double)rand()/RAND_MAX)*100.0);			
		}
	}

	// affichage
	void afficher();	
} ;

template<class T> void Matrice<T>::afficher()
{
	int vect,val;
	cout.precision(2);		
	cout << fixed;
	for(vect=0; vect<nb_vecteur; vect++)
	{
		for(val=0; val<t_vecteur; val++)
		{
			cout.width(6);
			cout << at(vect,val) ;
			cout << (val<t_vecteur-1?",":"");
		}
		cout << endl;
	}
}

template<> void Matrice<float>::afficher()
{
	int vect,val;
	cout.precision(2);		
	cout << fixed;
	printf("Affichage spécifique float\n");
	for(vect=0; vect<nb_vecteur; vect++)
	{
		for(val=0; val<t_vecteur; val++)
		{			
			printf("%f",at(vect,val)) ;
			printf((val<t_vecteur-1?",":""));
		}
		printf("\n");;
	}
}

template<class T> T& Matrice<T>::at(int vecteur,int valeur)
{
	return valeurs[vecteur*t_vecteur+valeur];
}

int main(int argc, char* argv[])
{
	Matrice<double> m(3,4);
	m.random();
	m.afficher();

	Matrice<> mf(5,5);	// matrice de float
	mf.random();
	//mf.afficher();
	return 0;
}

