| Séance d'exercices 11, Programmation I |
| Sciences et Technologies du Vivant, Semestre 1 |
Dans cet exercice, vous allez mettre en
uvre les fonctions
d'algèbre linéaire que vous avez vues en cours.
Matrice
struct Matrice {
float *tab;
int nl, nc;
};
Ajoutez ensuite le code pour les fonctions get et
set permettant d'accéder aux éléments du
tableau. Comme suggéré dans le cours, vérifiez que la ligne
et la colonne auxquelles on désire accéder sont bien
valides. Ajoutez également les fonctions alloue_matrice
et affiche.
Toutes ces fonctions ont été vues en cours, et leur implémentation ne devrait donc pas poser de problèmes.
copie, dont le but est de
copier le contenu d'une matrice dans une autre. La fonction
prendra deux arguments: un pointeur sur la matrice source et un
autre sur la matrice destination. On suppose que la matrice
destination a déjà été allouée. La fonction prendra soin
de vérifier que les deux matrices ont bien la même taille,
avant d'effectuer la copie.
set_id et set_0
permettant d'initialiser une matrice à la matrice identité et
à la matrice nulle, respectivement.
Les en-têtes de ces fonctions devront être:
bool set_id(Matrice *mat); void set_0(Matrice *mat);
La fonction set_id retournera false si la matrice
passée en paramètre n'est pas carrée, et true si
l'opération s'est bien passée.
init permettant d'initialiser
une matrice. Vous allez écrire une fonction différente pour
chaque type de matrice que vous voudrez initialiser. Par exemple,
pour initialiser une matrice 2void init(Matrice *matrice, float c1, float c2, float c3, float c4)
alors que pour initialiser une matrice 2
3, il faudra
utiliser
void init(Matrice *matrice, float c1, float c2, float c3, float c4,
float c5, float c6)
car elle contient 6 coefficients. Cette dernière fonction peut,
par ailleurs, autant servir à initialiser une matrice 3
2 que 2
3. Soyez donc bien attentifs lorsque vous
l'implémentez. On supposera qu'une matrice à 6 coefficients
n'a pas la forme 1
6 ou 6
1, car la structure
Vecteur s'occupera de ces cas-là.
main, déclarez deux matrices
M1 et M2 dans main et initialisez-les comme
suit (sans oublier de les allouer auparavant):
Ecrivez une nouvelle fonction
void add_mat(Matrice *m1, Matrice *m2, Matrice *res)
qui additionne les matrices m1 et m2 et met le
résultat dans res (res est censée avoir été allouée).
Testez votre fonction sur M1 et M2 et affichez le
résultat à l'aide de affiche. Vérifiez que celui-ci
est bien égal à
Vecteur
struct Vecteur {
float *tab;
int n;
};
ainsi que les fonctions relatives: get, set,
affiche et alloue_vecteur. Ces fonctions ont
également été vues en cours. Remarquez que 2 fonctions
peuvent avoir le même nom, pour autant qu'elles aient des
paramètres différents.
Ajoutez aussi une fonction
void init(Vecteur *vecteur, float c1, float c2, float c3, float c4)
pour initialiser un vecteur 4
1.
main, déclarez et initialisez les deux vecteurs
suivants:
Ajoutez la fonction norm_vect qui renvoie la norme d'un
vecteur, et testez-la sur V1 et V2. Vous devez
trouver à peu près 7.34 pour V1 et 4.79 pour
V2.
Ajoutez également la fonction produit_scalaire qui
renvoie le produit scalaire de deux vecteurs, et testez-la sur
V1 et V2. Vous devez trouver 11.
void init3x4(Matrice *matrice,
float c1, float c2, float c3, float c4,
float c5, float c6, float c7, float c8,
float c9, float c10, float c11, float c12)
permettant d'initialiser une matrice 3
4.
Ecrivez la fonction trace et testez-la sur P1. Vous
devez trouver 7.
mult qui multiplie une
matrice par un vecteur, et utilisez-la pour calculer le produit
de P2 et V1. Vous devez trouver:
mult qui multiplie deux
matrices. Utilisez-la pour calculer le produit de P1 et
P2 et mettre le résultat dans une nouvelle variable
P3. Vous devez trouver:
transpose_mat qui permet de transposer
une matrice. Utilisez-la pour affecter transpP1 à la
transposée de P1, et transpP2 à la transposée
de P2.
libere_matrice permettant de désallouer la mémoire d'une
structure Matrice. La fonction recevra un pointeur sur la
structure Matrice en paramètre. Elle désallouera toute la
mémoire ayant été réservée par la fonction
alloue_matrice.
libere_matrice dans le corps du
programme, afin de libérer correctement toute la mémoire qui a
été allouée.
Dans cet exercice, vous allez continuer l'exercice précédent en
ajoutant quelques nouvelles fonctions pour les structures Matrice
et Vecteur.
decale_a_gauche qui décale les
colonnes d'une matrice vers la gauche. La colonne de gauche devra
être déplacée sur la colonne de droite. Par exemple, si on
applique cette fonction à P2, on obtient:
Ecrivez également la fonction decale_a_droite.
Par exemple, appliquée à la matrice P2 qui contient
puissance_mat qui élève une
matrice carrée à une puissance entière passée en
paramètre.
Par exemple, P1 élevée à la puissance 4 donne: