IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Gestion de matrices


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut Gestion de matrices
    Bonjour à tous!!
    Tout d'abord je ne sais plus comment on fait pour allouer de la memoire à une matrice.
    Ensuite lié à ce probleme :
    Je veux que l'utilisateur saisit un nbre inconnu de valeur(coefficient), et je voudrais les mettre dans une matrice!!
    Comment faire!!
    Merci pour votre aide!!

  2. #2
    Membre régulier Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Tu dois sans doute déjà savoir qu'une matrice est un énorme tableau.
    il y a 2 façons de le représenter, soit un tableau de n lignes ou chaque ligne contient un tableau de m colonnes, soit un tableau de taille ligne*colonne
    Tout dépend avec quoi tu visualise mieux les choses

    Sinon pour allouer de la mémoire, soit statique, soit dynamique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char tab[ ligne * colonne ]
     
    char *tab;
    tab = malloc(ligne * colonne * sizeof(char));
    NB : sizeof char retourne 1 donc pas indispensable mais plus clair


    Sinon ton programme doit avoir la forme suivante :
    - Demander le nombre de lignes, puis de colonnes a l'utilisateur (pour connaitre les conditions de fin de tes boucles)
    - Ensuite tu alloue dynamiquement ton ou tes tableaux
    - Tu demande a l'utilisateur des valeurs tant que tu n'as pas obtenu ligne * colonne valeurs

    Bon courage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Points : 44
    Points
    44
    Par défaut
    tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define IMAX 100
    #define JMAX 100
     
    int matrice[IMAX][JMAX] //déclaration statique de la matrice
    sinon si tu veux utiliser une allocation dynamique, il faut que tu utilises un double pointeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int **matrice;
    matrice=(int**)malloc(sizeof(int*)*IMAX);
    for(i=0;i<IMAX;i++)
    {
      matrice[i]=(int*)malloc(sizeof(int)*JMAX);
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    merci beaucoup pour vos reponse ce qui ma permis de revoir allocation memoire d'une matrice!!
    Mais j'ai toujours un probleme. Car je veux saisir un nombre inconnu de valeur que je met dans la matrice.
    Voici mon code pour que vous me compreniez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    #include <stdio.h> 
    #include <stdlib.h>
    #define k 10 
    #define IMAX 5
    #define JMAX 3
    int tab [k][k]; 
    int matrice[IMAX][JMAX];
    void saisir(int a,int b) 
    { 
         int degre,val,i,j;
         int ** matrice;
    matrice=(int**)malloc(sizeof(int*)*IMAX); 
    for(i=0;i<IMAX;i++)
    {
    matrice[i]=(int*)malloc(sizeof(int)*JMAX);
    }
    printf ("Veuillez saisir le degré du polynome (nbre compris entre 0 et 5!!:"); 
    scanf("%d",&degre); 
    getchar(); 
    printf ("Veuillez choisir la valeur :"); 
    scanf("%d",&val); 
    getchar(); 
    if (degre>5) 
    { 
    printf ("IMPOSSIBLE"); 
    } 
    else 
    { 
         degre=degre+1;
    for (i=0;i<degre;i++) 
    { 
     
    printf ("Veuillez saisir les coeff de votre polynome!"); 
    scanf("%d",matrice[IMAX][JMAX]+i); 
    getchar(); 
    } 
    } 
     
    for (i=0;i<degre;i++)
    { 
        //for(j=0;j<degre;j++)
        //{
    printf("%d",matrice[IMAX][JMAX]); 
     
    getchar();
    }
    matrice[0][1]=5;
    //printf("%d",tableau[0][1]);
    getchar();
    } 
     
     
     
     
    int main() 
    {saisir(3,3);}

    Merci encore

  5. #5
    Membre régulier Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Points : 78
    Points
    78
    Par défaut
    alors quelques remarques comme ca assez rapide, juste en lisant ton code

    Deja, le prototype de ta fonction utilise a et b, mais dans ton code, tu ne les utilises pas, est ce normal ?

    ensuite tu a melangé deux petites choses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int matrice[IMAX][JMAX];
     
    int ** matrice;
    matrice=(int**)malloc(sizeof(int*)*IMAX);
    ceci doit te provoquer forcement des erreurs
    en variables globales, tu a declaré un tableau portant le nom matrice avec sa taille, puis dans ta fonction, tu declare un nouveau pointeur portant le meme nom que le tableau (ce qui ne veut pas dire que ce pointeur pointe sur ce tableau) et tu alloue de la memoire pour ce tableau.

    De plus, tu a choisi de faire un tableau de tableau donc tu va devoir faire une boucle dans laquelle pour chaque case de tab[i], tu fais un malloc de tab[j] de manier a avoir un tab[i][j] correct.

    Enfin petit warning : utilisation du scanf (beaucoup te diront que c'est assez dangereux d'utiliser cette fonction, mais pour ton cas, cela peut peut etre suffire)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    alors je pense que g un peu prés compris mais pour mon scanf et l'aafichage je ne vois pas du tout!!!
    en fait ce que j'essai de programmer c la methode d'Hörner!!!
    je sais comment faire mais je n'arrive pas à programmer!!
    revoici mon code et dite moi si j'ai bien compris ce que vous m'avez expliqué :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h> 
    #include <stdlib.h>
    #define k 10 
    #define IMAX 5
    #define JMAX 3
    int tab [k][k]; 
    void saisir(int a,int b) 
    { 
      int degre,val,i,j;
      int ** matrice;
      matrice=(int**)malloc(sizeof(int*)*IMAX); 
      for(i=0;i<IMAX;i++)
      {
         matrice[i]=(int*)malloc(sizeof(int)*JMAX);
      }
     
      printf ("Veuillez saisir le degré du polynome (nbre compris entre 0 et 5!!:"); 
      scanf("%d",&degre); 
      getchar(); 
      printf ("Veuillez choisir la valeur :"); 
      scanf("%d",&val); 
      getchar(); 
      if (degre>5) 
      { 
         printf ("IMPOSSIBLE"); 
      } 
      else 
      { 
         degre=degre+1;
         for (i=0;i<degre;i++) 
         { 
            printf ("Veuillez saisir les coeff de votre polynome!"); 
            scanf("%d",matrice);  
            getchar(); 
         } 
      } 
     
      for (i=0;i<degre;i++)
      { 
         for(j=0;j<3;j++)
         {
     
            printf("%d",matrice[i][j]); 
     
            getchar();
         }
        matrice[0][1]=5;
        //printf("%d",tableau[0][1]);
        getchar();
      } 
    }
     
     
     
     
    int main() 
    {
      saisir(3,3);
    }
    encore merci pour votre aide

  7. #7
    Membre régulier Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Points : 78
    Points
    78
    Par défaut
    Ca me semble beaucoup mieux oui, apres je ne suis pas suffisament expert pour dire Ici y'a une erreur

    Libre a toi désormais d'exécuter ce code et je l'espère pas, mais c'est rarement le cas, de revenir nous voir pour demander pourquoi ca ne marche pas

    Bon courage

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    bon bah je suis contente d'avoir compris mais pour mon scanf vous ne savez pas comment je peux faire!!??
    encore un grand merci!!

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         for (i=0;i<degre;i++) 
         { 
            printf ("Veuillez saisir les coeff de votre polynome!"); 
            scanf("%d",matrice);  
            getchar(); 
         }
    Ceci est incorrect. matrice n'est pas l'adresse d'un élément du tableau (d'ailleurs, il est du type int** et pas du type int*).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    if (degre>5) 
      { 
         printf ("IMPOSSIBLE"); 
      } 
      else // degre <= 5 
      { 
         degre=degre+1;   // degre<=6
         for (i=0;i<degre;i++) // i<=5
         { 
            printf ("Veuillez saisir les coeff de votre polynome!"); 
            scanf("%d",matrice);  
            getchar(); 
         } 
      } 
     
      for (i=0;i<degre;i++)   // i<=5
      { 
         for(j=0;j<3;j++)
         {
     
            printf("%d",matrice[i][j]); //erreur matrice[5][j] n existe pas
                                              // de plus ils ne sont pas initialisé
     
            getchar();
         }
        matrice[0][1]=5;
        //printf("%d",tableau[0][1]);
        getchar();
      } 
    }
    j ai repere une erreur dans une boucle
    a quoi te servent a et b?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    En effet mon a et b ne me sert à rien, mais je n'arrive pas à saisir je ne vois pas quoi mettre, je savais que :
    était faux
    Pouvez vous m'éclairer!!
    Merci pour votre aide

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    explique nous ta structure et ce qu elle fait, ou sont selon toi rangees les valeurs

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Revoilà mon code avec explication de ma structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <stdio.h> 
    #include <stdlib.h>
    #define k 10 
    #define IMAX 5
    #define JMAX 3
    int tab [k][k]; 
    void saisir() 
    { 
      int degre,val,i,j;
      int ** matrice;
      matrice=(int**)malloc(sizeof(int*)*IMAX); 
      for(i=0;i<IMAX;i++)
      {
         matrice[i]=(int*)malloc(sizeof(int)*JMAX);
      }
     
      printf ("Veuillez saisir le degré du polynome (nbre compris entre 0 et 5!!:"); 
      scanf("%d",&degre); //sasir du degre de polynome
      getchar(); 
      printf ("Veuillez choisir la valeur :"); // valeur de l'image à trouver
      scanf("%d",&val); 
      getchar(); 
      if (degre>5) 
      { 
         printf ("IMPOSSIBLE"); 
      } 
      else 
      { 
         degre=degre+1;
         for (i=0;i<degre;i++) 
         { 
            printf ("Veuillez saisir les coeff de votre polynome!"); //saisir des coefficient de mon polynome selon le degre choisi
            scanf("%d",matrice[i][j]);  //saisi de mes valeurs dans une matrice (mais je n'y arrive pas)
            getchar(); 
         } 
      } 
     
      for (i=0;i<degre;i++)//affichage de ma matrice!!
      { 
         for(j=0;j<3;j++)
         {
     
            printf("%d",matrice[i][j]); 
     
            getchar();
         }
         } 
    }
     
     
     
     
    int main() 
    {
      saisir();
    }

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    void saisir() 
    { 
      int degre,val,i,j;
      int ** matrice;
      matrice=(int**)malloc(sizeof(int*)*IMAX); //initialise les cases de degres
      for(i=0;i<IMAX;i++)
      {
         matrice[i]=(int*)malloc(sizeof(int)*JMAX);
      }
     
      printf ("Veuillez saisir le degré du polynome (nbre compris entre 0 et 5!!:"); 
      scanf("%d",&degre); 
      getchar(); 
     
      printf ("Veuillez choisir la valeur :"); 
      scanf("%d",&val); 
      getchar(); 
      if (degre>5) 
      { 
         printf ("IMPOSSIBLE"); 
      } 
      else 
      { 
         for (i=0;i<degre;i++) 
         { 
            printf ("Veuillez saisir les coeff de votre polynome!"); //saisir des coefficient de mon polynome selon le degre choisi
            scanf("%d",matrice[i][0]);  // saisi les coefficients dans la premiere colonne
            getchar(); 
         } 
      } 
     
      for (i=0;i<degre;i++)//affichage de ma matrice!!
      { 
     
            printf("%d",matrice[i][0]); 
      }
     
      //return matrice si tu ve la reutiliser
      //free(matrice) pour eviter les fuites memoire
    }
    voila ca te met les coeff dans une matrice mais il aurait ete plus simple d utiliser un tableau ou une liste si c juste enregistrer des coeff d un polynome

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    ok merci beaucoup pour ton aide, mais j'avais pensé au liste mais je ne vois pas comment m'y prendre. Si c'est simple à expliquer et à comprendre je veux bien que tu m'explique!!!
    encore merci!!!

  16. #16
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,
    • Les retours des malloc ne sont pas testés
    • Aucun free ! pas de libération de la mémoire aprés usage
    • ...bref de toute façon vu que tu connais la taille de ta matrice avant même l'exécution du programme, tu pourrais tout simplement déclarer ta matrice comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define MAX_X 5 
    #define MAX_Y 3
    <...>
    int Matrice [MAX_X][MAX_Y];
    @++
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    struct Coeff{
    	int coeff;
    	struct Coeff * suivant;
    };
     
    typedef struct Coeff Coeff;
     
     
    struct Polynome{
    	int degre;
    	Coeff * liste;
    }
     
    typedef struct Polynome Polynome;
     
    Polynome initPolynome()
    {
    	Polynome p;
    	p.liste = NULL;
    	p.degre = -1;
    }
     
    Coeff * creerCoeff(int valeur)
    {
    	Coeff * c;
    	if(c = (Coeff*) malloc(sizeof(Coeff)))
            {
    	     c->coeff = valeur;
    	     c->suivant =NULL;
            }
    	return c;
    }
     
    Polynome rajouterCoeff(Polynome p, int valeur)
    {
    	Coeff * c = creerCoeff(valeur);
    	Coeff * temp;
    	temp = p.liste;
    	p.liste = c; 
    	c->suivant = temp;
    	p.degre++;
    	return p;
    }
     
     
    void afficherPolynome(Polynome p)
    {
    	while( p.liste!=NULL )
    	{
    		printf("%d\t",p.liste->coeff);
    		p.liste = p.liste->suivant;
    	}
    }
     
     
     
    void main()
    {
    	int i,val,degre;
    	Polynome p = initPolynome();
    	printf("quel est le degre du polynome ?");
    	scanf("%d",&degre);
    	for(i = 0; i < degre+1; i ++)
    	{
    		printf("entrez le coefficient de degre %d?",i);
    		scanf("%d",&val);
    		p = rajouterCoeff( p, val);
    	}
    	void afficherPolynome( p);
    }

    voila un exemple desole j ai pas le temps de commenter.. si t as des questions mp moi

    ssmario2 a raison pour les free().. il faudrait faire une fonction detruire.. pas le temp ce soir..

Discussions similaires

  1. Introduction à la gestion des matrices
    Par Jerome Briot dans le forum MATLAB
    Réponses: 5
    Dernier message: 07/01/2014, 09h55
  2. gestion de matrice d'objet
    Par DrDam dans le forum C++
    Réponses: 2
    Dernier message: 02/06/2008, 19h15
  3. A propos du tutoriel sur la gestion des matrices
    Par Pierre845 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/04/2008, 13h32
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo