Skip to content
Browse files

04Apr2011-221944

  • Loading branch information...
1 parent 1afc104 commit 21a5aec2fb55e55c98e43c676342394a1eeb43b8 GuybrushT committed
Showing with 106 additions and 97 deletions.
  1. +4 −1 Makefile
  2. +5 −2 TODO
  3. +54 −48 func.c
  4. +11 −19 head.h
  5. BIN libmat.a
  6. +32 −27 main.c
View
5 Makefile
@@ -13,7 +13,7 @@ endif
all: head.h main.o func.o
- $(CC) main.o func.o
+ $(CC) main.o func.o libmat.a
clean:
rm -rf *.o
@@ -25,3 +25,6 @@ main.o: head.h main.c
func.o: head.h func.c
$(CC) $(CFLAGS) func.c
+
+libmat.a:
+ ar -a libmat.a func.o
View
7 TODO
@@ -1,4 +1,7 @@
TODO
-Affichage sym
-Remplissage sym
+• déterminer x solution de Ax = b par appel à une fonction solve(A, b, x)
+• afficher le résultat
+• vérifier le résultat par appel à une fonction qui calcule
+• afficher le résultat
+• libérer l'espace mémoire alloué dynamiquement au cours du programme.
View
102 func.c
@@ -13,53 +13,6 @@ int* recuperer_n_entiers(int n)
-/* Vecteurs -------------------------------------------------------*/
-
-vecteur* creer_vecteur(char *nom_vecteur, int dimension_vecteur)
-{
- vecteur *nouveau_vecteur;
- nouveau_vecteur=(vecteur*) malloc (sizeof(vecteur));
- strcpy(nouveau_vecteur->nom,nom_vecteur); // methode pour assigner une chaine de caracteres; ne pas oublier d'inclure string.h
- nouveau_vecteur->dimension=dimension_vecteur;
- nouveau_vecteur->tableau=(int*) malloc (dimension_vecteur*sizeof(int));
-
- return nouveau_vecteur;
-}
-
-
-void remplir_vecteur(vecteur vectA, int* TAB) // TAB doit contenir le meme nombre d'elements que vectA
-{
- int i=0;
-
- for(i=0;i<vectA.dimension;i++)
- vectA.tableau[i]=TAB[i];
-}
-
-void afficher_vecteur(vecteur vectA)
-{
- int i=0;
-
- printf("[ ");
- for(i=0;i<vectA.dimension;i++)
- printf("%d ",vectA.tableau[i]);
- printf("]\n");
-}
-
- int produit_scalaire(vecteur vectA, vecteur vectB) // vectB doit contenir le meme nombre d'elements que vectA
-{
- int i=0,R=0;
- for(i=0;i<vectA.dimension;i++)
- R+=vectA.tableau[i]*vectB.tableau[i];
- return R;
-}
-
-void detruire_vecteur(vecteur* vectA)
-{
- free(vectA->tableau);
- free(vectA);
-}
-
-
@@ -85,6 +38,8 @@ matrice* creer_matrice(char *nom_matrice, int nb_lignes_matrice, int nb_colonnes
else if(prop_matrice==SYMETRIQUE)
{
+ nouvelle_matrice->remplir=&remplir_matrice_symetrique;
+ nouvelle_matrice->afficher=&afficher_matrice_symetrique;
nouvelle_matrice->tableau_2d=allouer_matrice_symetrique(nb_lignes_matrice);
}
@@ -118,7 +73,7 @@ TYPE_ELEMENTS_MATRICE** allouer_matrice_symetrique(int nb_lignes_matrice)
matrice_allouee[0]=(TYPE_ELEMENTS_MATRICE*) malloc (nb_lignes_matrice*(nb_lignes_matrice+1)/2*sizeof(TYPE_ELEMENTS_MATRICE)); // calcul la somme des n premiers entiers pour trouver le nombre d'elements a stocker dans la matrice symetrique
for(i=1;i<nb_lignes_matrice;i++)
{
- matrice_allouee[i]=matrice_allouee[0]+(nb_lignes_matrice+1-i)*sizeof(TYPE_ELEMENTS_MATRICE); // le nombre d'elements par ligne est decroissant de n à 1
+ matrice_allouee[i]=matrice_allouee[i-1]+i; // le nombre d'elements par ligne est croissant de 1 à n
}
return matrice_allouee;
@@ -148,6 +103,25 @@ void afficher_matrice_pleine(matrice matriceA) // /!\ distinguer
printf("#############################################\n\n");
}
+void afficher_matrice_symetrique(matrice matriceA) // /!\ distinguer affichage de matrices pleines et symetriques
+{
+ int i,j;
+ printf("\n############# Matrice %s #############\n",matriceA.nom);
+
+ for (i=0; i<matriceA.nb_lignes; i++)
+ {
+ printf("[\t");
+ for (j=0; j<matriceA.nb_colonnes; j++)
+ {
+ if(j<=i) printf("%+d\t",matriceA.tableau_2d[i][j]);
+ else printf("%+d\t",matriceA.tableau_2d[j][i]);
+ }
+ printf("]\n");
+ }
+ printf("#############################################\n\n");
+}
+
+
@@ -166,6 +140,20 @@ void remplir_matrice_pleine(matrice matriceA, TYPE_ELEMENTS_MATRICE* TAB) /*
matriceA.tableau_2d[i][j]=TAB[j+i*matriceA.nb_colonnes];
}
+void remplir_matrice_symetrique(matrice matriceA, TYPE_ELEMENTS_MATRICE* TAB) /* /!\ TAB doit contenir le meme nombre d'elements que matriceA, soit nb_lignes*nb_colonnes */
+{
+ int i=0,j=0;
+
+/*
+ for(j=0;j<matriceA.nb_colonnes;j++)
+ for(i=0;i<matriceA.nb_lignes;i++)
+ if(i<=j) matriceA.tableau_2d[i][j]=TAB[j+i*(i+1)/2];
+ */
+
+ for(i=0;i<matriceA.nb_lignes*(matriceA.nb_lignes+1)/2;i++)
+ matriceA.tableau_2d[0][i]=TAB[i];
+}
+
/* Liberation de la memoire allouee */
@@ -176,6 +164,7 @@ void detruire_matrice(matrice* matriceA)
free(matriceA);
}
+
/* Fonctions de calcul */
matrice* produit_matriciel(matrice* matriceA, matrice* matriceB)
{
@@ -206,4 +195,21 @@ matrice* produit_matriciel(matrice* matriceA, matrice* matriceB)
return produit;
}
+}
+
+
+matrice* decomposition_cholesky(matrice* matriceA)
+{
+
+ if(matriceA->proprietes==SYMETRIQUE)
+ return 0;
+
+ else
+ {
+ /* Creation matrice resultat */
+ matrice *cholesky=creer_matrice(strcat("Decomposition de ",matriceA->nom), matriceA->nb_lignes, matriceA->nb_colonnes, NON_SYMETRIQUE);
+ }
+
+
+
}
View
30 head.h
@@ -3,22 +3,6 @@
#include <string.h>
-/* Vecteurs */
-typedef struct {
- char nom[15];
- int dimension;
- int* tableau;
-} vecteur;
-
-vecteur* creer_vecteur(char*, int);
-void remplir_vecteur(vecteur, int*);
-void afficher_vecteur(vecteur);
-int produit_scalaire(vecteur, vecteur);
-void detruire_vecteur(vecteur*);
-
-
-
-
/* Matrices */
@@ -43,14 +27,22 @@ typedef struct matrice {
-/* Prototypes */
+/* Fonctions de gestion de memoire */
matrice* creer_matrice(char*, int, int, int);
TYPE_ELEMENTS_MATRICE** allouer_matrice_pleine(int, int);
TYPE_ELEMENTS_MATRICE** allouer_matrice_symetrique(int);
+void detruire_matrice(matrice*);
+
+/* Fonctions d'affichage */
void afficher_matrice(matrice);
void afficher_matrice_pleine(matrice);
void afficher_matrice_symetrique(matrice);
+
+/* Fonctions d'affichage */
+void remplir_matrice(matrice, TYPE_ELEMENTS_MATRICE*);
void remplir_matrice_pleine(matrice, int*);
-void detruire_matrice(matrice*);
+void remplir_matrice_symetrique(matrice, int*);
-matrice* produit_matriciel(matrice*, matrice*);
+/* Fonctions de calcul */
+matrice* produit_matriciel(matrice*, matrice*);
+matrice* decomposition_cholesky(matrice*);
View
BIN libmat.a
Binary file not shown.
View
59 main.c
@@ -2,36 +2,11 @@
int main()
{
- /*
- int i=0;
- int tableau_test[3]={45,89,12};
-
- vecteur *A=creer_vecteur("A",3);
- vecteur *B=creer_vecteur("B",3);
-
-
- for(i=0;i<3;i++)
- {
- A->tableau[i]=3;
- B->tableau[i]=2;
- }
- remplir_vecteur(*A, tableau_test);
- printf("Vecteur A:\n");
- afficher_vecteur(*A);
- printf("\n");
-
- printf("Vecteur B:\n");
- afficher_vecteur(*B);
- printf("\n");
-
- printf("Le produit A.B vaut %d.\n",produit_scalaire(*A,*B));
-
- detruire_vecteur(A);
- detruire_vecteur(B);
- */
+ /* Programme test matrices pleines */
+ /*
int lignes, colonnes;
@@ -62,9 +37,39 @@ int main()
afficher_matrice(*produit_matriciel(A,B));
detruire_matrice(A);
detruire_matrice(B);
+ */
+ /* Programme test matrices sym */
+ int lignes, colonnes;
+
+ printf("Nombre de lignes: ");
+ scanf("%d",&lignes);
+ printf("Nombre de colonnes: ");
+ scanf("%d",&colonnes);
+
+ printf("Donner les valeurs du triangle inf: ");
+
+ matrice *A=creer_matrice("A",lignes,colonnes,SYMETRIQUE);
+ int* valeurs=recuperer_n_entiers(lignes*(lignes+1)/2);
+ remplir_matrice(*A, valeurs);
+ afficher_matrice(*A);
+
+
+ printf("Nombre de lignes: ");
+ scanf("%d",&lignes);
+ printf("Nombre de colonnes: ");
+ scanf("%d",&colonnes);
+ printf("Donner les valeurs du triangle inf: ");
+ matrice *B=creer_matrice("B",lignes,colonnes,SYMETRIQUE);
+ valeurs=recuperer_n_entiers(lignes*(lignes+1)/2);
+ remplir_matrice(*B, valeurs);
+ afficher_matrice(*B);
+
+// afficher_matrice(*produit_matriciel(A,B));
+ detruire_matrice(A);
+ detruire_matrice(B);
}

0 comments on commit 21a5aec

Please sign in to comment.
Something went wrong with that request. Please try again.