// chapitre 3 union.cpp : définit le point d'entrée pour l'application console.
// bguerin@iconic.fr guerin.brice@free.fr

#include "stdafx.h"

#include <stdio.h>
#include <math.h>

#include "Nombre.h"

Nombre Nombre::lire_double()
{
	Nombre n;
	n.t_nb=t_double;
	scanf("%lg",&n.val.nb_d);
	return n;
}

void Nombre::lire_float()
{
	t_nb=t_float;
	scanf("%f",&val.nb_f);
}

void Nombre::lire_int()
{
	t_nb=t_int;
	scanf("%d",&val.nb_i);
}

void Nombre::afficher()
{
	switch(t_nb)
	{
	case t_int:
		printf("%d\t",val.nb_i);
		break;
	case t_float:
		printf("%f\t",val.nb_f);
		break;
	case t_double:
		printf("%f\t",val.nb_d);
		break;
	}
}





void afficher(Nombre& n)
{
	switch(n.t_nb)
	{
	case t_int:
		printf("%d\t",n.val.nb_i);
		break;
	case t_float:
		printf("%f\t",n.val.nb_f);
		break;
	case t_double:
		printf("%f\t",n.val.nb_d);
		break;
	}
}

Nombre* lire_int()
{
	Nombre* c=new Nombre;
	c->t_nb=t_int;
	printf("entier: ");
	scanf("%d",&c->val.nb_i);

	return c;
}

Nombre* lire_float()
{
	Nombre* c=new Nombre;
	c->t_nb=t_float;
	printf("décimal: ");
	scanf("%f",&c->val.nb_f);
	//cin >> c->val.nb_f; // cin >> float&

	return c;
}

Nombre lire_double()
{
	Nombre c;
	c.t_nb=t_double;
	printf("double: ");
	scanf("%lg",&c.val.nb_d);
	return c;
}

double pi;

double& calcule_pi()
{
	pi=3.14;
	return pi;
}

void calcule_meilleur_pi()
{
	pi=4*atan(1.0);
}


int main(int argc, char* argv[])
{
	Nombre k=Nombre::lire_double();
	k.afficher();

	Nombre n;
	n.lire_int();
	n.afficher();

	Nombre* m;
	m=new Nombre;
	m->lire_int();
	m->afficher();

	n.lire_float();
	n.afficher();

	return 0;

	double & x=calcule_pi(); // autrement dit, x et pi, même variable
	printf("x=%f\n",x);		// 3.14

	calcule_meilleur_pi();
	printf("x=%f\n",x);		// 3.1415926	

	Nombre d;
	d=lire_double();
	afficher(d);
	//afficher(lire_double());

	Nombre* nb=lire_int();
	afficher(*nb);

	Nombre a;
	a.t_nb=t_int;	// on décide que a est un entier
	a.val.nb_i=32;	// c'est le champ nb_i de val qui reçoit la valeur

	Nombre b;
	b.t_nb=t_float;	// on décide que b est un float
	b.val.nb_f=3.14F;	// c'est le champ nb_f qui reçoit la valeur

	afficher(a);
	afficher(b);

	return 0;
}

