C pointeurs/Matrices fractions
Introduction
modifierPrésentation
modifierDouble pointeur de double.
- Pour nous ce sera un travail sur les matrices.
Ce cours en deux parties va vous présenter la création et la destruction de matrices dont les valeurs sont des fractions.
Le but
modifierCela vous permettra :
- Soit de construire votre propre méthode de création de matrices.
- Soit de construire votre propre librairie à partir de ces deux méthodes.
- Soit de commencer votre apprentissage de la méthode "mathc".
Exemple d'utilisation de la librairie
modifierCopie d'un tableau dans une matrice
modifier- Pour récupérer la librairied'algèbre linéaire (f03a.zip).
- Indispensable pour tester les exemples de cette page.
/* ------------------------------------ */
/* Save as : c01.c */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
int main(void)
{
double a[R2*(C3*C2)]={ 1,1, 2,2, 3,3,
4,4, 5,5, 6,6};
double **A = i_mF(R2,C3);
c_a_A_mF(a,A);
printf(" A: \n");
p_mF(A,3,0,C5);
f_mF(A);
getchar();
return 0;
}
Résultat :
A: . +1/1 +2/2 +3/3 +4/4 +5/5 +6/6
Présentation des fonctions :
double **A = i_mF(R2,C3); | Initialiser une matrice avec des fractions
|
c_a_A_mF(a,A); | Copier le tableau "a" dans la matrice "A" |
p_mF(A,N,F,C); | Imprimer la matrice "A"
|
f_mF(A); | Libérer l'espace alloué à la matrice "A" |
Additionner deux matrices
modifier/* ------------------------------------ */
/* Save as : c02.c */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
int r = rp_I(5);
int c = rp_I(5);
double **A = r_mF(i_mF(r,c),9,9);
double **B = r_mF(i_mF(r,c),9,9);
double **AplsB = i_mF(r,c);
printf(" A: \n");
p_mF(A,5,0,C6);
printf(" B: \n");
p_mF(B,5,0,C6);
printf(" A+B: \n");
p_mF(add_mF(A,B,AplsB),5,2,C6);
f_mF(A);
f_mF(B);
f_mF(AplsB);
getchar();
return 0;
}
Résultat :
A: +7/1 +1/1 +9/5 +3/4 +3/2 +2/7 +3/8 +1/4 +1/2 +1/1 +3/7 +1/2 +9/8 +9/2 +2/1 +1/2 . B: +2/3 +6/5 +1/1 +5/8 +3/4 +1/1 +3/8 +7/4 +7/1 +7/8 +9/7 +2/3 +1/1 +3/1 +8/3 +4/1 . A+B: +23/ 3 +11/ 5 +14/ 5 +11/ 8 +9/ 4 +9/ 7 +3/ 4 +2/ 1 +15/ 2 +15/ 8 +12/ 7 +7/ 6 +17/ 8 +15/ 2 +14/ 3 +9/ 2
Multiplier deux matrices
modifier/* ------------------------------------ */
/* Save as : c03.c */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
int a = rp_I(5);
int b = rp_I(5);
int c = rp_I(5);
double **A = r_mF(i_mF(a,c),9,9);
double **B = r_mF(i_mF(c,b),9,9);
double **AB = i_mF(a,b);
printf(" A:");
p_mF(A,5,0,C6);
printf(" B:");
p_mF(B,5,0,C6);
printf(" AB:");
p_mF(mul_mF(A,B,AB),10,4,C3);
f_mF(A);
f_mF(B);
f_mF(AB);
getchar();
return 0;
}
Résultat :
A: +7/8 +4/1 +3/8 +1/4 +5/9 +8/3 +3/7 +2/5 . B: +7/5 +5/6 +1/1 +2/7 +3/7 +7/5 +2/3 +3/1 . AB: +823/ 280 +1519/ 240 +85/ 24 +177/ 280 +53/ 80 +13/ 24 +121/ 63 +1133/ 270 +7/ 3 +27/ 35 +321/ 350 +73/ 105 . +49/ 4 +6/ 7 +514/ 63 +324/ 245
Remarque :
- r_ pour rand.
- p_ pour print.
- i_ pour initialize.
- f_ pour free.
double **A i_mF(r,c);
- Création de la matrice de r lignes et c colonnes.
double **A = r_mF(i_mF(r,c),9,9);
- Initialiser la matrices avec des fractions comprises entre 0/0 (= 0) et 9/9 (= 1).
La fonction f_mF();
modifier- Nous allons commencer par cette fonction.
- Elle libère l'espace alloué à la matrice par la fonction i_mF();
Code source
modifier/* ------------------------------------ */
void f_mF(
double **A
)
{
if(A) free(A[0]);
free(A);
}
- Nous travaillons avec des double pointeurs (**A).
- Il y a deux pointeurs dans la fonction. (A,A[0])
- C'est un bon début.
- On commence par vérifier que "A" n’est pas NULL.
- Si tout va bien on libère "A[0]" le deuxième pointeur.
- Puis on libère A.
- Si "A" n'existe pas, on saute "A[0]", mais on libère "A".
- Peut-être aurait-il mieux valu écrire
/* ------------------------------------ */
void f_mF(
double **A
)
{
if(A){
free(A[0]);
free(A);
}
}
Cette Vidéo termine notre premier pas sur les double pointeurs.