Une union est comparable à une structure si ce n'est que plusieurs
variables sont stockées au même endroit en mémoire : cette zone
peut donc être interprétée de plusieurs façons
différentes.
Exercice 6.2 --- Une arithmétique mixte.
En utilisant votre implantation des rationnels et des complexes,
définissez un type Nombre qui pourra être soit un
entier, soit un Rationnel, soit un flottant, soit un Complexe.
Indications :
vous pouvez vous baser sur le type Nombre suivant :
enum TypeNombre {entier, flottant, rationnel, complexe} ;
typedef struct Nombre {
enum TypeNombre tn ;
union valeur {
int nbentier ;
Rationnel nbrationnel ;
float nbflottant ;
Complexe nbcomplexe ;
} valeur;
} Nombre ;
typedef struct CoupleNombre {
Nombre a ;
Nombre b ;
} CoupleNombre ;
Comme précédent pour implanter notre arithmétique, il nous faut coder :
-
une fonction d'affichage d'un nombre : la fonction
PrintNombre prend en argument une variable de type
Nombre et affiche ce nombre en utilisant les fonctions déjà codées ;
- une fonction de conversion : la fonction ConvertNombre
prend en argument une variable de type CoupleNombre et
retourne une variable de type CoupleNombre dont les
composantes sont de même type ;
- l'addition de deux complexes : la fonction addNombre prend en
argument deux variables de type Nombre et retourne une
variable de type Nombre codant la somme des deux
arguments ;
- le produit de deux complexes : la fonction mulNombre
prend en argument deux variables de type Nombre et
retourne une variable de type Nombre codant le produit des
deux arguments ;
- le quotient de deux complexe : la fonction quoNombre
prend en argument deux variables de type Nombre et retourne
une variable de type Nombre codant le quotient du premier
argument par le second.
Pour fixer les idées, on cherche à élaborer des fonctions permettant les manipulations décrites dans la fonction principale suivante :
int main(void){
Nombre var1, var2, var3 ;
var1.tn = rationnel ;
var1.valeur.nbrationnel.numerateur = 1 ;
var1.valeur.nbrationnel.denominateur = 4 ;
var2.tn = entier ;
var2.valeur.nbentier= 4 ;
var3.tn = complexe ;
var3.valeur.nbcomplexe.partie_reelle = 2.54 ;
var3.valeur.nbcomplexe.partie_imaginaire = 4.45 ;
PrintNombre(var1) ;
printf(" et ");
PrintNombre(var2) ;
printf(" et ");
PrintNombre(var3) ;
printf(".\n");
PrintNombre(QuoNombre(MulNombre(var1,var2),var3)) ;
printf(".\n");
return 1 ;
}
Remarque :
ce genre de problème est plus facilement
gérable dans un langage orienté objet.
Pour tout commentaire : Alexandre Sedoglavic.