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 :

matrice et pointeurs


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Points : 12
    Points
    12
    Par défaut matrice et pointeurs
    bonsoir,
    je viens de réaliser un programme qui permet la multiplication de deux matrices en fonction des indices.Je veux maintenant la réaliser en fonction des pointeurs.J'arrive à faire l'allocation des matrices, le remplissage et aussi l'affichage avec les pointeurs, mais j'ai du mal à réaliser la partie de la multiplication.
    *voila le programme en fonction des indices :

    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
    72
    73
    74
    75
    76
    77
    78
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    main() {
              int **A , **B, **C;
              int  N,M,P,i,j,k,s,a,b;
              printf("entrer le nombre de ligne de la matrice A:");
              scanf("%d",&N);
              printf("entrer le nombre de colonne de la matrice A et le nombre de ligne de la matrice B:");
              scanf("%d",&M);
              printf("entrer le nombre de colonne de la matrice B:");
              scanf("%d",&P);
              A=(int**)malloc(N*sizeof(int*));
              for(i=0;i<N;i++) 
                      A[i]=(int*)malloc(M*sizeof(int));
              B=(int**)malloc(M*sizeof(int*));
              for(i=0;i<M;i++)
                       B[i]=(int*)malloc(P*sizeof(int));
              C=(int**)malloc(N*sizeof(int*));
              for(i=0;i<N;i++)
                       C[i]=(int*)malloc(P*sizeof(int));
              //remplissage de la matrice A
              printf("remplissage de la matrice A.\n");
              printf("\n");
              for(i=0;i<N;i++){ 
                              for(j=0;j<M;j++){
                                              printf("entrer la valeur d'indice %d,%d :",i,j);
                                              scanf("%d",*(A+i)+j);
                                              }
                              printf("\n");
                              }
              //Affichage de la matrice A
              printf("\nla matrice A est:\n");
              for(i=0;i<N;i++){
                              for(j=0;j<M;j++)
                                              printf("%6d",*(*(A+i)+j));
                              printf("\n");
                              }
              //remplissage de la matrice B
              printf("remplissage de la matrice B.\n");
              for(i=0;i<M;i++){ 
                              for(j=0;j<P;j++){
                                              printf("entrer la valeur d'indice %d,%d :",i,j);
                                              scanf("%d",*(B+i)+j);
                                              }
                              printf("\n");
                              }
              //Affichage de la matrice B
              printf("\nla matrice B est:\n");
              for(i=0;i<M;i++){
                              for(j=0;j<P;j++)
                                              printf("%6d",*(*(B+i)+j));
                              printf("\n");
                              }
              // La multiplication des deux matrices partie que j'arrive pas à transformer
              for(i=0;i<N;i++) {
                                 for(j=0;j<P;j++) {
                                                        s=0;
                                                        k=0;
                                                        do {
                                                            a=*(*(A+i)+k);
                                                            b=*(*(B+k)+j);
                                                            s+=a*b;
                                                            k++;
                                                            }while(k<M);
                                                        *(*(C+i)+j)=s;
                                                        getch();
                                                        }
                                  }
              //Affichage de la matrice C
              printf("\nla matrice C est:\n");
              for(i=0;i<N;i++){
                              for(j=0;j<P;j++)
                                              printf("%6d",*(*(C+i)+j));
                              printf("\n");
                              }
               getch();
               }
    * voila le remplissage et l'affichage avec les pointeurs :

    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
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<ctype.h>
    main() {
              int **A , **B, **C;
              int  N,M,P,i,j,s;
              printf("entrer le nombre de ligne de la matrice A:");
              scanf("%d",&N);
              printf("entrer le nombre de colonne de la matrice A et le nombre de ligne de la matrice B:");
              scanf("%d",&M);
              printf("entrer le nombre de colonne de la matrice B:");
              scanf("%d",&P);
              A=(int**)malloc(N*sizeof(int*));
              for(i=0;i<N;i++) 
                      A[i]=(int*)malloc(M*sizeof(int));
              B=(int**)malloc(M*sizeof(int*));
              for(i=0;i<M;i++)
                       B[i]=(int*)malloc(P*sizeof(int));
              C=(int**)malloc(N*sizeof(int*));
              for(i=0;i<N;i++)
                       C[i]=(int*)malloc(P*sizeof(int));
              //remplissage de la matrice A
              printf("remplissage de la matrice A.\n");
              printf("\n");
              for(p=A;p<A+N;p++){ 
                              for(q=*p;q<*p+M;q++){
                                              printf("entrer la valeur d'indice %d,%d :",p-A,q-(*p));
                                              scanf("%d",q);
                                              }
                              printf("\n");
                              }
             //Affichage de la matrice A
              printf("\nla matrice A est:\n");
              for(p=A;p<A+N;p++){
                              for(q=*p;q<*p+M;q++)
                                              printf("%6d",*q);
                              printf("\n");
                              }
              //remplissage de la matrice B
              printf("remplissage de la matrice B.\n");
              for(p=B;p<B+M;p++){ 
                              for(q=*p;q<*p+P;q++){
                                              printf("entrer la valeur d'indice %d,%d :",p-B,q-(*p));
                                              scanf("%d",q);
                                              }
                              printf("\n");
                              }
              //Affichage de la matrice B
              printf("\nla matrice B est:\n");
              for(p=B;p<B+M;p++){ 
                              for(q=*p;q<*p+P;q++)
                                              printf("%6d \t",*q);
                              printf("\n");
                              }
    merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    édite ton message et utilise les balises code pour que ton code soit lisible

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    bonjour,
    c'était la première fois que j'utilise ce forum !!
    merci de m'avoir faire savoir la façon de représenter ce message.
    alors , peux-tu m'aider à résoudre ce problème?
    merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    C'est déja plus lisible comme ça :-)


    Ça me semble juste, quel est le problème ?

    Par contre pourquoi utiliser un while au lieu d'un for pour la boucle sur k ? ça rend le code moins lisible...

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    j'ai écris le premier code en fonction des indices et sa marche sans aucun problème; j'essaye de l'éditer en fonction des pointeurs.
    Si tu remarque dans le premier code j'ai ecri un message qui indique la partie que j'arrive pas à la transformer en pointeur.

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    D'une autre manière cette partie du programme je veux l'écrire en fonction de pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for(i=0;i<N;i++) {
                                 for(j=0;j<P;j++) {
                                                        s=0;
                                                        k=0;
                                                        do {
                                                            a=*(*(A+i)+k);
                                                            b=*(*(B+k)+j);
                                                            s+=a*b;
                                                            k++;
                                                            }while(k<M);
                                                        *(*(C+i)+j)=s;
     
                                                        }
                                  }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    oui j'avais vu, mais qu'est ce que tu veux dire pas "écrire en fonction de pointeurs" ? Ce n'est pas le cas là ?

  8. #8
    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
    Ton code est déjà exprimé en terme de calcul d'adresses.
    De toute façon, c'est la même chose d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A[i][k] , B[k][j] et C[i][j] 
    // ou
    *(*(A+i)+k) , *(*(B+k)+j) et *(*(C+i)+j)
    puisque le compilateur interprète les premières expressions comme étant les secondes .

    La chose que tu peux faire, c'est d'éliminer les calculs redondants :
    - Dans *(*(A+i)+k) , *(A+i) ne change pas dans la boucle sur k ni dans la boucle sur j donc peut être fait en dehors :
    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
    for(i=0;i<N;i++)
    {
      pAi = A[i];      // ou *(A+i)
      for(j=0;j<P;j++)
      {
    ....
         k=0;
         do
         {
            a= pAi[k]; // ou *(pAi+k)
    ....
            k++;
         }while(k<M);
    ....
      }
    }
    Comme on accède aux éléments consécutifs en mémoire pAi[0], pAi[0],... dans la boucle sur k et on peut aussi modifier un peu ce code :
    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
    for(i=0;i<N;i++)
    {
      pAi = A[i];     // ou *(A+i)
      for(j=0;j<P;j++)
      {
    ....
         k=0;
         pAik = pAi;  
         do
         {
            a= *pAik;  
    ....
            k++;
            pAik++;
         }while(k<M);
    ....
      }
    }
    - De même, dans *(*(C+i)+j)=s; le terme *(C+i) ne change pas dans la boucle sur j et peut être calculé en dehors. Puis dans la boucle sur j, on accède à des éléments consécutifs et on peut faire la même transformation (ou les mêmes) que précédemment:
    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
    for(i=0;i<N;i++)
    {
      pCij = C[i];    
      pAi  = A[i];
      for(j=0;j<P;j++)
      {
    ....
         k=0;
         pAik = pAi;
         do
         {
            a= *pAik;
    ....
            k++;
            pAik++;
         }while(k<M);
         *pCij = s
         pCij++;
      }
    }
    - Par contre, pour B[k][j] (ou *(*(B+k)+j)), on ne peut rien faire.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Matrice de pointeur à initialiser..
    Par Koko33 dans le forum Débuter
    Réponses: 3
    Dernier message: 17/01/2013, 14h25
  2. matrice et pointeur en c
    Par khaoula aluoahk dans le forum C
    Réponses: 1
    Dernier message: 21/04/2011, 07h14
  3. Réponses: 3
    Dernier message: 31/05/2010, 17h18
  4. structure, matrice et pointeurs
    Par Margatthieu dans le forum C
    Réponses: 15
    Dernier message: 13/01/2008, 23h17
  5. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03

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