Resoudre une matrice triangulaire superieure [Résolu]

alyggattor
Messages postés
4
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
24 mai 2007
- 3 déc. 2006 à 22:36 - Dernière réponse : alyggattor
Messages postés
4
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
24 mai 2007
- 9 janv. 2007 à 09:20
Bonjour à tous,
je suis un debutant en C. J'ai voulu travailler sur la resolution d'une matrice d'ordre n directement triangulaire superieure. Cependant mon code comporte quelques erreurs et je ne me retrouve pas.
Quelqu'un pourrait il m'aider à y voir plus clair? Merci.

/*c'est juste pour voir comment trouver les solutions
 d'une matrice triangulaire superieure A telle que
       A*x=b  */


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int c,i,j,n,k;
float*a,*b,*x;




int val(int i,int j){k=((i-1)*n)+(j-1);  //pour faire la correspondance de
       return k;          // l'element a[i][j] de la matrice par rapport au pointeur
                            }


void saisie(){a=(float*)malloc((n*n)*sizeof(float));//a correspond à la matrice
       for(c=0;c<(n*n);c++)
         scanf("%f",a[c]);
                    }
void remonte(){
        b=(float*)malloc(n*sizeof(float));
        x=(float*)malloc(n*sizeof(float));
        x[n]=b[n]/(a[val(n,n)]);
        for(i=n-1;i>=1;i--)
  {x[i]=b[i];
   for(j=i+1;j<=n;j++)
   x[i]=x[i]-a[val(i,j)]*x[j];
   x[i]=x[i]/a[val(i,i)];
  }
                        }


void main(){clrscr();
     printf("Taille de la matrice?\n");
     scanf("%d",&n);
     printf("sasir la matrice triangulaire superieure\n");
     saisie();
     printf("saisir les resultats\n");
     for(i=1;i<=n;i++)
      scanf("%f",b[i]);
      remonte();
      printf("Les solutions sont:\n");
      for(i=1;i<=n;i++)
      printf("\nx%d=%f\n",i,x[i]);
      printf("voulez vous continuer");
      getch();
                 }

P.S.: encore une fois je suis un grand debutant de la programmation
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
- 3 déc. 2006 à 23:06
3
Merci
scanf("%f",b[i]);


Tu entre une valeur dans b mais ce pointeur n'est initialiser qu'après
à remonte(). Il n'y a pas de mémoire d'allouer pour le premier tour de
boucle. Si ça plante là, c'est logique.



Ensuite:


b=(float*)malloc(n*sizeof(float));


x=(float*)malloc(n*sizeof(float));


 x[n]=b[n]/(a[val(n,n)]);


Tu divise la valeur contenue dans b[n]. Cependant, il n'y a rien à
cette location puisque sa mémoire vien juste d'être alloué. Le résultat
est faussé.



Finalement, je vois beaucoup de malloc mais aucun free. C'est pas bon du tout ça.



Il faudrait que tu revoie certaines notions. Ton programme n'est pas très bon.


Commence par quelque chose de plus facile si tu es "un grand debutant de la programmation".


Bonne continuation.

C++ (@++)

Merci SAKingdom 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de SAKingdom
alyggattor
Messages postés
4
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
24 mai 2007
- 9 janv. 2007 à 09:20
0
Merci
Après verification et prise en compte de la derniere reponse, j'ai pu modifier mon code. Bien que pouvant etre harmonisé, je l'ai fait juste dans le cadre de la manipilation des pointeurs. J'avais eu à le faire avec des tableaux statiques.
Merci de voir le code suivant.

/*c'est juste pour voir comment trouver les solutions
 d'une matrice triangulaire superieure A telle que
      A*x=b  */



#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int c,i,j,n,k;
float*a,*b,*x;





int val(int i,int j){k=((i-1)*n)+(j-1);  //pour faire la correspondance de
       return k;          // l'element a[i][j] de la matrice par rapport au pointeur
      }



void saisie(float*a){                   //saisie de la matrice A
  for(c=0;c<(n*n);c++)
   scanf("%f",a[c]);
      }
void remonte(){
        x[n-1]=b[n-1]/(a[val(n,n)]);
        for(i=n-2;i>=0;i--)
  {x[i]=b[i];
   for(j=i+1;j<n;j++)
    x[i]=x[i]-a[val(i+1,j)]*x[j];
    x[i]=x[i]/a[val(i+1,i+1)];
  }
       }



void main(){clrscr();
     printf("Taille de la matrice?\n");
     scanf("%d",&n);
     a=(float*)malloc((n*n)*sizeof(float));//a correspond à la matrice
     x=(float*)malloc(n*sizeof(float));
     b=(float*)malloc(n*sizeof(float));
     printf("sasir la matrice triangulaire superieure\n");
     saisie(a);
     printf("saisir les resultats\n");
     for(i=0;i<n;i++)
      scanf("%f",b[i]);
      remonte();
      printf("Les solutions sont:\n");
      for(i=0;i<n;i++)
      printf("\nx%d=%f\n",(i+1),x[i]);
      printf("voulez vous continuer");
      free(a);
             free(b);
             free(x);
             getch();
            
     }
Commenter la réponse de alyggattor

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.