« C pointeurs/Matrices complexes 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 = 16
| précédent = [[../Matrices fractions 3/]]
| suivant = [[../Matrices complexes fractions 2/]]
}}
 
 
== Introduction ==
 
 
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.
* Les valeurs sont des complexes dont les parties 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 (f04a.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*C4)]={ 1,1,1,1, 2,2,2,2, 3,3,3,3,
4,4,4,4, 5,5,5,5, 6,6,6,6};
double **A = i_mF(R2,C3);
 
c_a_A_mF(a,A);
printf(" A: \n");
p_mF(A,5,0,4);
 
f_mF(A);
 
getchar();
 
return 0;
}
</source>
 
Le résultat:
 
A:
.
+1/1 +1/1*I +2/2 +2/2*I +3/3 +3/3*I
+4/4 +4/4*I +5/5 +5/5*I +6/6 +6/6*I
 
 
* 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),5,5);
double **B = r_mF(i_mF(r,c),5,5);
double **AplsB = i_mF(r,c);
 
printf(" A:");
p_mF(A,5,0,C4);
printf(" B:");
p_mF(B,5,0,C4);
 
printf(" AplsB:");
p_mF(add_mF(A,B,AplsB),7,3, C3);
 
getchar();
 
f_mF(A);
f_mF(B);
f_mF(AplsB);
 
return 0;
}
</source>
 
 
Résultat :
 
 
A:
+4/3 +3/5*I +3/4 +4/4*I +5/3 +1/3*I
+4/2 +4/2*I +2/1 +2/1*I +2/2 +3/3*I
+5/5 +5/5*I +5/1 +2/4*I +3/5 +5/5*I
+3/3 +3/4*I +1/1 +3/1*I +2/3 +3/5*I
+4/1 +1/2*I +2/5 +2/2*I +4/3 +1/5*I
.
B:
+3/4 +3/5*I +3/2 +5/3*I +5/4 +1/2*I
+1/4 +2/2*I +1/4 +4/1*I +5/4 +3/3*I
+5/4 +1/5*I +3/3 +4/5*I +2/2 +1/4*I
+5/2 +3/4*I +1/4 +2/1*I +2/4 +5/4*I
+4/3 +5/5*I +3/2 +3/4*I +2/3 +3/4*I
.
AplsB:
+25/ 12 +6/ 5*I +9/ 4 +8/ 3*I +35/ 12 +5/ 6*I
+9/ 4 +3/ 1*I +9/ 4 +6/ 1*I +9/ 4 +2/ 1*I
+9/ 4 +6/ 5*I +6/ 1 +13/ 10*I +8/ 5 +5/ 4*I
+7/ 2 +3/ 2*I +5/ 4 +5/ 1*I +7/ 6 +37/ 20*I
+16/ 3 +3/ 2*I +19/ 10 +7/ 4*I +2/ 1 +19/ 20*I
 
 
=== Multiplier deux matrices ===
 
 
<source lang="c">
/* ------------------------------------ */
/* Save as : c02.c */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
 
srand(time(&t));
 
int a = rp_I(4);
int b = rp_I(4);
int c = rp_I(4);
 
double **A = r_mF(i_mF(a,b),5,5);
double **B = r_mF(i_mF(b,c),5,5);
double **AB = i_mF(a,c);
 
printf(" A:");
p_mF(A,5,0,C4);
printf(" B:");
p_mF(B,5,0,C4);
 
printf(" AB:");
p_mF(mul_mF(A,B,AB),7,3, C3);
 
getchar();
 
f_mF(A);
f_mF(B);
f_mF(AB);
 
return 0;
}
</source>
 
 
Résultat :
 
 
A:
+1/4 +2/1*I +2/4 +3/4*I
+1/5 +1/4*I +3/3 +5/4*I
+2/2 +2/4*I +2/5 +5/5*I
+1/4 +3/4*I +3/4 +4/3*I
.
B:
+3/2 +3/4*I +5/2 +2/3*I +4/4 +1/3*I +1/3 +4/4*I
+1/5 +2/2*I +2/3 +1/4*I +1/1 +4/1*I +4/3 +3/3*I
.
AB:
-71/ 40 +307/ 80*I -9/ 16 +139/ 24*I -35/ 12 +29/ 6*I
-15/ 16 +71/ 40*I +11/ 16 +221/120*I -233/ 60 +167/ 30*I
+41/200 +21/ 10*I +131/ 60 +161/ 60*I -83/ 30 +103/ 30*I
-329/240 +559/240*I +7/ 24 +449/144*I -55/ 12 +31/ 6*I
.
-2/ 1 +29/ 12*I
-1/ 10 +59/ 20*I
-19/ 30 +29/ 10*I
-1/ 1 +109/ 36*I
 
Remarque :
 
* r_ pour rand.
* p_ pour print.
* i_ pour initialize.
* f_ pour free.
 
 
== 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>
 
 
Ceci termine notre premier pas sur les double pointeurs.
 
 
 
{{Bas de page
| idfaculté = informatique
| précédent = [[../Matrices fractions 3/]]
| suivant = [[../Matrices complexes fractions 2/]]
}}