Exercice langage C : Les Types Float et Double

En langage C, les types prédé?nis ?oat et double permettent de manipuler des nombres à virgule ?ottante en simple et double précision mais il n’y a pas de type prédé?ni permettant de manipuler des nombres complexes.

On dé?nira un type cmplx1en utilisant une structure et deux champs de type double qui représentent la partie réelle et la partie imaginaire.

On écrira des fonctions lit c(), a?che c(c),somme c(c1,c2) et produit c(c1,c2) que l’on utilisera dans un programme permettant de calculer des expressions de la forme ((c1op1c2)op2c3)op3c4)...opn?1cn) o`u les complexes sont rentrés dans

l’ordre c1, c2,... et l’expression calculée dans l’ordre c1op1c2 d’abord puis son résultat utilisé comme argument gauche de op2 et ainsi de suite.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

#include
#include
#de?ne N 5
/? type?/
struct cmplx

{ double re;
double im;
};
/? prototypes ?/
struct cmplx lit c(void);
void a?che c(struct cmplx c);
struct cmplx somme c(struct cmplx c1, struct cmplx c2);
struct cmplx produit c(struct cmplx c1, struct cmplx c2);
/? principale ?/
int main()
{ struct cmplx resg,d;
char rep[10];
printf(”gauche ? (deux r´eels a et b pour le complexe a+ ib)\n”);
resg=lit c();
a?che c (resg);
printf(”op? (+ ou? ou r (esultat) )\n”);
scanf(%s”,rep);
while (rep[0] !=’r’)
{ printf(”droit ? (deux r´eels a et b pour le complexe a+ ib)\n”);
d=lit c();
if (rep[0]==+)
{ resg=somme c(resg,d);
}else
{ if (rep[0]==’?’)
{ resg=produit c(resg,d);
}else
{ printf(”erreur\n”);break;
}
}printf((interm´ediaire) ==>);
a?che c (resg);
printf(”op? (+ ou? ou r (esultat) )\n”);
scanf(%s”,rep);
}printf(==>);
a?che c (resg);
return EXIT SUCCESS;
}/?fonctions?/

truct cmplx lit c(void)
{ struct cmplx c;
scanf(%lf”,&c.re);
scanf(%lf”,&c.im);
return (c);
}void a?che c(struct cmplx c)
{ printf((%lf,%lf)\n”,c.re,c.im);
return ;
}struct cmplx somme c(struct cmplx c1, struct cmplx c2)
{ struct cmplx c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return (c);
}struct cmplx produit c(struct cmplx c1, struct cmplx c2)
{ struct cmplx c;
c.re=(c1.re?c2.re)?(c1.im?c2.im);
c.im=(c1.re?c2.im)+(c1.im?c2.re);
return (c);
}//((a op b) op c)op d ) etc ...
//[Session started at 2006?11?14 15:45:21 +0100.]
//gauche ? (deux r´eels a et b pour le complexe a+ ib)
//1 1
//(1.000000,1.000000)
//op? (+ ou? ou r (esultat) )
//+
//droit ? (deux r´eels a et b pour le complexe a+ ib)
//3 3
//(interm´ediaire) ==>(4.000000,4.000000)
//op? (+ ou? ou r (esultat) )
//?
//droit ? (deux r´eels a et b pour le complexe a+ ib)
//2 1
//(interm´ediaire) ==>(4.000000,12.000000)
//op? (+ ou? ou r (esultat) )
//r
//==>(4.000000,12.000000)