« C pointeurs/Double pointeur de double » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Page blanchie
Ligne 1 :
{{Chapitre
| niveau = 14
| idfaculté = informatique
| numéro = 5
| précédent = [[../Tableau de pointeurs de fonctions 2 /]]
| suivant = [[../ Double pointeur de double 2/]]
}}
 
 
== Introduction ==
 
=== Présentation ===
 
 
Double 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 de la librairie "[[Mathc_Home_Edition_f01|Mathc]]".
 
=== Le but ===
 
Cela 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 ==
 
=== Copie d'un tableau dans une matrice ===
 
* Pour récupérer la '''[https://drive.google.com/folderview?id=0B-KoQAOnU4FnWFJJUnNkN3h1bFU&usp=sharing librairie]'''d'algèbre linéaire (n_1aa.zip).
* Indispensable pour tester les exemples de cette page.
* Le deuxième fichier n_1ab.zip sera pour l'étude des tableaux de matrices.
 
<source lang="c">
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
double a[R2*C3]={ 1,2,3,
4,5,6};
 
double **A = i_mR(R2,C3);
 
c_a_A_mR(a,A);
 
printf(" a[r*c] -> A : \n\n");
p_mR(A,0,0,C6);
 
f_mR(A);
getchar();
 
return 0;
}
</source>
 
 
Présentation des fonctions :
 
{| class="wikitable"
|-
| double**A=i_mR(R2,C3); || Initialiser une matrice réelle
* Deux lignes (rows)
* Trois colonnes (columns)
|-
| c_a_A_mR(a,A); || Copier le tableau "a" dans la matrice "A"
|-
| p_mR(A,T,V,C); || Imprimer la matrice "A"
* T espaces entre les nombres
* V chiffres après la virgule.
* C colonnes par lignes.
|-
| f_mR(A); || Libérer l'espace alloué à la matrice "A"
|}
 
 
 
=== Additionner deux matrices ===
 
 
<source lang="c">
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
 
srand(time(&t));
 
int r = rp_I(5);
int c = rp_I(5);
 
double **A = r_mR(i_mR(r,c),9);
double **B = r_mR(i_mR(r,c),9);
double **AplsB = i_mR(r,c);
 
 
printf(" A : ");
p_mR(A,3,0,C6);
 
printf(" B : ");
p_mR(B,3,0,C6);
 
printf(" AplsB : ");
p_mR(add_mR(A,B,AplsB),3,0,C6);
 
f_mR(A);
f_mR(B);
f_mR(AplsB);
 
getchar();
 
return 0;
}
</source>
 
Résultat :
 
A :
+8 +6 -5 +4
+2 +2 -5 -1
-9 +2 +8 -7
+4 +4 -7 -9
-7 +2 +6 +2
.
B :
+4 +8 -5 +8
+8 -7 +2 +4
+4 +6 -9 -1
+2 +2 +4 -3
-3 -9 -1 -9
.
AplsB :
+12 +14 -10 +12
+10 -5 -3 +3
-5 +8 -1 -8
+6 +6 -3 -12
-10 -7 +5 -7
 
 
=== Mutiplier deux matrices ===
 
 
<source lang="c">
/* ------------------------------------ */
#include "v_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_mR(i_mR(a,c),9);
double **B = r_mR(i_mR(c,b),9);
double **AB = i_mR(a,b);
 
printf(" A : ");
p_mR(A,3,0,C6);
 
printf(" B : ");
p_mR(B,3,0,C6);
 
printf(" AB : ");
p_mR(mul_mR(A,B,AB),3,0,C6);
 
f_mR(A);
f_mR(B);
f_mR(AB);
 
getchar();
 
return 0;
}
</source>
 
 
Résultat :
 
 
A :
-7 -1 -1
-3 +2 -1
+8 -3 -5
-9 -5 -3
+2 +6 -3
.
B :
-3 +8 -5 -3
+2 +8 +4 -9
+6 +8 -7 +8
.
AB :
+13 -72 +38 +22
+7 -16 +30 -17
-60 +0 -17 -37
-1 -136 +46 +48
-12 +40 +35 -84
 
 
=== Inverser une matrice ===
 
 
<source lang="c">
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
 
srand(time(&t));
 
int r = rp_I(5)+1;
 
double **A = r_mR(i_mR(r,r),9);
double **invA = r_mR(i_mR(r,r),9);
double **AinvA = i_mR(r,r);
 
printf(" A : ");
p_mR(A,3,0,C6);
 
printf(" invA : ");
p_mR(inv_mR(A,invA),6,3,C6);
 
printf(" A *& invA : ");
p_mR(mul_mR(A,invA,AinvA),6,3,C6);
 
f_mR(A);
f_mR(invA);
f_mR(AinvA);
 
getchar();
 
return 0;
}
</source>
 
 
Résultat :
 
A
-1 +2 +2 -3 -5 +6
-1 -5 -9 -3 +2 -3
-5 -7 +4 -3 -3 -7
+4 +8 +6 -3 -7 +6
-3 +2 +6 -1 -3 +6
-5 -1 -5 +4 -3 -7
.
invA :
+0.382 -0.241 +0.023 -0.125 -0.448 -0.082
-0.598 +0.310 -0.063 +0.305 +0.470 +0.083
-0.055 -0.057 +0.046 +0.006 +0.031 -0.037
+0.441 -0.339 -0.029 -0.254 -0.363 +0.023
-0.448 +0.213 -0.041 +0.117 +0.354 -0.031
+0.296 -0.116 -0.039 -0.154 -0.129 -0.043
.
A *& invA :
+1.000 -0.000 +0.000 -0.000 -0.000 -0.000
+0.000 +1.000 -0.000 +0.000 +0.000 +0.000
-0.000 +0.000 +1.000 +0.000 +0.000 -0.000
+0.000 -0.000 +0.000 +1.000 -0.000 -0.000
+0.000 -0.000 +0.000 +0.000 +1.000 -0.000
-0.000 +0.000 -0.000 +0.000 +0.000 +1.000
 
 
Remarque :
 
 
* r_ pour rand.
* p_ pour print.
* i_ pour initialize.
* f_ pour free.
* mR pour Real matrix
 
 
== La fonction f_mR(); ==
 
* Nous allons commencer par cette fonction.
* Elle libère l'espace alloué à la matrice par la fonction i_mR();
 
=== Code source ===
 
 
<source lang="c">
/* ------------------------------------ */
void f_mR(
double **A
)
{
if(A) free(A[0]);
 
free(A);
}
</source>
 
 
* 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
 
 
<source lang="c">
/* ------------------------------------ */
void f_mR(
double **A
)
{
if(A){
free(A[0]);
free(A);
}
}
</source>
 
 
* Ces [[Mathc_Home_Edition_t01/Matrices|vidéos]] terminent notre premier pas sur les double pointeurs.
 
 
{{Bas de page
| idfaculté = informatique
| précédent = [[../Tableau de pointeurs de fonctions 2/]]
| suivant = [[../ Double pointeur de double 2/]]
}}