« C pointeurs/Matrices fractions » : 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 = 13
| précédent = [[../Tableau matrices complexes/]]
| suivant = [[../Matrices fractions 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 dont les valeurs sont des fractions.
 
=== 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-KoQAOnU4FnTWt2MnRnV3Y3UUE&usp=sharing librairie]'''d'algèbre linéaire (f03a.zip).
* Indispensable pour tester les exemples de cette page.
 
<source lang="c">
/* ------------------------------------ */
/* 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;
}
</source>
 
 
Résultat :
 
A:
.
+1/1 +2/2 +3/3
+4/4 +5/5 +6/6
 
 
Présentation des fonctions :
 
{| class="wikitable"
|-
| double **A = i_mF(R2,C3); || Initialiser une matrice avec des fractions
* Deux lignes (Rows)
* Trois colonnes (Columns)
|-
| c_a_A_mF(a,A); || Copier le tableau "a" dans la matrice "A"
|-
| p_mF(A,N,F,C); || Imprimer la matrice "A"
* N espaces entre les nombres.
* F espaces entre les numérateurs et les dénominateurs.
* C colonnes par lignes.
|-
| f_mF(A); || Libérer l'espace alloué à la matrice "A"
|}
 
 
=== Additionner deux matrices ===
 
 
<source lang="c">
/* ------------------------------------ */
/* 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;
}
</source>
 
 
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 ===
 
 
<source lang="c">
/* ------------------------------------ */
/* 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;
}
</source>
 
 
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.
 
 
<source lang="c">
double **A i_mF(r,c);
</source>
 
* Création de la matrice de r lignes et c colonnes.
 
<source lang="c">
double **A = r_mF(i_mF(r,c),9,9);
</source>
 
* Initialiser la matrices avec des fractions comprises entre 0/0 (= 0) et 9/9 (= 1).
 
== La fonction f_mF(); ==
 
* Nous allons commencer par cette fonction.
* Elle libère l'espace alloué à la matrice par la fonction i_mF();
 
=== Code source ===
 
 
<source lang="c">
/* ------------------------------------ */
void f_mF(
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_mF(
double **A
)
{
if(A){
free(A[0]);
free(A);
}
}
</source>
 
 
Cette [http://www.dailymotion.com/video/xeqr4p_f03-4a_tech Vidéo] termine notre premier pas sur les double pointeurs.
 
 
{{Bas de page
| idfaculté = informatique
| précédent = [[../Tableau matrices complexes/]]
| suivant = [[../Matrices fractions 2/]]
}}