TD-2, division par deux, types enregistrements
Vos programmes à déposer sous la forme Prenom.Nom par ftp sur poly en /users/profs/maranget/TD-2.
1 Division par deux
Afin de laisser le plus de place possible à la programmation, voici
quelques indications sur l'exercice 2 du cours.
Cet exercice demande un calcul efficace de x puissance n, à partir de la
décomposition binaire de n, en itérant l'élévation à la puissance
deux (c'est à dire le carré).
Il y a plusieurs façons d'aborder cet exercice classique. En voici
d'abord une qui conduit à une boucle. Soit la décomposition de n en
base deux : n = n0 + n1 * 2 + ··· + nt * 2t. Alors, on a
xn = xn0 * x(n1 * 2) * ··· * x(nt * 2t). Soit
maintenant la suite w0 = x, wk+1 = wk * wk --- autrement dit
wk est x à la puissance 2k. Le résultat xn est un produit
de wj. Dans ce produit, il y a un facteur wj pour chacun des
j tel que 2j entre dans la décomposition en base 2 de n
(i.e. nj = 1). Le programme est donc une boucle sur n0, n1,
..., nt, la décomposition binaire de n. À la j-ème itération,
on accumulera ou non un facteur, selon que nj vaut 1 ou 0, et
on calculera le wj+1 de l'itération suivante.
Avec cette technique, x7 est calculé comme le produit
w0 * w1 * w2 = x * x2 * x4 (puisque 7 = 111 en base deux).
Une autre technique (plus simple à mon avis) est de considérer les
deux relations de récurrence x2k = (xk)2 et x2k+1 = x *
(xk)2, puis d'écrire une fonction récursive.
Avec cette technique x7, est calculé directement comme
x * (x * x2)2.
Dans tous les cas, on a besoin de l'opération modulo, reste de la division
euclidienne, qui s'écrit % en C. Par exemple la fonction
suivante teste la parité d'un entier :
int pair(int i)
{
return (i % 2) == 0;
}
2 Puissances des entiers
Écrire le programme d'élévation à la puissance n, selon l'une ou
l'autre des techniques présentées ci-dessus.
On se place dans le cas où x est un entier long (type long).
Pour lire un entier au clavier
et le ranger dans une variable n du type int, on écrit :
scanf("%d",&n); /* attention au & devant la variable !!! */
Dans le cas d'un entier long, à ranger dans x de type long, c'est un peu différent :
scanf("%ld",&x);
Pour afficher, on utilise printf et les mêmes formats que pour
scanf.
printf("%d",n);
printf("%ld",x);
Faites particulièrement attention aux types, x est de type long, tandis que n est de type int.
3 Nombres complexes
On se place dans le cas particulier des nombres complexes de la forme
n1 + n2 i, où n1 et n2 sont des entiers.
En C, un tel complexe et une valeur du type suivant :
typedef struct {
int re; /* partie réelle */
int im; /* partie imaginaire */
} Complexe;
On demande d'écrire les fonctions qui réalisent les opérations
suivantes :
-
Lire un complexe, sous la forme de deux entiers tapés au
clavier.
- Afficher un complexe à l'écran.
- Multiplier deux complexes.
- Calculer le carré d'un complexe.
En outre, la variable globale neutre devra être déclarée de type
Complexe et initialisée à l'élement neutre de la multiplication.
Ensuite, écrire un programme qui lit un complexe c et un entier n au
clavier, puis calcule et affiche le complexe c à la puissance n.
Ce programme devra utiliser l'élévation à la puissance efficace.
Il sera facile à écrire à partir du programme de l'exercice précédent,
surtout si vous avez utilisé les types rigoureusement et écrit votre
premier programme de façon générique.
4 Il vous reste du temps
Faites le dernier exercice du TP précédent :
``démonstration graphique des tris''.
Ce document a été traduit de LATEX par
HEVEA.